/* * NestedDissection.h * * Created on: Nov 27, 2010 * Author: nikai * Description: apply nested dissection algorithm to the factor graph */ #pragma once #include #include #include namespace gtsam { namespace partition { /** * Apply nested dissection algorithm to nonlinear factor graphs */ template class NestedDissection { public: typedef std::shared_ptr sharedSubNLG; private: NLG fg_; // the original nonlinear factor graph Ordering ordering_; // the variable ordering in the nonlinear factor graph std::vector int2symbol_; // the mapping from integer key to symbol sharedSubNLG root_; // the root of generated cluster tree public: sharedSubNLG root() const { return root_; } public: /* constructor with post-determined partitoning*/ NestedDissection(const NLG& fg, const Ordering& ordering, const int numNodeStopPartition, const int minNodesPerMap, const bool verbose = false); /* constructor with pre-determined cuts*/ NestedDissection(const NLG& fg, const Ordering& ordering, const std::shared_ptr& cuts, const bool verbose = false); private: /* convert generic subgraph to nonlinear subgraph */ sharedSubNLG makeSubNLG(const NLG& fg, const std::vector& frontals, const std::vector& sep, const std::shared_ptr& parent) const; void processFactor(const typename GenericGraph::value_type& factor, const std::vector& partitionTable, // input std::vector& frontalFactors, NLG& sepFactors, std::vector >& childSeps, // output factor graphs typename SubNLG::Weeklinks& weeklinks) const; /* recursively partition the generic graph */ void partitionFactorsAndVariables( const GenericGraph& fg, const GenericUnaryGraph& unaryFactors, const std::vector& keys, const std::vector& partitionTable, const int numSubmaps, // input std::vector& frontalFactors, vector& frontalUnaryFactors, NLG& sepFactors, // output factor graphs std::vector >& childFrontals, std::vector >& childSeps, std::vector& localFrontals, // output sub-orderings typename SubNLG::Weeklinks& weeklinks) const; NLG collectOriginalFactors(const GenericGraph& gfg, const GenericUnaryGraph& unaryFactors) const; /* recursively partition the generic graph */ sharedSubNLG recursivePartition(const GenericGraph& gfg, const GenericUnaryGraph& unaryFactors, const std::vector& frontals, const std::vector& sep, const int numNodeStopPartition, const int minNodesPerMap, const std::shared_ptr& parent, WorkSpace& workspace, const bool verbose) const; /* recursively partition the generic graph */ sharedSubNLG recursivePartition(const GenericGraph& gfg, const GenericUnaryGraph& unaryFactors, const std::vector& frontals, const std::vector& sep, const std::shared_ptr& cuts, const std::shared_ptr& parent, WorkSpace& workspace, const bool verbose) const; }; }} //namespace