Moved testIterative.cpp back to GTSAM, made the first test compile/run
							parent
							
								
									b6150bd27e
								
							
						
					
					
						commit
						35d188e36d
					
				| 
						 | 
				
			
			@ -0,0 +1,194 @@
 | 
			
		|||
/* ----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 * 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   testIterative.cpp
 | 
			
		||||
 *  @brief  Unit tests for iterative methods
 | 
			
		||||
 *  @author Frank Dellaert
 | 
			
		||||
 **/
 | 
			
		||||
 | 
			
		||||
#include <tests/smallExample.h>
 | 
			
		||||
#include <gtsam/nonlinear/Ordering.h>
 | 
			
		||||
#include <gtsam/nonlinear/Symbol.h>
 | 
			
		||||
#include <gtsam/linear/GaussianSequentialSolver.h>
 | 
			
		||||
//#include <gtsam/linear/VectorValues.h>
 | 
			
		||||
//#include <gtsam/linear/SubgraphPreconditioner.h>
 | 
			
		||||
#include <gtsam/linear/iterative-inl.h>
 | 
			
		||||
//#include <gtsam/inference/FactorGraph-inl.h>
 | 
			
		||||
 | 
			
		||||
#include <CppUnitLite/TestHarness.h>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace gtsam;
 | 
			
		||||
using namespace example;
 | 
			
		||||
using symbol_shorthand::X; // to create pose keys
 | 
			
		||||
using symbol_shorthand::L; // to create landmark keys
 | 
			
		||||
 | 
			
		||||
