Formatting and documentation
							parent
							
								
									87ef601b66
								
							
						
					
					
						commit
						d4b868aa12
					
				|  | @ -64,7 +64,8 @@ public: | |||
|   } | ||||
|   /// Access via key
 | ||||
|   VerticalBlockMatrix::Block operator()(Key key) { | ||||
|     FastVector<Key>::const_iterator it = std::find(keys_.begin(),keys_.end(),key); | ||||
|     FastVector<Key>::const_iterator it = std::find(keys_.begin(), keys_.end(), | ||||
|         key); | ||||
|     DenseIndex block = it - keys_.begin(); | ||||
|     return Ab_(block); | ||||
|   } | ||||
|  | @ -98,7 +99,7 @@ struct CallRecord { | |||
| template<int ROWS, int COLS> | ||||
| void handleLeafCase(const Eigen::Matrix<double, ROWS, COLS>& dTdA, | ||||
|     JacobianMap& jacobians, Key key) { | ||||
|   jacobians(key).block < ROWS, COLS > (0, 0) += dTdA; // block makes HUGE difference
 | ||||
|   jacobians(key).block<ROWS, COLS>(0, 0) += dTdA; // block makes HUGE difference
 | ||||
| } | ||||
| /// Handle Leaf Case for Dynamic Matrix type (slower)
 | ||||
| template<> | ||||
|  | @ -311,9 +312,9 @@ public: | |||
| 
 | ||||
| //-----------------------------------------------------------------------------
 | ||||
| /// Leaf Expression
 | ||||
| template<class T, class Chart=DefaultChart<T> > | ||||
| template<class T, class Chart = DefaultChart<T> > | ||||
| class LeafExpression: public ExpressionNode<T> { | ||||
|   typedef ChartValue<T,Chart> value_type; // perhaps this can be something else like a std::pair<T,Chart> ??
 | ||||
|   typedef ChartValue<T, Chart> value_type; // perhaps this can be something else like a std::pair<T,Chart> ??
 | ||||
| 
 | ||||
|   /// The key into values
 | ||||
|   Key key_; | ||||
|  | @ -347,8 +348,8 @@ public: | |||
|   } | ||||
| 
 | ||||
|   /// Construct an execution trace for reverse AD
 | ||||
|   virtual const value_type& traceExecution(const Values& values, ExecutionTrace<value_type>& trace, | ||||
|       char* raw) const { | ||||
|   virtual const value_type& traceExecution(const Values& values, | ||||
|       ExecutionTrace<value_type>& trace, char* raw) const { | ||||
|     trace.setLeaf(key_); | ||||
|     return dynamic_cast<const value_type&>(values.at(key_)); | ||||
|   } | ||||
|  | @ -358,7 +359,7 @@ public: | |||
| //-----------------------------------------------------------------------------
 | ||||
| /// Leaf Expression, if no chart is given, assume default chart and value_type is just the plain value
 | ||||
| template<typename T> | ||||
| class LeafExpression<T, DefaultChart<T> >: public ExpressionNode<T> { | ||||
| class LeafExpression<T, DefaultChart<T> > : public ExpressionNode<T> { | ||||
|   typedef T value_type; | ||||
| 
 | ||||
|   /// The key into values
 | ||||
|  | @ -405,6 +406,7 @@ public: | |||
| //   C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost
 | ||||
| //   and Beyond. Abrahams, David; Gurtovoy, Aleksey. Pearson Education.
 | ||||
| // to recursively generate a class, that will be the base for function nodes.
 | ||||
| //
 | ||||
| // The class generated, for three arguments A1, A2, and A3 will be
 | ||||
| //
 | ||||
| // struct Base1 : Argument<T,A1,1>, FunctionalBase<T> {
 | ||||
|  | @ -429,6 +431,30 @@ public: | |||
| //
 | ||||
| // All this magic happens when  we generate the Base3 base class of FunctionalNode
 | ||||
| // by invoking boost::mpl::fold over the meta-function GenerateFunctionalNode
 | ||||
| //
 | ||||
| // Similarly, the inner Record struct will be
 | ||||
| //
 | ||||
| // struct Record1 : JacobianTrace<T,A1,1>, CallRecord<traits::dimension<T>::value> {
 | ||||
| //   ... storage related to A1 ...
 | ||||
| //   ... methods that work on A1 ...
 | ||||
| // };
 | ||||
| //
 | ||||
| // struct Record2 : JacobianTrace<T,A2,2>, Record1 {
 | ||||
| //   ... storage related to A2 ...
 | ||||
| //   ... methods that work on A2 and (recursively) on A1 ...
 | ||||
| // };
 | ||||
| //
 | ||||
| // struct Record3 : JacobianTrace<T,A3,3>, Record2 {
 | ||||
| //   ... storage related to A3 ...
 | ||||
| //   ... methods that work on A3 and (recursively) on A2 and A1 ...
 | ||||
| // };
 | ||||
| //
 | ||||
| // struct Record : Record3 {
 | ||||
| //   Provides convenience access to storage in hierarchy by using
 | ||||
| //   static_cast<JacobianTrace<T, A, N> &>(*this)
 | ||||
| // }
 | ||||
| //
 | ||||
| 
 | ||||
| //-----------------------------------------------------------------------------
 | ||||
| 
 | ||||
| /// meta-function to generate fixed-size JacobianTA type
 | ||||
|  | @ -457,6 +483,7 @@ struct FunctionalBase: ExpressionNode<T> { | |||
| 
 | ||||
|   /// Construct an execution trace for reverse AD
 | ||||
|   void trace(const Values& values, Record* record, char*& raw) const { | ||||
|     // base case: does not do anything
 | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
|  | @ -562,15 +589,23 @@ struct GenerateFunctionalNode: Argument<T, A, Base::N + 1>, Base { | |||
| template<class T, class TYPES> | ||||
| struct FunctionalNode { | ||||
| 
 | ||||
|   /// The following typedef generates the recursively defined Base class
 | ||||
|   typedef typename boost::mpl::fold<TYPES, FunctionalBase<T>, | ||||
|       GenerateFunctionalNode<T, MPL::_2, MPL::_1> >::type Base; | ||||
| 
 | ||||
|   /**
 | ||||
|    *  The type generated by this meta-function derives from Base | ||||
|    *  and adds access functions as well as the crucial [trace] function | ||||
|    */ | ||||
|   struct type: public Base { | ||||
| 
 | ||||
|     // Argument types and derived, note these are base 0 !
 | ||||
|     // These are currently not used - useful for Phoenix in future
 | ||||
| #ifdef EXPRESSIONS_PHOENIX | ||||
|     typedef TYPES Arguments; | ||||
|     typedef typename boost::mpl::transform<TYPES, Jacobian<T, MPL::_1> >::type Jacobians; | ||||
|     typedef typename boost::mpl::transform<TYPES, OptionalJacobian<T, MPL::_1> >::type Optionals; | ||||
| #endif | ||||
| 
 | ||||
|     /// Reset expression shared pointer
 | ||||
|     template<class A, size_t N> | ||||
|  | @ -725,7 +760,8 @@ public: | |||
| 
 | ||||
|   typedef boost::function< | ||||
|       T(const A1&, const A2&, const A3&, typename OptionalJacobian<T, A1>::type, | ||||
|           typename OptionalJacobian<T, A2>::type, typename OptionalJacobian<T, A3>::type)> Function; | ||||
|           typename OptionalJacobian<T, A2>::type, | ||||
|           typename OptionalJacobian<T, A3>::type)> Function; | ||||
|   typedef typename FunctionalNode<T, boost::mpl::vector<A1, A2, A3> >::type Base; | ||||
|   typedef typename Base::Record Record; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue