LieGroup concept and flushing out more tags
							parent
							
								
									56787e1a88
								
							
						
					
					
						commit
						2fa9d0f557
					
				|  | @ -10,6 +10,7 @@ | |||
| 
 | ||||
| #include "manifold.h" | ||||
| #include "chart.h" | ||||
| #include <boost/type_traits.hpp> | ||||
| 
 | ||||
| namespace gtsam { | ||||
| 
 | ||||
|  | @ -31,9 +32,15 @@ struct DefaultChart { | |||
|   //typedef XXX type;
 | ||||
| }; | ||||
| 
 | ||||
| template <class T> | ||||
| struct structure {}; // specializations should be derived from one of the following tags
 | ||||
| struct manifold_tag {}; | ||||
| struct group_tag {}; | ||||
| struct lie_group_tag : public manifold_tag, public group_tag {}; | ||||
| struct vector_space_tag : public lie_group_tag {}; | ||||
| 
 | ||||
| template <class Group> | ||||
| struct group_flavor {}; | ||||
| 
 | ||||
| struct additive_group_tag {}; | ||||
| struct multiplicative_group_tag {}; | ||||
| 
 | ||||
|  | @ -43,11 +50,13 @@ template<class T> | |||
| class ManifoldConcept { | ||||
|  public: | ||||
|   typedef T Manifold; | ||||
|   typedef traits::manifold_tag<T> manifold_tag; | ||||
|   typedef traits::TangentVector<T>::type TangentVector; | ||||
|   typedef traits::DefaultChart<T>::type DefaultChart; | ||||
|   static const size_t dim = traits::dimension<T>::value; | ||||
| 
 | ||||
|   BOOST_CONCEPT_USAGE(ManifoldConcept) { | ||||
|     BOOST_STATIC_ASSERT(boost::is_base_of<traits::manifold_tag, traits::structure<Manifold> >); | ||||
|     BOOST_STATIC_ASSERT(TangentVector::SizeAtCompileTime == dim); | ||||
|     // no direct usage for manifold since most usage is through a chart
 | ||||
|   } | ||||
|  | @ -81,6 +90,7 @@ class GroupConcept { | |||
|   static const Group identity = traits::identity<G>::value; | ||||
| 
 | ||||
|   BOOST_CONCEPT_USAGE(GroupConcept) { | ||||
|     BOOST_STATIC_ASSERT(boost::is_base_of<traits::group_tag, traits::structure<Group> >); | ||||
|     Group ip = inverse(p); | ||||
|     Group pq = compose(p, q); | ||||
|     Group d = between(p, q); | ||||
|  | @ -108,6 +118,16 @@ class GroupConcept { | |||
| 
 | ||||
| }; | ||||
| 
 | ||||
| template <class L> | ||||
| class LieGroupConcept : public GroupConcept<L>, public ManifoldConcept<L> { | ||||
| 
 | ||||
|   BOOST_CONCEPT_USAGE(LieGroupConcept) { | ||||
|     BOOST_STATIC_ASSERT(boost::is_base_of<traits::lie_group_tag, traits::structure<L> >); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| } // namespace gtsam
 | ||||
| 
 | ||||
| #endif /* CONCEPTS_H_ */ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue