33 template<
class BAYESNET,
class GRAPH>
36 const std::shared_ptr<BayesNetType>& output,
41 assert(childrenResults.size() ==
children.size());
47 gatheredFactors.push_back(childrenResults.begin(), childrenResults.end());
51 auto eliminationResult =
function(gatheredFactors,
Ordering(keyAsVector));
54 output->push_back(eliminationResult.first);
57 return eliminationResult.second;
61 template<
class BAYESNET,
class GRAPH>
65 std::cout <<
str <<
"(" << keyFormatter(
key) <<
")\n";
70 std::cout <<
str <<
"null factor\n";
76 template<
class BAYESNET,
class GRAPH>
80 gttic(EliminationTree_Contructor);
84 const size_t m =
graph.size();
85 const size_t n = order.size();
97 for (
size_t j = 0;
j <
n;
j++)
101 const sharedNode node = std::make_shared<Node>();
102 node->key = order[
j];
105 node->children.reserve(
factors.size());
106 node->factors.reserve(
factors.size());
113 if (prevCol[
i] !=
none) {
114 size_t k = prevCol[
i];
118 while (parents[r] !=
none)
125 node->children.push_back(
nodes[r]);
129 node->factors.push_back(
graph[
i]);
130 factorUsed[
i] =
true;
136 }
catch(std::invalid_argument&
e) {
140 throw std::invalid_argument(
"EliminationTree: given ordering contains variables that are not involved in the factor graph");
146 assert(parents.empty() || parents.back() ==
none);
147 for(
size_t j = 0;
j <
n; ++
j)
148 if(parents[
j] ==
none)
152 for(
size_t i = 0;
i <
m; ++
i)
158 template<
class BAYESNET,
class GRAPH>
165 This temp(factorGraph, variableIndex, order);
170 template<
class BAYESNET,
class GRAPH>
191 template<
class BAYESNET,
class GRAPH>
196 for (
auto&& root :
roots_) {
197 std::queue<sharedNode> bfs_queue;
200 bfs_queue.push(root);
205 while (!bfs_queue.empty()) {
207 auto node = bfs_queue.front();
211 for (
auto&& child : node->children) {
212 bfs_queue.push(child);
222 template<
class BAYESNET,
class GRAPH>
223 std::pair<std::shared_ptr<BAYESNET>, std::shared_ptr<GRAPH> >
226 gttic(EliminationTree_eliminate);
228 auto result = std::make_shared<BayesNetType>();
234 auto allRemainingFactors = std::make_shared<FactorGraphType>();
239 return {
result, allRemainingFactors};
243 template<
class BAYESNET,
class GRAPH>
250 template<
class BAYESNET,
class GRAPH>
254 std::stack<sharedNode, FastVector<sharedNode> > stack1, stack2;
259 for(
const sharedNode& root: this->
roots_) { keys.emplace(root->key, root); }
261 for(
const Key_Node& key_node:
keys) { stack1.push(key_node.second); }
267 for(
const Key_Node& key_node:
keys) { stack2.push(key_node.second); }
271 while(!stack1.empty() && !stack2.empty()) {
279 if(node1->key != node2->key)
281 if(node1->factors.size() != node2->factors.size()) {
284 for(
typename Node::Factors::const_iterator it1 = node1->factors.begin(), it2 = node2->factors.begin();
285 it1 != node1->factors.end(); ++it1, ++it2)
288 if(!(*it1)->equals(**it2,
tol))
290 }
else if((*it1 && !*it2) || (*it2 && !*it1)) {
299 for(
const sharedNode& node: node1->children) {
keys.emplace(node->key, node); }
301 for(
const Key_Node& key_node:
keys) { stack1.push(key_node.second); }
305 for(
const sharedNode& node: node2->children) {
keys.emplace(node->key, node); }
307 for(
const Key_Node& key_node:
keys) { stack2.push(key_node.second); }
312 if(!stack1.empty() || !stack2.empty())
319 template<
class BAYESNET,
class GRAPH>