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
 | 
						|
 |