[EXPERIMENTAL] Initial SQP Solver. DO NOT BUILD.
							parent
							
								
									d4b4b2b31d
								
							
						
					
					
						commit
						8926a1da91
					
				| 
						 | 
				
			
			@ -10,7 +10,7 @@
 | 
			
		|||
namespace gtsam {
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
/** An exception indicating that the provided initial value is infeasible
 | 
			
		||||
 * Also used to indicatethat the noise model dimension passed into a
 | 
			
		||||
 * Also used to inzdicatethat the noise model dimension passed into a
 | 
			
		||||
 * JacobianFactor has a different dimensionality than the factor. */
 | 
			
		||||
class InfeasibleInitialValues: public ThreadsafeException<
 | 
			
		||||
    InfeasibleInitialValues> {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file     NP.h
 | 
			
		||||
 * @brief    Use this virtual class to represent a non-linear
 | 
			
		||||
 *           problem. An implementation of this should provide
 | 
			
		||||
 *           approximation and differentiation services to
 | 
			
		||||
 *           allow SQP to work on the given problem.
 | 
			
		||||
 * @author   Ivan Dario Jimenez
 | 
			
		||||
 * @date     2/2/16
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <gtsam_unstable/linear/QP.h>
 | 
			
		||||
 | 
			
		||||
namespace gtsam {
 | 
			
		||||
 | 
			
		||||
class NP {
 | 
			
		||||
public:
 | 
			
		||||
  /*
 | 
			
		||||
   * This function takes the a point and returns a quadratic 
 | 
			
		||||
   * problem approximation to the non-linear Problem.
 | 
			
		||||
   */
 | 
			
		||||
  virtual QP approximate(const Vector& x) const = 0;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Differentiates the objective function of the non-linear 
 | 
			
		||||
   * problem at point x.
 | 
			
		||||
   */
 | 
			
		||||
  virtual Vector objectiveDerivative(const Vector& x) const = 0;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Differentiates the constraints at point x.
 | 
			
		||||
   */
 | 
			
		||||
  virtual Vector constraintsDerivative(const Vector& x) const = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file     SQPSolver.h
 | 
			
		||||
 * @brief    This class is used to solve a Non-linear Problem
 | 
			
		||||
 *           (NP) and finds a local solution using SQP. See
 | 
			
		||||
 *           Nocedal Algorithm 18.3 for details.
 | 
			
		||||
 * @author   Ivan Dario Jimenez
 | 
			
		||||
 * @date     2/2/16
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <gtsam_unstable/linear/NP.h>
 | 
			
		||||
#include <gtsam_unstable/linear/ActiveSetSolver.h>
 | 
			
		||||
#include <gtsam_unstable/linear/SQPState.h>
 | 
			
		||||
 | 
			
		||||
class SQPSolver : public ActiveSetSolver {
 | 
			
		||||
  const NP& np_; //!< the nonlinear programming problem
 | 
			
		||||
public:
 | 
			
		||||
  SQPSolver(const NP& np) : np_(np){}
 | 
			
		||||
 | 
			
		||||
  NPState iterate(const NPState& state) const;
 | 
			
		||||
  /*
 | 
			
		||||
   * This function will optimize the Non-linear problem given a set of initial values
 | 
			
		||||
   */
 | 
			
		||||
  pair<Vector, Vector> optimize(const Vector& initialValues) const;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * This function will attempt to optimize the Non-linear problem without the need
 | 
			
		||||
   * of initial values.
 | 
			
		||||
   */
 | 
			
		||||
  pair<Vector, Vector> optimize();
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file     SQPState.h
 | 
			
		||||
 * @brief    This class is used to store the current state of
 | 
			
		||||
 *           an SQPSolver iteration.
 | 
			
		||||
 * @author   Ivan Dario Jimenez
 | 
			
		||||
 * @date     2/2/16
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <gtsam/base/Matrix.h>
 | 
			
		||||
 | 
			
		||||
namespace gtsam {
 | 
			
		||||
class SQPState {
 | 
			
		||||
  Vector values;
 | 
			
		||||
  Vector duals;
 | 
			
		||||
  Vector workingSet;
 | 
			
		||||
 | 
			
		||||
  bool converged;
 | 
			
		||||
  size_t iterations;
 | 
			
		||||
 | 
			
		||||
  SQPState() :
 | 
			
		||||
    values(), duals(), workingSet(),converged(false), iterations(0) {}
 | 
			
		||||
 | 
			
		||||
  SQPState(const Vector& initialValues, const Vector& initialDuals,
 | 
			
		||||
           const Vector& initialWorkingSet, const bool _converged,
 | 
			
		||||
           const size_t iterations) :
 | 
			
		||||
    values(initialValues), duals(initialDuals), workingSet(initialWorkingSet),
 | 
			
		||||
    converged(_converged), iterations(iterations) {}
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
#include <gtsam_unstable/linear/NP.h>
 | 
			
		||||
#include <gtsam_unstable/linear/SQPSolver.h>
 | 
			
		||||
#include <gtsam_unstable/linear/SQPState.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace gtsam;
 | 
			
		||||
 | 
			
		||||
int main(){
 | 
			
		||||
  TestResult tr;
 | 
			
		||||
  return TestRegistry::runAllTests(tr);
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue