treeTraversal-inst.h
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
17 #pragma once
18 
21 
22 #include <gtsam/base/FastList.h>
23 #include <gtsam/base/FastVector.h>
24 #include <gtsam/inference/Key.h>
25 #include <gtsam/config.h> // for GTSAM_USE_TBB
26 
27 #include <stack>
28 #include <vector>
29 #include <string>
30 #include <memory>
31 #include <cassert>
32 
33 namespace gtsam {
34 
36 namespace treeTraversal {
37 
38 /* ************************************************************************* */
39 namespace {
40 // Internal node used in DFS preorder stack
41 template<typename NODE, typename DATA>
42 struct TraversalNode {
43  bool expanded;
44  const std::shared_ptr<NODE>& treeNode;
45  DATA& parentData;
46  typename FastList<DATA>::iterator dataPointer;
47  TraversalNode(const std::shared_ptr<NODE>& _treeNode, DATA& _parentData) :
48  expanded(false), treeNode(_treeNode), parentData(_parentData) {
49  }
50 };
51 
52 // Do nothing - default argument for post-visitor for tree traversal
53 struct no_op {
54  template<typename NODE, typename DATA>
55  void operator()(const std::shared_ptr<NODE>& node, const DATA& data) {
56  }
57 };
58 
59 }
60 
75 template<class FOREST, typename DATA, typename VISITOR_PRE,
76  typename VISITOR_POST>
77 void DepthFirstForest(FOREST& forest, DATA& rootData, VISITOR_PRE& visitorPre,
78  VISITOR_POST& visitorPost) {
79  // Typedefs
80  typedef typename FOREST::Node Node;
81  typedef std::shared_ptr<Node> sharedNode;
82 
83  // Depth first traversal stack
84  typedef TraversalNode<typename FOREST::Node, DATA> TraversalNode;
85  typedef FastList<TraversalNode> Stack;
86  Stack stack;
87  FastList<DATA> dataList; // List to store node data as it is returned from the pre-order visitor
88 
89  // Add roots to stack (insert such that they are visited and processed in order
90  {
91  typename Stack::iterator insertLocation = stack.begin();
92  for(const sharedNode& root: forest.roots())
93  stack.insert(insertLocation, TraversalNode(root, rootData));
94  }
95 
96  // Traverse
97  while (!stack.empty()) {
98  // Get next node
99  TraversalNode& node = stack.front();
100 
101  if (node.expanded) {
102  // If already expanded, then the data stored in the node is no longer needed, so visit
103  // then delete it.
104  (void) visitorPost(node.treeNode, *node.dataPointer);
105  dataList.erase(node.dataPointer);
106  stack.pop_front();
107  } else {
108  // If not already visited, visit the node and add its children (use reverse iterators so
109  // children are processed in the order they appear)
110  node.dataPointer = dataList.insert(dataList.end(),
111  visitorPre(node.treeNode, node.parentData));
112  typename Stack::iterator insertLocation = stack.begin();
113  for(const sharedNode& child: node.treeNode->children)
114  stack.insert(insertLocation, TraversalNode(child, *node.dataPointer));
115  node.expanded = true;
116  }
117  }
118  assert(dataList.empty());
119 }
120 
132 template<class FOREST, typename DATA, typename VISITOR_PRE>
133 void DepthFirstForest(FOREST& forest, DATA& rootData, VISITOR_PRE& visitorPre) {
134  no_op visitorPost;
135  DepthFirstForest(forest, rootData, visitorPre, visitorPost);
136 }
137 
152 template<class FOREST, typename DATA, typename VISITOR_PRE,
153  typename VISITOR_POST>
154 void DepthFirstForestParallel(FOREST& forest, DATA& rootData,
155  VISITOR_PRE& visitorPre, VISITOR_POST& visitorPost,
156  int problemSizeThreshold = 10) {
157 #ifdef GTSAM_USE_TBB
158  // Typedefs
159  typedef typename FOREST::Node Node;
160 
161  internal::CreateRootTask<Node>(forest.roots(), rootData, visitorPre,
162  visitorPost, problemSizeThreshold);
163 #else
164  DepthFirstForest(forest, rootData, visitorPre, visitorPost);
165 #endif
166 }
167 
168 /* ************************************************************************* */
170 namespace {
171 template<typename NODE>
172 std::shared_ptr<NODE> CloneForestVisitorPre(
173  const std::shared_ptr<NODE>& node,
174  const std::shared_ptr<NODE>& parentPointer) {
175  // Clone the current node and add it to its cloned parent
176  std::shared_ptr<NODE> clone = std::make_shared<NODE>(*node);
177  clone->children.clear();
178  parentPointer->children.push_back(clone);
179  return clone;
180 }
181 }
182 
188 template<class FOREST>
190  const FOREST& forest) {
191  typedef typename FOREST::Node Node;
192  std::shared_ptr<Node> rootContainer = std::make_shared<Node>();
193  DepthFirstForest(forest, rootContainer, CloneForestVisitorPre<Node>);
194  return FastVector<std::shared_ptr<Node> >(rootContainer->children.begin(),
195  rootContainer->children.end());
196 }
197 
198 /* ************************************************************************* */
200 namespace {
201 struct PrintForestVisitorPre {
203  PrintForestVisitorPre(const KeyFormatter& formatter) :
204  formatter(formatter) {
205  }
206  template<typename NODE> std::string operator()(
207  const std::shared_ptr<NODE>& node, const std::string& parentString) {
208  // Print the current node
209  node->print(parentString + "-", formatter);
210  // Increment the indentation
211  return parentString + "| ";
212  }
213 };
214 }
215 
218 template<class FOREST>
219 void PrintForest(const FOREST& forest, std::string str,
220  const KeyFormatter& keyFormatter) {
221  PrintForestVisitorPre visitor(keyFormatter);
222  DepthFirstForest(forest, str, visitor);
223 }
224 } // namespace treeTraversal
225 
226 } // namespace gtsam
SymbolicEliminationTree::sharedNode sharedNode
A thin wrapper around std::list that uses boost&#39;s fast_pool_allocator.
std::vector< T, typename internal::FastDefaultVectorAllocator< T >::type > FastVector
Definition: FastVector.h:34
Tools for gathering statistics about a forest to aid tuning parallel traversal.
const KeyFormatter & formatter
void DepthFirstForest(FOREST &forest, DATA &rootData, VISITOR_PRE &visitorPre, VISITOR_POST &visitorPost)
DATA & parentData
void DepthFirstForestParallel(FOREST &forest, DATA &rootData, VISITOR_PRE &visitorPre, VISITOR_POST &visitorPost, int problemSizeThreshold=10)
Definition: pytypes.h:1403
Matrix stack(size_t nrMatrices,...)
Definition: Matrix.cpp:395
int data[]
void PrintForest(const FOREST &forest, std::string str, const KeyFormatter &keyFormatter)
static sharedNode Node(Key key, const SymbolicFactorGraph &factors, const ChildNodes::Result &children)
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition: Key.h:35
A thin wrapper around std::vector that uses a custom allocator.
FastVector< std::shared_ptr< typename FOREST::Node > > CloneForest(const FOREST &forest)
traits
Definition: chartTesting.h:28
const std::shared_ptr< NODE > & treeNode
FastList< DATA >::iterator dataPointer
bool expanded
internal::enable_if< internal::valid_indexed_view_overload< RowIndices, ColIndices >::value &&internal::traits< typename EIGEN_INDEXED_VIEW_METHOD_TYPE< RowIndices, ColIndices >::type >::ReturnAsIndexedView, typename EIGEN_INDEXED_VIEW_METHOD_TYPE< RowIndices, ColIndices >::type >::type operator()(const RowIndices &rowIndices, const ColIndices &colIndices) EIGEN_INDEXED_VIEW_METHOD_CONST


gtsam
Author(s):
autogenerated on Tue Jul 4 2023 02:40:26