29template <
class FACTOR,
class DERIVEDCONDITIONAL>
31 const std::string& s,
const KeyFormatter& formatter)
const {
32 std::cout << s <<
" P(";
33 for (
Key key : frontals()) std::cout <<
" " << formatter(key);
34 if (nrParents() > 0) std::cout <<
" |";
35 for (
Key parent : parents()) std::cout <<
" " << formatter(parent);
36 std::cout <<
")" << std::endl;
40template <
class FACTOR,
class DERIVEDCONDITIONAL>
47template <
class FACTOR,
class DERIVEDCONDITIONAL>
50 throw std::runtime_error(
"Conditional::logProbability is not implemented");
54template <
class FACTOR,
class DERIVEDCONDITIONAL>
57 throw std::runtime_error(
"Conditional::evaluate is not implemented");
61template <
class FACTOR,
class DERIVEDCONDITIONAL>
64 throw std::runtime_error(
65 "Conditional::logNormalizationConstant is not implemented");
69template <
class FACTOR,
class DERIVEDCONDITIONAL>
71 return std::exp(logNormalizationConstant());
75template <
class FACTOR,
class DERIVEDCONDITIONAL>
76template <
class VALUES>
78 const DERIVEDCONDITIONAL& conditional,
const VALUES& values) {
79 const double prob_or_density = conditional.evaluate(values);
80 if (prob_or_density < 0.0)
return false;
81 if (std::abs(prob_or_density - conditional(values)) > 1e-9)
83 const double logProb = conditional.logProbability(values);
84 if (std::abs(prob_or_density - std::exp(logProb)) > 1e-9)
86 if (std::abs(conditional.logNormalizationConstant() -
87 std::log(conditional.normalizationConstant())) > 1e-9)
90 const double error = conditional.error(values);
91 if (error < 0.0)
return false;
92 const double expected = conditional.logNormalizationConstant() - error;
93 if (std::abs(logProb - expected) > 1e-9)
Base class for conditional densities.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
std::uint64_t Key
Integer nonlinear key type.
Definition types.h:100
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition Key.h:35
HybridValues represents a collection of DiscreteValues and VectorValues.
Definition HybridValues.h:38
Definition Conditional.h:64
static bool CheckInvariants(const DERIVEDCONDITIONAL &conditional, const VALUES &x)
Check invariants of this conditional, given the values x.
Definition Conditional-inst.h:77
size_t nrFrontals_
The first nrFrontal variables are frontal and the rest are parents.
Definition Conditional.h:67
virtual double logNormalizationConstant() const
All conditional types need to implement a log normalization constant to make it such that error>=0.
Definition Conditional-inst.h:62
virtual double evaluate(const HybridValues &c) const
All conditional types need to implement an evaluate function, that yields a true probability.
Definition Conditional-inst.h:55
bool equals(const This &c, double tol=1e-9) const
check equality
Definition Conditional-inst.h:41
virtual double logProbability(const HybridValues &c) const
All conditional types need to implement a logProbability function, for which exp(logProbability(x)) =...
Definition Conditional-inst.h:48
double normalizationConstant() const
Non-virtual, exponentiate logNormalizationConstant.
Definition Conditional-inst.h:70
void print(const std::string &s="Conditional", const KeyFormatter &formatter=DefaultKeyFormatter) const
print with optional formatter
Definition Conditional-inst.h:30