HybridFactor.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 
19 
20 namespace gtsam {
21 
22 /* ************************************************************************ */
23 KeyVector CollectKeys(const KeyVector &continuousKeys,
24  const DiscreteKeys &discreteKeys) {
25  KeyVector allKeys;
26  allKeys.reserve(continuousKeys.size() + discreteKeys.size());
27  std::copy(continuousKeys.begin(), continuousKeys.end(),
28  std::back_inserter(allKeys));
29  std::transform(discreteKeys.begin(), discreteKeys.end(),
30  std::back_inserter(allKeys),
31  [](const DiscreteKey &k) { return k.first; });
32  return allKeys;
33 }
34 
35 /* ************************************************************************ */
36 KeyVector CollectKeys(const KeyVector &keys1, const KeyVector &keys2) {
37  KeyVector allKeys;
38  allKeys.reserve(keys1.size() + keys2.size());
39  std::copy(keys1.begin(), keys1.end(), std::back_inserter(allKeys));
40  std::copy(keys2.begin(), keys2.end(), std::back_inserter(allKeys));
41  return allKeys;
42 }
43 
44 /* ************************************************************************ */
46  const DiscreteKeys &key2) {
47  DiscreteKeys allKeys;
48  std::copy(key1.begin(), key1.end(), std::back_inserter(allKeys));
49  std::copy(key2.begin(), key2.end(), std::back_inserter(allKeys));
50  return allKeys;
51 }
52 
53 /* ************************************************************************ */
55  : Base(keys), category_(Category::Continuous), continuousKeys_(keys) {}
56 
57 /* ************************************************************************ */
59  const DiscreteKeys &discreteKeys) {
60  if ((continuousKeys.size() == 0) && (discreteKeys.size() != 0)) {
62  } else if ((continuousKeys.size() != 0) && (discreteKeys.size() == 0)) {
64  } else if ((continuousKeys.size() != 0) && (discreteKeys.size() != 0)) {
66  } else {
67  // Case where we have no keys. Should never happen.
69  }
70 }
71 
72 /* ************************************************************************ */
73 HybridFactor::HybridFactor(const KeyVector &continuousKeys,
74  const DiscreteKeys &discreteKeys)
75  : Base(CollectKeys(continuousKeys, discreteKeys)),
76  category_(GetCategory(continuousKeys, discreteKeys)),
77  discreteKeys_(discreteKeys),
78  continuousKeys_(continuousKeys) {}
79 
80 /* ************************************************************************ */
82  : Base(CollectKeys({}, discreteKeys)),
83  category_(Category::Discrete),
84  discreteKeys_(discreteKeys),
85  continuousKeys_({}) {}
86 
87 /* ************************************************************************ */
88 bool HybridFactor::equals(const HybridFactor &lf, double tol) const {
89  const This *e = dynamic_cast<const This *>(&lf);
90  return e != nullptr && Base::equals(*e, tol) && category_ == e->category_ &&
91  continuousKeys_ == e->continuousKeys_ &&
92  discreteKeys_ == e->discreteKeys_;
93 }
94 
95 /* ************************************************************************ */
96 void HybridFactor::print(const std::string &s,
97  const KeyFormatter &formatter) const {
98  std::cout << (s.empty() ? "" : s + "\n");
99  switch (category_) {
101  std::cout << "Continuous ";
102  break;
103  case Category::Discrete:
104  std::cout << "Discrete ";
105  break;
106  case Category::Hybrid:
107  std::cout << "Hybrid ";
108  break;
109  case Category::None:
110  std::cout << "None ";
111  break;
112  }
113 
114  std::cout << "[";
115  for (size_t c = 0; c < continuousKeys_.size(); c++) {
116  std::cout << formatter(continuousKeys_.at(c));
117  if (c < continuousKeys_.size() - 1) {
118  std::cout << " ";
119  } else {
120  std::cout << (discreteKeys_.size() > 0 ? "; " : "");
121  }
122  }
123  for (size_t d = 0; d < discreteKeys_.size(); d++) {
124  std::cout << formatter(discreteKeys_.at(d).first);
125  if (d < discreteKeys_.size() - 1) {
126  std::cout << " ";
127  }
128  }
129  std::cout << "]";
130 }
131 
132 } // namespace gtsam
key1
const Symbol key1('v', 1)
s
RealScalar s
Definition: level1_cplx_impl.h:126
e
Array< double, 1, 3 > e(1./3., 0.5, 2.)
d
static const double d[K][N]
Definition: igam.h:11
gtsam::HybridFactor::equals
virtual bool equals(const HybridFactor &lf, double tol=1e-9) const
equals
Definition: HybridFactor.cpp:88
keys
const KeyVector keys
Definition: testRegularImplicitSchurFactor.cpp:40
c
Scalar Scalar * c
Definition: benchVecAdd.cpp:17
gtsam::HybridFactor::category_
Category category_
Record what category of HybridFactor this is.
Definition: HybridFactor.h:58
gtsam::HybridFactor::Category::Discrete
@ Discrete
gtsam::HybridFactor
Definition: HybridFactor.h:51
formatter
const KeyFormatter & formatter
Definition: treeTraversal-inst.h:204
gtsam::HybridFactor::continuousKeys_
KeyVector continuousKeys_
Record continuous keys for book-keeping.
Definition: HybridFactor.h:64
gtsam::Factor
Definition: Factor.h:70
gtsam::DiscreteKeys
DiscreteKeys is a set of keys that can be assembled using the & operator.
Definition: DiscreteKey.h:41
gtsam::KeyVector
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition: Key.h:92
HybridFactor.h
gtsam::HybridFactor::Category
Category
Enum to help with categorizing hybrid factors.
Definition: HybridFactor.h:54
key2
const Symbol key2('v', 2)
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::CollectKeys
KeyVector CollectKeys(const KeyVector &continuousKeys, const DiscreteKeys &discreteKeys)
Definition: HybridFactor.cpp:23
gtsam::HybridFactor::discreteKeys_
DiscreteKeys discreteKeys_
Definition: HybridFactor.h:62
transform
EIGEN_DONT_INLINE void transform(const Transformation &t, Data &data)
Definition: geometry.cpp:25
gtsam::HybridFactor::Category::None
@ None
gtsam::HybridFactor::print
void print(const std::string &s="HybridFactor\n", const KeyFormatter &formatter=DefaultKeyFormatter) const override
print
Definition: HybridFactor.cpp:96
gtsam::GetCategory
HybridFactor::Category GetCategory(const KeyVector &continuousKeys, const DiscreteKeys &discreteKeys)
Definition: HybridFactor.cpp:58
gtsam::HybridFactor::HybridFactor
HybridFactor()=default
gtsam
traits
Definition: SFMdata.h:40
gtsam::Factor::equals
bool equals(const This &other, double tol=1e-9) const
check equality
Definition: Factor.cpp:42
gtsam::DiscreteKey
std::pair< Key, size_t > DiscreteKey
Definition: DiscreteKey.h:38
gtsam::HybridFactor::Category::Hybrid
@ Hybrid
gtsam::tol
const G double tol
Definition: Group.h:79
gtsam::HybridFactor::Category::Continuous
@ Continuous
gtsam::CollectDiscreteKeys
DiscreteKeys CollectDiscreteKeys(const DiscreteKeys &key1, const DiscreteKeys &key2)
Definition: HybridFactor.cpp:45


gtsam
Author(s):
autogenerated on Wed Mar 19 2025 03:01:48