123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /**
- * @file timeSchurFactors.cpp
- * @brief Time various Schur-complement Jacobian factors
- * @author Frank Dellaert
- * @date Oct 27, 2013
- */
- #include "DummyFactor.h"
- #include <gtsam/base/timing.h>
- #include <gtsam/slam/JacobianFactorQ.h>
- #include "gtsam/slam/JacobianFactorQR.h"
- #include <gtsam/slam/RegularImplicitSchurFactor.h>
- #include <gtsam/geometry/Cal3Bundler.h>
- #include <gtsam/geometry/PinholePose.h>
- #include <boost/assign/list_of.hpp>
- #include <boost/assign/std/vector.hpp>
- #include <fstream>
- using namespace std;
- using namespace boost::assign;
- using namespace gtsam;
- #define SLOW
- #define RAW
- #define HESSIAN
- #define NUM_ITERATIONS 1000
- // Create CSV file for results
- ofstream os("timeSchurFactors.csv");
- /*************************************************************************************/
- template<typename CAMERA>
- void timeAll(size_t m, size_t N) {
- cout << m << endl;
- // create F
- static const int D = CAMERA::dimension;
- typedef Eigen::Matrix<double, 2, D> Matrix2D;
- KeyVector keys;
- vector <Matrix2D, Eigen::aligned_allocator<Matrix2D>> Fblocks;
- for (size_t i = 0; i < m; i++) {
- keys.push_back(i);
- Fblocks.push_back((i + 1) * Matrix::Ones(2, D));
- }
- // create E
- Matrix E(2 * m, 3);
- for (size_t i = 0; i < m; i++)
- E.block < 2, 3 > (2 * i, 0) = Matrix::Ones(2, 3);
- // Calculate point covariance
- Matrix P = (E.transpose() * E).inverse();
- // RHS and sigmas
- const Vector b = Vector::Constant(2*m,1);
- const SharedDiagonal model;
- // parameters for multiplyHessianAdd
- double alpha = 0.5;
- VectorValues xvalues, yvalues;
- for (size_t i = 0; i < m; i++)
- xvalues.insert(i, Vector::Constant(D,2));
- // Implicit
- RegularImplicitSchurFactor<CAMERA> implicitFactor(keys, Fblocks, E, P, b);
- // JacobianFactor with same error
- JacobianFactorQ<D, 2> jf(keys, Fblocks, E, P, b, model);
- // JacobianFactorQR with same error
- JacobianFactorQR<D, 2> jqr(keys, Fblocks, E, P, b, model);
- // Hessian
- HessianFactor hessianFactor(jqr);
- #define TIME(label,factor,xx,yy) {\
- for (size_t t = 0; t < N; t++) \
- factor.multiplyHessianAdd(alpha, xx, yy);\
- gttic_(label);\
- for (size_t t = 0; t < N; t++) {\
- factor.multiplyHessianAdd(alpha, xx, yy);\
- }\
- gttoc_(label);\
- tictoc_getNode(timer, label)\
- os << timer->secs()/NUM_ITERATIONS << ", ";\
- }
- #ifdef SLOW
- TIME(Implicit, implicitFactor, xvalues, yvalues)
- TIME(Jacobian, jf, xvalues, yvalues)
- TIME(JacobianQR, jqr, xvalues, yvalues)
- #endif
- #ifdef HESSIAN
- TIME(Hessian, hessianFactor, xvalues, yvalues)
- #endif
- #ifdef OVERHEAD
- DummyFactor<D> dummy(Fblocks, E, P, b);
- TIME(Overhead,dummy,xvalues,yvalues)
- #endif
- #ifdef RAW
- { // Raw memory Version
- FastVector < Key > keys;
- for (size_t i = 0; i < m; i++)
- keys += i;
- Vector x = xvalues.vector(keys);
- double* xdata = x.data();
- // create a y
- Vector y = Vector::Zero(m * D);
- TIME(RawImplicit, implicitFactor, xdata, y.data())
- TIME(RawJacobianQ, jf, xdata, y.data())
- TIME(RawJacobianQR, jqr, xdata, y.data())
- }
- #endif
- os << m << endl;
- } // timeAll
- /*************************************************************************************/
- int main(void) {
- #ifdef SLOW
- os << "Implicit,";
- os << "JacobianQ,";
- os << "JacobianQR,";
- #endif
- #ifdef HESSIAN
- os << "Hessian,";
- #endif
- #ifdef OVERHEAD
- os << "Overhead,";
- #endif
- #ifdef RAW
- os << "RawImplicit,";
- os << "RawJacobianQ,";
- os << "RawJacobianQR,";
- #endif
- os << "m" << endl;
- // define images
- vector < size_t > ms;
- // ms += 2;
- // ms += 3, 4, 5, 6, 7, 8, 9, 10;
- // ms += 11,12,13,14,15,16,17,18,19;
- // ms += 20, 30, 40, 50;
- // ms += 20,30,40,50,60,70,80,90,100;
- for (size_t m = 2; m <= 50; m += 2)
- ms += m;
- //for (size_t m=10;m<=100;m+=10) ms += m;
- // loop over number of images
- for(size_t m: ms)
- timeAll<PinholePose<Cal3Bundler> >(m, NUM_ITERATIONS);
- }
- //*************************************************************************************
|