dcsam
Factored inference for discrete-continuous smoothing and mapping
DCContinuousFactor.h
Go to the documentation of this file.
1 
8 #pragma once
9 
10 #include <gtsam/discrete/DiscreteFactor.h>
11 #include <gtsam/discrete/DiscreteKey.h>
12 #include <gtsam/nonlinear/NonlinearFactor.h>
13 #include <gtsam/nonlinear/Symbol.h>
14 #include <math.h>
15 
16 #include <algorithm>
17 #include <limits>
18 #include <memory>
19 #include <vector>
20 
21 #include "DCFactor.h"
22 #include "DCSAM_types.h"
23 
24 namespace dcsam {
25 
40 class DCContinuousFactor : public gtsam::NonlinearFactor {
41  private:
42  gtsam::DiscreteKeys discreteKeys_;
43  boost::shared_ptr<DCFactor> dcfactor_;
44  DiscreteValues discreteVals_;
45 
46  public:
47  using Base = gtsam::NonlinearFactor;
48 
49  DCContinuousFactor() = default;
50 
51  explicit DCContinuousFactor(boost::shared_ptr<DCFactor> dcfactor)
52  : discreteKeys_(dcfactor->discreteKeys()), dcfactor_(dcfactor) {
53  keys_ = dcfactor->keys();
54  }
55 
56  double error(const gtsam::Values& continuousVals) const override {
57  assert(allInitialized());
58  return dcfactor_->error(continuousVals, discreteVals_);
59  }
60 
61  boost::shared_ptr<gtsam::GaussianFactor> linearize(
62  const gtsam::Values& continuousVals) const override {
63  assert(allInitialized());
64  return dcfactor_->linearize(continuousVals, discreteVals_);
65  }
66 
68  Base::operator=(rhs);
69  discreteKeys_ = rhs.discreteKeys_;
70  dcfactor_ = rhs.dcfactor_;
71  discreteVals_ = rhs.discreteVals_;
72  return *this;
73  }
74 
75  ~DCContinuousFactor() = default;
76 
77  bool updateDiscrete(const DiscreteValues& discreteVals) {
78  bool updated = false;
79  for (const gtsam::DiscreteKey& dk : discreteKeys_) {
80  const gtsam::Key k = dk.first;
81  if (discreteVals.find(k) != discreteVals.end()) {
82  if (discreteVals.at(k) != discreteVals_[k]) {
83  discreteVals_[k] = discreteVals.at(k);
84  updated = true;
85  }
86  }
87  }
88  return updated;
89  }
90 
91  size_t dim() const override { return dcfactor_->dim(); }
92 
93  bool allInitialized() const {
94  for (const gtsam::DiscreteKey& dk : discreteKeys_) {
95  const gtsam::Key k = dk.first;
96  if (discreteVals_.find(k) == discreteVals_.end()) return false;
97  }
98  return true;
99  }
100 };
101 
102 } // 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: DCContinuousFactor.h:40
DCContinuousFactor & operator=(const DCContinuousFactor &rhs)
Definition: DCContinuousFactor.h:67
bool updateDiscrete(const DiscreteValues &discreteVals)
Definition: DCContinuousFactor.h:77
DCContinuousFactor(boost::shared_ptr< DCFactor > dcfactor)
Definition: DCContinuousFactor.h:51
double error(const gtsam::Values &continuousVals) const override
Definition: DCContinuousFactor.h:56
size_t dim() const override
Definition: DCContinuousFactor.h:91
gtsam::NonlinearFactor Base
Definition: DCContinuousFactor.h:47
boost::shared_ptr< gtsam::GaussianFactor > linearize(const gtsam::Values &continuousVals) const override
Definition: DCContinuousFactor.h:61
bool allInitialized() const
Definition: DCContinuousFactor.h:93
Definition: DCContinuousFactor.h:24
gtsam::DiscreteFactor::Values DiscreteValues
Definition: DCSAM_types.h:19