gtsam/timing/timeGaussianFactor.cpp

137 lines
3.8 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 timeGaussianFactor.cpp
* @brief time JacobianFactor.eliminate
* @author Alireza Fathi
*/
#include <time.h>
/*STL/C++*/
#include <iostream>
using namespace std;
#include <boost/tuple/tuple.hpp>
#include <boost/assign/list_of.hpp>
#include <gtsam/base/Matrix.h>
#include <gtsam/linear/JacobianFactor.h>
#include <gtsam/linear/JacobianFactor.h>
#include <gtsam/linear/GaussianConditional.h>
#include <gtsam/linear/NoiseModel.h>
using namespace gtsam;
using namespace boost::assign;
static const Key _x1_=1, _x2_=2, _l1_=3;
/*
* Alex's Machine
* Results for Eliminate:
* Initial (1891): 17.91 sec, 55834.7 calls/sec
* NoiseQR : 11.69 sec
*
* Results for matrix_augmented:
* Initial (1891) : 0.85 sec, 1.17647e+06 calls/sec
* int->size_t Version : 8.45 sec (for n1 reps) with memcpy version of collect()
* w/ original collect(): 8.73 sec (for n1 reps)
* b memcpy Version : 8.64 sec (for n1 reps) with original version of collect()
* w/ memcpy collect() : 8.40 sec (for n1 reps)
* Rev 2100 : 8.15 sec
*/
int main()
{
// create a linear factor
Matrix Ax2 = (Matrix(8, 2) <<
// x2
-5., 0.,
+0.,-5.,
10., 0.,
+0.,10.,
-5., 0.,
+0.,-5.,
10., 0.,
+0.,10.
).finished();
Matrix Al1 = (Matrix(8, 10) <<
// l1
5., 0.,1.,2.,3.,4.,5.,6.,7.,8.,
0., 5.,1.,2.,3.,4.,5.,6.,7.,8.,
0., 0.,1.,2.,3.,4.,5.,6.,7.,8.,
0., 0.,1.,2.,3.,4.,5.,6.,7.,8.,
5., 0.,1.,2.,3.,4.,5.,6.,7.,8.,
0., 5.,1.,2.,3.,4.,5.,6.,7.,8.,
0., 0.,1.,2.,3.,4.,5.,6.,7.,8.,
0., 0.,1.,2.,3.,4.,5.,6.,7.,8.
).finished();
Matrix Ax1 = (Matrix(8, 2) <<
// x1
0.00, 0.,1.,2.,3.,4.,5.,6.,7.,8.,
0.00, 0.,1.,2.,3.,4.,5.,6.,7.,8.,
-10., 0.,1.,2.,3.,4.,5.,6.,7.,8.,
0.00,-10.,1.,2.,3.,4.,5.,6.,7.,8.,
0.00, 0.,1.,2.,3.,4.,5.,6.,7.,8.,
0.00, 0.,1.,2.,3.,4.,5.,6.,7.,8.,
-10., 0.,1.,2.,3.,4.,5.,6.,7.,8.,
0.00,-10.,1.,2.,3.,4.,5.,6.,7.,8.
).finished();
// and a RHS
Vector b2(8);
b2(0) = -1;
b2(1) = 1.5;
b2(2) = 2;
b2(3) = -1;
b2(4) = -1;
b2(5) = 1.5;
b2(6) = 2;
b2(7) = -1;
// time eliminate
JacobianFactor combined(_x2_, Ax2, _l1_, Al1, _x1_, Ax1, b2, noiseModel::Isotropic::Sigma(8,1));
long timeLog = clock();
int n = 1000000;
GaussianConditional::shared_ptr conditional;
JacobianFactor::shared_ptr factor;
for(int i = 0; i < n; i++)
boost::tie(conditional, factor) =
JacobianFactor(combined).eliminate(Ordering(boost::assign::list_of(_x2_)));
long timeLog2 = clock();
double seconds = (double)(timeLog2-timeLog)/CLOCKS_PER_SEC;
cout << "Single Eliminate Timing:" << endl;
cout << seconds << " seconds" << endl;
cout << ((double)n/seconds) << " calls/second" << endl;
// time matrix_augmented
// Ordering ordering;
// ordering += _x2_, _l1_, _x1_;
// size_t n1 = 10000000;
// timeLog = clock();
//
// for(size_t i = 0; i < n1; i++)
// Matrix Ab = combined.matrix_augmented(ordering, true);
//
// timeLog2 = clock();
// seconds = (double)(timeLog2-timeLog)/CLOCKS_PER_SEC;
// cout << "matrix_augmented Timing:" << endl;
// cout << seconds << " seconds" << endl;
// cout << ((double)n/seconds) << " calls/second" << endl;
return 0;
}