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);
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>
63 throw std::runtime_error(
"Conditional::negLogConstant is not implemented");
67template <
class FACTOR,
class DERIVEDCONDITIONAL>
68template <
class VALUES>
70 const DERIVEDCONDITIONAL& conditional,
const VALUES& values) {
71 const double prob_or_density = conditional.evaluate(values);
72 if (prob_or_density < 0.0)
return false;
73 if (std::abs(prob_or_density - conditional(values)) > 1e-9)
75 const double logProb = conditional.logProbability(values);
76 if (std::abs(prob_or_density - std::exp(logProb)) > 1e-9)
78 const double error = conditional.error(values);
79 if (error < 0.0)
return false;
80 const double expected = -(conditional.negLogConstant() + error);
81 if (std::abs(logProb - expected) > 1e-9)
Base class for conditional densities.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
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
std::uint64_t Key
Integer nonlinear key type.
Definition types.h:43
HybridValues represents a collection of DiscreteValues and VectorValues.
Definition HybridValues.h:37
static bool CheckInvariants(const DERIVEDCONDITIONAL &conditional, const VALUES &x)
Check invariants of this conditional, given the values x.
Definition Conditional-inst.h:69
size_t nrFrontals_
The first nrFrontal variables are frontal and the rest are parents.
Definition Conditional.h:67
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
Parents parents() const
return a view of the parent keys
Definition Conditional.h:150
bool equals(const This &c, double tol=1e-9) const
check equality
Definition Conditional-inst.h:41
virtual double negLogConstant() const
All conditional types need to implement this as the negative log of the normalization constant to mak...
Definition Conditional-inst.h:62
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
Frontals frontals() const
return a view of the frontal keys
Definition Conditional.h:147
size_t nrParents() const
return the number of parents
Definition Conditional.h:136
void print(const std::string &s="Conditional", const KeyFormatter &formatter=DefaultKeyFormatter) const
print with optional formatter
Definition Conditional-inst.h:30