implement errorTree for HybridNonlinearFactorGraph
parent
3797996e89
commit
14d1594bd1
|
@ -179,4 +179,35 @@ HybridGaussianFactorGraph::shared_ptr HybridNonlinearFactorGraph::linearize(
|
||||||
return linearFG;
|
return linearFG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
AlgebraicDecisionTree<Key> HybridNonlinearFactorGraph::errorTree(
|
||||||
|
const Values& values) const {
|
||||||
|
AlgebraicDecisionTree<Key> result(0.0);
|
||||||
|
|
||||||
|
// Iterate over each factor.
|
||||||
|
for (auto& factor : factors_) {
|
||||||
|
if (auto hnf = std::dynamic_pointer_cast<HybridNonlinearFactor>(factor)) {
|
||||||
|
// Compute factor error and add it.
|
||||||
|
result = result + hnf->errorTree(values);
|
||||||
|
|
||||||
|
} else if (auto nf = std::dynamic_pointer_cast<NonlinearFactor>(factor)) {
|
||||||
|
// If continuous only, get the (double) error
|
||||||
|
// and add it to every leaf of the result
|
||||||
|
result = result + nf->error(values);
|
||||||
|
|
||||||
|
} else if (auto df = std::dynamic_pointer_cast<DiscreteFactor>(factor)) {
|
||||||
|
// If discrete, just add its errorTree as well
|
||||||
|
result = result + df->errorTree();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw std::runtime_error(
|
||||||
|
"HybridNonlinearFactorGraph::errorTree(Values) not implemented for "
|
||||||
|
"factor type " +
|
||||||
|
demangle(typeid(factor).name()) + ".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace gtsam
|
} // namespace gtsam
|
||||||
|
|
|
@ -90,6 +90,19 @@ class GTSAM_EXPORT HybridNonlinearFactorGraph : public HybridFactorGraph {
|
||||||
/// Expose error(const HybridValues&) method.
|
/// Expose error(const HybridValues&) method.
|
||||||
using Base::error;
|
using Base::error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute error of (hybrid) nonlinear factors and discrete factors
|
||||||
|
* over each discrete assignment, and return as a tree.
|
||||||
|
*
|
||||||
|
* Error \f$ e = \Vert f(x) - \mu \Vert_{\Sigma} \f$.
|
||||||
|
*
|
||||||
|
* @note: Gaussian and hybrid Gaussian factors are not considered!
|
||||||
|
*
|
||||||
|
* @param values Manifold values at which to compute the error.
|
||||||
|
* @return AlgebraicDecisionTree<Key>
|
||||||
|
*/
|
||||||
|
AlgebraicDecisionTree<Key> errorTree(const Values& values) const;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue