230 lines
7.7 KiB
C++
230 lines
7.7 KiB
C++
/* ----------------------------------------------------------------------------
|
|
|
|
* 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 timeGaussianFactorGraph.cpp
|
|
* @brief Time elimination with simple Kalman Smoothing example
|
|
* @author Frank Dellaert
|
|
*/
|
|
|
|
// Magically casts strings like "x3" to a Symbol('x',3) key, see Symbol.h
|
|
#define GTSAM_MAGIC_KEY
|
|
|
|
#include <time.h>
|
|
#include <boost/foreach.hpp>
|
|
#include <boost/assign/std/list.hpp> // for operator += in Ordering
|
|
#include <CppUnitLite/TestHarness.h>
|
|
#include <gtsam/slam/smallExample.h>
|
|
#include <gtsam/linear/GaussianSequentialSolver.h>
|
|
|
|
using namespace std;
|
|
using namespace gtsam;
|
|
using namespace example;
|
|
using namespace boost::assign;
|
|
|
|
/* ************************************************************************* */
|
|
// Create a Kalman smoother for t=1:T and optimize
|
|
double timeKalmanSmoother(int T) {
|
|
pair<GaussianFactorGraph,Ordering> smoother_ordering = createSmoother(T);
|
|
GaussianFactorGraph& smoother(smoother_ordering.first);
|
|
clock_t start = clock();
|
|
GaussianSequentialSolver(smoother).optimize();
|
|
clock_t end = clock ();
|
|
double dif = (double)(end - start) / CLOCKS_PER_SEC;
|
|
return dif;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
// Create a planar factor graph and optimize
|
|
// todo: use COLAMD ordering again (removed when linear baked-in ordering added)
|
|
double timePlanarSmoother(int N, bool old = true) {
|
|
boost::tuple<GaussianFactorGraph, Ordering, VectorValues> pg = planarGraph(N);
|
|
GaussianFactorGraph& fg(pg.get<0>());
|
|
// Ordering& ordering(pg.get<1>());
|
|
// VectorValues& config(pg.get<2>());
|
|
clock_t start = clock();
|
|
GaussianSequentialSolver(fg).optimize();
|
|
clock_t end = clock ();
|
|
double dif = (double)(end - start) / CLOCKS_PER_SEC;
|
|
return dif;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
// Create a planar factor graph and eliminate
|
|
// todo: use COLAMD ordering again (removed when linear baked-in ordering added)
|
|
double timePlanarSmootherEliminate(int N, bool old = true) {
|
|
boost::tuple<GaussianFactorGraph, Ordering, VectorValues> pg = planarGraph(N);
|
|
GaussianFactorGraph& fg(pg.get<0>());
|
|
// Ordering& ordering(pg.get<1>());
|
|
// VectorValues& config(pg.get<2>());
|
|
clock_t start = clock();
|
|
GaussianSequentialSolver(fg).eliminate();
|
|
clock_t end = clock ();
|
|
double dif = (double)(end - start) / CLOCKS_PER_SEC;
|
|
return dif;
|
|
}
|
|
|
|
///* ************************************************************************* */
|
|
//// Create a planar factor graph and join factors until matrix formation
|
|
//// This variation uses the original join factors approach
|
|
//double timePlanarSmootherJoinAug(int N, size_t reps) {
|
|
// GaussianFactorGraph fgBase;
|
|
// VectorValues config;
|
|
// boost::tie(fgBase,config) = planarGraph(N);
|
|
// Ordering ordering = fgBase.getOrdering();
|
|
// Symbol key = ordering.front();
|
|
//
|
|
// clock_t start = clock();
|
|
//
|
|
// for (size_t i = 0; i<reps; ++i) {
|
|
// // setup
|
|
// GaussianFactorGraph fg(fgBase);
|
|
//
|
|
// // combine some factors
|
|
// GaussianFactor::shared_ptr joint_factor = removeAndCombineFactors(fg,key);
|
|
//
|
|
// // create an internal ordering to render Ab
|
|
// Ordering render;
|
|
// render += key;
|
|
// BOOST_FOREACH(const Symbol& k, joint_factor->keys())
|
|
// if (k != key) render += k;
|
|
//
|
|
// Matrix Ab = joint_factor->matrix_augmented(render,false);
|
|
// }
|
|
//
|
|
// clock_t end = clock ();
|
|
// double dif = (double)(end - start) / CLOCKS_PER_SEC;
|
|
// return dif;
|
|
//}
|
|
|
|
///* ************************************************************************* */
|
|
//// Create a planar factor graph and join factors until matrix formation
|
|
//// This variation uses the single-allocate version to create the matrix
|
|
//double timePlanarSmootherCombined(int N, size_t reps) {
|
|
// GaussianFactorGraph fgBase;
|
|
// VectorValues config;
|
|
// boost::tie(fgBase,config) = planarGraph(N);
|
|
// Ordering ordering = fgBase.getOrdering();
|
|
// Symbol key = ordering.front();
|
|
//
|
|
// clock_t start = clock();
|
|
//
|
|
// for (size_t i = 0; i<reps; ++i) {
|
|
// GaussianFactorGraph fg(fgBase);
|
|
// fg.eliminateOneMatrixJoin(key);
|
|
// }
|
|
//
|
|
// clock_t end = clock ();
|
|
// double dif = (double)(end - start) / CLOCKS_PER_SEC;
|
|
// return dif;
|
|
//}
|
|
|
|
|
|
/* ************************************************************************* */
|
|
TEST(timeGaussianFactorGraph, linearTime)
|
|
{
|
|
// Original T = 1000;
|
|
|
|
// Alex's Results
|
|
// T = 100000
|
|
// 1907 (init) : T - 1.65, 2T = 3.28
|
|
// int->size_t : T - 1.63, 2T = 3.27
|
|
// 2100 : T - 1.52, 2T = 2.96
|
|
|
|
int T = 100000;
|
|
double time1 = timeKalmanSmoother( T); cout << "timeKalmanSmoother( T): " << time1;
|
|
double time2 = timeKalmanSmoother(2*T); cout << " (2*T): " << time2 << endl;
|
|
DOUBLES_EQUAL(2*time1,time2,0.2);
|
|
}
|
|
|
|
|
|
// Timing with N = 30
|
|
// 1741: 8.12, 8.12, 8.12, 8.14, 8.16
|
|
// 1742: 5.97, 5.97, 5.97, 5.99, 6.02
|
|
// 1746: 5.96, 5.96, 5.97, 6.00, 6.04
|
|
// 1748: 5.91, 5.92, 5.93, 5.95, 5.96
|
|
// 1839: 0.206956 0.206939 0.206213 0.206092 0.206780 // colamd !!!!
|
|
|
|
// Alex's Machine
|
|
// Initial:
|
|
// 1907 (N = 30) : 0.14
|
|
// (N = 100) : 16.36
|
|
// Improved (int->size_t)
|
|
// (N = 100) : 15.39
|
|
// Using GSL/BLAS for updateAb : 12.87
|
|
// Using NoiseQR : 16.33
|
|
// Using correct system : 10.00
|
|
|
|
// Switch to 100*100 grid = 10K poses
|
|
// 1879: 15.6498 15.3851 15.5279
|
|
|
|
int size = 100;
|
|
|
|
/* ************************************************************************* */
|
|
TEST(timeGaussianFactorGraph, planar_old)
|
|
{
|
|
cout << "Timing planar - original version" << endl;
|
|
double time = timePlanarSmoother(size);
|
|
cout << "timeGaussianFactorGraph : " << time << endl;
|
|
//DOUBLES_EQUAL(5.97,time,0.1);
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
TEST(timeGaussianFactorGraph, planar_new)
|
|
{
|
|
cout << "Timing planar - new version" << endl;
|
|
double time = timePlanarSmoother(size, false);
|
|
cout << "timeGaussianFactorGraph : " << time << endl;
|
|
//DOUBLES_EQUAL(5.97,time,0.1);
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
TEST(timeGaussianFactorGraph, planar_eliminate_old)
|
|
{
|
|
cout << "Timing planar Eliminate - original version" << endl;
|
|
double time = timePlanarSmootherEliminate(size);
|
|
cout << "timeGaussianFactorGraph : " << time << endl;
|
|
//DOUBLES_EQUAL(5.97,time,0.1);
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
TEST(timeGaussianFactorGraph, planar_eliminate_new)
|
|
{
|
|
cout << "Timing planar Eliminate - new version" << endl;
|
|
double time = timePlanarSmootherEliminate(size, false);
|
|
cout << "timeGaussianFactorGraph : " << time << endl;
|
|
//DOUBLES_EQUAL(5.97,time,0.1);
|
|
}
|
|
|
|
//size_t reps = 1000;
|
|
///* ************************************************************************* */
|
|
//TEST(timeGaussianFactorGraph, planar_join_old)
|
|
//{
|
|
// cout << "Timing planar join - old" << endl;
|
|
// double time = timePlanarSmootherJoinAug(size, reps);
|
|
// cout << "timePlanarSmootherJoinAug " << size << " : " << time << endl;
|
|
// //DOUBLES_EQUAL(5.97,time,0.1);
|
|
//}
|
|
//
|
|
///* ************************************************************************* */
|
|
//TEST(timeGaussianFactorGraph, planar_join_new)
|
|
//{
|
|
// cout << "Timing planar join - new" << endl;
|
|
// double time = timePlanarSmootherCombined(size, reps);
|
|
// cout << "timePlanarSmootherCombined " << size << " : " << time << endl;
|
|
// //DOUBLES_EQUAL(5.97,time,0.1);
|
|
//}
|
|
|
|
|
|
/* ************************************************************************* */
|
|
int main() { TestResult tr; return TestRegistry::runAllTests(tr); }
|
|
/* ************************************************************************* */
|