static bool verbose = false;
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
TEST( Iterative, steepestDescent )
 | 
			
		||||
{
 | 
			
		||||
	// Create factor graph
 | 
			
		||||
	Ordering ord;
 | 
			
		||||
	ord += L(1), X(1), X(2);
 | 
			
		||||
	JacobianFactorGraph fg = createGaussianFactorGraph(ord);
 | 
			
		||||
 | 
			
		||||
  // eliminate and solve
 | 
			
		||||
  VectorValues expected = *GaussianSequentialSolver(fg).optimize();
 | 
			
		||||
 | 
			
		||||
	// Do gradient descent
 | 
			
		||||
	VectorValues zero = VectorValues::Zero(expected); // TODO, how do we do this normally?
 | 
			
		||||
  ConjugateGradientParameters parameters;
 | 
			
		||||
//  parameters.verbosity_ = ConjugateGradientParameters::COMPLEXITY;
 | 
			
		||||
	VectorValues actual = steepestDescent(fg, zero, parameters);
 | 
			
		||||
	CHECK(assert_equal(expected,actual,1e-2));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
TEST( Iterative, conjugateGradientDescent )
 | 
			
		||||
{
 | 
			
		||||
//	// Expected solution
 | 
			
		||||
//	Ordering ord;
 | 
			
		||||
//	ord += L(1), X(1), X(2);
 | 
			
		||||
//	GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
			
		||||
//	VectorValues expected = fg.optimize(ord); // destructive
 | 
			
		||||
//
 | 
			
		||||
//	// create graph and get matrices
 | 
			
		||||
//	GaussianFactorGraph fg2 = createGaussianFactorGraph();
 | 
			
		||||
//	Matrix A;
 | 
			
		||||
//	Vector b;
 | 
			
		||||
//	Vector x0 = gtsam::zero(6);
 | 
			
		||||
//	boost::tie(A, b) = fg2.matrix(ord);
 | 
			
		||||
//	Vector expectedX = Vector_(6, -0.1, 0.1, -0.1, -0.1, 0.1, -0.2);
 | 
			
		||||
//
 | 
			
		||||
//	// Do conjugate gradient descent, System version
 | 
			
		||||
//	System Ab(A, b);
 | 
			
		||||
//	Vector actualX = conjugateGradientDescent(Ab, x0, verbose);
 | 
			
		||||
//	CHECK(assert_equal(expectedX,actualX,1e-9));
 | 
			
		||||
//
 | 
			
		||||
//	// Do conjugate gradient descent, Matrix version
 | 
			
		||||
//	Vector actualX2 = conjugateGradientDescent(A, b, x0, verbose);
 | 
			
		||||
//	CHECK(assert_equal(expectedX,actualX2,1e-9));
 | 
			
		||||
//
 | 
			
		||||
//	// Do conjugate gradient descent on factor graph
 | 
			
		||||
//	VectorValues zero = createZeroDelta();
 | 
			
		||||
//	VectorValues actual = conjugateGradientDescent(fg2, zero, verbose);
 | 
			
		||||
//	CHECK(assert_equal(expected,actual,1e-2));
 | 
			
		||||
//
 | 
			
		||||
//	// Test method
 | 
			
		||||
//	VectorValues actual2 = fg2.conjugateGradientDescent(zero, verbose);
 | 
			
		||||
//	CHECK(assert_equal(expected,actual2,1e-2));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
/*TEST( Iterative, conjugateGradientDescent_hard_constraint )
 | 
			
		||||
{
 | 
			
		||||
	typedef Pose2Values::Key Key;
 | 
			
		||||
 | 
			
		||||
	Pose2Values config;
 | 
			
		||||
	config.insert(1, Pose2(0.,0.,0.));
 | 
			
		||||
	config.insert(2, Pose2(1.5,0.,0.));
 | 
			
		||||
 | 
			
		||||
	Pose2Graph graph;
 | 
			
		||||
	Matrix cov = eye(3);
 | 
			
		||||
	graph.push_back(Pose2Graph::sharedFactor(new Pose2Factor(Key(1), Key(2), Pose2(1.,0.,0.), cov)));
 | 
			
		||||
	graph.addHardConstraint(1, config[1]);
 | 
			
		||||
 | 
			
		||||
	VectorValues zeros;
 | 
			
		||||
	zeros.insert(X(1),zero(3));
 | 
			
		||||
	zeros.insert(X(2),zero(3));
 | 
			
		||||
 | 
			
		||||
	GaussianFactorGraph fg = graph.linearize(config);
 | 
			
		||||
	VectorValues actual = conjugateGradientDescent(fg, zeros, true, 1e-3, 1e-5, 10);
 | 
			
		||||
 | 
			
		||||
	VectorValues expected;
 | 
			
		||||
	expected.insert(X(1), zero(3));
 | 
			
		||||
	expected.insert(X(2), Vector_(-0.5,0.,0.));
 | 
			
		||||
	CHECK(assert_equal(expected, actual));
 | 
			
		||||
}*/
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
TEST( Iterative, conjugateGradientDescent_soft_constraint )
 | 
			
		||||
{
 | 
			
		||||
//	Pose2Values config;
 | 
			
		||||
//	config.insert(1, Pose2(0.,0.,0.));
 | 
			
		||||
//	config.insert(2, Pose2(1.5,0.,0.));
 | 
			
		||||
//
 | 
			
		||||
//	Pose2Graph graph;
 | 
			
		||||
//	graph.addPrior(1, Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10));
 | 
			
		||||
//	graph.addConstraint(1,2, Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1));
 | 
			
		||||
//
 | 
			
		||||
//	VectorValues zeros;
 | 
			
		||||
//	zeros.insert(X(1),zero(3));
 | 
			
		||||
//	zeros.insert(X(2),zero(3));
 | 
			
		||||
//
 | 
			
		||||
//	boost::shared_ptr<GaussianFactorGraph> fg = graph.linearize(config);
 | 
			
		||||
//	VectorValues actual = conjugateGradientDescent(*fg, zeros, verbose, 1e-3, 1e-5, 100);
 | 
			
		||||
//
 | 
			
		||||
//	VectorValues expected;
 | 
			
		||||
//	expected.insert(X(1), zero(3));
 | 
			
		||||
//	expected.insert(X(2), Vector_(3,-0.5,0.,0.));
 | 
			
		||||
//	CHECK(assert_equal(expected, actual));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
TEST( Iterative, subgraphPCG )
 | 
			
		||||
{
 | 
			
		||||
//	typedef Pose2Values::Key Key;
 | 
			
		||||
//
 | 
			
		||||
//	Pose2Values theta_bar;
 | 
			
		||||
//	theta_bar.insert(1, Pose2(0.,0.,0.));
 | 
			
		||||
//	theta_bar.insert(2, Pose2(1.5,0.,0.));
 | 
			
		||||
//
 | 
			
		||||
//	Pose2Graph graph;
 | 
			
		||||
//	graph.addPrior(1, Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10));
 | 
			
		||||
//	graph.addConstraint(1,2, Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1));
 | 
			
		||||
//
 | 
			
		||||
//	// generate spanning tree and create ordering
 | 
			
		||||
//	PredecessorMap<Key> tree = graph.findMinimumSpanningTree<Key, Pose2Factor>();
 | 
			
		||||
//	list<Key> keys = predecessorMap2Keys(tree);
 | 
			
		||||
//	list<Symbol> symbols;
 | 
			
		||||
//	symbols.resize(keys.size());
 | 
			
		||||
//	std::transform(keys.begin(), keys.end(), symbols.begin(), key2symbol<Key>);
 | 
			
		||||
//	Ordering ordering(symbols);
 | 
			
		||||
//
 | 
			
		||||
//	Key root = keys.back();
 | 
			
		||||
//	Pose2Graph T, C;
 | 
			
		||||
//	graph.split<Key, Pose2Factor>(tree, T, C);
 | 
			
		||||
//
 | 
			
		||||
//	// build the subgraph PCG system
 | 
			
		||||
//	boost::shared_ptr<GaussianFactorGraph> Ab1_ = T.linearize(theta_bar);
 | 
			
		||||
//	SubgraphPreconditioner::sharedFG Ab1 = T.linearize(theta_bar);
 | 
			
		||||
//	SubgraphPreconditioner::sharedFG Ab2 = C.linearize(theta_bar);
 | 
			
		||||
//	SubgraphPreconditioner::sharedBayesNet Rc1 = Ab1_->eliminate_(ordering);
 | 
			
		||||
//	SubgraphPreconditioner::sharedValues xbar = optimize_(*Rc1);
 | 
			
		||||
//	SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbar);
 | 
			
		||||
//
 | 
			
		||||
//	VectorValues zeros = VectorValues::zero(*xbar);
 | 
			
		||||
//
 | 
			
		||||
//	// Solve the subgraph PCG
 | 
			
		||||
//	VectorValues ybar = conjugateGradients<SubgraphPreconditioner, VectorValues,
 | 
			
		||||
//			Errors> (system, zeros, verbose, 1e-5, 1e-5, 100);
 | 
			
		||||
//	VectorValues actual = system.x(ybar);
 | 
			
		||||
//
 | 
			
		||||
//	VectorValues expected;
 | 
			
		||||
//	expected.insert(X(1), zero(3));
 | 
			
		||||
//	expected.insert(X(2), Vector_(3, -0.5, 0., 0.));
 | 
			
		||||
//	CHECK(assert_equal(expected, actual));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
int main() {
 | 
			
		||||
	TestResult tr;
 | 
			
		||||
	return TestRegistry::runAllTests(tr);
 | 
			
		||||
}
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
		Loading…
	
		Reference in New Issue