Throw if sampling conditions not satisfied

release/4.3a0
Frank Dellaert 2024-09-29 15:41:17 -07:00
parent 28a2cd3475
commit 8675dc62df
2 changed files with 14 additions and 6 deletions

View File

@ -259,8 +259,18 @@ size_t DiscreteConditional::argmax(const DiscreteValues& parentsValues) const {
/* ************************************************************************** */ /* ************************************************************************** */
void DiscreteConditional::sampleInPlace(DiscreteValues* values) const { void DiscreteConditional::sampleInPlace(DiscreteValues* values) const {
assert(nrFrontals() == 1); // throw if more than one frontal:
Key j = (firstFrontalKey()); if (nrFrontals() != 1) {
throw std::invalid_argument(
"DiscreteConditional::sampleInPlace can only be called on single "
"variable conditionals");
}
Key j = firstFrontalKey();
// throw if values already contains j:
if (values->count(j) > 0) {
throw std::invalid_argument(
"DiscreteConditional::sampleInPlace: values already contains j");
}
size_t sampled = sample(*values); // Sample variable given parents size_t sampled = sample(*values); // Sample variable given parents
(*values)[j] = sampled; // store result in partial solution (*values)[j] = sampled; // store result in partial solution
} }
@ -467,9 +477,7 @@ double DiscreteConditional::evaluate(const HybridValues& x) const {
} }
/* ************************************************************************* */ /* ************************************************************************* */
double DiscreteConditional::negLogConstant() const { double DiscreteConditional::negLogConstant() const { return 0.0; }
return 0.0;
}
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -168,7 +168,7 @@ class GTSAM_EXPORT DiscreteConditional
static_cast<const BaseConditional*>(this)->print(s, formatter); static_cast<const BaseConditional*>(this)->print(s, formatter);
} }
/// Evaluate, just look up in AlgebraicDecisonTree /// Evaluate, just look up in AlgebraicDecisionTree
double evaluate(const DiscreteValues& values) const { double evaluate(const DiscreteValues& values) const {
return ADT::operator()(values); return ADT::operator()(values);
} }