move min spanning tree and split functions from FactorGraph.h to graph.h
							parent
							
								
									422a4ae16d
								
							
						
					
					
						commit
						fd794e0da2
					
				| 
						 | 
				
			
			@ -213,61 +213,61 @@ namespace gtsam {
 | 
			
		|||
//		return ordering;
 | 
			
		||||
//	}
 | 
			
		||||
 | 
			
		||||
	/* ************************************************************************* */
 | 
			
		||||
	template<class Factor> template<class Key, class Factor2>
 | 
			
		||||
	PredecessorMap<Key> FactorGraph<Factor>::findMinimumSpanningTree() const {
 | 
			
		||||
 | 
			
		||||
		SDGraph<Key> g = gtsam::toBoostGraph<FactorGraph<Factor> , Factor2, Key>(
 | 
			
		||||
				*this);
 | 
			
		||||
 | 
			
		||||
		// find minimum spanning tree
 | 
			
		||||
		vector<typename SDGraph<Key>::Vertex> p_map(boost::num_vertices(g));
 | 
			
		||||
		prim_minimum_spanning_tree(g, &p_map[0]);
 | 
			
		||||
 | 
			
		||||
		// convert edge to string pairs
 | 
			
		||||
		PredecessorMap<Key> tree;
 | 
			
		||||
		typename SDGraph<Key>::vertex_iterator itVertex = boost::vertices(g).first;
 | 
			
		||||
		typename vector<typename SDGraph<Key>::Vertex>::iterator vi;
 | 
			
		||||
		for (vi = p_map.begin(); vi != p_map.end(); itVertex++, vi++) {
 | 
			
		||||
			Key key = boost::get(boost::vertex_name, g, *itVertex);
 | 
			
		||||
			Key parent = boost::get(boost::vertex_name, g, *vi);
 | 
			
		||||
			tree.insert(key, parent);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return tree;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* ************************************************************************* */
 | 
			
		||||
	template<class Factor> template<class Key, class Factor2>
 | 
			
		||||
	void FactorGraph<Factor>::split(const PredecessorMap<Key>& tree,
 | 
			
		||||
									FactorGraph<Factor>& Ab1, FactorGraph<Factor>& Ab2) const {
 | 
			
		||||
 | 
			
		||||
		BOOST_FOREACH(const sharedFactor& factor, factors_)
 | 
			
		||||
		{
 | 
			
		||||
			if (factor->keys().size() > 2) throw(invalid_argument(
 | 
			
		||||
					"split: only support factors with at most two keys"));
 | 
			
		||||
 | 
			
		||||
			if (factor->keys().size() == 1) {
 | 
			
		||||
				Ab1.push_back(factor);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			boost::shared_ptr<Factor2> factor2 = boost::dynamic_pointer_cast<
 | 
			
		||||
					Factor2>(factor);
 | 
			
		||||
			if (!factor2) continue;
 | 
			
		||||
 | 
			
		||||
			Key key1 = factor2->key1();
 | 
			
		||||
			Key key2 = factor2->key2();
 | 
			
		||||
			// if the tree contains the key
 | 
			
		||||
			if ((tree.find(key1) != tree.end()
 | 
			
		||||
					&& tree.find(key1)->second.compare(key2) == 0) || (tree.find(
 | 
			
		||||
					key2) != tree.end() && tree.find(key2)->second.compare(key1)
 | 
			
		||||
					== 0))
 | 
			
		||||
				Ab1.push_back(factor2);
 | 
			
		||||
			else
 | 
			
		||||
				Ab2.push_back(factor2);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
//	/* ************************************************************************* */
 | 
			
		||||
//	template<class Factor> template<class Key, class Factor2>
 | 
			
		||||
//	PredecessorMap<Key> FactorGraph<Factor>::findMinimumSpanningTree() const {
 | 
			
		||||
//
 | 
			
		||||
//		SDGraph<Key> g = gtsam::toBoostGraph<FactorGraph<Factor> , Factor2, Key>(
 | 
			
		||||
//				*this);
 | 
			
		||||
//
 | 
			
		||||
//		// find minimum spanning tree
 | 
			
		||||
//		vector<typename SDGraph<Key>::Vertex> p_map(boost::num_vertices(g));
 | 
			
		||||
//		prim_minimum_spanning_tree(g, &p_map[0]);
 | 
			
		||||
//
 | 
			
		||||
//		// convert edge to string pairs
 | 
			
		||||
//		PredecessorMap<Key> tree;
 | 
			
		||||
//		typename SDGraph<Key>::vertex_iterator itVertex = boost::vertices(g).first;
 | 
			
		||||
//		typename vector<typename SDGraph<Key>::Vertex>::iterator vi;
 | 
			
		||||
//		for (vi = p_map.begin(); vi != p_map.end(); itVertex++, vi++) {
 | 
			
		||||
//			Key key = boost::get(boost::vertex_name, g, *itVertex);
 | 
			
		||||
//			Key parent = boost::get(boost::vertex_name, g, *vi);
 | 
			
		||||
//			tree.insert(key, parent);
 | 
			
		||||
//		}
 | 
			
		||||
//
 | 
			
		||||
//		return tree;
 | 
			
		||||
//	}
 | 
			
		||||
//
 | 
			
		||||
//	/* ************************************************************************* */
 | 
			
		||||
//	template<class Factor> template<class Key, class Factor2>
 | 
			
		||||
//	void FactorGraph<Factor>::split(const PredecessorMap<Key>& tree,
 | 
			
		||||
//									FactorGraph<Factor>& Ab1, FactorGraph<Factor>& Ab2) const {
 | 
			
		||||
//
 | 
			
		||||
//		BOOST_FOREACH(const sharedFactor& factor, factors_)
 | 
			
		||||
//		{
 | 
			
		||||
//			if (factor->keys().size() > 2) throw(invalid_argument(
 | 
			
		||||
//					"split: only support factors with at most two keys"));
 | 
			
		||||
//
 | 
			
		||||
//			if (factor->keys().size() == 1) {
 | 
			
		||||
//				Ab1.push_back(factor);
 | 
			
		||||
//				continue;
 | 
			
		||||
//			}
 | 
			
		||||
//
 | 
			
		||||
//			boost::shared_ptr<Factor2> factor2 = boost::dynamic_pointer_cast<
 | 
			
		||||
//					Factor2>(factor);
 | 
			
		||||
//			if (!factor2) continue;
 | 
			
		||||
//
 | 
			
		||||
//			Key key1 = factor2->key1();
 | 
			
		||||
//			Key key2 = factor2->key2();
 | 
			
		||||
//			// if the tree contains the key
 | 
			
		||||
//			if ((tree.find(key1) != tree.end()
 | 
			
		||||
//					&& tree.find(key1)->second.compare(key2) == 0) || (tree.find(
 | 
			
		||||
//					key2) != tree.end() && tree.find(key2)->second.compare(key1)
 | 
			
		||||
//					== 0))
 | 
			
		||||
//				Ab1.push_back(factor2);
 | 
			
		||||
//			else
 | 
			
		||||
//				Ab2.push_back(factor2);
 | 
			
		||||
//		}
 | 
			
		||||
//	}
 | 
			
		||||
 | 
			
		||||
//	/* ************************************************************************* */
 | 
			
		||||
//	template<class Factor>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -116,18 +116,18 @@ namespace gtsam {
 | 
			
		|||
//		Ordering getOrdering(const std::set<Index>& scope) const;
 | 
			
		||||
//		Ordering getConstrainedOrdering(const std::set<Index>& lastKeys) const;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * find the minimum spanning tree using boost graph library
 | 
			
		||||
		 */
 | 
			
		||||
		template<class Key, class Factor2>
 | 
			
		||||
		PredecessorMap<Key> findMinimumSpanningTree() const;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * Split the graph into two parts: one corresponds to the given spanning tree,
 | 
			
		||||
		 * and the other corresponds to the rest of the factors
 | 
			
		||||
		 */
 | 
			
		||||
		template<class Key, class Factor2>
 | 
			
		||||
		void split(const PredecessorMap<Key>& tree, FactorGraph<Factor>& Ab1, FactorGraph<Factor>& Ab2) const;
 | 
			
		||||
//		/**
 | 
			
		||||
//		 * find the minimum spanning tree using boost graph library
 | 
			
		||||
//		 */
 | 
			
		||||
//		template<class Key, class Factor2>
 | 
			
		||||
//		PredecessorMap<Key> findMinimumSpanningTree() const;
 | 
			
		||||
//
 | 
			
		||||
//		/**
 | 
			
		||||
//		 * Split the graph into two parts: one corresponds to the given spanning tree,
 | 
			
		||||
//		 * and the other corresponds to the rest of the factors
 | 
			
		||||
//		 */
 | 
			
		||||
//		template<class Key, class Factor2>
 | 
			
		||||
//		void split(const PredecessorMap<Key>& tree, FactorGraph<Factor>& Ab1, FactorGraph<Factor>& Ab2) const;
 | 
			
		||||
 | 
			
		||||
//		/**
 | 
			
		||||
//		 * find the minimum spanning tree using DSF
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -206,4 +206,60 @@ boost::shared_ptr<Values> composePoses(const G& graph, const PredecessorMap<type
 | 
			
		|||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
template<class G, class Key, class Factor2>
 | 
			
		||||
PredecessorMap<Key> findMinimumSpanningTree(const G& fg) {
 | 
			
		||||
 | 
			
		||||
	SDGraph<Key> g = gtsam::toBoostGraph<G, Factor2, Key>(fg);
 | 
			
		||||
 | 
			
		||||
	// find minimum spanning tree
 | 
			
		||||
	vector<typename SDGraph<Key>::Vertex> p_map(boost::num_vertices(g));
 | 
			
		||||
	prim_minimum_spanning_tree(g, &p_map[0]);
 | 
			
		||||
 | 
			
		||||
	// convert edge to string pairs
 | 
			
		||||
	PredecessorMap<Key> tree;
 | 
			
		||||
	typename SDGraph<Key>::vertex_iterator itVertex = boost::vertices(g).first;
 | 
			
		||||
	typename vector<typename SDGraph<Key>::Vertex>::iterator vi;
 | 
			
		||||
	for (vi = p_map.begin(); vi != p_map.end(); itVertex++, vi++) {
 | 
			
		||||
		Key key = boost::get(boost::vertex_name, g, *itVertex);
 | 
			
		||||
		Key parent = boost::get(boost::vertex_name, g, *vi);
 | 
			
		||||
		tree.insert(key, parent);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return tree;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
template<class G, class Key, class Factor2>
 | 
			
		||||
void split(const G& g, const PredecessorMap<Key>& tree, G& Ab1, G& Ab2) {
 | 
			
		||||
 | 
			
		||||
	typedef typename G::sharedFactor F ;
 | 
			
		||||
 | 
			
		||||
	BOOST_FOREACH(const F& factor, g.factors_)
 | 
			
		||||
	{
 | 
			
		||||
		if (factor->keys().size() > 2)
 | 
			
		||||
			throw(invalid_argument("split: only support factors with at most two keys"));
 | 
			
		||||
 | 
			
		||||
		if (factor->keys().size() == 1) {
 | 
			
		||||
			Ab1.push_back(factor);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		boost::shared_ptr<Factor2> factor2 = boost::dynamic_pointer_cast<
 | 
			
		||||
				Factor2>(factor);
 | 
			
		||||
		if (!factor2) continue;
 | 
			
		||||
 | 
			
		||||
		Key key1 = factor2->key1();
 | 
			
		||||
		Key key2 = factor2->key2();
 | 
			
		||||
		// if the tree contains the key
 | 
			
		||||
		if ((tree.find(key1) != tree.end() &&
 | 
			
		||||
			 tree.find(key1)->second.compare(key2) == 0) ||
 | 
			
		||||
			  (tree.find(key2) != tree.end() &&
 | 
			
		||||
			   tree.find(key2)->second.compare(key1)== 0) )
 | 
			
		||||
			Ab1.push_back(factor2);
 | 
			
		||||
		else
 | 
			
		||||
			Ab2.push_back(factor2);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -80,4 +80,19 @@ namespace gtsam {
 | 
			
		|||
	boost::shared_ptr<Values>
 | 
			
		||||
		composePoses(const G& graph, const PredecessorMap<typename Values::Key>& tree, const Pose& rootPose);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * find the minimum spanning tree using boost graph library
 | 
			
		||||
	 */
 | 
			
		||||
	template<class G, class Key, class Factor2>
 | 
			
		||||
	PredecessorMap<Key> findMinimumSpanningTree(const G& g) ;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Split the graph into two parts: one corresponds to the given spanning tree,
 | 
			
		||||
	 * and the other corresponds to the rest of the factors
 | 
			
		||||
	 */
 | 
			
		||||
	template<class G, class Key, class Factor2>
 | 
			
		||||
	void split(const G& g, const PredecessorMap<Key>& tree, G& Ab1, G& Ab2) ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} // namespace gtsam
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue