2012-04-16 06:35:28 +08:00
|
|
|
/*
|
|
|
|
* Domain.h
|
|
|
|
* @brief Domain restriction constraint
|
|
|
|
* @date Feb 13, 2012
|
|
|
|
* @author Frank Dellaert
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2012-04-16 07:12:17 +08:00
|
|
|
#include <gtsam/discrete/DiscreteKey.h>
|
2021-11-18 23:54:00 +08:00
|
|
|
#include <gtsam_unstable/discrete/Constraint.h>
|
2012-04-16 06:35:28 +08:00
|
|
|
|
|
|
|
namespace gtsam {
|
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/**
|
|
|
|
* Domain restriction constraint
|
|
|
|
*/
|
|
|
|
class GTSAM_UNSTABLE_EXPORT Domain : public Constraint {
|
|
|
|
size_t cardinality_; /// Cardinality
|
|
|
|
std::set<size_t> values_; /// allowed values
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
public:
|
|
|
|
typedef boost::shared_ptr<Domain> shared_ptr;
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
// 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);
|
|
|
|
}
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
// 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);
|
|
|
|
}
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/// Constructor
|
|
|
|
Domain(const Domain& other)
|
|
|
|
: Constraint(other.keys_[0]), values_(other.values_) {}
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/// insert a value, non const :-(
|
|
|
|
void insert(size_t value) { values_.insert(value); }
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/// erase a value, non const :-(
|
|
|
|
void erase(size_t value) { values_.erase(value); }
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
size_t nrValues() const { return values_.size(); }
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
bool isSingleton() const { return nrValues() == 1; }
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
size_t firstValue() const { return *values_.begin(); }
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
// print
|
|
|
|
void print(const std::string& s = "", const KeyFormatter& formatter =
|
|
|
|
DefaultKeyFormatter) const override;
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/// equals
|
|
|
|
bool equals(const DiscreteFactor& other, double tol) const override {
|
|
|
|
if (!dynamic_cast<const Domain*>(&other))
|
|
|
|
return false;
|
|
|
|
else {
|
|
|
|
const Domain& f(static_cast<const Domain&>(other));
|
|
|
|
return (cardinality_ == f.cardinality_) && (values_ == f.values_);
|
2013-10-12 01:42:30 +08:00
|
|
|
}
|
2021-11-18 23:54:00 +08:00
|
|
|
}
|
2013-10-12 01:42:30 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
bool contains(size_t value) const { return values_.count(value) > 0; }
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/// Calculate value
|
|
|
|
double operator()(const Values& values) const override;
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/// Convert into a decisiontree
|
|
|
|
DecisionTreeFactor toDecisionTreeFactor() const override;
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/// Multiply into a decisiontree
|
|
|
|
DecisionTreeFactor operator*(const DecisionTreeFactor& f) const override;
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/*
|
|
|
|
* Ensure Arc-consistency
|
|
|
|
* @param j domain to be checked
|
|
|
|
* @param domains all other domains
|
|
|
|
*/
|
|
|
|
bool ensureArcConsistency(size_t j,
|
|
|
|
std::vector<Domain>& domains) const override;
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/**
|
|
|
|
* 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 KeyVector keys, std::vector<Domain>& domains);
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/// Partially apply known values
|
|
|
|
Constraint::shared_ptr partiallyApply(const Values& values) const override;
|
2012-10-02 22:40:07 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
/// Partially apply known values, domain version
|
|
|
|
Constraint::shared_ptr partiallyApply(
|
|
|
|
const std::vector<Domain>& domains) const override;
|
|
|
|
};
|
2012-04-16 06:35:28 +08:00
|
|
|
|
2021-11-18 23:54:00 +08:00
|
|
|
} // namespace gtsam
|