HybridConditional.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 
22 #include <gtsam/inference/Key.h>
23 
24 namespace gtsam {
25 
26 /* ************************************************************************ */
28  const DiscreteKeys &discreteFrontals,
29  const KeyVector &continuousParents,
30  const DiscreteKeys &discreteParents)
33  {continuousFrontals.begin(), continuousFrontals.end()},
34  KeyVector{continuousParents.begin(), continuousParents.end()}),
36  {discreteFrontals.begin(), discreteFrontals.end()},
37  {discreteParents.begin(), discreteParents.end()}),
38  continuousFrontals.size() + discreteFrontals.size()) {}
39 
40 /* ************************************************************************ */
42  const std::shared_ptr<GaussianConditional> &continuousConditional)
43  : HybridConditional(continuousConditional->keys(), {},
44  continuousConditional->nrFrontals()) {
45  inner_ = continuousConditional;
46 }
47 
48 /* ************************************************************************ */
50  const std::shared_ptr<DiscreteConditional> &discreteConditional)
51  : HybridConditional({}, discreteConditional->discreteKeys(),
52  discreteConditional->nrFrontals()) {
53  inner_ = discreteConditional;
54 }
55 
56 /* ************************************************************************ */
58  const std::shared_ptr<GaussianMixture> &gaussianMixture)
59  : BaseFactor(KeyVector(gaussianMixture->keys().begin(),
60  gaussianMixture->keys().begin() +
61  gaussianMixture->nrContinuous()),
62  gaussianMixture->discreteKeys()),
63  BaseConditional(gaussianMixture->nrFrontals()) {
64  inner_ = gaussianMixture;
65 }
66 
67 /* ************************************************************************ */
68 void HybridConditional::print(const std::string &s,
69  const KeyFormatter &formatter) const {
70  std::cout << s;
71 
72  if (inner_) {
73  inner_->print("", formatter);
74 
75  } else {
76  if (isContinuous()) std::cout << "Continuous ";
77  if (isDiscrete()) std::cout << "Discrete ";
78  if (isHybrid()) std::cout << "Hybrid ";
80 
81  std::cout << "P(";
82  size_t index = 0;
83  const size_t N = keys().size();
84  const size_t contN = N - discreteKeys_.size();
85  while (index < N) {
86  if (index > 0) {
87  if (index == nrFrontals_)
88  std::cout << " | ";
89  else
90  std::cout << ", ";
91  }
92  if (index < contN) {
93  std::cout << formatter(keys()[index]);
94  } else {
95  auto &dk = discreteKeys_[index - contN];
96  std::cout << "(" << formatter(dk.first) << ", " << dk.second << ")";
97  }
98  index++;
99  }
100  }
101 }
102 
103 /* ************************************************************************ */
104 bool HybridConditional::equals(const HybridFactor &other, double tol) const {
105  const This *e = dynamic_cast<const This *>(&other);
106  if (e == nullptr) return false;
107  if (auto gm = asMixture()) {
108  auto other = e->asMixture();
109  return other != nullptr && gm->equals(*other, tol);
110  }
111  if (auto gc = asGaussian()) {
112  auto other = e->asGaussian();
113  return other != nullptr && gc->equals(*other, tol);
114  }
115  if (auto dc = asDiscrete()) {
116  auto other = e->asDiscrete();
117  return other != nullptr && dc->equals(*other, tol);
118  }
119 
120  return inner_ ? (e->inner_ ? inner_->equals(*(e->inner_), tol) : false)
121  : !(e->inner_);
122 }
123 
124 /* ************************************************************************ */
126  if (auto gc = asGaussian()) {
127  return gc->error(values.continuous());
128  }
129  if (auto gm = asMixture()) {
130  return gm->error(values);
131  }
132  if (auto dc = asDiscrete()) {
133  return dc->error(values.discrete());
134  }
135  throw std::runtime_error(
136  "HybridConditional::error: conditional type not handled");
137 }
138 
139 /* ************************************************************************ */
141  if (auto gc = asGaussian()) {
142  return gc->logProbability(values.continuous());
143  }
144  if (auto gm = asMixture()) {
145  return gm->logProbability(values);
146  }
147  if (auto dc = asDiscrete()) {
148  return dc->logProbability(values.discrete());
149  }
150  throw std::runtime_error(
151  "HybridConditional::logProbability: conditional type not handled");
152 }
153 
154 /* ************************************************************************ */
156  if (auto gc = asGaussian()) {
157  return gc->logNormalizationConstant();
158  }
159  if (auto gm = asMixture()) {
160  return gm->logNormalizationConstant(); // 0.0!
161  }
162  if (auto dc = asDiscrete()) {
163  return dc->logNormalizationConstant(); // 0.0!
164  }
165  throw std::runtime_error(
166  "HybridConditional::logProbability: conditional type not handled");
167 }
168 
169 /* ************************************************************************ */
171  return std::exp(logProbability(values));
172 }
173 
174 } // namespace gtsam
gtsam::Conditional::print
void print(const std::string &s="Conditional", const KeyFormatter &formatter=DefaultKeyFormatter) const
Definition: Conditional-inst.h:30
gtsam::HybridValues
Definition: HybridValues.h:38
gtsam::HybridConditional
Definition: HybridConditional.h:59
s
RealScalar s
Definition: level1_cplx_impl.h:126
e
Array< double, 1, 3 > e(1./3., 0.5, 2.)
keys
const KeyVector keys
Definition: testRegularImplicitSchurFactor.cpp:40
gtsam::HybridConditional::HybridConditional
HybridConditional()=default
Default constructor needed for serialization.
gtsam::HybridFactor::isDiscrete
bool isDiscrete() const
True if this is a factor of discrete variables only.
Definition: HybridFactor.h:118
gtsam::HybridFactor
Definition: HybridFactor.h:53
formatter
const KeyFormatter & formatter
Definition: treeTraversal-inst.h:204
gtsam::DiscreteKeys
DiscreteKeys is a set of keys that can be assembled using the & operator.
Definition: DiscreteKey.h:41
exp
const EIGEN_DEVICE_FUNC ExpReturnType exp() const
Definition: ArrayCwiseUnaryOps.h:97
gtsam::HybridConditional::asMixture
GaussianMixture::shared_ptr asMixture() const
Return HybridConditional as a GaussianMixture.
Definition: HybridConditional.h:153
gtsam::HybridFactor::isHybrid
bool isHybrid() const
True is this is a Discrete-Continuous factor.
Definition: HybridFactor.h:124
gtsam::KeyVector
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition: Key.h:92
gtsam::HybridConditional::evaluate
double evaluate(const HybridValues &values) const override
Return the probability (or density) of the underlying conditional.
Definition: HybridConditional.cpp:170
Key.h
HybridFactor.h
gtsam::HybridConditional::print
void print(const std::string &s="Hybrid Conditional: ", const KeyFormatter &formatter=DefaultKeyFormatter) const override
GTSAM-style print.
Definition: HybridConditional.cpp:68
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
gtsam::Conditional< HybridFactor, HybridConditional >::nrFrontals_
size_t nrFrontals_
Definition: Conditional.h:65
gtsam::CollectKeys
KeyVector CollectKeys(const KeyVector &continuousKeys, const DiscreteKeys &discreteKeys)
Definition: HybridFactor.cpp:23
gtsam::HybridConditional::error
double error(const HybridValues &values) const override
Return the error of the underlying conditional.
Definition: HybridConditional.cpp:125
gtsam::HybridFactor::discreteKeys_
DiscreteKeys discreteKeys_
Definition: HybridFactor.h:61
gtsam::HybridFactor::isContinuous
bool isContinuous() const
True if this is a factor of continuous variables only.
Definition: HybridFactor.h:121
gtsam::Conditional
Definition: Conditional.h:61
gtsam::HybridConditional::inner_
std::shared_ptr< Factor > inner_
Type-erased pointer to the inner type.
Definition: HybridConditional.h:72
gtsam
traits
Definition: chartTesting.h:28
leaf::values
leaf::MyValues values
gtsam::Factor::keys
const KeyVector & keys() const
Access the factor's involved variable keys.
Definition: Factor.h:142
gtsam::HybridConditional::logNormalizationConstant
double logNormalizationConstant() const override
Definition: HybridConditional.cpp:155
gtsam::HybridConditional::asDiscrete
DiscreteConditional::shared_ptr asDiscrete() const
Return conditional as a DiscreteConditional.
Definition: HybridConditional.h:171
gtsam::tol
const G double tol
Definition: Group.h:79
N
#define N
Definition: igam.h:9
gtsam::HybridConditional::asGaussian
GaussianConditional::shared_ptr asGaussian() const
Return HybridConditional as a GaussianConditional.
Definition: HybridConditional.h:162
HybridValues.h
gtsam::HybridConditional::equals
bool equals(const HybridFactor &other, double tol=1e-9) const override
GTSAM-style equals.
Definition: HybridConditional.cpp:104
pybind_wrapper_test_script.other
other
Definition: pybind_wrapper_test_script.py:42
Conditional-inst.h
gtsam::HybridConditional::logProbability
double logProbability(const HybridValues &values) const override
Return the log-probability (or density) of the underlying conditional.
Definition: HybridConditional.cpp:140
HybridConditional.h
gtsam::CollectDiscreteKeys
DiscreteKeys CollectDiscreteKeys(const DiscreteKeys &key1, const DiscreteKeys &key2)
Definition: HybridFactor.cpp:43


gtsam
Author(s):
autogenerated on Tue Jun 25 2024 03:01:00