98 lines
2.8 KiB
C++
98 lines
2.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 DSFVector.cpp
|
|
* @date Jun 25, 2010
|
|
* @author Kai Ni
|
|
* @brief a faster implementation for DSF, which uses vector rather than btree.
|
|
*/
|
|
|
|
#include <boost/make_shared.hpp>
|
|
#include <boost/foreach.hpp>
|
|
#include <gtsam_unstable/base/DSFVector.h>
|
|
|
|
using namespace std;
|
|
|
|
namespace gtsam {
|
|
|
|
/* ************************************************************************* */
|
|
DSFVector::DSFVector (const size_t numNodes) {
|
|
v_ = boost::make_shared<V>(numNodes);
|
|
int index = 0;
|
|
keys_.reserve(numNodes);
|
|
for(V::iterator it = v_->begin(); it!=v_->end(); it++, index++) {
|
|
*it = index;
|
|
keys_.push_back(index);
|
|
}
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
DSFVector::DSFVector(const boost::shared_ptr<V>& v_in, const std::vector<size_t>& keys) : keys_(keys) {
|
|
v_ = v_in;
|
|
BOOST_FOREACH(const size_t key, keys)
|
|
(*v_)[key] = key;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
bool DSFVector::isSingleton(const Label& label) const {
|
|
bool result = false;
|
|
V::const_iterator it = keys_.begin();
|
|
for (; it != keys_.end(); ++it) {
|
|
if(findSet(*it) == label) {
|
|
if (!result) // find the first occurrence
|
|
result = true;
|
|
else
|
|
return false;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
std::set<size_t> DSFVector::set(const Label& label) const {
|
|
std::set<size_t> set;
|
|
V::const_iterator it = keys_.begin();
|
|
for (; it != keys_.end(); it++) {
|
|
if (findSet(*it) == label)
|
|
set.insert(*it);
|
|
}
|
|
return set;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
std::map<DSFVector::Label, std::set<size_t> > DSFVector::sets() const {
|
|
std::map<Label, std::set<size_t> > sets;
|
|
V::const_iterator it = keys_.begin();
|
|
for (; it != keys_.end(); it++) {
|
|
sets[findSet(*it)].insert(*it);
|
|
}
|
|
return sets;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
std::map<DSFVector::Label, std::vector<size_t> > DSFVector::arrays() const {
|
|
std::map<Label, std::vector<size_t> > arrays;
|
|
V::const_iterator it = keys_.begin();
|
|
for (; it != keys_.end(); it++) {
|
|
arrays[findSet(*it)].push_back(*it);
|
|
}
|
|
return arrays;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
void DSFVector::makeUnionInPlace(const size_t& i1, const size_t& i2) {
|
|
(*v_)[findSet(i2)] = findSet(i1);
|
|
}
|
|
|
|
} // namespace gtsam
|
|
|