11 #include <gtsam/base/Vector.h>
20 inline std::vector<double>
expNormalize(
const std::vector<double> &logProbs) {
36 std::vector<double> cleanLogProbs;
37 double maxLogProb = -std::numeric_limits<double>::infinity();
38 for (
size_t i = 0; i < logProbs.size(); i++) {
39 double logProb = (!std::isnan(logProbs[i]))
41 : -std::numeric_limits<double>::infinity();
42 if ((logProb != std::numeric_limits<double>::infinity()) &&
43 logProb > maxLogProb) {
46 cleanLogProbs.push_back(logProb);
52 for (
size_t i = 0; i < cleanLogProbs.size(); i++) {
53 double probPrime = exp(cleanLogProbs[i] - maxLogProb);
56 double logTotal = log(total);
60 double checkNormalization = 0.0;
61 std::vector<double> probs;
62 for (
size_t i = 0; i < cleanLogProbs.size(); i++) {
63 double prob = exp(cleanLogProbs[i] - maxLogProb - logTotal);
64 probs.push_back(prob);
65 checkNormalization += prob;
71 if (!gtsam::fpEqual(checkNormalization, 1.0,
tol)) {
73 std::string(
"expNormalize failed to normalize probabilities. ") +
74 std::string(
"Expected normalization constant = 1.0. Got value: ") +
75 std::to_string(checkNormalization) +
77 "\n This could have resulted from numerical overflow/underflow.");
78 throw std::logic_error(errMsg);
Definition: DCContinuousFactor.h:24
std::vector< double > expNormalize(const std::vector< double > &logProbs)
Definition: DCSAM_utils.h:20
const double tol
Definition: testDCSAM.cpp:40