dcsam
Factored inference for discrete-continuous smoothing and mapping
DCDiscreteFactor.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <gtsam/discrete/DiscreteFactor.h>
12 #include <gtsam/discrete/DiscreteKey.h>
13 #include <gtsam/nonlinear/NonlinearFactor.h>
14 #include <gtsam/nonlinear/Symbol.h>
15 #include <math.h>
16 
17 #include <algorithm>
18 #include <limits>
19 #include <memory>
20 #include <vector>
21 
22 #include "DCFactor.h"
23 #include "DCSAM_types.h"
24 
25 namespace dcsam {
26 
41 class DCDiscreteFactor : public gtsam::DiscreteFactor {
42  private:
43  gtsam::DiscreteKeys discreteKeys_;
44  gtsam::KeyVector continuousKeys_;
45  boost::shared_ptr<DCFactor> dcfactor_;
46  gtsam::Values continuousVals_;
47  DiscreteValues discreteVals_;
48 
49  public:
50  using Base = gtsam::DiscreteFactor;
51 
52  DCDiscreteFactor() = default;
53 
54  DCDiscreteFactor(const gtsam::DiscreteKeys& discreteKeys,
55  boost::shared_ptr<DCFactor> dcfactor)
56  : discreteKeys_(discreteKeys),
57  continuousKeys_(dcfactor->keys()),
58  dcfactor_(dcfactor) {
59  // Since this is a DiscreteFactor, its `keys_` member variable stores the
60  // discrete keys only.
61  for (const gtsam::DiscreteKey& k : discreteKeys_) keys_.push_back(k.first);
62  }
63 
64  explicit DCDiscreteFactor(boost::shared_ptr<DCFactor> dcfactor)
65  : discreteKeys_(dcfactor->discreteKeys()),
66  continuousKeys_(dcfactor->keys()),
67  dcfactor_(dcfactor) {
68  // Since this is a DiscreteFactor, its `keys_` member variable stores the
69  // discrete keys only.
70  for (const gtsam::DiscreteKey& k : discreteKeys_) keys_.push_back(k.first);
71  }
72 
74  Base::operator=(rhs);
75  discreteKeys_ = rhs.discreteKeys_;
76  dcfactor_ = rhs.dcfactor_;
77  continuousKeys_ = rhs.continuousKeys_;
78  continuousVals_ = rhs.continuousVals_;
79  discreteVals_ = rhs.discreteVals_;
80  return *this;
81  }
82 
83  virtual ~DCDiscreteFactor() = default;
84 
85  bool equals(const DiscreteFactor& other, double tol = 1e-9) const override {
86  if (!dynamic_cast<const DCDiscreteFactor*>(&other)) return false;
87  const DCDiscreteFactor& f(static_cast<const DCDiscreteFactor&>(other));
88  return (dcfactor_->equals(*f.dcfactor_) &&
89  (discreteKeys_ == f.discreteKeys_) &&
90  continuousVals_.equals(f.continuousVals_) &&
91  discreteVals_ == f.discreteVals_);
92  }
93 
94  gtsam::DecisionTreeFactor toDecisionTreeFactor() const override {
95  assert(allInitialized());
96  return dcfactor_->toDecisionTreeFactor(continuousVals_, discreteVals_);
97  }
98 
99  gtsam::DecisionTreeFactor operator*(
100  const gtsam::DecisionTreeFactor& f) const override {
101  assert(allInitialized());
102  return dcfactor_->conditionalTimes(f, continuousVals_, discreteVals_);
103  }
104 
105  double operator()(const DiscreteValues& values) const override {
106  assert(allInitialized());
107  return exp(-dcfactor_->error(continuousVals_, values));
108  }
109 
110  void updateContinuous(const gtsam::Values& continuousVals) {
111  for (const gtsam::Key& k : continuousKeys_) {
112  // If key `k` is not set continuousVals, skip it.
113  if (!continuousVals.exists(k)) continue;
114 
115  if (continuousVals_.exists(k)) {
116  // If key `k` is set in stored continuousVals_, update its value
117  continuousVals_.update(k, continuousVals.at(k));
118  } else {
119  // If key `k` is not in the stored continuousVals_, create a new entry
120  // with key `k` and set its value to the one specified in the argument
121  // `continuousVals`
122  continuousVals_.insert(k, continuousVals.at(k));
123  }
124  }
125  }
126 
127  void updateDiscrete(const DiscreteValues& discreteVals) {
128  for (const gtsam::DiscreteKey& dk : discreteKeys_) {
129  const gtsam::Key k = dk.first;
130  if (discreteVals.find(k) != discreteVals.end())
131  discreteVals_[k] = discreteVals.at(k);
132  }
133  }
134 
135  bool allInitialized() const {
136  for (const gtsam::Key& k : continuousKeys_) {
137  if (!continuousVals_.exists(k)) return false;
138  }
139  for (const gtsam::Key k : keys_) {
140  if (discreteVals_.find(k) == discreteVals_.end()) return false;
141  }
142  return true;
143  }
144 
145  std::string markdown(const gtsam::KeyFormatter& keyFormatter,
146  const Names& names) const override {
147  return toDecisionTreeFactor().markdown(keyFormatter, names);
148  }
149 
150  std::string html(const gtsam::KeyFormatter& keyFormatter,
151  const Names& names) const override {
152  return toDecisionTreeFactor().markdown(keyFormatter, names);
153  }
154 };
155 
156 } // namespace dcsam
Custom discrete-continuous factor.
Some convenient types for DCSAM.
Implementation of a discrete-continuous factor. This is used internally within the DCSAM solver....
Definition: DCDiscreteFactor.h:41
DCDiscreteFactor(const gtsam::DiscreteKeys &discreteKeys, boost::shared_ptr< DCFactor > dcfactor)
Definition: DCDiscreteFactor.h:54
gtsam::DiscreteFactor Base
Definition: DCDiscreteFactor.h:50
gtsam::DecisionTreeFactor toDecisionTreeFactor() const override
Definition: DCDiscreteFactor.h:94
gtsam::DecisionTreeFactor operator*(const gtsam::DecisionTreeFactor &f) const override
Definition: DCDiscreteFactor.h:99
bool equals(const DiscreteFactor &other, double tol=1e-9) const override
Definition: DCDiscreteFactor.h:85
std::string markdown(const gtsam::KeyFormatter &keyFormatter, const Names &names) const override
Definition: DCDiscreteFactor.h:145
DCDiscreteFactor(boost::shared_ptr< DCFactor > dcfactor)
Definition: DCDiscreteFactor.h:64
double operator()(const DiscreteValues &values) const override
Definition: DCDiscreteFactor.h:105
void updateDiscrete(const DiscreteValues &discreteVals)
Definition: DCDiscreteFactor.h:127
void updateContinuous(const gtsam::Values &continuousVals)
Definition: DCDiscreteFactor.h:110
bool allInitialized() const
Definition: DCDiscreteFactor.h:135
virtual ~DCDiscreteFactor()=default
DCDiscreteFactor & operator=(const DCDiscreteFactor &rhs)
Definition: DCDiscreteFactor.h:73
std::string html(const gtsam::KeyFormatter &keyFormatter, const Names &names) const override
Definition: DCDiscreteFactor.h:150
Definition: DCContinuousFactor.h:24
gtsam::DiscreteFactor::Values DiscreteValues
Definition: DCSAM_types.h:19
const double tol
Definition: testDCSAM.cpp:40