@@ -1229,6 +1229,9 @@ T getDbFromProb(const std::vector<T>& probs, double fC = 0.018)
12291229template <typename T>
12301230T getDb (const std::vector<T>& logits, double fC = 0.018 )
12311231{
1232+ if (logits.size () < 3 ) {
1233+ LOG (fatal) << " getDb expects at least 3 class logits, received " << logits.size ();
1234+ }
12321235 auto softmax = [](const std::vector<T>& logits) {
12331236 std::vector<T> res;
12341237 T maxLogit = *std::max_element (logits.begin (), logits.end ());
@@ -1245,11 +1248,13 @@ T getDb(const std::vector<T>& logits, double fC = 0.018)
12451248
12461249 std::vector<T> softmaxLogits = softmax (logits);
12471250
1248- if (softmaxLogits[1 ] == 0 . && softmaxLogits[2 ] == 0 .) {
1249- LOG (debug) << " jettaggingutilities::Db, Divide by zero: softmaxLogits = (" << softmaxLogits[0 ] << " , " << softmaxLogits[1 ] << " , " << softmaxLogits[2 ] << " )" ;
1251+ auto denominator = fC * softmaxLogits[1 ] + (1 . - fC ) * softmaxLogits[2 ];
1252+ if (!std::isfinite (softmaxLogits[0 ]) || !std::isfinite (denominator) || softmaxLogits[0 ] <= 0 . || denominator <= 0 .) {
1253+ LOG (debug) << " jettaggingutilities::getDb, non-positive or non-finite numerator/denominator" ;
1254+ return std::numeric_limits<T>::quiet_NaN ();
12501255 }
12511256
1252- return std::log (softmaxLogits[0 ] / ( fC * softmaxLogits[ 1 ] + ( 1 . - fC ) * softmaxLogits[ 2 ]) );
1257+ return std::log (softmaxLogits[0 ] / denominator );
12531258}
12541259
12551260// Track-origin discriminant. Logit order: [background, charm, beauty, PV, other SV].
@@ -1273,8 +1278,9 @@ T getTrackDb(const std::vector<T>& trackLogits, double trackFC)
12731278 }
12741279
12751280 T denominator = trackFC * softmaxLogits[1 ] + (1 . - trackFC) * (softmaxLogits[0 ] + softmaxLogits[3 ] + softmaxLogits[4 ]);
1276- if (denominator == 0 .) {
1277- LOG (debug) << " jettaggingutilities::getTrackDb, zero denominator" ;
1281+ if (!std::isfinite (softmaxLogits[2 ]) || !std::isfinite (denominator) || softmaxLogits[2 ] <= 0 . || denominator <= 0 .) {
1282+ LOG (debug) << " jettaggingutilities::getTrackDb, non-positive or non-finite numerator/denominator" ;
1283+ return std::numeric_limits<T>::quiet_NaN ();
12781284 }
12791285 return std::log (softmaxLogits[2 ] / denominator);
12801286}
0 commit comments