54 std::vector<double>
expNormalize(
const std::vector<double>& logProbs) {
55 double maxLogProb = -std::numeric_limits<double>::infinity();
56 for (
size_t i = 0;
i < logProbs.size();
i++) {
57 double logProb = logProbs[
i];
58 if ((logProb != std::numeric_limits<double>::infinity()) &&
59 logProb > maxLogProb) {
67 for (
size_t i = 0;
i < logProbs.size();
i++) {
68 double probPrime =
exp(logProbs[
i] - maxLogProb);
71 double logTotal =
log(total);
75 double checkNormalization = 0.0;
76 std::vector<double> probs;
77 for (
size_t i = 0;
i < logProbs.size();
i++) {
78 double prob =
exp(logProbs[
i] - maxLogProb - logTotal);
79 probs.push_back(prob);
80 checkNormalization += prob;
88 std::string(
"expNormalize failed to normalize probabilities. ") +
89 std::string(
"Expected normalization constant = 1.0. Got value: ") +
90 std::to_string(checkNormalization) +
92 "\n This could have resulted from numerical overflow/underflow.");
93 throw std::logic_error(errMsg);