TreeNode.cpp
Go to the documentation of this file.
1 
18 #include "trainer/TreeNode.h"
19 
20 namespace SceneModel {
21 
23  : mObjectSet(pObjectSet)
24  {
25  }
26 
28  {
29  mObjectSet = pRoot->mObjectSet;
31 
32  BOOST_FOREACH(boost::shared_ptr<TreeNode> child, pRoot->mChildren)
34  }
35 
37  {
38  }
39 
41  {
43 
44  // Search the new root node.
45  std::queue<boost::shared_ptr<TreeNode> > nodesToVisit;
46  nodesToVisit.push(f());
47 
48  while(nodesToVisit.size() > 0)
49  {
50  boost::shared_ptr<TreeNode> node = nodesToVisit.front();
51  nodesToVisit.pop();
52 
53  if (!(node->mIsReference)) // A reference node can not be root, has no children, and its parent node must appear as parent node of a non-reference node elsewhere.
54  {
55 
56  // New root node found?
57  if(node->mObjectSet->objects[0]->type.compare(pType) == 0)
58  {
59  newRoot = node;
60  break;
61  }
62 
63  // Add the child nodes to queue.
64  BOOST_FOREACH(boost::shared_ptr<TreeNode> child, node->mChildren)
65  nodesToVisit.push(child);
66 
67  // Add parent node to queue, if it exists.
68  if(node->mParent)
69  nodesToVisit.push(node->mParent);
70  }
71  }
72 
73  // Reorganize the tree from the root node.
74  if(newRoot->mParent)
75  {
76  newRoot->mParent->reassignNewParentNode(newRoot);
77  newRoot->mParent = boost::shared_ptr<TreeNode>();
78  }
79 
80  std::vector<boost::shared_ptr<TreeNode>> reversedReferences = newRoot->updateReferences(newRoot);
81  for (boost::shared_ptr<TreeNode> reversedReference: reversedReferences) newRoot->addChild(reversedReference);
82 
83  // Assign unique IDs to each node, counted in order of depth-first search.
84  newRoot->setIDs();
85 
86  // Return the new root node.
87  return newRoot;
88  }
89 
91  {
92  return mObjectSet;
93  }
94 
95  std::vector<boost::shared_ptr<TreeNode> > TreeNode::getChildren()
96  {
97  return mChildren;
98  }
99 
101  {
102  pChild->mParent = f();
103  mChildren.push_back(pChild);
104  }
105 
107  {
108  unsigned int result = 1;
109 
110  BOOST_FOREACH(boost::shared_ptr<TreeNode> child, mChildren)
111  result += child->getNumberOfNodes();
112 
113  return result;
114  }
115 
117  {
118  return shared_from_this();
119  }
120 
121  void TreeNode::printTreeToConsole(unsigned int pSpace)
122  {
123  // Generate leading spaces.
124  for(unsigned int i = 0; i < pSpace; i++)
125  std::cout << " ";
126  std::cout << "-";
127 
128  // Print types and number of children and observations, as well as ID and ID of referenced (own if not reference): ID mID -> referencedID
129  unsigned int referencing = mID;
130  if (mIsReference) referencing = mReferenceTo->mID;
131  std::cout << mObjectSet->objects[0]->type << "(" << mChildren.size() << "/" << mObjectSet->objects.size() << ")" << " ID " << mID << " -> " << referencing << std::endl;
132 
133  // Print children.
134  if (!mIsReference) // References have no children
136  node->printTreeToConsole(pSpace + 1);
137  }
138 
140  {
141  if(mParent)
142  mParent->reassignNewParentNode(f());
143 
144  // Overwrite parent pointer and add as child to parent.
145  mParent = pParent;
146  pParent->mChildren.push_back(f());
147 
148  // Remove new parent from own child list.
149  for(unsigned int i = 0; i < mChildren.size(); i++)
150  {
151  if(mChildren[i] == pParent)
152  {
153  mChildren.erase(mChildren.begin() + i);
154  break;
155  }
156  }
157 
158  // to avoid circles:
159  std::vector<boost::shared_ptr<TreeNode>> reversedReferences = updateReferences(f());
160  for (boost::shared_ptr<TreeNode> reversedReference: reversedReferences) addChild(reversedReference);
161  }
162 
164  {
165  unsigned int id = 0;
166  this->mID = id;
167  for (boost::shared_ptr<TreeNode> child: mChildren) child->updateIDs(id, false);
168  for (boost::shared_ptr<TreeNode> child: mChildren) child->updateIDs(id, true);
169  }
170 
171  void TreeNode::updateIDs(unsigned int& pID, bool pUpdateReferenceIDs)
172  {
173  if (!mIsReference ^ pUpdateReferenceIDs)
174  {
175  pID++;
176  this->mID = pID;
177  }
178  if (!mIsReference) // References dont't have children
179  for (boost::shared_ptr<TreeNode> child: mChildren) child->updateIDs(pID, pUpdateReferenceIDs);
180  }
181 
182 std::vector<boost::shared_ptr<TreeNode>> TreeNode::updateReferences(boost::shared_ptr<TreeNode> pRoot)
183 {
184  std::vector<boost::shared_ptr<TreeNode>> reversedReferences;
185  std::vector<boost::shared_ptr<TreeNode>> toDelete;
186  if (mIsReference) return std::vector<boost::shared_ptr<TreeNode>>(); // references have no children, so there is nothing to reverse
187  for (boost::shared_ptr<TreeNode> child: this->mChildren)
188  {
189  if (child->mIsReference)
190  {
191  if (child->mReferenceTo == pRoot)
192  {
193  boost::shared_ptr<TreeNode> reversedReference(new TreeNode(this->mObjectSet));
194  reversedReference->mReferenceTo = boost::shared_ptr<TreeNode>(f());
195  reversedReference->mIsReference = true;
196  // references have no mChildren:
197  reversedReference->mChildren = std::vector<boost::shared_ptr<TreeNode>>();
198  reversedReferences.push_back(reversedReference);
199  toDelete.push_back(child);
200  }
201  }
202  else // references don't have children, so it is unneccessary to do this on a reference
203  {
204  std::vector<boost::shared_ptr<TreeNode>> childReversedReferences = child->updateReferences(pRoot);
205  for (boost::shared_ptr<TreeNode> childReversedReference: childReversedReferences) reversedReferences.push_back(childReversedReference);
206  }
207  }
208  for (boost::shared_ptr<TreeNode> childToDelete: toDelete)
209  {
210  for(unsigned int i = 0; i < mChildren.size(); i++)
211  {
212  if(mChildren[i] == childToDelete)
213  {
214  mChildren.erase(mChildren.begin() + i);
215  break;
216  }
217  }
218  }
219  return reversedReferences;
220 }
221 
222 }
boost::shared_ptr< TreeNode > setNewRootNodeByType(std::string pType)
Definition: TreeNode.cpp:40
boost::shared_ptr< ISM::ObjectSet > getObjectSet()
Definition: TreeNode.cpp:90
std::vector< boost::shared_ptr< TreeNode > > getChildren()
Definition: TreeNode.cpp:95
boost::shared_ptr< TreeNode > f()
Definition: TreeNode.cpp:116
TreeNode(boost::shared_ptr< ISM::ObjectSet > pObjectSet)
Definition: TreeNode.cpp:22
boost::shared_ptr< ISM::ObjectSet > mObjectSet
Definition: TreeNode.h:123
unsigned int mID
Definition: TreeNode.h:149
void printTreeToConsole(unsigned int space)
Definition: TreeNode.cpp:121
unsigned int getNumberOfNodes()
Definition: TreeNode.cpp:106
std::vector< boost::shared_ptr< TreeNode > > updateReferences(boost::shared_ptr< TreeNode > pRoot)
Definition: TreeNode.cpp:182
void updateIDs(unsigned int &pID, bool pUpdateReferencIDs)
Definition: TreeNode.cpp:171
boost::shared_ptr< TreeNode > mReferenceTo
Definition: TreeNode.h:144
void addChild(boost::shared_ptr< TreeNode > pChild)
Definition: TreeNode.cpp:100
std::vector< boost::shared_ptr< TreeNode > > mChildren
Definition: TreeNode.h:134
void reassignNewParentNode(boost::shared_ptr< TreeNode > pParent)
Definition: TreeNode.cpp:139
boost::shared_ptr< TreeNode > mParent
Definition: TreeNode.h:129


asr_relation_graph_generator
Author(s): Meißner Pascal
autogenerated on Fri Nov 15 2019 03:39:19