delete SQP
parent
41684ee6e0
commit
016da71033
|
@ -1,37 +0,0 @@
|
|||
/**
|
||||
* @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;
|
||||
};
|
||||
|
||||
}
|
|
@ -1,176 +0,0 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
|
||||
* 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 testPositionUpperBoundX.cpp
|
||||
* @brief Unit tests for testPositionUpperBoundX
|
||||
* @author Krunal Chande
|
||||
* @author Duy-Nguyen Ta
|
||||
* @author Luca Carlone
|
||||
* @date Dec 16, 2014
|
||||
*/
|
||||
|
||||
#include <gtsam/base/numericalDerivative.h>
|
||||
#include <gtsam/geometry/Pose3.h>
|
||||
#include <gtsam/inference/Symbol.h>
|
||||
#include <gtsam/nonlinear/NonlinearFactor.h>
|
||||
#include <CppUnitLite/TestHarness.h>
|
||||
#include <iostream>
|
||||
|
||||
namespace gtsam {
|
||||
|
||||
template<class T>
|
||||
class LinearInequalityManifold1: public NoiseModelFactor1<T> {
|
||||
typedef NoiseModelFactor1<T> Base;
|
||||
typedef LinearInequalityManifold1<T> This;
|
||||
protected:
|
||||
bool active_;
|
||||
public:
|
||||
|
||||
/// Constructor
|
||||
LinearInequalityManifold1(Key key) :
|
||||
Base(noiseModel::Constrained::All(1), key), active_(true) {
|
||||
}
|
||||
|
||||
/** implement functions needed for Testable */
|
||||
|
||||
/** print */
|
||||
virtual void print(const std::string& s, const KeyFormatter& keyFormatter =
|
||||
DefaultKeyFormatter) const {
|
||||
std::cout << s << " key = { " << keyFormatter(this->key()) << "}"
|
||||
<< std::endl;
|
||||
if (active_)
|
||||
std::cout << " Active" << std::endl;
|
||||
else
|
||||
std::cout << " Inactive" << std::endl;
|
||||
}
|
||||
|
||||
/** equals */
|
||||
virtual bool equals(const NonlinearFactor& expected,
|
||||
double tol = 1e-9) const {
|
||||
const This* e = dynamic_cast<const This*>(&expected);
|
||||
return e != NULL && Base::equals(*e, tol) && (active_ == e->active_);
|
||||
}
|
||||
|
||||
/** Evaluate error MUST return a *one dimensional* vector,
|
||||
* because we don't support multi-valued inequality factors
|
||||
*/
|
||||
virtual Vector evaluateError(const T& x, boost::optional<Matrix&> H =
|
||||
boost::none) const = 0;
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* This class defines an inequality upper bound on x for a Pose3
|
||||
* x <= upperBound
|
||||
*/
|
||||
class PositionUpperBoundX: public LinearInequalityManifold1<Pose3> {
|
||||
double upperBound_;
|
||||
typedef LinearInequalityManifold1<Pose3> Base;
|
||||
typedef PositionUpperBoundX This;
|
||||
public:
|
||||
PositionUpperBoundX(Key key, const double upperBound) :
|
||||
Base(key), upperBound_(upperBound) {
|
||||
}
|
||||
|
||||
/// @return a deep copy of this factor
|
||||
virtual gtsam::NonlinearFactor::shared_ptr clone() const {
|
||||
return boost::static_pointer_cast<NonlinearFactor>(
|
||||
gtsam::NonlinearFactor::shared_ptr(new This(*this)));
|
||||
}
|
||||
|
||||
/** implement functions needed for Testable */
|
||||
|
||||
/** print */
|
||||
virtual void print(const std::string& s, const KeyFormatter& keyFormatter =
|
||||
DefaultKeyFormatter) const {
|
||||
Base::print(s);
|
||||
std::cout << "PositionUpperBoundX" << std::endl;
|
||||
std::cout << "x <= " << upperBound_ << std::endl;
|
||||
}
|
||||
|
||||
/** equals */
|
||||
virtual bool equals(const NonlinearFactor& expected,
|
||||
double tol = 1e-9) const {
|
||||
const This* e = dynamic_cast<const This*>(&expected);
|
||||
return e != NULL && Base::equals(*e, tol) && (upperBound_ == e->upperBound_);
|
||||
}
|
||||
|
||||
/**
|
||||
* error = x - upperBound_
|
||||
*/
|
||||
double computeError(const Pose3& pose) const {
|
||||
return pose.x() - upperBound_;
|
||||
}
|
||||
|
||||
/**
|
||||
* error = x - upperBound_
|
||||
*/
|
||||
Vector evaluateError(const Pose3& pose, boost::optional<Matrix&> H =
|
||||
boost::none) const {
|
||||
if (H)
|
||||
*H = (Matrix(1, 6) << 0, 0, 0, 1, 0, 0).finished();
|
||||
return (Vector(1) << computeError(pose)).finished();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
|
||||
using namespace std;
|
||||
using namespace gtsam::symbol_shorthand;
|
||||
using namespace gtsam;
|
||||
|
||||
//******************************************************************************
|
||||
TEST(PositionUpperBoundX, equals ) {
|
||||
// Instantiate a class PositionUpperBoundX
|
||||
PositionUpperBoundX ineq1(X(1), 1);
|
||||
|
||||
// Instantiate another class PositionUpperBoundX
|
||||
PositionUpperBoundX ineq2(X(1), 1);
|
||||
|
||||
// check equals
|
||||
CHECK(ineq1.equals(ineq2, 1e-5));
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
TEST(PositionUpperBoundX, evaluateError ) {
|
||||
// Instantiate a class PositionUpperBoundX
|
||||
PositionUpperBoundX ineq(X(1), 45.6);
|
||||
|
||||
Pose3 pose(Rot3::Ypr(0.1, 0.3, 0.2), Point3(43.0, 27.8, 91.1));
|
||||
Matrix H;
|
||||
Vector error = ineq.evaluateError(pose, H);
|
||||
|
||||
Matrix expectedH = numericalDerivative11<Vector, Pose3>(
|
||||
boost::bind(&PositionUpperBoundX::evaluateError, ineq, _1, boost::none),
|
||||
pose, 1e-5);
|
||||
|
||||
cout << "expectedH: " << expectedH << endl;
|
||||
cout << "H: " << H << endl;
|
||||
|
||||
Vector expectedError = (Vector(1) << 0.0).finished();
|
||||
// CHECK(assert_equal(expectedError, error, 1e-100));
|
||||
// CHECK(assert_equal(expectedH, H, 1e-100));
|
||||
|
||||
Matrix hessian = numericalHessian<Pose3>(
|
||||
boost::bind(&PositionUpperBoundX::computeError, ineq, _1),
|
||||
pose, 1e-5);
|
||||
cout << "Hessian: \n" << hessian << endl;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
int main() {
|
||||
TestResult tr;
|
||||
return TestRegistry::runAllTests(tr);
|
||||
}
|
||||
//******************************************************************************
|
||||
|
Loading…
Reference in New Issue