diff --git a/gtsam/base/concepts.h b/gtsam/base/concepts.h index 90f897b90..e4fa6eda9 100644 --- a/gtsam/base/concepts.h +++ b/gtsam/base/concepts.h @@ -25,6 +25,9 @@ struct Manifold { typedef Chart::value_type type; }; +struct additive_group_tag {}; +struct multiplicative_group_tag {}; + } // namespace traits template @@ -77,16 +80,27 @@ class GroupConcept { Group pq = compose(p, q); Group d = between(p, q); bool test = equal(p, q); + operator_usage(p, q, traits::group_flavor::tag); } 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)); + && (equal(compose(a, between(a, b)), b)) + && operator_usage(a, b, traits::group_flavor::tag) } private: Group p,q; + + bool operator_usage(const Group& a, const Group& b, traits::multiplicative_group_tag) { + return equals(compose(a, b), a*b); + + } + bool operator_usage(const Group& a, const Group& b, traits::additive_group_tag) { + return equals(compose(a, b), a+b); + } + }; } // namespace gtsam