| 
									
										
										
										
											2010-06-25 14:35:44 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * DSFVector.cpp | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   Created on: Jun 25, 2010 | 
					
						
							|  |  |  |  *       Author: nikai | 
					
						
							|  |  |  |  *  Description: a faster implementation for DSF, which uses vector rather than btree. | 
					
						
							|  |  |  |  *               As a result, the size of the forest is prefixed. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-20 01:23:19 +08:00
										 |  |  | #include <gtsam/base/DSFVector.h>
 | 
					
						
							| 
									
										
										
										
											2010-06-25 14:35:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	DSFVector::DSFVector (const size_t numNodes) { | 
					
						
							|  |  |  | 		resize(numNodes); | 
					
						
							|  |  |  | 		int index = 0; | 
					
						
							|  |  |  | 		for(iterator it = begin(); it!=end(); it++, index++) | 
					
						
							|  |  |  | 			*it = index; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	size_t DSFVector::findSet(const size_t& key) const { | 
					
						
							|  |  |  | 		size_t parent = at(key); | 
					
						
							|  |  |  | 		return parent == key ? key : findSet(parent); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	std::set<size_t> DSFVector::set(const std::size_t& label) const { | 
					
						
							|  |  |  | 		std::set<size_t> set; | 
					
						
							|  |  |  | 		size_t key = 0; | 
					
						
							|  |  |  | 		std::vector<std::size_t>::const_iterator it = begin(); | 
					
						
							|  |  |  | 		for (; it != end(); it++, key++) { | 
					
						
							|  |  |  | 			if (*it == label || findSet(*it) == label) | 
					
						
							|  |  |  | 				set.insert(key); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return set; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	void DSFVector::makeUnionInPlace(const std::size_t& i1, const std::size_t& i2)  { | 
					
						
							|  |  |  | 		at(findSet(i2)) = findSet(i1); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	std::map<size_t, std::set<size_t> > DSFVector::sets() const { | 
					
						
							|  |  |  | 		std::map<size_t, std::set<size_t> > sets; | 
					
						
							|  |  |  | 		size_t key = 0; | 
					
						
							|  |  |  | 		std::vector<std::size_t>::const_iterator it = begin(); | 
					
						
							|  |  |  | 		for (; it != end(); it++, key++) { | 
					
						
							|  |  |  | 			sets[findSet(*it)].insert(key); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return sets; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |