80 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file ConstraintOptimizer.h
 | |
|  * @brief Utilities and classes required for solving Constrained Problems
 | |
|  * @author Alex Cunningham
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <boost/optional.hpp>
 | |
| #include <Matrix.h>
 | |
| 
 | |
| namespace gtsam {
 | |
| 
 | |
| 	/**
 | |
| 	 * BFGS Hessian estimator
 | |
| 	 * Maintains an estimate for a hessian matrix using
 | |
| 	 * only derivatives and the step
 | |
| 	 */
 | |
| 	class BFGSEstimator {
 | |
| 	protected:
 | |
| 		size_t n_; // dimension of square matrix
 | |
| 		Matrix B_; // current estimate
 | |
| 		Vector prev_dfx_; // previous gradient value
 | |
| 	public:
 | |
| 
 | |
| 		/**
 | |
| 		 * Creates an estimator of a particular dimension
 | |
| 		 */
 | |
| 		BFGSEstimator(size_t n) : n_(n), B_(eye(n,n)) {}
 | |
| 
 | |
| 		~BFGSEstimator() {}
 | |
| 
 | |
| 		/**
 | |
| 		 * Direct vector interface - useful for small problems
 | |
| 		 *
 | |
| 		 * Update will set the previous gradient and update the
 | |
| 		 * estimate for the Hessian.  When specified without
 | |
| 		 * the step, this is the initialization phase, and will not
 | |
| 		 * change the Hessian estimate
 | |
| 		 * @param df is the gradient of the function
 | |
| 		 * @param step is the step vector applied at the last iteration
 | |
| 		 */
 | |
| 		void update(const Vector& df, const boost::optional<Vector&> step = boost::none);
 | |
| 
 | |
| 		// access functions
 | |
| 		const Matrix& getB() const { return B_; }
 | |
| 		size_t dim() const { return n_; }
 | |
| 
 | |
| 	};
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Basic function that uses LDL factorization to solve a
 | |
| 	 * KKT system (state and lagrange multipliers) of the form:
 | |
| 	 * Gd=b, where
 | |
| 	 * G = [B  A]  d = [ x ] b = - [g]
 | |
| 	 *     [A' 0]      [lam]       [h]
 | |
| 	 * B = Hessian of Lagragian function
 | |
| 	 * A = Gradient of constraints
 | |
| 	 * x = state
 | |
| 	 * lam = vector of lagrange mulipliers
 | |
| 	 * g = gradient of f(x) evaluated a point
 | |
| 	 * h = current value of c(x)
 | |
| 	 *
 | |
| 	 * @return pair of state and lambas
 | |
| 	 */
 | |
| 	std::pair<Vector, Vector> solveCQP(const Matrix& B, const Matrix& A,
 | |
| 									   const Vector& g, const Vector& h);
 | |
| 
 | |
| 	/**
 | |
| 	 * Simple line search function using an externally specified
 | |
| 	 * penalty function
 | |
| 	 */
 | |
| 	Vector linesearch(const Vector& x, const Vector& delta,
 | |
| 			double (*penalty)(const Vector&), size_t maxIt = 10);
 | |
| 
 | |
| } // \namespace gtsam
 | |
| 
 | |
| 
 |