/* ---------------------------------------------------------------------------- * 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 * -------------------------------------------------------------------------- */ /* * graph.h * @brief Graph algorithm using boost library * @author: Kai Ni * Created on: Jan 11, 2010 */ #pragma once #include #define BOOST_NO_HASH // to pacify the warnings about depricated headers in boost.graph #include #include #include namespace gtsam { // type definitions : /** * SDGraph is undirected graph with variable keys and double edge weights */ template class SDGraph: public boost::adjacency_list, boost::property< boost::edge_weight_t, double> > { public: typedef typename boost::graph_traits >::vertex_descriptor Vertex; }; template class SGraph : public boost::adjacency_list > { public: typedef typename boost::graph_traits >::vertex_descriptor Vertex; }; //typedef boost::graph_traits::vertex_descriptor SVertex; /** * Map from variable key to parent key */ template class PredecessorMap: public std::map { public: /** convenience insert so we can pass ints for TypedSymbol keys */ inline void insert(const KEY& key, const KEY& parent) { std::map::insert(std::make_pair(key, parent)); } }; /** * Generate a list of keys from a spanning tree represented by its predecessor map */ template std::list predecessorMap2Keys(const PredecessorMap& p_map); /** * Convert the factor graph to an SDGraph * G = Graph type * F = Factor type * Key = Key type */ template SDGraph toBoostGraph(const G& graph); /** * Build takes a predecessor map, and builds a directed graph corresponding to the tree. * G = Graph type * V = Vertex type */ template boost::tuple > predecessorMap2Graph(const PredecessorMap& p_map); /** * Compose the poses by following the chain specified by the spanning tree */ template boost::shared_ptr composePoses(const G& graph, const PredecessorMap& tree, const POSE& rootPose); /** * find the minimum spanning tree using boost graph library */ template PredecessorMap 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 void split(const G& g, const PredecessorMap& tree, G& Ab1, G& Ab2) ; } // namespace gtsam