From b6576d7e276599af0517ebad42233047d753992e Mon Sep 17 00:00:00 2001 From: Mike Bosse Date: Thu, 4 Dec 2014 13:10:50 +0100 Subject: [PATCH] added group concept check --- GTSAM-Concepts.md | 2 +- gtsam/base/concepts.h | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/GTSAM-Concepts.md b/GTSAM-Concepts.md index 41bdafee9..774409e8d 100644 --- a/GTSAM-Concepts.md +++ b/GTSAM-Concepts.md @@ -162,7 +162,7 @@ The group composition operation can be of two flavors: * `gtsam::traits::additive_group_tag` * `gtsam::traits::multiplicative_group_tag` -which should be queryable by `gtsam::traits::group_flavor` +which should be queryable by `gtsam::traits::group_flavor::tag` Manifold Example diff --git a/gtsam/base/concepts.h b/gtsam/base/concepts.h index 05d7e378b..90f897b90 100644 --- a/gtsam/base/concepts.h +++ b/gtsam/base/concepts.h @@ -66,6 +66,29 @@ class ChartConcept { }; +template +class GroupConcept { + public: + typedef G Group; + static const Group identity = traits::identity::value; + + BOOST_CONCEPT_USAGE(GroupConcept) { + Group ip = inverse(p); + Group pq = compose(p, q); + Group d = between(p, q); + bool test = equal(p, q); + } + + bool check_invariants(const Group& a, const Group& b) { + return (equal(compose(a, inverse(a)), identity)) + && (equal(between(a, b), compose(inverse(a), b))) + && (equal(compose(a, between(a, b)), b)); + } + + private: + Group p,q; +}; + } // namespace gtsam #endif /* CONCEPTS_H_ */