/* * CSP.h * @brief Constraint Satisfaction Problem class * @date Feb 6, 2012 * @author Frank Dellaert */ #pragma once #include #include #include namespace gtsam { /** * Constraint Satisfaction Problem class * A specialization of a DiscreteFactorGraph. * It knows about CSP-specific constraints and algorithms */ class GTSAM_UNSTABLE_EXPORT CSP : public DiscreteFactorGraph { public: using Values = DiscreteValues; ///< backwards compatibility /// Add a unary constraint, allowing only a single value void addSingleValue(const DiscreteKey& dkey, size_t value) { emplace_shared(dkey, value); } /// Add a binary AllDiff constraint void addAllDiff(const DiscreteKey& key1, const DiscreteKey& key2) { emplace_shared(key1, key2); } /// Add a general AllDiff constraint void addAllDiff(const DiscreteKeys& dkeys) { emplace_shared(dkeys); } // /** return product of all factors as a single factor */ // DecisionTreeFactor product() const { // DecisionTreeFactor result; // for(const sharedFactor& factor: *this) // if (factor) result = (*factor) * result; // return result; // } // /* // * Perform loopy belief propagation // * True belief propagation would check for each value in domain // * whether any satisfying separator assignment can be found. // * This corresponds to hyper-arc consistency in CSP speak. // * This can be done by creating a mini-factor graph and search. // * For a nine-by-nine Sudoku, the search tree will be 8+6+6=20 levels // deep. // * It will be very expensive to exclude values that way. // */ // void applyBeliefPropagation(size_t maxIterations = 10) const; /* * Apply arc-consistency ~ Approximate loopy belief propagation * We need to give the domains to a constraint, and it returns * a domain whose values don't conflict in the arc-consistency way. * TODO: should get cardinality from DiscreteKeys */ Domains runArcConsistency(size_t cardinality, size_t maxIterations = 10) const; /// Run arc consistency for all variables, return true if any domain changed. bool runArcConsistency(const VariableIndex& index, Domains* domains) const; /* * Create a new CSP, applying the given Domain constraints. */ CSP partiallyApply(const Domains& domains) const; }; // CSP } // namespace gtsam