gtsam
Loading...
Searching...
No Matches
HybridConditional.h
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
18
19#pragma once
20
26#include <gtsam/inference/Key.h>
28
29#include <memory>
30#include <stdexcept>
31#include <string>
32#include <typeinfo>
33#include <vector>
34
35namespace gtsam {
36
60class GTSAM_EXPORT HybridConditional
61 : public HybridFactor,
62 public Conditional<HybridFactor, HybridConditional> {
63 public:
64 // typedefs needed to play nice with gtsam
66 typedef std::shared_ptr<This> shared_ptr;
70
71 protected:
73 std::shared_ptr<Factor> inner_;
74
75 public:
78
80 HybridConditional() = default;
81
92
102 HybridConditional(const KeyVector& continuousFrontals,
103 const DiscreteKeys& discreteFrontals,
104 const KeyVector& continuousParents,
105 const DiscreteKeys& discreteParents);
106
114 const std::shared_ptr<GaussianConditional>& continuousConditional);
115
123 const std::shared_ptr<DiscreteConditional>& discreteConditional);
124
132 const std::shared_ptr<HybridGaussianConditional>& hybridGaussianCond);
133
137
139 void print(
140 const std::string& s = "Hybrid Conditional: ",
141 const KeyFormatter& formatter = DefaultKeyFormatter) const override;
142
144 bool equals(const HybridFactor& other, double tol = 1e-9) const override;
145
149
155 HybridGaussianConditional::shared_ptr asHybrid() const {
156 if (!isHybrid()) return nullptr;
157 return std::static_pointer_cast<HybridGaussianConditional>(inner_);
158 }
159
166 if (!isContinuous()) return nullptr;
167 return std::static_pointer_cast<GaussianConditional>(inner_);
168 }
169
175 template <typename T = DiscreteConditional>
176 typename T::shared_ptr asDiscrete() const {
177 if (!isDiscrete()) return nullptr;
178 return std::static_pointer_cast<T>(inner_);
179 }
180
182 std::shared_ptr<Factor> inner() const { return inner_; }
183
185 double error(const HybridValues& hybridValues) const override;
186
195 const VectorValues& continuousValues) const override;
196
198 double logProbability(const HybridValues& values) const override;
199
206 double negLogConstant() const override;
207
209 double evaluate(const HybridValues& values) const override;
210
212 bool frontalsIn(const VectorValues& measurements) const {
213 for (Key key : frontals()) {
214 if (!measurements.exists(key)) {
215 return false;
216 }
217 }
218 return true;
219 }
220
227 std::shared_ptr<Factor> restrict(
228 const DiscreteValues& assignment) const override;
229
231
232 private:
233#if GTSAM_ENABLE_BOOST_SERIALIZATION
235 friend class boost::serialization::access;
236 template <class Archive>
237 void serialize(Archive& ar, const unsigned int /*version*/) {
238 ar& BOOST_SERIALIZATION_BASE_OBJECT_NVP(BaseFactor);
239 ar& BOOST_SERIALIZATION_BASE_OBJECT_NVP(BaseConditional);
240 ar& BOOST_SERIALIZATION_NVP(inner_);
241
242 // register the various casts based on the type of inner_
243 // https://www.boost.org/doc/libs/1_80_0/libs/serialization/doc/serialization.html#runtimecasting
244 if (isDiscrete()) {
245 boost::serialization::void_cast_register<DiscreteConditional, Factor>(
246 static_cast<DiscreteConditional*>(NULL), static_cast<Factor*>(NULL));
247 } else if (isContinuous()) {
248 boost::serialization::void_cast_register<GaussianConditional, Factor>(
249 static_cast<GaussianConditional*>(NULL), static_cast<Factor*>(NULL));
250 } else {
251 boost::serialization::void_cast_register<HybridGaussianConditional,
252 Factor>(
253 static_cast<HybridGaussianConditional*>(NULL),
254 static_cast<Factor*>(NULL));
255 }
256 }
257#endif
258
259}; // HybridConditional
260
261// traits
262template <>
263struct traits<HybridConditional> : public Testable<HybridConditional> {};
264
265} // namespace gtsam
Linearized Hybrid factor graph that uses type erasure.
A hybrid conditional in the Conditional Linear Gaussian scheme.
Base class for conditional densities.
Conditional Gaussian Base class.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
KeyFormatter DefaultKeyFormatter
Assign default key formatter.
Definition Key.cpp:30
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition Key.h:91
void print(const Matrix &A, const string &s, ostream &stream)
print without optional string, must specify cout yourself
Definition Matrix.cpp:143
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
std::uint64_t Key
Integer nonlinear key type.
Definition types.h:43
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
Template to create a binary predicate.
Definition Testable.h:112
A helper that implements the traits interface for GTSAM types.
Definition Testable.h:152
An algebraic decision tree fixes the range of a DecisionTree to double.
Definition AlgebraicDecisionTree.h:41
Discrete Conditional Density Derives from DecisionTreeFactor.
Definition DiscreteConditional.h:40
DiscreteKeys is a set of keys that can be assembled using the & operator.
Definition DiscreteKey.h:41
A map from keys to values.
Definition DiscreteValues.h:34
Hybrid Conditional Density.
Definition HybridConditional.h:62
Conditional< BaseFactor, This > BaseConditional
Typedef to our conditional base class.
Definition HybridConditional.h:69
std::shared_ptr< Factor > inner() const
Get the type-erased pointer to the inner type.
Definition HybridConditional.h:182
HybridGaussianConditional::shared_ptr asHybrid() const
Return HybridConditional as a HybridGaussianConditional.
Definition HybridConditional.h:155
HybridFactor BaseFactor
Typedef to our factor base class.
Definition HybridConditional.h:67
bool frontalsIn(const VectorValues &measurements) const
Check if VectorValues measurements contains all frontal keys.
Definition HybridConditional.h:212
HybridConditional(const KeyVector &continuousKeys, const DiscreteKeys &discreteKeys, size_t nFrontals)
Construct a new Hybrid Conditional object.
Definition HybridConditional.h:89
std::shared_ptr< Factor > inner_
Type-erased pointer to the inner type.
Definition HybridConditional.h:73
GaussianConditional::shared_ptr asGaussian() const
Return HybridConditional as a GaussianConditional.
Definition HybridConditional.h:165
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition HybridConditional.h:66
HybridConditional This
Typedef to this class.
Definition HybridConditional.h:65
T::shared_ptr asDiscrete() const
Return conditional as a DiscreteConditional or specified type T.
Definition HybridConditional.h:176
HybridConditional()=default
Default constructor needed for serialization.
Base class for truly hybrid probabilistic factors.
Definition HybridFactor.h:51
bool isDiscrete() const
True if this is a factor of discrete variables only.
Definition HybridFactor.h:119
bool isHybrid() const
True is this is a Discrete-Continuous factor.
Definition HybridFactor.h:125
HybridFactor()=default
Default constructor creates empty factor.
const KeyVector & continuousKeys() const
Return only the continuous keys for this factor.
Definition HybridFactor.h:134
bool isContinuous() const
True if this is a factor of continuous variables only.
Definition HybridFactor.h:122
const DiscreteKeys & discreteKeys() const
Return the discrete keys for this factor.
Definition HybridFactor.h:131
HybridValues represents a collection of DiscreteValues and VectorValues.
Definition HybridValues.h:37
Frontals frontals() const
Definition Conditional.h:147
Definition Factor.h:71
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition GaussianConditional.h:46
VectorValues represents a collection of vector-valued variables associated each with a unique integer...
Definition VectorValues.h:73
bool exists(Key j) const
Check whether a variable with key j exists.
Definition VectorValues.h:135
is the normalization constant.