| 
									
										
										
										
											2015-03-25 20:19:43 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation, | 
					
						
							|  |  |  |  * Atlanta, Georgia 30332-0415 | 
					
						
							|  |  |  |  * All Rights Reserved | 
					
						
							|  |  |  |  * Authors: Frank Dellaert, et al. (see THANKS for the full author list) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * See LICENSE for the license information | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * -------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @file    LinearCost.h | 
					
						
							|  |  |  |  * @brief   LinearCost derived from JacobianFactor to support linear cost functions c'x | 
					
						
							|  |  |  |  * @date    Nov 27, 2014 | 
					
						
							|  |  |  |  * @author  Duy-Nguyen Ta | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <gtsam/linear/JacobianFactor.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef Eigen::RowVectorXd RowVector; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2015-05-15 20:44:58 +08:00
										 |  |  |  * This class defines a linear cost function c'x | 
					
						
							|  |  |  |  * which is a JacobianFactor with only one row | 
					
						
							| 
									
										
										
										
											2015-03-25 20:19:43 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | class LinearCost: public JacobianFactor { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-14 10:58:36 +08:00
										 |  |  |   typedef LinearCost This; ///< Typedef to this class
 | 
					
						
							|  |  |  |   typedef JacobianFactor Base; ///< Typedef to base class
 | 
					
						
							|  |  |  |   typedef boost::shared_ptr<This> shared_ptr; ///< shared_ptr to this class
 | 
					
						
							| 
									
										
										
										
											2015-03-25 20:19:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-14 10:58:36 +08:00
										 |  |  |   /** default constructor for I/O */ | 
					
						
							|  |  |  |   LinearCost() : | 
					
						
							|  |  |  |       Base() { | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Conversion from HessianFactor */ | 
					
						
							|  |  |  |   explicit LinearCost(const HessianFactor& hf) { | 
					
						
							|  |  |  |     throw std::runtime_error("Cannot convert HessianFactor to LinearCost"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Conversion from JacobianFactor */ | 
					
						
							|  |  |  |   explicit LinearCost(const JacobianFactor& jf) : | 
					
						
							|  |  |  |       Base(jf) { | 
					
						
							|  |  |  |     if (jf.isConstrained()) { | 
					
						
							|  |  |  |       throw std::runtime_error( | 
					
						
							|  |  |  |           "Cannot convert a constrained JacobianFactor to LinearCost"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (jf.get_model()->dim() != 1) { | 
					
						
							|  |  |  |       throw std::runtime_error( | 
					
						
							|  |  |  |           "Only support single-valued linear cost factor!"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Construct unary factor */ | 
					
						
							|  |  |  |   LinearCost(Key i1, const RowVector& A1) : | 
					
						
							|  |  |  |       Base(i1, A1, Vector1::Zero()) { | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Construct binary factor */ | 
					
						
							|  |  |  |   LinearCost(Key i1, const RowVector& A1, Key i2, const RowVector& A2, double b) : | 
					
						
							|  |  |  |       Base(i1, A1, i2, A2, Vector1::Zero()) { | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Construct ternary factor */ | 
					
						
							|  |  |  |   LinearCost(Key i1, const RowVector& A1, Key i2, const RowVector& A2, Key i3, | 
					
						
							|  |  |  |       const RowVector& A3) : | 
					
						
							|  |  |  |       Base(i1, A1, i2, A2, i3, A3, Vector1::Zero()) { | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Construct an n-ary factor
 | 
					
						
							|  |  |  |    * @tparam TERMS A container whose value type is std::pair<Key, Matrix>, specifying the | 
					
						
							|  |  |  |    *         collection of keys and matrices making up the factor. */ | 
					
						
							|  |  |  |   template<typename TERMS> | 
					
						
							|  |  |  |   LinearCost(const TERMS& terms) : | 
					
						
							|  |  |  |       Base(terms, Vector1::Zero()) { | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Virtual destructor */ | 
					
						
							|  |  |  |   virtual ~LinearCost() { | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** equals */ | 
					
						
							| 
									
										
										
										
											2020-07-26 15:57:54 +08:00
										 |  |  |   bool equals(const GaussianFactor& lf, double tol = 1e-9) const override { | 
					
						
							| 
									
										
										
										
											2016-06-14 10:58:36 +08:00
										 |  |  |     return Base::equals(lf, tol); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** print */ | 
					
						
							| 
									
										
										
										
											2020-07-26 15:57:54 +08:00
										 |  |  |   void print(const std::string& s = "", const KeyFormatter& formatter = | 
					
						
							|  |  |  |       DefaultKeyFormatter) const override { | 
					
						
							| 
									
										
										
										
											2016-06-14 10:58:36 +08:00
										 |  |  |     Base::print(s + " LinearCost: ", formatter); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Clone this LinearCost */ | 
					
						
							| 
									
										
										
										
											2020-07-26 15:57:54 +08:00
										 |  |  |   GaussianFactor::shared_ptr clone() const override { | 
					
						
							| 
									
										
										
										
											2016-06-14 10:58:36 +08:00
										 |  |  |     return boost::static_pointer_cast < GaussianFactor | 
					
						
							|  |  |  |         > (boost::make_shared < LinearCost > (*this)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Special error_vector for constraints (A*x-b) */ | 
					
						
							|  |  |  |   Vector error_vector(const VectorValues& c) const { | 
					
						
							|  |  |  |     return unweighted_error(c); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Special error for single-valued inequality constraints. */ | 
					
						
							| 
									
										
										
										
											2020-07-26 15:57:54 +08:00
										 |  |  |   double error(const VectorValues& c) const override { | 
					
						
							| 
									
										
										
										
											2016-06-14 10:58:36 +08:00
										 |  |  |     return error_vector(c)[0]; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-03-25 20:19:43 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | // \ LinearCost
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// traits
 | 
					
						
							|  |  |  | template<> struct traits<LinearCost> : public Testable<LinearCost> { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // \ namespace gtsam
 | 
					
						
							|  |  |  | 
 |