159 lines
5.4 KiB
C++
159 lines
5.4 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 timeFactorOverhead.cpp
|
|
* @brief Compares times of solving large single-factor graphs with their multi-factor equivalents.
|
|
* @author Richard Roberts
|
|
* @date Aug 20, 2010
|
|
*/
|
|
|
|
#include <gtsam/base/timing.h>
|
|
#include <gtsam/linear/GaussianBayesNet.h>
|
|
#include <gtsam/linear/GaussianFactorGraph.h>
|
|
#include <gtsam/linear/NoiseModel.h>
|
|
#include <gtsam/linear/VectorValues.h>
|
|
|
|
#include <boost/random.hpp>
|
|
#include <vector>
|
|
|
|
using namespace gtsam;
|
|
using namespace std;
|
|
|
|
static boost::variate_generator<boost::mt19937, boost::uniform_real<> > rg(boost::mt19937(), boost::uniform_real<>(0.0, 1.0));
|
|
|
|
int main(int argc, char *argv[]) {
|
|
|
|
Key key = 0;
|
|
|
|
size_t vardim = 2;
|
|
size_t blockdim = 1;
|
|
size_t nBlocks = 4000;
|
|
|
|
size_t nTrials = 20;
|
|
|
|
double blockbuild, blocksolve, combbuild, combsolve;
|
|
|
|
cout << "\n1 variable of dimension " << vardim << ", " <<
|
|
nBlocks << " blocks of dimension " << blockdim << "\n";
|
|
cout << nTrials << " trials\n";
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Timing test with blockwise Gaussian factor graphs
|
|
|
|
{
|
|
// Build GFG's
|
|
cout << "Building blockwise Gaussian factor graphs... ";
|
|
cout.flush();
|
|
gttic_(blockbuild);
|
|
vector<GaussianFactorGraph> blockGfgs;
|
|
blockGfgs.reserve(nTrials);
|
|
for(size_t trial=0; trial<nTrials; ++trial) {
|
|
blockGfgs.push_back(GaussianFactorGraph());
|
|
SharedDiagonal noise = noiseModel::Isotropic::Sigma(blockdim, 1.0);
|
|
for(size_t i=0; i<nBlocks; ++i) {
|
|
// Generate a random Gaussian factor
|
|
Matrix A(blockdim, vardim);
|
|
for(size_t j=0; j<blockdim; ++j)
|
|
for(size_t k=0; k<vardim; ++k)
|
|
A(j,k) = rg();
|
|
Vector b(blockdim);
|
|
for(size_t j=0; j<blockdim; ++j)
|
|
b(j) = rg();
|
|
blockGfgs[trial].push_back(boost::make_shared<JacobianFactor>(key, A, b, noise));
|
|
}
|
|
}
|
|
gttoc_(blockbuild);
|
|
tictoc_getNode(blockbuildNode, blockbuild);
|
|
blockbuild = blockbuildNode->secs();
|
|
cout << blockbuild << " s" << endl;
|
|
|
|
// Solve GFG's
|
|
cout << "Solving blockwise Gaussian factor graphs... ";
|
|
cout.flush();
|
|
gttic_(blocksolve);
|
|
for(size_t trial=0; trial<nTrials; ++trial) {
|
|
// cout << "Trial " << trial << endl;
|
|
GaussianBayesNet::shared_ptr gbn = blockGfgs[trial].eliminateSequential();
|
|
VectorValues soln = gbn->optimize();
|
|
}
|
|
gttoc_(blocksolve);
|
|
tictoc_getNode(blocksolveNode, blocksolve);
|
|
blocksolve = blocksolveNode->secs();
|
|
cout << blocksolve << " s" << endl;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Timing test with combined-factor Gaussian factor graphs
|
|
|
|
{
|
|
// Build GFG's
|
|
cout << "Building combined-factor Gaussian factor graphs... ";
|
|
cout.flush();
|
|
gttic_(combbuild);
|
|
vector<GaussianFactorGraph> combGfgs;
|
|
for(size_t trial=0; trial<nTrials; ++trial) {
|
|
combGfgs.push_back(GaussianFactorGraph());
|
|
SharedDiagonal noise = noiseModel::Isotropic::Sigma(blockdim, 1.0);
|
|
|
|
Matrix Acomb(blockdim*nBlocks, vardim);
|
|
Vector bcomb(blockdim*nBlocks);
|
|
for(size_t i=0; i<nBlocks; ++i) {
|
|
// Generate a random Gaussian factor
|
|
for(size_t j=0; j<blockdim; ++j)
|
|
for(size_t k=0; k<vardim; ++k)
|
|
Acomb(blockdim*i+j, k) = rg();
|
|
Vector b(blockdim);
|
|
for(size_t j=0; j<blockdim; ++j)
|
|
bcomb(blockdim*i+j) = rg();
|
|
}
|
|
combGfgs[trial].push_back(boost::make_shared<JacobianFactor>(key, Acomb, bcomb,
|
|
noiseModel::Isotropic::Sigma(blockdim*nBlocks, 1.0)));
|
|
}
|
|
gttoc(combbuild);
|
|
tictoc_getNode(combbuildNode, combbuild);
|
|
combbuild = combbuildNode->secs();
|
|
cout << combbuild << " s" << endl;
|
|
|
|
// Solve GFG's
|
|
cout << "Solving combined-factor Gaussian factor graphs... ";
|
|
cout.flush();
|
|
gttic_(combsolve);
|
|
for(size_t trial=0; trial<nTrials; ++trial) {
|
|
GaussianBayesNet::shared_ptr gbn = combGfgs[trial].eliminateSequential();
|
|
VectorValues soln = gbn->optimize();
|
|
}
|
|
gttoc_(combsolve);
|
|
tictoc_getNode(combsolveNode, combsolve);
|
|
combsolve = combsolveNode->secs();
|
|
cout << combsolve << " s" << endl;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Print per-graph times
|
|
cout << "\nPer-factor-graph times for building and solving\n";
|
|
cout << "Blockwise: total " << (1000.0*(blockbuild+blocksolve)/double(nTrials)) <<
|
|
" build " << (1000.0*blockbuild/double(nTrials)) <<
|
|
" solve " << (1000.0*blocksolve/double(nTrials)) << " ms/graph\n";
|
|
cout << "Combined: total " << (1000.0*(combbuild+combsolve)/double(nTrials)) <<
|
|
" build " << (1000.0*combbuild/double(nTrials)) <<
|
|
" solve " << (1000.0*combsolve/double(nTrials)) << " ms/graph\n";
|
|
cout << "Fraction of time spent in overhead\n" <<
|
|
" total " << (((blockbuild+blocksolve)-(combbuild+combsolve)) / (blockbuild+blocksolve)) << "\n" <<
|
|
" build " << ((blockbuild-combbuild) / blockbuild) << "\n" <<
|
|
" solve " << ((blocksolve-combsolve) / blocksolve) << "\n";
|
|
cout << endl;
|
|
|
|
return 0;
|
|
}
|
|
|