Go to the documentation of this file.
53 #define GTSAM_HYBRID_WITH_TABLEFACTOR 1
58 template class EliminateableFactorGraph<HybridGaussianFactorGraph>;
60 using std::dynamic_pointer_cast;
72 return conditional ==
other.conditional && negLogK ==
other.negLogK &&
83 const std::shared_ptr<Factor> &
f) {
85 throw std::runtime_error(
s +
" not implemented for factor type " +
94 index,
KeyVector(discrete_keys.begin(), discrete_keys.end()),
true);
101 if (
auto hgf = dynamic_pointer_cast<HybridGaussianFactor>(
factor)) {
102 if (assignment.empty()) {
103 hgf->print(
"HybridGaussianFactor:", keyFormatter);
105 hgf->operator()(assignment)
106 .first->print(
"HybridGaussianFactor, component:", keyFormatter);
108 }
else if (
auto gf = dynamic_pointer_cast<GaussianFactor>(
factor)) {
111 }
else if (
auto df = dynamic_pointer_cast<DiscreteFactor>(
factor)) {
113 }
else if (
auto hc = dynamic_pointer_cast<HybridConditional>(
factor)) {
114 if (
hc->isContinuous()) {
115 factor->
print(
"GaussianConditional:\n", keyFormatter);
116 }
else if (
hc->isDiscrete()) {
117 factor->
print(
"DiscreteConditional:\n", keyFormatter);
119 if (assignment.empty()) {
120 hc->print(
"HybridConditional:", keyFormatter);
124 ->print(
"HybridConditional, component:\n", keyFormatter);
128 factor->
print(
"Unknown factor type\n", keyFormatter);
135 std::cout << (
s.empty() ?
"" :
s +
" ") << std::endl;
136 std::cout <<
"size: " <<
size() << std::endl;
141 std::cout <<
"Factor " <<
i <<
": nullptr\n";
145 std::cout <<
"Factor " <<
i <<
"\n";
156 const std::function<
bool(
const Factor * ,
158 &printCondition)
const {
159 std::cout <<
str <<
"size: " <<
size() << std::endl << std::endl;
164 std::cout <<
"Factor " <<
i <<
": nullptr\n";
168 if (!printCondition(
factor.get(), errorValue,
i))
172 std::cout <<
"Factor " <<
i <<
", error = " << errorValue <<
"\n";
186 if (
auto orphan = dynamic_pointer_cast<OrphanWrapper>(
f)) {
188 }
else if (
auto gf = dynamic_pointer_cast<GaussianFactor>(
f)) {
190 }
else if (
auto gc = dynamic_pointer_cast<GaussianConditional>(
f)) {
192 }
else if (
auto gmf = dynamic_pointer_cast<HybridGaussianFactor>(
f)) {
194 }
else if (
auto gm = dynamic_pointer_cast<HybridGaussianConditional>(
f)) {
196 }
else if (
auto hc = dynamic_pointer_cast<HybridConditional>(
f)) {
197 if (
auto gm =
hc->asHybrid()) {
199 }
else if (
auto g =
hc->asGaussian()) {
206 }
else if (dynamic_pointer_cast<DiscreteFactor>(
f)) {
221 static std::pair<HybridConditional::shared_ptr, std::shared_ptr<Factor>>
226 if (
auto gf = dynamic_pointer_cast<GaussianFactor>(
f)) {
228 }
else if (
auto orphan = dynamic_pointer_cast<OrphanWrapper>(
f)) {
231 }
else if (
auto hc = dynamic_pointer_cast<HybridConditional>(
f)) {
232 auto gc =
hc->asGaussian();
241 return {std::make_shared<HybridConditional>(
result.first),
result.second};
255 double min_log = errors.
min();
257 errors, [&min_log](
const double x) {
return exp(-(
x - min_log)); });
258 #if GTSAM_HYBRID_WITH_TABLEFACTOR
259 return std::make_shared<TableFactor>(discreteKeys, potentials);
261 return std::make_shared<DecisionTreeFactor>(discreteKeys, potentials);
271 if (
auto df = dynamic_pointer_cast<DiscreteFactor>(
f)) {
274 }
else if (
auto gmf = dynamic_pointer_cast<HybridGaussianFactor>(
f)) {
277 auto calculateError = [&](
const auto &pair) ->
double {
280 if (!
factor)
return std::numeric_limits<double>::infinity();
286 }
else if (
auto orphan = dynamic_pointer_cast<OrphanWrapper>(
f)) {
289 }
else if (
auto hc = dynamic_pointer_cast<HybridConditional>(
f)) {
290 auto dc =
hc->asDiscrete();
292 #if GTSAM_HYBRID_TIMING
293 gttic_(ConvertConditionalToTableFactor);
295 if (
auto dtc = std::dynamic_pointer_cast<TableDistribution>(dc)) {
299 #if GTSAM_HYBRID_WITH_TABLEFACTOR
301 auto tdc = std::make_shared<TableFactor>(*dc);
307 #if GTSAM_HYBRID_TIMING
308 gttoc_(ConvertConditionalToTableFactor);
319 static std::pair<HybridConditional::shared_ptr, std::shared_ptr<Factor>>
322 #if GTSAM_HYBRID_TIMING
326 #if GTSAM_HYBRID_TIMING
330 #if GTSAM_HYBRID_TIMING
333 #if GTSAM_HYBRID_WITH_TABLEFACTOR
339 if (frontalKeys.size() == dfg.
keys().size()) {
347 if (
auto tf = std::dynamic_pointer_cast<TableFactor>(
product)) {
352 auto conditional = std::make_shared<TableDistribution>(
p);
356 return {std::make_shared<HybridConditional>(conditional), sum};
362 return {std::make_shared<HybridConditional>(
result.first),
result.second};
363 #if GTSAM_HYBRID_WITH_TABLEFACTOR
366 #if GTSAM_HYBRID_TIMING
381 auto calculateError = [&](
const Result &
result) ->
double {
390 return std::numeric_limits<double>::infinity();
392 throw std::runtime_error(
"createDiscreteFactor has mixed NULLs");
396 #if GTSAM_HYBRID_TIMING
397 gttic_(DiscreteBoundaryErrors);
400 #if GTSAM_HYBRID_TIMING
401 gttoc_(DiscreteBoundaryErrors);
402 gttic_(DiscreteBoundaryResult);
405 #if GTSAM_HYBRID_TIMING
406 gttoc_(DiscreteBoundaryResult);
422 return {
nullptr, std::numeric_limits<double>::infinity()};
424 throw std::runtime_error(
"createHybridGaussianFactors has mixed NULLs");
427 #if GTSAM_HYBRID_TIMING
428 gttic_(HybridCreateGaussianFactor);
432 #if GTSAM_HYBRID_TIMING
433 gttoc_(HybridCreateGaussianFactor);
436 return std::make_shared<HybridGaussianFactor>(discreteSeparator, newFactors);
443 const std::set<DiscreteKey> discreteKeySet = hfg.discreteKeys();
444 return {discreteKeySet.begin(), discreteKeySet.end()};
448 std::pair<HybridConditional::shared_ptr, std::shared_ptr<Factor>>
454 #if GTSAM_HYBRID_TIMING
455 gttic_(HybridCollectProductFactor);
463 #if GTSAM_HYBRID_TIMING
464 gttoc_(HybridCollectProductFactor);
471 bool someContinuousLeft =
false;
473 [&](
const std::pair<GaussianFactorGraph, double> &pair) ->
Result {
479 return {
nullptr, 0.0,
nullptr, 0.0};
483 auto [conditional,
factor] =
487 someContinuousLeft |= !
factor->empty();
490 return {conditional, conditional->negLogConstant(),
factor,
scalar};
493 #if GTSAM_HYBRID_TIMING
498 #if GTSAM_HYBRID_TIMING
515 auto hybridGaussian =
516 std::make_shared<HybridGaussianConditional>(discreteSeparator, pairs);
518 return {std::make_shared<HybridConditional>(hybridGaussian), newFactor};
535 std::pair<HybridConditional::shared_ptr, std::shared_ptr<Factor>>
587 bool only_discrete =
true, only_continuous =
true;
589 if (
auto hybrid_factor = std::dynamic_pointer_cast<HybridFactor>(
factor)) {
590 if (hybrid_factor->isDiscrete()) {
591 only_continuous =
false;
592 }
else if (hybrid_factor->isContinuous()) {
593 only_discrete =
false;
594 }
else if (hybrid_factor->isHybrid()) {
595 only_continuous =
false;
596 only_discrete =
false;
599 }
else if (
auto cont_factor =
600 std::dynamic_pointer_cast<GaussianFactor>(
factor)) {
601 only_discrete =
false;
602 }
else if (
auto discrete_factor =
603 std::dynamic_pointer_cast<DiscreteFactor>(
factor)) {
604 only_continuous =
false;
613 }
else if (only_continuous) {
628 if (
auto hf = std::dynamic_pointer_cast<HybridFactor>(
factor)) {
631 }
else if (
auto df = std::dynamic_pointer_cast<DiscreteFactor>(
factor)) {
634 }
else if (
auto gf = dynamic_pointer_cast<GaussianFactor>(
factor)) {
666 for (
auto &&
f : *
this) {
667 if (
auto gf = std::dynamic_pointer_cast<GaussianFactor>(
f)) {
669 }
else if (
auto gc = std::dynamic_pointer_cast<GaussianConditional>(
f)) {
671 }
else if (
auto hgf = std::dynamic_pointer_cast<HybridGaussianFactor>(
f)) {
673 }
else if (
auto hgc = dynamic_pointer_cast<HybridGaussianConditional>(
f)) {
675 }
else if (
auto hc = dynamic_pointer_cast<HybridConditional>(
f)) {
676 if (
auto gc =
hc->asGaussian())
678 else if (
auto hgc =
hc->asHybrid())
691 if (
auto discreteFactor = std::dynamic_pointer_cast<DiscreteFactor>(
f)) {
std::pair< DiscreteConditional::shared_ptr, DiscreteFactor::shared_ptr > EliminateDiscrete(const DiscreteFactorGraph &factors, const Ordering &frontalKeys)
Main elimination function for DiscreteFactorGraph.
static Ordering ColamdConstrainedLast(const FACTOR_GRAPH &graph, const KeyVector &constrainLast, bool forceOrder=false)
Linear Factor Graph where all factors are Gaussians.
Conditional Gaussian Base class.
FastVector< sharedFactor > factors_
GaussianConditional::shared_ptr conditional
A hybrid conditional in the Conditional Linear Gaussian scheme.
double error(const HybridValues &values) const
static DiscreteFactor::shared_ptr DiscreteFactorFromErrors(const DiscreteKeys &discreteKeys, const AlgebraicDecisionTree< Key > &errors)
Take negative log-values, shift them so that the minimum value is 0, and then exponentiate to create ...
const GaussianFactorGraph factors
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
static auto GetDiscreteKeys
Get the discrete keys from the HybridGaussianFactorGraph as DiscreteKeys.
double error(const DiscreteValues &values) const override
Calculate error for DiscreteValues x, is -log(probability).
Alias for DecisionTree of GaussianFactorGraphs and their scalar sums.
Contains the HessianFactor class, a general quadratic factor.
DiscreteKeys is a set of keys that can be assembled using the & operator.
negation< all_of< negation< Ts >... > > any_of
const EIGEN_DEVICE_FUNC ExpReturnType exp() const
DiscreteFactorGraph discreteFactors() const
Helper method to get all the discrete factors as a DiscreteFactorGraph.
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
A set of GaussianFactors, indexed by a set of discrete keys.
HybridGaussianProductFactor collectProductFactor() const
Create a decision tree of factor graphs out of this hybrid factor graph.
DecisionTreeFactor factor(D &C &B &A, "0.0 0.0 0.0 0.60658897 0.61241912 0.61241969 0.61247685 0.61247742 0.0 " "0.0 0.0 0.99995287 1.0 1.0 1.0 1.0")
DiscreteFactor::shared_ptr scaledProduct() const
Return product of all factors as a single factor, which is scaled by the max value to prevent underfl...
std::pair< std::shared_ptr< GaussianConditional >, std::shared_ptr< GaussianFactor > > EliminatePreferCholesky(const GaussianFactorGraph &factors, const Ordering &keys)
std::pair< GaussianFactor::shared_ptr, double > GaussianFactorValuePair
Alias for pair of GaussianFactor::shared_pointer and a double value.
static void throwRuntimeError(const std::string &s, const std::shared_ptr< Factor > &f)
static std::shared_ptr< Factor > createDiscreteFactor(const ResultTree &eliminationResults, const DiscreteKeys &discreteSeparator)
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
static DiscreteFactorGraph CollectDiscreteFactors(const HybridGaussianFactorGraph &factors)
mxArray * scalar(mxClassID classid)
std::shared_ptr< This > shared_ptr
shared_ptr to this class
static std::pair< HybridConditional::shared_ptr, std::shared_ptr< Factor > > continuousElimination(const HybridGaussianFactorGraph &factors, const Ordering &frontalKeys)
An assignment from labels to a discrete value index (size_t)
static std::pair< HybridConditional::shared_ptr, std::shared_ptr< Factor > > discreteElimination(const HybridGaussianFactorGraph &factors, const Ordering &frontalKeys)
std::pair< std::shared_ptr< HybridConditional >, std::shared_ptr< Factor > > eliminate(const Ordering &keys) const
Eliminate the given continuous keys.
static const VectorValues kEmpty
void print(const std::string &s="DecisionTreeFactor:\n", const KeyFormatter &formatter=DefaultKeyFormatter) const override
print
std::pair< HybridConditional::shared_ptr, std::shared_ptr< Factor > > EliminateHybrid(const HybridGaussianFactorGraph &factors, const Ordering &keys)
Main elimination function for HybridGaussianFactorGraph.
static void printFactor(const std::shared_ptr< Factor > &factor, const DiscreteValues &assignment, const KeyFormatter &keyFormatter)
DecisionTree apply(const Unary &op) const
void g(const string &key, int i)
specialized key for discrete variables
bool operator==(const Result &other) const
Point2(* f)(const Point3 &, OptionalJacobian< 2, 3 >)
a decision tree is a function from assignments to values.
Linearized Hybrid factor graph that uses type erasure.
GaussianFactorGraph choose(const DiscreteValues &assignment) const
Get the GaussianFactorGraph at a given discrete assignment. Note this corresponds to the Gaussian pos...
std::shared_ptr< DiscreteFactor > shared_ptr
shared_ptr to this class
void printErrors(const HybridValues &values, const std::string &str="HybridGaussianFactorGraph: ", const KeyFormatter &keyFormatter=DefaultKeyFormatter, const std::function< bool(const Factor *, double, size_t)> &printCondition=[](const Factor *, double, size_t) { return true;}) const
Print the errors of each factor in the hybrid factor graph.
double probPrime(const HybridValues &values) const
Compute the unnormalized posterior probability for a continuous vector values given a specific assign...
IsDerived< DERIVEDFACTOR > push_back(std::shared_ptr< DERIVEDFACTOR > factor)
Add a factor directly using a shared_ptr.
static std::shared_ptr< Factor > createHybridGaussianFactor(const ResultTree &eliminationResults, const DiscreteKeys &discreteSeparator)
std::string demangle(const char *name)
Pretty print Value type name.
GaussianFactor::shared_ptr factor
std::shared_ptr< This > shared_ptr
shared_ptr to this class
AlgebraicDecisionTree< Key > errorTree(const VectorValues &continuousValues) const
Compute error for each discrete assignment, and return as a tree.
void print(const std::string &s="HybridGaussianFactorGraph", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
Print out graph to std::cout, with optional key formatter.
void product(const MatrixType &m)
const Ordering HybridOrdering(const HybridGaussianFactorGraph &graph)
Return a Colamd constrained ordering where the discrete keys are eliminated after the continuous keys...
double min() const
Find the minimum values amongst all leaves.
AlgebraicDecisionTree< Key > discretePosterior(const VectorValues &continuousValues) const
Computer posterior P(M|X=x) when all continuous values X are given. This is efficient as this simply ...
NonlinearFactorGraph graph
gtsam
Author(s):
autogenerated on Wed Mar 19 2025 03:01:48