group concept operator usage with tags
parent
b6576d7e27
commit
978c17ceb6
|
@ -25,6 +25,9 @@ struct Manifold {
|
||||||
typedef Chart::value_type type;
|
typedef Chart::value_type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct additive_group_tag {};
|
||||||
|
struct multiplicative_group_tag {};
|
||||||
|
|
||||||
} // namespace traits
|
} // namespace traits
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
|
@ -77,16 +80,27 @@ class GroupConcept {
|
||||||
Group pq = compose(p, q);
|
Group pq = compose(p, q);
|
||||||
Group d = between(p, q);
|
Group d = between(p, q);
|
||||||
bool test = equal(p, q);
|
bool test = equal(p, q);
|
||||||
|
operator_usage(p, q, traits::group_flavor<Group>::tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool check_invariants(const Group& a, const Group& b) {
|
bool check_invariants(const Group& a, const Group& b) {
|
||||||
return (equal(compose(a, inverse(a)), identity))
|
return (equal(compose(a, inverse(a)), identity))
|
||||||
&& (equal(between(a, b), compose(inverse(a), b)))
|
&& (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<Group>::tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Group p,q;
|
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
|
} // namespace gtsam
|
||||||
|
|
Loading…
Reference in New Issue