109 lines
2.8 KiB
C++
109 lines
2.8 KiB
C++
/*
|
|
* Domain.h
|
|
* @brief Domain restriction constraint
|
|
* @date Feb 13, 2012
|
|
* @author Frank Dellaert
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <gtsam_unstable/discrete/Constraint.h>
|
|
#include <gtsam/discrete/DiscreteKey.h>
|
|
|
|
namespace gtsam {
|
|
|
|
/**
|
|
* Domain restriction constraint
|
|
*/
|
|
class GTSAM_UNSTABLE_EXPORT Domain: public Constraint {
|
|
|
|
size_t cardinality_; /// Cardinality
|
|
std::set<size_t> values_; /// allowed values
|
|
|
|
public:
|
|
|
|
typedef boost::shared_ptr<Domain> shared_ptr;
|
|
|
|
// Constructor on Discrete Key initializes an "all-allowed" domain
|
|
Domain(const DiscreteKey& dkey) :
|
|
Constraint(dkey.first), cardinality_(dkey.second) {
|
|
for (size_t v = 0; v < cardinality_; v++)
|
|
values_.insert(v);
|
|
}
|
|
|
|
// Constructor on Discrete Key with single allowed value
|
|
// Consider SingleValue constraint
|
|
Domain(const DiscreteKey& dkey, size_t v) :
|
|
Constraint(dkey.first), cardinality_(dkey.second) {
|
|
values_.insert(v);
|
|
}
|
|
|
|
/// Constructor
|
|
Domain(const Domain& other) :
|
|
Constraint(other.keys_[0]), values_(other.values_) {
|
|
}
|
|
|
|
/// insert a value, non const :-(
|
|
void insert(size_t value) {
|
|
values_.insert(value);
|
|
}
|
|
|
|
/// erase a value, non const :-(
|
|
void erase(size_t value) {
|
|
values_.erase(value);
|
|
}
|
|
|
|
size_t nrValues() const {
|
|
return values_.size();
|
|
}
|
|
|
|
bool isSingleton() const {
|
|
return nrValues() == 1;
|
|
}
|
|
|
|
size_t firstValue() const {
|
|
return *values_.begin();
|
|
}
|
|
|
|
// print
|
|
virtual void print(const std::string& s = "",
|
|
const IndexFormatter& formatter = DefaultIndexFormatter) const;
|
|
|
|
bool contains(size_t value) const {
|
|
return values_.count(value)>0;
|
|
}
|
|
|
|
/// Calculate value
|
|
virtual double operator()(const Values& values) const;
|
|
|
|
/// Convert into a decisiontree
|
|
virtual DecisionTreeFactor toDecisionTreeFactor() const;
|
|
|
|
/// Multiply into a decisiontree
|
|
virtual DecisionTreeFactor operator*(const DecisionTreeFactor& f) const;
|
|
|
|
/*
|
|
* Ensure Arc-consistency
|
|
* @param j domain to be checked
|
|
* @param domains all other domains
|
|
*/
|
|
bool ensureArcConsistency(size_t j, std::vector<Domain>& domains) const;
|
|
|
|
/**
|
|
* Check for a value in domain that does not occur in any other connected domain.
|
|
* If found, we make this a singleton... Called in AllDiff::ensureArcConsistency
|
|
* @param keys connected domains through alldiff
|
|
*/
|
|
bool checkAllDiff(const std::vector<Index> keys, std::vector<Domain>& domains);
|
|
|
|
/// Partially apply known values
|
|
virtual Constraint::shared_ptr partiallyApply(
|
|
const Values& values) const;
|
|
|
|
/// Partially apply known values, domain version
|
|
virtual Constraint::shared_ptr partiallyApply(
|
|
const std::vector<Domain>& domains) const;
|
|
};
|
|
|
|
} // namespace gtsam
|