25 #include <gtsam/symbolic/SymbolicConditional.h>
26 #include <gtsam/symbolic/SymbolicFactor-inst.h>
32 template<
class BAYESTREE,
class GRAPH>
33 struct ConstructorTraversalData {
34 ConstructorTraversalData*
const parentData;
35 typename JunctionTree<BAYESTREE,GRAPH>::sharedNode myJTNode;
36 FastVector<SymbolicConditional::shared_ptr> childSymbolicConditionals;
37 FastVector<SymbolicFactor::shared_ptr> childSymbolicFactors;
38 ConstructorTraversalData(ConstructorTraversalData* _parentData) : parentData(_parentData) {}
43 template<
class BAYESTREE,
class GRAPH,
class ETREE_NODE>
44 ConstructorTraversalData<BAYESTREE,GRAPH> ConstructorTraversalVisitorPre(
45 const boost::shared_ptr<ETREE_NODE>& node,
46 ConstructorTraversalData<BAYESTREE,GRAPH>& parentData)
50 ConstructorTraversalData<BAYESTREE,GRAPH> myData = ConstructorTraversalData<BAYESTREE,GRAPH>(&parentData);
51 myData.myJTNode = boost::make_shared<typename JunctionTree<BAYESTREE,GRAPH>::Node>();
52 myData.myJTNode->keys.push_back(node->key);
53 myData.myJTNode->factors.insert(myData.myJTNode->factors.begin(), node->factors.begin(), node->factors.end());
54 parentData.myJTNode->children.push_back(myData.myJTNode);
60 template<
class BAYESTREE,
class GRAPH,
class ETREE_NODE>
61 void ConstructorTraversalVisitorPostAlg2(
62 const boost::shared_ptr<ETREE_NODE>& ETreeNode,
63 const ConstructorTraversalData<BAYESTREE, GRAPH>& myData)
73 class :
public FactorGraph<Factor> {} symbolicFactors;
74 symbolicFactors.reserve(ETreeNode->factors.size() + myData.childSymbolicFactors.size());
76 symbolicFactors += ETreeNode->factors;
78 symbolicFactors += myData.childSymbolicFactors;
80 Ordering keyAsOrdering; keyAsOrdering.push_back(ETreeNode->key);
81 std::pair<SymbolicConditional::shared_ptr, SymbolicFactor::shared_ptr> symbolicElimResult =
82 internal::EliminateSymbolic(symbolicFactors, keyAsOrdering);
85 myData.parentData->childSymbolicConditionals.push_back(symbolicElimResult.first);
86 myData.parentData->childSymbolicFactors.push_back(symbolicElimResult.second);
90 size_t myNrFrontals = 1;
91 const size_t myNrParents = symbolicElimResult.first->nrParents();
92 size_t nrMergedChildren = 0;
93 assert(myData.myJTNode->children.size() == myData.childSymbolicConditionals.size());
95 int combinedProblemSize = (int) (symbolicElimResult.first->size() * symbolicFactors.size());
96 for(
size_t child = 0; child < myData.childSymbolicConditionals.size(); ++child) {
98 if(myNrParents + myNrFrontals == myData.childSymbolicConditionals[child]->nrParents()) {
101 const typename JunctionTree<BAYESTREE, GRAPH>::Node& childToMerge =
102 *myData.myJTNode->children[child - nrMergedChildren];
104 myData.myJTNode->keys.insert(myData.myJTNode->keys.begin(), childToMerge.keys.begin(), childToMerge.keys.end());
105 myData.myJTNode->factors.insert(myData.myJTNode->factors.end(), childToMerge.factors.begin(), childToMerge.factors.end());
106 myData.myJTNode->children.insert(myData.myJTNode->children.end(), childToMerge.children.begin(), childToMerge.children.end());
108 combinedProblemSize =
std::max(combinedProblemSize, childToMerge.problemSize_);
110 myNrFrontals += childToMerge.keys.size();
112 myData.myJTNode->children.erase(myData.myJTNode->children.begin() + (child - nrMergedChildren));
117 myData.myJTNode->problemSize_ = combinedProblemSize;
122 template<
class BAYESTREE,
class GRAPH>
123 template<
class ETREE_BAYESNET,
class ETREE_GRAPH>
126 gttic(JunctionTree_FromEliminationTree);
136 ConstructorTraversalData<BAYESTREE, GRAPH> rootData(0);
137 rootData.myJTNode = boost::make_shared<typename Base::Node>();
139 ConstructorTraversalVisitorPre<BAYESTREE,GRAPH,ETreeNode>, ConstructorTraversalVisitorPostAlg2<BAYESTREE,GRAPH,ETreeNode>);
142 Base::roots_ = rootData.myJTNode->children;
Definition: JunctionTree.h:52
Collects factorgraph fragments defined on variable clusters, arranged in a tree.
Definition: EliminationTree.h:66
void DepthFirstForest(FOREST &forest, DATA &rootData, VISITOR_PRE &visitorPre, VISITOR_POST &visitorPost)
Traverse a forest depth-first with pre-order and post-order visits.
Definition: treeTraversal-inst.h:75
double max(const Vector &a)
Return the max element of a vector.
Definition: Vector.cpp:238
const FastVector< sharedFactor > & remainingFactors() const
Return the remaining factors that are not pulled into elimination.
Definition: EliminationTree.h:154
An elimination tree is a data structure used intermediately during elimination.
Definition: EliminationTree.h:51