25 #ifdef GTSAM_USE_BOOST_FEATURES 26 #include <boost/concept_check.hpp> 27 #include <boost/concept/requires.hpp> 28 #include <boost/type_traits/is_base_of.hpp> 29 #include <boost/static_assert.hpp> 57 (std::is_base_of<group_tag, structure_category_tag>::value),
58 "This type's structure_category trait does not assert it as a group (or derived)");
63 operator_usage(flavor);
86 check_group_invariants(
const G& a,
const G& b,
double tol = 1e-9) {
98 struct MultiplicativeGroupTraits {
101 static Class Identity() {
return Class::Identity(); }
102 static Class Compose(
const Class &g,
const Class & h) {
return g * h;}
103 static Class Between(
const Class &g,
const Class & h) {
return g.inverse() * h;}
104 static Class Inverse(
const Class &g) {
return g.inverse();}
108 template<
class Class>
109 struct MultiplicativeGroup : MultiplicativeGroupTraits<Class>,
Testable<Class> {};
113 template<
class Class>
114 struct AdditiveGroupTraits {
117 static Class Identity() {
return Class::Identity(); }
118 static Class Compose(
const Class &g,
const Class & h) {
return g + h;}
119 static Class Between(
const Class &g,
const Class & h) {
return h - g;}
120 static Class Inverse(
const Class &g) {
return -g;}
124 template<
class Class>
125 struct AdditiveGroup : AdditiveGroupTraits<Class>,
Testable<Class> {};
132 compose_pow(
const G& g,
size_t n) {
134 else if (n == 1)
return g;
140 template<
typename G,
typename H>
160 return DirectProduct(this->first.inverse(), this->second.inverse());
165 template<
typename G,
typename H>
167 internal::MultiplicativeGroupTraits<DirectProduct<G, H> > {};
171 template<
typename G,
typename H>
176 const G& g()
const {
return this->first; }
177 const H& h()
const {
return this->second;}
184 DirectSum(
const G& g,
const H& h):std::pair<G,H>(g,h) {}
190 return DirectSum(g()+other.g(), h()+other.h());
193 return DirectSum(g()-other.g(), h()-other.h());
201 template<
typename G,
typename H>
203 internal::AdditiveGroupTraits<DirectSum<G, H> > {};
215 #define GTSAM_CONCEPT_GROUP_INST(T) template class gtsam::IsGroup<T>; 216 #define GTSAM_CONCEPT_GROUP_TYPE(T) typedef gtsam::IsGroup<T> _gtsam_IsGroup_##T; Concept check for values that can be used in unit tests.
Definition: Testable.h:152
Point2 operator*(double s, const Point2 &p)
multiply with scalar
Definition: Point2.h:52
DirectProduct()
Default constructor yields identity.
Definition: Group.h:147
Group operator syntax flavors.
Definition: Group.h:40
Definition: chartTesting.h:28
GTSAM_EXPORT Errors operator-(const Errors &a, const Errors &b)
Subtraction.
GTSAM_CONCEPT_REQUIRES(IsGroup< G >, bool) check_group_invariants(const G &a
Check invariants.
tag to assert a type is a group
Definition: Group.h:37
GTSAM_EXPORT Errors operator+(const Errors &a, const Errors &b)
Addition.
DirectSum()
Default constructor yields identity.
Definition: Group.h:181