HybridGaussianConditional.cpp
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
21 #include <gtsam/base/utilities.h>
30 
31 #include <cstddef>
32 
33 namespace gtsam {
34 /* *******************************************************************************/
36  std::optional<size_t> nrFrontals;
40 
42  using P = std::vector<std::pair<Vector, double>>;
43 
45  template <typename... Args>
46  explicit Helper(const DiscreteKey &mode, const P &p, Args &&...args) {
47  nrFrontals = 1;
48  minNegLogConstant = std::numeric_limits<double>::infinity();
49 
50  std::vector<GaussianFactorValuePair> fvs;
51  std::vector<GC::shared_ptr> gcs;
52  fvs.reserve(p.size());
53  gcs.reserve(p.size());
54  for (auto &&[mean, sigma] : p) {
55  auto gaussianConditional =
56  GC::sharedMeanAndStddev(std::forward<Args>(args)..., mean, sigma);
57  double value = gaussianConditional->negLogConstant();
59  fvs.emplace_back(gaussianConditional, value);
60  gcs.push_back(gaussianConditional);
61  }
62 
63  conditionals = Conditionals({mode}, gcs);
64  pairs = FactorValuePairs({mode}, fvs);
65  }
66 
68  explicit Helper(const Conditionals &conditionals)
70  minNegLogConstant(std::numeric_limits<double>::infinity()) {
71  auto func = [this](const GC::shared_ptr &c) -> GaussianFactorValuePair {
72  double value = 0.0;
73  if (c) {
74  if (!nrFrontals.has_value()) {
75  nrFrontals = c->nrFrontals();
76  }
77  value = c->negLogConstant();
79  }
80  return {std::dynamic_pointer_cast<GaussianFactor>(c), value};
81  };
83  if (!nrFrontals.has_value()) {
84  throw std::runtime_error(
85  "HybridGaussianConditional: need at least one frontal variable. "
86  "Provided conditionals do not contain any frontal variables.");
87  }
88  }
89 };
90 
91 /* *******************************************************************************/
93  const DiscreteKeys &discreteParents, const Helper &helper)
94  : BaseFactor(discreteParents, helper.pairs),
95  BaseConditional(*helper.nrFrontals),
96  conditionals_(helper.conditionals),
97  negLogConstant_(helper.minNegLogConstant) {}
98 
100  const DiscreteKey &discreteParent,
101  const std::vector<GaussianConditional::shared_ptr> &conditionals)
102  : HybridGaussianConditional(DiscreteKeys{discreteParent},
103  Conditionals({discreteParent}, conditionals)) {}
104 
106  const DiscreteKey &discreteParent, Key key, //
107  const std::vector<std::pair<Vector, double>> &parameters)
108  : HybridGaussianConditional(DiscreteKeys{discreteParent},
109  Helper(discreteParent, parameters, key)) {}
110 
112  const DiscreteKey &discreteParent, Key key, //
113  const Matrix &A, Key parent,
114  const std::vector<std::pair<Vector, double>> &parameters)
116  DiscreteKeys{discreteParent},
117  Helper(discreteParent, parameters, key, A, parent)) {}
118 
120  const DiscreteKey &discreteParent, Key key, //
121  const Matrix &A1, Key parent1, const Matrix &A2, Key parent2,
122  const std::vector<std::pair<Vector, double>> &parameters)
124  DiscreteKeys{discreteParent},
125  Helper(discreteParent, parameters, key, A1, parent1, A2, parent2)) {}
126 
128  const DiscreteKeys &discreteParents,
130  : HybridGaussianConditional(discreteParents, Helper(conditionals)) {}
131 
132 /* *******************************************************************************/
135  return conditionals_;
136 }
137 
138 /* *******************************************************************************/
140  const {
141  auto wrap = [this](const GaussianConditional::shared_ptr &gc) {
142  // First check if conditional has not been pruned
143  if (gc) {
144  const double Cgm_Kgcm = gc->negLogConstant() - this->negLogConstant_;
145  // If there is a difference in the covariances, we need to account for
146  // that since the error is dependent on the mode.
147  if (Cgm_Kgcm > 0.0) {
148  // We add a constant factor which will be used when computing
149  // the probability of the discrete variables.
150  Vector c(1);
151  c << std::sqrt(2.0 * Cgm_Kgcm);
152  auto constantFactor = std::make_shared<JacobianFactor>(c);
153  return GaussianFactorGraph{gc, constantFactor};
154  }
155  }
156  return GaussianFactorGraph{gc};
157  };
158  return {conditionals_, wrap};
159 }
160 
161 /* *******************************************************************************/
163  size_t total = 0;
164  conditionals_.visit([&total](const GaussianFactor::shared_ptr &node) {
165  if (node) total += 1;
166  });
167  return total;
168 }
169 
170 /* *******************************************************************************/
172  const DiscreteValues &discreteValues) const {
173  auto &ptr = conditionals_(discreteValues);
174  if (!ptr) return nullptr;
175  auto conditional = std::dynamic_pointer_cast<GaussianConditional>(ptr);
176  if (conditional)
177  return conditional;
178  else
179  throw std::logic_error(
180  "A HybridGaussianConditional unexpectedly contained a non-conditional");
181 }
182 
183 /* *******************************************************************************/
185  double tol) const {
186  const This *e = dynamic_cast<const This *>(&lf);
187  if (e == nullptr) return false;
188 
189  // This will return false if either conditionals_ is empty or e->conditionals_
190  // is empty, but not if both are empty or both are not empty:
191  if (conditionals_.empty() ^ e->conditionals_.empty()) return false;
192 
193  // Check the base and the factors:
194  return BaseFactor::equals(*e, tol) &&
196  e->conditionals_, [tol](const auto &f1, const auto &f2) {
197  return (!f1 && !f2) || (f1 && f2 && f1->equals(*f2, tol));
198  });
199 }
200 
201 /* *******************************************************************************/
202 void HybridGaussianConditional::print(const std::string &s,
203  const KeyFormatter &formatter) const {
204  std::cout << (s.empty() ? "" : s + "\n");
205  if (isContinuous()) std::cout << "Continuous ";
206  if (isDiscrete()) std::cout << "Discrete ";
207  if (isHybrid()) std::cout << "Hybrid ";
209  std::cout << " Discrete Keys = ";
210  for (auto &dk : discreteKeys()) {
211  std::cout << "(" << formatter(dk.first) << ", " << dk.second << "), ";
212  }
213  std::cout << std::endl
214  << " logNormalizationConstant: " << -negLogConstant() << std::endl
215  << std::endl;
217  "", [&](Key k) { return formatter(k); },
218  [&](const GaussianConditional::shared_ptr &gf) -> std::string {
219  RedirectCout rd;
220  if (gf && !gf->empty()) {
221  gf->print("", formatter);
222  return rd.str();
223  } else {
224  return "nullptr";
225  }
226  });
227 }
228 
229 /* ************************************************************************* */
231  // Get all parent keys:
232  const auto range = parents();
233  KeyVector continuousParentKeys(range.begin(), range.end());
234  // Loop over all discrete keys:
235  for (const auto &discreteKey : discreteKeys()) {
236  const Key key = discreteKey.first;
237  // remove that key from continuousParentKeys:
238  continuousParentKeys.erase(std::remove(continuousParentKeys.begin(),
239  continuousParentKeys.end(), key),
240  continuousParentKeys.end());
241  }
242  return continuousParentKeys;
243 }
244 
245 /* ************************************************************************* */
247  const VectorValues &given) const {
248  for (auto &&kv : given) {
249  if (given.find(kv.first) == given.end()) {
250  return false;
251  }
252  }
253  return true;
254 }
255 
256 /* ************************************************************************* */
257 std::shared_ptr<HybridGaussianFactor> HybridGaussianConditional::likelihood(
258  const VectorValues &given) const {
259  if (!allFrontalsGiven(given)) {
260  throw std::runtime_error(
261  "HybridGaussianConditional::likelihood: given values are missing some "
262  "frontals.");
263  }
264 
265  const DiscreteKeys discreteParentKeys = discreteKeys();
266  const KeyVector continuousParentKeys = continuousParents();
267  const HybridGaussianFactor::FactorValuePairs likelihoods(
269  [&](const GaussianConditional::shared_ptr &conditional)
271  const auto likelihood_m = conditional->likelihood(given);
272  const double Cgm_Kgcm = conditional->negLogConstant() - negLogConstant_;
273  if (Cgm_Kgcm == 0.0) {
274  return {likelihood_m, 0.0};
275  } else {
276  // Add a constant to the likelihood in case the noise models
277  // are not all equal.
278  return {likelihood_m, Cgm_Kgcm};
279  }
280  });
281  return std::make_shared<HybridGaussianFactor>(discreteParentKeys,
282  likelihoods);
283 }
284 
285 /* ************************************************************************* */
286 std::set<DiscreteKey> DiscreteKeysAsSet(const DiscreteKeys &discreteKeys) {
287  std::set<DiscreteKey> s(discreteKeys.begin(), discreteKeys.end());
288  return s;
289 }
290 
291 /* ************************************************************************* */
292 std::function<GaussianConditional::shared_ptr(
293  const Assignment<Key> &, const GaussianConditional::shared_ptr &)>
295  // Get the discrete keys as sets for the decision tree
296  // and the hybrid gaussian conditional.
297  auto discreteProbsKeySet = DiscreteKeysAsSet(discreteProbs.discreteKeys());
298  auto hybridGaussianCondKeySet = DiscreteKeysAsSet(this->discreteKeys());
299 
300  auto pruner = [discreteProbs, discreteProbsKeySet, hybridGaussianCondKeySet](
301  const Assignment<Key> &choices,
302  const GaussianConditional::shared_ptr &conditional)
304  // typecast so we can use this to get probability value
305  const DiscreteValues values(choices);
306 
307  // Case where the hybrid gaussian conditional has the same
308  // discrete keys as the decision tree.
309  if (hybridGaussianCondKeySet == discreteProbsKeySet) {
310  if (discreteProbs(values) == 0.0) {
311  // empty aka null pointer
312  std::shared_ptr<GaussianConditional> null;
313  return null;
314  } else {
315  return conditional;
316  }
317  } else {
318  std::vector<DiscreteKey> set_diff;
319  std::set_difference(
320  discreteProbsKeySet.begin(), discreteProbsKeySet.end(),
321  hybridGaussianCondKeySet.begin(), hybridGaussianCondKeySet.end(),
322  std::back_inserter(set_diff));
323 
324  const std::vector<DiscreteValues> assignments =
326  for (const DiscreteValues &assignment : assignments) {
327  DiscreteValues augmented_values(values);
328  augmented_values.insert(assignment);
329 
330  // If any one of the sub-branches are non-zero,
331  // we need this conditional.
332  if (discreteProbs(augmented_values) > 0.0) {
333  return conditional;
334  }
335  }
336  // If we are here, it means that all the sub-branches are 0,
337  // so we prune.
338  return nullptr;
339  }
340  };
341  return pruner;
342 }
343 
344 /* *******************************************************************************/
346  // Functional which loops over all assignments and create a set of
347  // GaussianConditionals
348  auto pruner = prunerFunc(discreteProbs);
349 
350  auto pruned_conditionals = conditionals_.apply(pruner);
351  conditionals_.root_ = pruned_conditionals.root_;
352 }
353 
354 /* *******************************************************************************/
356  const VectorValues &continuousValues) const {
357  // functor to calculate (double) logProbability value from
358  // GaussianConditional.
359  auto probFunc =
360  [continuousValues](const GaussianConditional::shared_ptr &conditional) {
361  if (conditional) {
362  return conditional->logProbability(continuousValues);
363  } else {
364  // Return arbitrarily small logProbability if conditional is null
365  // Conditional is null if it is pruned out.
366  return -1e20;
367  }
368  };
369  return DecisionTree<Key, double>(conditionals_, probFunc);
370 }
371 
372 /* *******************************************************************************/
374  const HybridValues &values) const {
375  auto conditional = conditionals_(values.discrete());
376  return conditional->logProbability(values.continuous());
377 }
378 
379 /* *******************************************************************************/
381  auto conditional = conditionals_(values.discrete());
382  return conditional->evaluate(values.continuous());
383 }
384 
385 } // namespace gtsam
gtsam::Conditional::print
void print(const std::string &s="Conditional", const KeyFormatter &formatter=DefaultKeyFormatter) const
Definition: Conditional-inst.h:30
GaussianFactorGraph.h
Linear Factor Graph where all factors are Gaussians.
gtsam::DecisionTreeFactor
Definition: DecisionTreeFactor.h:44
gtsam::HybridValues
Definition: HybridValues.h:37
gtsam::HybridGaussianConditional::Helper::Helper
Helper(const Conditionals &conditionals)
Construct from tree of GaussianConditionals.
Definition: HybridGaussianConditional.cpp:68
test_constructor::f1
auto f1
Definition: testHybridNonlinearFactor.cpp:56
HybridGaussianConditional.h
A hybrid conditional in the Conditional Linear Gaussian scheme.
s
RealScalar s
Definition: level1_cplx_impl.h:126
e
Array< double, 1, 3 > e(1./3., 0.5, 2.)
gtsam::HybridGaussianConditional::choose
GaussianConditional::shared_ptr choose(const DiscreteValues &discreteValues) const
Return the conditional Gaussian for the given discrete assignment.
Definition: HybridGaussianConditional.cpp:171
gtsam::HybridGaussianConditional::conditionals_
Conditionals conditionals_
a decision tree of Gaussian conditionals.
Definition: HybridGaussianConditional.h:66
gtsam::HybridGaussianConditional::Helper
Definition: HybridGaussianConditional.cpp:35
gtsam::DecisionTree::empty
bool empty() const
Check if tree is empty.
Definition: DecisionTree.h:269
gtsam::HybridGaussianConditional::Helper::Helper
Helper(const DiscreteKey &mode, const P &p, Args &&...args)
Construct from a vector of mean and sigma pairs, plus extra args.
Definition: HybridGaussianConditional.cpp:46
c
Scalar Scalar * c
Definition: benchVecAdd.cpp:17
gtsam::DecisionTree::equals
bool equals(const DecisionTree &other, const CompareFunc &compare=&DefaultCompare) const
Definition: DecisionTree-inl.h:899
gtsam::HybridFactor::isDiscrete
bool isDiscrete() const
True if this is a factor of discrete variables only.
Definition: HybridFactor.h:122
gtsam::RedirectCout
Definition: base/utilities.h:16
gtsam::HybridFactor
Definition: HybridFactor.h:54
wrap
mxArray * wrap(const Class &value)
Definition: matlab.h:126
formatter
const KeyFormatter & formatter
Definition: treeTraversal-inst.h:204
f2
double f2(const Vector2 &x)
Definition: testNumericalDerivative.cpp:56
gtsam::Matrix
Eigen::MatrixXd Matrix
Definition: base/Matrix.h:39
different_sigmas::values
HybridValues values
Definition: testHybridBayesNet.cpp:195
gtsam::DiscreteKeys
DiscreteKeys is a set of keys that can be assembled using the & operator.
Definition: DiscreteKey.h:41
gtsam::DecisionTree::print
void print(const std::string &s, const LabelFormatter &labelFormatter, const ValueFormatter &valueFormatter) const
GTSAM-style print.
Definition: DecisionTree-inl.h:905
GaussianBayesNet.h
Chordal Bayes Net, the result of eliminating a factor graph.
gtsam::HybridFactor::isHybrid
bool isHybrid() const
True is this is a Discrete-Continuous factor.
Definition: HybridFactor.h:128
gtsam::Vector
Eigen::VectorXd Vector
Definition: Vector.h:38
gtsam::KeyVector
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition: Key.h:92
HybridGaussianFactor.h
A set of GaussianFactors, indexed by a set of discrete keys.
utilities.h
equal_constants::conditionals
const std::vector< GaussianConditional::shared_ptr > conditionals
Definition: testHybridGaussianConditional.cpp:50
sampling::sigma
static const double sigma
Definition: testGaussianBayesNet.cpp:170
gtsam::AlgebraicDecisionTree< Key >
gtsam::range
Double_ range(const Point2_ &p, const Point2_ &q)
Definition: slam/expressions.h:30
gtsam::HybridGaussianConditional::Helper::conditionals
Conditionals conditionals
Definition: HybridGaussianConditional.cpp:38
gtsam::GaussianFactorGraph
Definition: GaussianFactorGraph.h:73
gtsam::HybridGaussianConditional::logProbability
AlgebraicDecisionTree< Key > logProbability(const VectorValues &continuousValues) const
Compute logProbability of the HybridGaussianConditional as a tree.
Definition: HybridGaussianConditional.cpp:355
gtsam::HybridGaussianConditional::evaluate
double evaluate(const HybridValues &values) const override
Calculate probability density for given values.
Definition: HybridGaussianConditional.cpp:380
gtsam::DecisionTree::root_
NodePtr root_
A DecisionTree just contains the root. TODO(dellaert): make protected.
Definition: DecisionTree.h:150
A
Definition: test_numpy_dtypes.cpp:298
gtsam::GaussianFactorValuePair
std::pair< GaussianFactor::shared_ptr, double > GaussianFactorValuePair
Alias for pair of GaussianFactor::shared_pointer and a double value.
Definition: HybridGaussianFactor.h:37
gtsam::VectorValues
Definition: VectorValues.h:74
gtsam::DiscreteValues::CartesianProduct
static std::vector< DiscreteValues > CartesianProduct(const DiscreteKeys &keys)
Return a vector of DiscreteValues, one for each possible combination of values.
Definition: DiscreteValues.h:85
mode
static const DiscreteKey mode(modeKey, 2)
gtsam::KeyFormatter
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
parameters
static ConjugateGradientParameters parameters
Definition: testIterative.cpp:33
gtsam::HybridGaussianConditional::nrComponents
size_t nrComponents() const
Returns the total number of continuous components.
Definition: HybridGaussianConditional.cpp:162
gtsam::GaussianFactor::shared_ptr
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianFactor.h:42
gtsam::GaussianConditional
Definition: GaussianConditional.h:40
A2
static const double A2[]
Definition: expn.h:7
gtsam::HybridGaussianConditional::Helper::P
std::vector< std::pair< Vector, double > > P
Definition: HybridGaussianConditional.cpp:42
gtsam::HybridGaussianConditional
A conditional of gaussian conditionals indexed by discrete variables, as part of a Bayes Network....
Definition: HybridGaussianConditional.h:53
gtsam::DecisionTree::visit
void visit(Func f) const
Visit all leaves in depth-first fashion.
Definition: DecisionTree-inl.h:769
gtsam::HybridGaussianConditional::prune
void prune(const DecisionTreeFactor &discreteProbs)
Prune the decision tree of Gaussian factors as per the discrete discreteProbs.
Definition: HybridGaussianConditional.cpp:345
gtsam::Assignment< Key >
gtsam::HybridGaussianConditional::continuousParents
KeyVector continuousParents() const
Returns the continuous keys among the parents.
Definition: HybridGaussianConditional.cpp:230
gtsam::HybridFactor::isContinuous
bool isContinuous() const
True if this is a factor of continuous variables only.
Definition: HybridFactor.h:125
gtsam::Conditional
Definition: Conditional.h:63
gtsam::DecisionTree::apply
DecisionTree apply(const Unary &op) const
Definition: DecisionTree-inl.h:922
gtsam::HybridGaussianConditional::likelihood
std::shared_ptr< HybridGaussianFactor > likelihood(const VectorValues &given) const
Definition: HybridGaussianConditional.cpp:257
gtsam::Conditional< HybridGaussianFactor, HybridGaussianConditional >::parents
Parents parents() const
Definition: Conditional.h:148
gtsam::HybridGaussianFactor::equals
bool equals(const HybridFactor &lf, double tol=1e-9) const override
equals
Definition: HybridGaussianFactor.cpp:147
gtsam::HybridGaussianConditional::Helper::minNegLogConstant
double minNegLogConstant
Definition: HybridGaussianConditional.cpp:39
gtsam::HybridGaussianConditional::Helper::nrFrontals
std::optional< size_t > nrFrontals
Definition: HybridGaussianConditional.cpp:36
key
const gtsam::Symbol key('X', 0)
gtsam::HybridGaussianConditional::asGaussianFactorGraphTree
GaussianFactorGraphTree asGaussianFactorGraphTree() const
Convert to a DecisionTree of Gaussian factor graphs.
Definition: HybridGaussianConditional.cpp:139
JacobianFactor.h
gtsam::DecisionTree< Key, GaussianFactorValuePair >
gtsam::HybridGaussianConditional::Helper::pairs
FactorValuePairs pairs
Definition: HybridGaussianConditional.cpp:37
gtsam::DiscreteKeysAsSet
std::set< DiscreteKey > DiscreteKeysAsSet(const DiscreteKeys &discreteKeys)
Return the DiscreteKey vector as a set.
Definition: HybridGaussianConditional.cpp:286
different_sigmas::gc
const auto gc
Definition: testHybridBayesNet.cpp:181
gtsam::HybridGaussianConditional::Conditionals
DecisionTree< Key, GaussianConditional::shared_ptr > Conditionals
typedef for Decision Tree of Gaussian Conditionals
Definition: HybridGaussianConditional.h:63
gtsam
traits
Definition: chartTesting.h:28
DiscreteValues.h
gtsam::HybridGaussianFactor::FactorValuePairs
DecisionTree< Key, GaussianFactorValuePair > FactorValuePairs
typedef for Decision Tree of Gaussian factors and arbitrary value.
Definition: HybridGaussianFactor.h:68
gtsam::mean
Point3 mean(const CONTAINER &points)
mean
Definition: Point3.h:70
gtsam::DiscreteValues
Definition: DiscreteValues.h:34
gtsam::DiscreteKey
std::pair< Key, size_t > DiscreteKey
Definition: DiscreteKey.h:38
std
Definition: BFloat16.h:88
args
Definition: pytypes.h:2210
gtsam::HybridGaussianConditional::allFrontalsGiven
bool allFrontalsGiven(const VectorValues &given) const
Check whether given has values for all frontal keys.
Definition: HybridGaussianConditional.cpp:246
gtsam::DiscreteValues::insert
std::pair< iterator, bool > insert(const value_type &value)
Definition: DiscreteValues.h:68
p
float * p
Definition: Tutorial_Map_using.cpp:9
gtsam::HybridGaussianConditional::equals
bool equals(const HybridFactor &lf, double tol=1e-9) const override
Test equality with base HybridFactor.
Definition: HybridGaussianConditional.cpp:184
gtsam::HybridGaussianFactor
Implementation of a discrete-conditioned hybrid factor. Implements a joint discrete-continuous factor...
Definition: HybridGaussianFactor.h:59
gtsam::HybridGaussianConditional::conditionals
const Conditionals & conditionals() const
Getter for the underlying Conditionals DecisionTree.
Definition: HybridGaussianConditional.cpp:134
A1
static const double A1[]
Definition: expn.h:6
gtsam::GaussianConditional::shared_ptr
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianConditional.h:46
gtsam::HybridGaussianConditional::negLogConstant_
double negLogConstant_
Definition: HybridGaussianConditional.h:70
gtsam::HybridGaussianConditional::prunerFunc
std::function< GaussianConditional::shared_ptr(const Assignment< Key > &, const GaussianConditional::shared_ptr &)> prunerFunc(const DecisionTreeFactor &prunedProbabilities)
Get the pruner function from discrete probabilities.
Definition: HybridGaussianConditional.cpp:294
min
#define min(a, b)
Definition: datatypes.h:19
gtsam::HybridGaussianConditional::negLogConstant
double negLogConstant() const override
Return log normalization constant in negative log space.
Definition: HybridGaussianConditional.h:185
gtsam::tol
const G double tol
Definition: Group.h:79
gtsam::HybridGaussianConditional::HybridGaussianConditional
HybridGaussianConditional()=default
Default constructor, mainly for serialization.
gtsam::DiscreteFactor::discreteKeys
DiscreteKeys discreteKeys() const
Return all the discrete keys associated with this factor.
Definition: DiscreteFactor.cpp:32
func
Definition: benchGeometry.cpp:23
gtsam::Key
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:97
HybridValues.h
gtsam::HybridFactor::discreteKeys
const DiscreteKeys & discreteKeys() const
Return the discrete keys for this factor.
Definition: HybridFactor.h:134
test_callbacks.value
value
Definition: test_callbacks.py:160
gtsam::HybridGaussianConditional::print
void print(const std::string &s="HybridGaussianConditional\n", const KeyFormatter &formatter=DefaultKeyFormatter) const override
Print utility.
Definition: HybridGaussianConditional.cpp:202
ceres::sqrt
Jet< T, N > sqrt(const Jet< T, N > &f)
Definition: jet.h:418
gtsam::RedirectCout::str
std::string str() const
return the string
Definition: utilities.cpp:5
Conditional-inst.h
gtsam::GaussianConditional::sharedMeanAndStddev
static shared_ptr sharedMeanAndStddev(Args &&... args)
Create shared pointer by forwarding arguments to fromMeanAndStddev.
Definition: GaussianConditional.h:105


gtsam
Author(s):
autogenerated on Fri Oct 4 2024 03:02:13