77 lines
2.5 KiB
C++
77 lines
2.5 KiB
C++
/*
|
|
* CSP.h
|
|
* @brief Constraint Satisfaction Problem class
|
|
* @date Feb 6, 2012
|
|
* @author Frank Dellaert
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <gtsam/discrete/DiscreteFactorGraph.h>
|
|
#include <gtsam_unstable/discrete/AllDiff.h>
|
|
#include <gtsam_unstable/discrete/SingleValue.h>
|
|
|
|
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<SingleValue>(dkey, value);
|
|
}
|
|
|
|
/// Add a binary AllDiff constraint
|
|
void addAllDiff(const DiscreteKey& key1, const DiscreteKey& key2) {
|
|
emplace_shared<BinaryAllDiff>(key1, key2);
|
|
}
|
|
|
|
/// Add a general AllDiff constraint
|
|
void addAllDiff(const DiscreteKeys& dkeys) { emplace_shared<AllDiff>(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
|