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