dcsam
Factored inference for discrete-continuous smoothing and mapping
DiscretePriorFactor.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 
14 #include <vector>
15 
16 namespace dcsam {
17 
30 class DiscretePriorFactor : public gtsam::DiscreteFactor {
31  protected:
32  gtsam::DiscreteKey dk_;
33  std::vector<double> probs_;
34 
35  public:
36  using Base = gtsam::DiscreteFactor;
37 
38  DiscretePriorFactor() = default;
39 
40  DiscretePriorFactor(const gtsam::DiscreteKey& dk,
41  const std::vector<double> probs)
42  : dk_(dk), probs_(probs) {
43  // Ensure that length of probs is equal to the cardinality of the discrete
44  // variable (for gtsam::DiscreteKey dk, dk.second is the cardinality).
45  assert(probs.size() == dk.second);
46 
47  // For gtsam::DiscreteKey dk, dk.first is the Key for this variable.
48  keys_.push_back(dk.first);
49  }
50 
51  bool equals(const DiscreteFactor& other, double tol = 1e-9) const override {
52  if (!dynamic_cast<const DiscretePriorFactor*>(&other)) return false;
53  const DiscretePriorFactor& f(
54  static_cast<const DiscretePriorFactor&>(other));
55  if (probs_.size() != f.probs_.size() || (dk_ != f.dk_)) {
56  return false;
57  } else {
58  for (size_t i = 0; i < probs_.size(); i++)
59  if (abs(probs_[i] - f.probs_[i]) > tol) return false;
60  return true;
61  }
62  }
63 
65  Base::operator=(rhs);
66  dk_ = rhs.dk_;
67  probs_ = rhs.probs_;
68  return *this;
69  }
70 
71  gtsam::DecisionTreeFactor toDecisionTreeFactor() const override {
72  gtsam::DecisionTreeFactor converted(dk_, probs_);
73  return converted;
74  }
75 
76  gtsam::DecisionTreeFactor operator*(
77  const gtsam::DecisionTreeFactor& f) const override {
78  return toDecisionTreeFactor() * f;
79  }
80 
81  double operator()(const DiscreteValues& values) const override {
82  size_t assignment = values.at(dk_.first);
83  return probs_[assignment];
84  }
85 
86  std::string markdown(const gtsam::KeyFormatter& keyFormatter,
87  const Names& names) const override {
88  return toDecisionTreeFactor().markdown(keyFormatter, names);
89  }
90 
91  std::string html(const gtsam::KeyFormatter& keyFormatter,
92  const Names& names) const override {
93  return toDecisionTreeFactor().markdown(keyFormatter, names);
94  }
95 };
96 
97 } // namespace dcsam
Implementation of a discrete prior factor.
Definition: DiscretePriorFactor.h:30
gtsam::DiscreteFactor Base
Definition: DiscretePriorFactor.h:36
DiscretePriorFactor & operator=(const DiscretePriorFactor &rhs)
Definition: DiscretePriorFactor.h:64
std::vector< double > probs_
Definition: DiscretePriorFactor.h:33
std::string markdown(const gtsam::KeyFormatter &keyFormatter, const Names &names) const override
Definition: DiscretePriorFactor.h:86
gtsam::DecisionTreeFactor operator*(const gtsam::DecisionTreeFactor &f) const override
Definition: DiscretePriorFactor.h:76
gtsam::DecisionTreeFactor toDecisionTreeFactor() const override
Definition: DiscretePriorFactor.h:71
double operator()(const DiscreteValues &values) const override
Definition: DiscretePriorFactor.h:81
bool equals(const DiscreteFactor &other, double tol=1e-9) const override
Definition: DiscretePriorFactor.h:51
DiscretePriorFactor(const gtsam::DiscreteKey &dk, const std::vector< double > probs)
Definition: DiscretePriorFactor.h:40
std::string html(const gtsam::KeyFormatter &keyFormatter, const Names &names) const override
Definition: DiscretePriorFactor.h:91
gtsam::DiscreteKey dk_
Definition: DiscretePriorFactor.h:32
Definition: DCContinuousFactor.h:24
gtsam::DiscreteFactor::Values DiscreteValues
Definition: DCSAM_types.h:19
const double tol
Definition: testDCSAM.cpp:40