134 lines
3.8 KiB
C++
134 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 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 <fstream>
|
|
#include <iostream>
|
|
#include <random>
|
|
#include <vector>
|
|
#include <utility>
|
|
|
|
using namespace std;
|
|
using namespace gtsam;
|
|
|
|
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 {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 << "\nTesting with " << (int)m << " images, " << (int)N << " points, " << (int)nm << " matches\n";
|
|
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 << (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 << "DSFBase: " << dsftime << " s" << 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 << "DSFMap: " << dsftime << " s" << 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 << "DSF functional: " << dsftime << " s" << 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 << "DSF in-place: " << dsftime << " s" << endl;
|
|
tictoc_reset_();
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|