27 #include <gtsam/nonlinear/Symbol.h> 51 using shared_ptr = std::shared_ptr<MixtureFactor>;
52 using sharedFactor = std::shared_ptr<NonlinearFactor>;
78 const Factors& factors,
bool normalized =
false)
79 :
Base(keys, discreteKeys), factors_(factors), normalized_(normalized) {}
97 template <
typename FACTOR>
99 const std::vector<std::shared_ptr<FACTOR>>& factors,
100 bool normalized =
false)
101 :
Base(keys, discreteKeys), normalized_(normalized) {
102 std::vector<NonlinearFactor::shared_ptr> nonlinear_factors;
103 KeySet continuous_keys_set(keys.begin(), keys.end());
105 for (
auto&& f : factors) {
107 std::copy(f->keys().begin(), f->keys().end(),
108 std::inserter(factor_keys_set, factor_keys_set.end()));
110 if (
auto nf = std::dynamic_pointer_cast<NonlinearFactor>(f)) {
111 nonlinear_factors.push_back(nf);
113 throw std::runtime_error(
114 "Factors passed into MixtureFactor need to be nonlinear!");
117 factors_ =
Factors(discreteKeys, nonlinear_factors);
119 if (continuous_keys_set != factor_keys_set) {
120 throw std::runtime_error(
121 "The specified continuous keys and the keys in the factors don't " 136 auto errorFunc = [continuousValues](
const sharedFactor& factor) {
137 return factor->error(continuousValues);
153 auto factor = factors_(discreteValues);
155 const double factorError = factor->error(continuousValues);
156 if (normalized_)
return factorError;
158 factor, continuousValues);
178 auto factor = factors_(assignments.at(0));
179 return factor->dim();
187 const std::string& s =
"",
188 const KeyFormatter& keyFormatter = DefaultKeyFormatter)
const override {
189 std::cout << (s.empty() ?
"" : s +
" ");
191 std::cout <<
"\nMixtureFactor\n";
192 auto valueFormatter = [](
const sharedFactor& v) {
194 return "Nonlinear factor on " + std::to_string(v->size()) +
" keys";
196 return std::string(
"nullptr");
199 factors_.
print(
"", keyFormatter, valueFormatter);
206 if (!dynamic_cast<const MixtureFactor*>(&other))
return false;
210 const MixtureFactor& f(static_cast<const MixtureFactor&>(other));
213 auto compare = [tol](
const sharedFactor& a,
const sharedFactor& b) {
216 if (!factors_.equals(f.factors_, compare))
return false;
221 (discreteKeys_ == f.discreteKeys_) &&
222 (normalized_ == f.normalized_));
230 const Values& continuousValues,
232 auto factor = factors_(discreteValues);
233 return factor->linearize(continuousValues);
238 const Values& continuousValues)
const {
240 auto linearizeDT = [continuousValues](
const sharedFactor& factor) {
241 return factor->linearize(continuousValues);
245 factors_, linearizeDT);
247 return std::make_shared<GaussianMixtureFactor>(
259 const Values& values)
const {
265 if (
auto noiseModelFactor =
266 std::dynamic_pointer_cast<NoiseModelFactor>(factor)) {
269 auto noiseModel = noiseModelFactor->noiseModel();
271 auto gaussianNoiseModel =
273 if (gaussianNoiseModel) {
281 auto gaussianFactor = factor->linearize(values);
282 infoMat = gaussianFactor->information();
287 return -(factor->dim() * log(2.0 * M_PI) / 2.0) -
288 (log(infoMat.determinant()) / 2.0);
Definition: HybridValues.h:38
A set of GaussianFactors, indexed by a set of discrete keys.
DecisionTree< Key, sharedFactor > Factors
typedef for DecisionTree which has Keys as node labels and NonlinearFactor as leaf nodes...
Definition: MixtureFactor.h:58
Definition: HybridFactor.h:52
Factor Graph consisting of non-linear factors.
const DiscreteKeys & discreteKeys() const
Return the discrete keys for this factor.
Definition: HybridFactor.h:129
MixtureFactor(const KeyVector &keys, const DiscreteKeys &discreteKeys, const std::vector< std::shared_ptr< FACTOR >> &factors, bool normalized=false)
Convenience constructor that generates the underlying factor decision tree for us.
Definition: MixtureFactor.h:98
KeyVector keys_
The keys involved in this factor.
Definition: Factor.h:87
MixtureFactor(const KeyVector &keys, const DiscreteKeys &discreteKeys, const Factors &factors, bool normalized=false)
Construct from Decision tree.
Definition: MixtureFactor.h:77
bool equals(const HybridFactor &other, double tol=1e-9) const override
Check equality.
Definition: MixtureFactor.h:203
static std::vector< DiscreteValues > CartesianProduct(const DiscreteKeys &keys)
Return a vector of DiscreteValues, one for each possible combination of values.
Definition: DiscreteValues.h:85
std::shared_ptr< HybridFactor > shared_ptr
shared_ptr to this class
Definition: HybridFactor.h:68
AlgebraicDecisionTree< Key > error(const Values &continuousValues) const
Compute error of the MixtureFactor as a tree.
Definition: MixtureFactor.h:134
void print(const std::string &s="HybridFactor\, const KeyFormatter &formatter=DefaultKeyFormatter) const override
print
Definition: NoiseModel.h:168
GaussianFactor::shared_ptr linearize(const Values &continuousValues, const DiscreteValues &discreteValues) const
Definition: MixtureFactor.h:229
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print to stdout
Definition: MixtureFactor.h:186
virtual Matrix information() const
Compute information matrix.
double nonlinearFactorLogNormalizingConstant(const sharedFactor &factor, const Values &values) const
Definition: MixtureFactor.h:258
Definition: DiscreteValues.h:34
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition: Key.h:35
KeyVector continuousKeys_
Record continuous keys for book-keeping.
Definition: HybridFactor.h:62
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianFactor.h:42
Definition: chartTesting.h:28
void print(const std::string &s, const LabelFormatter &labelFormatter, const ValueFormatter &valueFormatter) const
GTSAM-style print.
Definition: DecisionTree-inl.h:872
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition: Key.h:86
double error(const Values &continuousValues, const DiscreteValues &discreteValues) const
Compute error of factor given both continuous and discrete values.
Definition: MixtureFactor.h:150
Non-linear factor base classes.
size_t dim() const
Get the dimension of the factor (number of rows on linearization). Returns the dimension of the first...
Definition: MixtureFactor.h:176
const DiscreteValues & discrete() const
Return the discrete values.
Definition: HybridValues.h:92
const KeyVector & keys() const
Access the factor's involved variable keys.
Definition: Factor.h:142
double error(const HybridValues &values) const override
Compute error of factor given hybrid values.
Definition: MixtureFactor.h:167
Implementation of a discrete conditional mixture factor.
Definition: MixtureFactor.h:47
const Values & nonlinear() const
Return the nonlinear values.
Definition: HybridValues.h:95
bool equal(const T &obj1, const T &obj2, double tol)
Definition: Testable.h:85
std::shared_ptr< GaussianMixtureFactor > linearize(const Values &continuousValues) const
Linearize all the continuous factors to get a GaussianMixtureFactor.
Definition: MixtureFactor.h:237
DiscreteKeys is a set of keys that can be assembled using the & operator.
Definition: DiscreteKey.h:41