/* * SingleValue.cpp * @brief domain constraint * @date Feb 13, 2012 * @author Frank Dellaert */ #include #include #include #include namespace gtsam { using namespace std; /* ************************************************************************* */ void SingleValue::print(const string& s, const KeyFormatter& formatter) const { cout << s << "SingleValue on " << "j=" << formatter(keys_[0]) << " with value " << value_ << endl; } /* ************************************************************************* */ double SingleValue::evaluate(const Assignment& values) const { return (double)(values.at(keys_[0]) == value_); } /* ************************************************************************* */ DecisionTreeFactor SingleValue::toDecisionTreeFactor() const { const DiscreteKeys keys{DiscreteKey(keys_[0], cardinality_)}; vector table; for (size_t i1 = 0; i1 < cardinality_; i1++) table.push_back(i1 == value_); DecisionTreeFactor converted(keys, table); return converted; } /* ************************************************************************* */ DecisionTreeFactor SingleValue::operator*(const DecisionTreeFactor& f) const { // TODO: can we do this more efficiently? return toDecisionTreeFactor() * f; } /* ************************************************************************* */ DiscreteFactor::shared_ptr SingleValue::operator/( const DiscreteFactor::shared_ptr& df) const { return this->toDecisionTreeFactor() / df; } /* ************************************************************************* */ bool SingleValue::ensureArcConsistency(Key j, Domains* domains) const { if (j != keys_[0]) throw invalid_argument("SingleValue check on wrong domain"); Domain& D = domains->at(j); if (D.isSingleton()) { if (D.firstValue() != value_) throw runtime_error("Unsatisfiable"); return false; } D = Domain(discreteKey(), value_); return true; } /* ************************************************************************* */ Constraint::shared_ptr SingleValue::partiallyApply(const DiscreteValues& values) const { DiscreteValues::const_iterator it = values.find(keys_[0]); if (it != values.end() && it->second != value_) throw runtime_error("SingleValue::partiallyApply: unsatisfiable"); return std::make_shared(keys_[0], cardinality_, value_); } /* ************************************************************************* */ Constraint::shared_ptr SingleValue::partiallyApply( const Domains& domains) const { const Domain& Dk = domains.at(keys_[0]); if (Dk.isSingleton() && !Dk.contains(value_)) throw runtime_error("SingleValue::partiallyApply: unsatisfiable"); return std::make_shared(discreteKey(), value_); } /* ************************************************************************* */ } // namespace gtsam