139 lines
3.9 KiB
C++
139 lines
3.9 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 timeDSFvariants.cpp
|
|
* @brief Time different implementations of DSF
|
|
* @author Frank Dellaert
|
|
* @date Oct 26, 2013
|
|
*/
|
|
|
|
#include <gtsam/base/timing.h>
|
|
#include <gtsam/base/DSFVector.h>
|
|
#include <gtsam_unstable/base/DSF.h>
|
|
#include <gtsam/base/DSFMap.h>
|
|
|
|
#include <boost/format.hpp>
|
|
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <random>
|
|
#include <vector>
|
|
#include <utility>
|
|
|
|
using namespace std;
|
|
using namespace gtsam;
|
|
using boost::format;
|
|
|
|
int main(int argc, char* argv[]) {
|
|
|
|
// Create CSV file for results
|
|
ofstream os("dsf-timing.csv");
|
|
os << "images,points,matches,Base,Map,BTree" << endl;
|
|
|
|
// loop over number of images
|
|
vector<size_t> ms;
|
|
ms += 10, 20, 30, 40, 50, 100, 200, 300, 400, 500, 1000;
|
|
for(size_t m: ms) {
|
|
// We use volatile here to make these appear to the optimizing compiler as
|
|
// if their values are only known at run-time.
|
|
volatile size_t n = 500; // number of points per image
|
|
volatile size_t N = m * n; // number of points per image
|
|
|
|
volatile double fm = 0.1; // fraction of image pairs matched
|
|
volatile size_t np = fm * m * m / 2; // number of image pairs
|
|
volatile double fpm = 0.5; // fraction of points matched
|
|
volatile size_t nm = fpm * n * np; // number of matches
|
|
|
|
cout << format("\nTesting with %1% images, %2% points, %3% matches\n")
|
|
% (int)m % (int)N % (int)nm;
|
|
cout << "Generating " << nm << " matches" << endl;
|
|
std::mt19937 rng;
|
|
std::uniform_int_distribution<> rn(0, N - 1);
|
|
|
|
typedef pair<size_t, size_t> Match;
|
|
vector<Match> matches;
|
|
matches.reserve(nm);
|
|
for (size_t k = 0; k < nm; k++)
|
|
matches.push_back(Match(rn(rng), rn(rng)));
|
|
|
|
os << format("%1%,%2%,%3%,") % (int)m % (int)N % (int)nm;
|
|
|
|
{
|
|
// DSFBase version
|
|
double dsftime = 0;
|
|
gttic_(dsftime);
|
|
DSFBase dsf(N); // Allow for N keys
|
|
for(const Match& m: matches)
|
|
dsf.merge(m.first, m.second);
|
|
gttoc_(dsftime);
|
|
tictoc_getNode(dsftimeNode, dsftime);
|
|
dsftime = dsftimeNode->secs();
|
|
os << dsftime << ",";
|
|
cout << format("DSFBase: %1% s") % dsftime << endl;
|
|
tictoc_reset_();
|
|
}
|
|
|
|
{
|
|
// DSFMap version
|
|
double dsftime = 0;
|
|
gttic_(dsftime);
|
|
DSFMap<size_t> dsf;
|
|
for(const Match& m: matches)
|
|
dsf.merge(m.first, m.second);
|
|
gttoc_(dsftime);
|
|
tictoc_getNode(dsftimeNode, dsftime);
|
|
dsftime = dsftimeNode->secs();
|
|
os << dsftime << endl;
|
|
cout << format("DSFMap: %1% s") % dsftime << endl;
|
|
tictoc_reset_();
|
|
}
|
|
|
|
if (false) {
|
|
// DSF version, functional
|
|
double dsftime = 0;
|
|
gttic_(dsftime);
|
|
DSF<size_t> dsf;
|
|
for (size_t j = 0; j < N; j++)
|
|
dsf = dsf.makeSet(j);
|
|
for(const Match& m: matches)
|
|
dsf = dsf.makeUnion(m.first, m.second);
|
|
gttoc_(dsftime);
|
|
tictoc_getNode(dsftimeNode, dsftime);
|
|
dsftime = dsftimeNode->secs();
|
|
os << dsftime << endl;
|
|
cout << format("DSF functional: %1% s") % dsftime << endl;
|
|
tictoc_reset_();
|
|
}
|
|
|
|
if (false) {
|
|
// DSF version, in place - always slower - use functional !
|
|
double dsftime = 0;
|
|
gttic_(dsftime);
|
|
DSF<size_t> dsf;
|
|
for (size_t j = 0; j < N; j++)
|
|
dsf.makeSetInPlace(j);
|
|
for(const Match& m: matches)
|
|
dsf.makeUnionInPlace(m.first, m.second);
|
|
gttoc_(dsftime);
|
|
tictoc_getNode(dsftimeNode, dsftime);
|
|
dsftime = dsftimeNode->secs();
|
|
os << dsftime << ",";
|
|
cout << format("DSF in-place: %1% s") % dsftime << endl;
|
|
tictoc_reset_();
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|