Linear[In]EqualityFactorGraph --> [In]EqualityFactorGraph
parent
ce50219f9d
commit
d2f919e632
|
@ -10,7 +10,7 @@
|
|||
* -------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* LinearEqualityFactorGraph.h
|
||||
* EqualityFactorGraph.h
|
||||
* @brief: Factor graph of all LinearEquality factors
|
||||
* @date: Dec 8, 2014
|
||||
* @author: Duy-Nguyen Ta
|
||||
|
@ -23,14 +23,14 @@
|
|||
|
||||
namespace gtsam {
|
||||
|
||||
class LinearEqualityFactorGraph : public FactorGraph<LinearEquality> {
|
||||
class EqualityFactorGraph : public FactorGraph<LinearEquality> {
|
||||
public:
|
||||
typedef boost::shared_ptr<LinearEqualityFactorGraph> shared_ptr;
|
||||
typedef boost::shared_ptr<EqualityFactorGraph> shared_ptr;
|
||||
};
|
||||
|
||||
/// traits
|
||||
template<> struct traits<LinearEqualityFactorGraph> : public Testable<
|
||||
LinearEqualityFactorGraph> {
|
||||
template<> struct traits<EqualityFactorGraph> : public Testable<
|
||||
EqualityFactorGraph> {
|
||||
};
|
||||
|
||||
} // \ namespace gtsam
|
|
@ -10,7 +10,7 @@
|
|||
* -------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* LinearInequalityFactorGraph.h
|
||||
* InequalityFactorGraph.h
|
||||
* @brief: Factor graph of all LinearInequality factors
|
||||
* @date: Dec 8, 2014
|
||||
* @author: Duy-Nguyen Ta
|
||||
|
@ -23,12 +23,12 @@
|
|||
|
||||
namespace gtsam {
|
||||
|
||||
class LinearInequalityFactorGraph: public FactorGraph<LinearInequality> {
|
||||
class InequalityFactorGraph: public FactorGraph<LinearInequality> {
|
||||
private:
|
||||
typedef FactorGraph<LinearInequality> Base;
|
||||
|
||||
public:
|
||||
typedef boost::shared_ptr<LinearInequalityFactorGraph> shared_ptr;
|
||||
typedef boost::shared_ptr<InequalityFactorGraph> shared_ptr;
|
||||
|
||||
/** print */
|
||||
void print(const std::string& str, const KeyFormatter& keyFormatter =
|
||||
|
@ -37,15 +37,15 @@ public:
|
|||
}
|
||||
|
||||
/** equals */
|
||||
bool equals(const LinearInequalityFactorGraph& other,
|
||||
bool equals(const InequalityFactorGraph& other,
|
||||
double tol = 1e-9) const {
|
||||
return Base::equals(other, tol);
|
||||
}
|
||||
};
|
||||
|
||||
/// traits
|
||||
template<> struct traits<LinearInequalityFactorGraph> : public Testable<
|
||||
LinearInequalityFactorGraph> {
|
||||
template<> struct traits<InequalityFactorGraph> : public Testable<
|
||||
InequalityFactorGraph> {
|
||||
};
|
||||
|
||||
} // \ namespace gtsam
|
|
@ -19,8 +19,8 @@
|
|||
#pragma once
|
||||
|
||||
#include <gtsam/linear/GaussianFactorGraph.h>
|
||||
#include <gtsam_unstable/linear/LinearEqualityFactorGraph.h>
|
||||
#include <gtsam_unstable/linear/LinearInequalityFactorGraph.h>
|
||||
#include <gtsam_unstable/linear/EqualityFactorGraph.h>
|
||||
#include <gtsam_unstable/linear/InequalityFactorGraph.h>
|
||||
|
||||
namespace gtsam {
|
||||
|
||||
|
@ -29,8 +29,8 @@ namespace gtsam {
|
|||
*/
|
||||
struct QP {
|
||||
GaussianFactorGraph cost; //!< Quadratic cost factors
|
||||
LinearEqualityFactorGraph equalities; //!< linear equality constraints: f(x) = 0
|
||||
LinearInequalityFactorGraph inequalities; //!< linear inequality constraints: g(x) <= 0
|
||||
EqualityFactorGraph equalities; //!< linear equality constraints: f(x) = 0
|
||||
InequalityFactorGraph inequalities; //!< linear inequality constraints: g(x) <= 0
|
||||
|
||||
/** default constructor */
|
||||
QP() :
|
||||
|
@ -39,8 +39,8 @@ struct QP {
|
|||
|
||||
/** constructor */
|
||||
QP(const GaussianFactorGraph& _cost,
|
||||
const LinearEqualityFactorGraph& _linearEqualities,
|
||||
const LinearInequalityFactorGraph& _linearInequalities) :
|
||||
const EqualityFactorGraph& _linearEqualities,
|
||||
const InequalityFactorGraph& _linearInequalities) :
|
||||
cost(_cost), equalities(_linearEqualities), inequalities(
|
||||
_linearInequalities) {
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ QPSolver::QPSolver(const QP& qp) : qp_(qp) {
|
|||
|
||||
//******************************************************************************
|
||||
VectorValues QPSolver::solveWithCurrentWorkingSet(
|
||||
const LinearInequalityFactorGraph& workingSet) const {
|
||||
const InequalityFactorGraph& workingSet) const {
|
||||
GaussianFactorGraph workingGraph = baseGraph_;
|
||||
BOOST_FOREACH(const LinearInequality::shared_ptr& factor, workingSet) {
|
||||
if (factor->active())
|
||||
|
@ -50,7 +50,7 @@ VectorValues QPSolver::solveWithCurrentWorkingSet(
|
|||
|
||||
//******************************************************************************
|
||||
JacobianFactor::shared_ptr QPSolver::createDualFactor(Key key,
|
||||
const LinearInequalityFactorGraph& workingSet, const VectorValues& delta) const {
|
||||
const InequalityFactorGraph& workingSet, const VectorValues& delta) const {
|
||||
|
||||
// Transpose the A matrix of constrained factors to have the jacobian of the dual key
|
||||
std::vector<std::pair<Key, Matrix> > Aterms = collectDualJacobians
|
||||
|
@ -78,7 +78,7 @@ JacobianFactor::shared_ptr QPSolver::createDualFactor(Key key,
|
|||
|
||||
//******************************************************************************
|
||||
GaussianFactorGraph::shared_ptr QPSolver::buildDualGraph(
|
||||
const LinearInequalityFactorGraph& workingSet, const VectorValues& delta) const {
|
||||
const InequalityFactorGraph& workingSet, const VectorValues& delta) const {
|
||||
GaussianFactorGraph::shared_ptr dualGraph(new GaussianFactorGraph());
|
||||
BOOST_FOREACH(Key key, constrainedKeys_) {
|
||||
// Each constrained key becomes a factor in the dual graph
|
||||
|
@ -91,7 +91,7 @@ GaussianFactorGraph::shared_ptr QPSolver::buildDualGraph(
|
|||
|
||||
//******************************************************************************
|
||||
int QPSolver::identifyLeavingConstraint(
|
||||
const LinearInequalityFactorGraph& workingSet,
|
||||
const InequalityFactorGraph& workingSet,
|
||||
const VectorValues& lambdas) const {
|
||||
int worstFactorIx = -1;
|
||||
// preset the maxLambda to 0.0: if lambda is <= 0.0, the constraint is either
|
||||
|
@ -127,7 +127,7 @@ int QPSolver::identifyLeavingConstraint(
|
|||
* We want the minimum of all those alphas among all inactive inequality.
|
||||
*/
|
||||
boost::tuple<double, int> QPSolver::computeStepSize(
|
||||
const LinearInequalityFactorGraph& workingSet, const VectorValues& xk,
|
||||
const InequalityFactorGraph& workingSet, const VectorValues& xk,
|
||||
const VectorValues& p) const {
|
||||
static bool debug = false;
|
||||
|
||||
|
@ -198,7 +198,7 @@ QPState QPSolver::iterate(const QPState& state) const {
|
|||
}
|
||||
else {
|
||||
// Inactivate the leaving constraint
|
||||
LinearInequalityFactorGraph newWorkingSet = state.workingSet;
|
||||
InequalityFactorGraph newWorkingSet = state.workingSet;
|
||||
newWorkingSet.at(leavingFactor)->inactivate();
|
||||
return QPState(newValues, duals, newWorkingSet, false, state.iterations+1);
|
||||
}
|
||||
|
@ -216,7 +216,7 @@ QPState QPSolver::iterate(const QPState& state) const {
|
|||
<< endl;
|
||||
|
||||
// also add to the working set the one that complains the most
|
||||
LinearInequalityFactorGraph newWorkingSet = state.workingSet;
|
||||
InequalityFactorGraph newWorkingSet = state.workingSet;
|
||||
if (factorIx >= 0)
|
||||
newWorkingSet.at(factorIx)->activate();
|
||||
|
||||
|
@ -228,10 +228,10 @@ QPState QPSolver::iterate(const QPState& state) const {
|
|||
}
|
||||
|
||||
//******************************************************************************
|
||||
LinearInequalityFactorGraph QPSolver::identifyActiveConstraints(
|
||||
const LinearInequalityFactorGraph& inequalities,
|
||||
InequalityFactorGraph QPSolver::identifyActiveConstraints(
|
||||
const InequalityFactorGraph& inequalities,
|
||||
const VectorValues& initialValues, const VectorValues& duals, bool useWarmStart) const {
|
||||
LinearInequalityFactorGraph workingSet;
|
||||
InequalityFactorGraph workingSet;
|
||||
BOOST_FOREACH(const LinearInequality::shared_ptr& factor, inequalities) {
|
||||
LinearInequality::shared_ptr workingFactor(new LinearInequality(*factor));
|
||||
if (useWarmStart == true && duals.exists(workingFactor->dualKey())) {
|
||||
|
@ -265,7 +265,7 @@ pair<VectorValues, VectorValues> QPSolver::optimize(
|
|||
const VectorValues& initialValues, const VectorValues& duals, bool useWarmStart) const {
|
||||
|
||||
// Initialize workingSet from the feasible initialValues
|
||||
LinearInequalityFactorGraph workingSet =
|
||||
InequalityFactorGraph workingSet =
|
||||
identifyActiveConstraints(qp_.inequalities, initialValues, duals, useWarmStart);
|
||||
QPState state(initialValues, duals, workingSet, false, 0);
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace gtsam {
|
|||
struct QPState {
|
||||
VectorValues values;
|
||||
VectorValues duals;
|
||||
LinearInequalityFactorGraph workingSet;
|
||||
InequalityFactorGraph workingSet;
|
||||
bool converged;
|
||||
size_t iterations;
|
||||
|
||||
|
@ -41,7 +41,7 @@ struct QPState {
|
|||
|
||||
/// constructor with initial values
|
||||
QPState(const VectorValues& initialValues, const VectorValues& initialDuals,
|
||||
const LinearInequalityFactorGraph& initialWorkingSet, bool _converged, size_t _iterations) :
|
||||
const InequalityFactorGraph& initialWorkingSet, bool _converged, size_t _iterations) :
|
||||
values(initialValues), duals(initialDuals), workingSet(initialWorkingSet), converged(
|
||||
_converged), iterations(_iterations) {
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ public:
|
|||
|
||||
/// Find solution with the current working set
|
||||
VectorValues solveWithCurrentWorkingSet(
|
||||
const LinearInequalityFactorGraph& workingSet) const;
|
||||
const InequalityFactorGraph& workingSet) const;
|
||||
|
||||
/// @name Build the dual graph
|
||||
/// @{
|
||||
|
@ -92,7 +92,7 @@ public:
|
|||
|
||||
/// Create a dual factor
|
||||
JacobianFactor::shared_ptr createDualFactor(Key key,
|
||||
const LinearInequalityFactorGraph& workingSet,
|
||||
const InequalityFactorGraph& workingSet,
|
||||
const VectorValues& delta) const;
|
||||
|
||||
/**
|
||||
|
@ -123,7 +123,7 @@ public:
|
|||
* Hessian factors connecting to xi: \grad f(xi) = \sum_j G_ij*xj - gi
|
||||
*/
|
||||
GaussianFactorGraph::shared_ptr buildDualGraph(
|
||||
const LinearInequalityFactorGraph& workingSet,
|
||||
const InequalityFactorGraph& workingSet,
|
||||
const VectorValues& delta) const;
|
||||
|
||||
/// @}
|
||||
|
@ -162,7 +162,7 @@ public:
|
|||
* And we want to remove the worst one with the largest lambda from the active set.
|
||||
*
|
||||
*/
|
||||
int identifyLeavingConstraint(const LinearInequalityFactorGraph& workingSet,
|
||||
int identifyLeavingConstraint(const InequalityFactorGraph& workingSet,
|
||||
const VectorValues& lambdas) const;
|
||||
|
||||
/**
|
||||
|
@ -174,7 +174,7 @@ public:
|
|||
* in the next iteration
|
||||
*/
|
||||
boost::tuple<double, int> computeStepSize(
|
||||
const LinearInequalityFactorGraph& workingSet, const VectorValues& xk,
|
||||
const InequalityFactorGraph& workingSet, const VectorValues& xk,
|
||||
const VectorValues& p) const;
|
||||
|
||||
/** Iterate 1 step, return a new state with a new workingSet and values */
|
||||
|
@ -183,8 +183,8 @@ public:
|
|||
/**
|
||||
* Identify active constraints based on initial values.
|
||||
*/
|
||||
LinearInequalityFactorGraph identifyActiveConstraints(
|
||||
const LinearInequalityFactorGraph& inequalities,
|
||||
InequalityFactorGraph identifyActiveConstraints(
|
||||
const InequalityFactorGraph& inequalities,
|
||||
const VectorValues& initialValues,
|
||||
const VectorValues& duals = VectorValues(), bool useWarmStart = true) const;
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
/**
|
||||
* @file testLinearEquality.cpp
|
||||
* @brief Unit tests for LinearEquality
|
||||
* @author thduynguyen
|
||||
* @author Duy-Nguyen Ta
|
||||
**/
|
||||
|
||||
#include <gtsam_unstable/linear/LinearEquality.h>
|
||||
|
|
|
@ -132,7 +132,7 @@ TEST(QPSolver, indentifyActiveConstraints) {
|
|||
currentSolution.insert(X(1), zero(1));
|
||||
currentSolution.insert(X(2), zero(1));
|
||||
|
||||
LinearInequalityFactorGraph workingSet =
|
||||
InequalityFactorGraph workingSet =
|
||||
solver.identifyActiveConstraints(qp.inequalities, currentSolution);
|
||||
|
||||
CHECK(!workingSet.at(0)->active()); // inactive
|
||||
|
@ -173,7 +173,7 @@ TEST(QPSolver, iterate) {
|
|||
expectedSolutions[3].insert(X(1), (Vector(1) << 1.5).finished());
|
||||
expectedSolutions[3].insert(X(2), (Vector(1) << 0.5).finished());
|
||||
|
||||
LinearInequalityFactorGraph workingSet =
|
||||
InequalityFactorGraph workingSet =
|
||||
solver.identifyActiveConstraints(qp.inequalities, currentSolution);
|
||||
|
||||
QPState state(currentSolution, VectorValues(), workingSet, false, 100);
|
||||
|
|
Loading…
Reference in New Issue