Prototype code for passing methods. Does not work (uncomment line 61)
							parent
							
								
									ae17f8a82f
								
							
						
					
					
						commit
						c68c2d2dac
					
				|  | @ -53,8 +53,8 @@ public: | |||
|   virtual std::set<Key> keys() const = 0; | ||||
| 
 | ||||
|   /// Return value and optional derivatives
 | ||||
|   virtual T value(const Values& values, | ||||
|       boost::optional<JacobianMap&> = boost::none) const = 0; | ||||
|   virtual T value(const Values& values, boost::optional<JacobianMap&> = | ||||
|       boost::none) const = 0; | ||||
| }; | ||||
| 
 | ||||
| /// Constant Expression
 | ||||
|  | @ -205,6 +205,7 @@ public: | |||
|   typedef boost::function< | ||||
|       T(const E1&, const E2&, boost::optional<Matrix&>, | ||||
|           boost::optional<Matrix&>)> function; | ||||
| 
 | ||||
| private: | ||||
| 
 | ||||
|   boost::shared_ptr<ExpressionNode<E1> > expression1_; | ||||
|  | @ -277,5 +278,65 @@ public: | |||
| 
 | ||||
| }; | ||||
| 
 | ||||
| //-----------------------------------------------------------------------------
 | ||||
| /// Binary Expression
 | ||||
| 
 | ||||
| template<class T, class E1, class E2> | ||||
| class MethodExpression: public ExpressionNode<T> { | ||||
| 
 | ||||
| public: | ||||
| 
 | ||||
|   typedef std::map<Key, Matrix> JacobianMap; | ||||
| 
 | ||||
|   typedef boost::function< | ||||
|       T(const E1*, const E2&, boost::optional<Matrix&>, | ||||
|           boost::optional<Matrix&>)> method; | ||||
| 
 | ||||
| private: | ||||
| 
 | ||||
|   boost::shared_ptr<ExpressionNode<E1> > expression1_; | ||||
|   boost::shared_ptr<ExpressionNode<E2> > expression2_; | ||||
|   method f_; | ||||
| 
 | ||||
|   /// Constructor with a binary function f, and two input arguments
 | ||||
|   MethodExpression(const Expression<E1>& e1, method f, const Expression<E2>& e2) : | ||||
|       expression1_(e1.root()), expression2_(e2.root()), f_(f) { | ||||
|   } | ||||
| 
 | ||||
|   friend class Expression<T> ; | ||||
| 
 | ||||
| public: | ||||
| 
 | ||||
|   /// Destructor
 | ||||
|   virtual ~MethodExpression() { | ||||
|   } | ||||
| 
 | ||||
|   /// Return keys that play in this expression
 | ||||
|   virtual std::set<Key> keys() const { | ||||
|     std::set<Key> keys1 = expression1_->keys(); | ||||
|     std::set<Key> keys2 = expression2_->keys(); | ||||
|     keys1.insert(keys2.begin(), keys2.end()); | ||||
|     return keys1; | ||||
|   } | ||||
| 
 | ||||
|   /// Return value and optional derivatives
 | ||||
|   virtual T value(const Values& values, | ||||
|       boost::optional<JacobianMap&> jacobians = boost::none) const { | ||||
|     T val; | ||||
|     if (jacobians) { | ||||
|       JacobianMap terms1, terms2; | ||||
|       Matrix H1, H2; | ||||
|       val = f_(expression1_->value(values, terms1), | ||||
|           expression2_->value(values, terms2), H1, H2); | ||||
|       BinaryExpression<T, E1, E2>::combine(H1, H2, terms1, terms2, *jacobians); | ||||
|     } else { | ||||
|       val = f_(expression1_->value(values), expression2_->value(values), | ||||
|           boost::none, boost::none); | ||||
|     } | ||||
|     return val; | ||||
|   } | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -57,6 +57,15 @@ public: | |||
|     root_.reset(new BinaryExpression<T, E1, E2>(f, expression1, expression2)); | ||||
|   } | ||||
| 
 | ||||
|   /// Construct a binary expression, where a method is passed
 | ||||
|   template<typename E1, typename E2> | ||||
|   Expression(const Expression<E1>& expression1, | ||||
|       typename MethodExpression<T, E1, E2>::method f, | ||||
|       const Expression<E2>& expression2) { | ||||
|     // TODO Assert that root of expressions 1 and 2 are not null.
 | ||||
|     root_.reset(new MethodExpression<T, E1, E2>(f, expression1, expression2)); | ||||
|   } | ||||
| 
 | ||||
|   /// Return keys that play in this expression
 | ||||
|   std::set<Key> keys() const { | ||||
|     return root_->keys(); | ||||
|  |  | |||
|  | @ -58,6 +58,9 @@ TEST(BAD, test) { | |||
|   Expression<Cal3_S2> K(3); | ||||
| 
 | ||||
|   // Create expression tree
 | ||||
| //  MethodExpression<Point3,Pose3,Point3>::method m = &Pose3::transform_to;
 | ||||
| //  MethodExpression<Point3,Pose3,Point3> methodExpression(x, &Pose3::transform_to, p);
 | ||||
| //  Expression<Point3> p_cam(x, &Pose3::transform_to, p);
 | ||||
|   Expression<Point3> p_cam(transformTo, x, p); | ||||
|   Expression<Point2> projection(project, p_cam); | ||||
|   Expression<Point2> uv_hat(uncalibrate<Cal3_S2>, K, projection); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue