Avoid creating duplicate symbolic factors in JunctionTree constructor (small optimization)

release/4.3a0
Richard Roberts 2013-11-18 19:23:27 +00:00
parent 701bb0054d
commit 1f5f86f6e8
2 changed files with 8 additions and 10 deletions

View File

@ -23,7 +23,7 @@
#include <gtsam/inference/JunctionTree.h> #include <gtsam/inference/JunctionTree.h>
#include <gtsam/inference/ClusterTree-inst.h> #include <gtsam/inference/ClusterTree-inst.h>
#include <gtsam/symbolic/SymbolicConditional.h> #include <gtsam/symbolic/SymbolicConditional.h>
#include <gtsam/symbolic/SymbolicFactorGraph.h> #include <gtsam/symbolic/SymbolicFactor-inst.h>
namespace gtsam { namespace gtsam {
@ -130,18 +130,16 @@ namespace gtsam {
// current node did not introduce any parents beyond those already in the child. // current node did not introduce any parents beyond those already in the child.
// Do symbolic elimination for this node // Do symbolic elimination for this node
SymbolicFactorGraph symbolicFactors; class : public FactorGraph<Factor> {} symbolicFactors;
symbolicFactors.reserve(ETreeNode->factors.size() + myData.childSymbolicFactors.size()); symbolicFactors.reserve(ETreeNode->factors.size() + myData.childSymbolicFactors.size());
// Add symbolic versions of the ETree node factors // Add ETree node factors
BOOST_FOREACH(const typename GRAPH::sharedFactor& factor, ETreeNode->factors) { symbolicFactors += ETreeNode->factors;
symbolicFactors.push_back(boost::make_shared<SymbolicFactor>(
SymbolicFactor::FromKeys(*factor)));
}
// Add symbolic factors passed up from children // Add symbolic factors passed up from children
symbolicFactors.push_back(myData.childSymbolicFactors.begin(), myData.childSymbolicFactors.end()); symbolicFactors += myData.childSymbolicFactors;
Ordering keyAsOrdering; keyAsOrdering.push_back(ETreeNode->key); Ordering keyAsOrdering; keyAsOrdering.push_back(ETreeNode->key);
std::pair<SymbolicConditional::shared_ptr, SymbolicFactor::shared_ptr> symbolicElimResult = std::pair<SymbolicConditional::shared_ptr, SymbolicFactor::shared_ptr> symbolicElimResult =
EliminateSymbolic(symbolicFactors, keyAsOrdering); internal::EliminateSymbolic(symbolicFactors, keyAsOrdering);
// Store symbolic elimination results in the parent // Store symbolic elimination results in the parent
myData.parentData->childSymbolicConditionals.push_back(symbolicElimResult.first); myData.parentData->childSymbolicConditionals.push_back(symbolicElimResult.first);

View File

@ -59,7 +59,7 @@ namespace gtsam
std::set_difference(allKeys.begin(), allKeys.end(), frontals.begin(), frontals.end(), orderedKeys.begin() + nFrontals); std::set_difference(allKeys.begin(), allKeys.end(), frontals.begin(), frontals.end(), orderedKeys.begin() + nFrontals);
// Return resulting conditional and factor // Return resulting conditional and factor
return make_pair( return std::make_pair(
boost::make_shared<SymbolicConditional>( boost::make_shared<SymbolicConditional>(
SymbolicConditional::FromKeys(orderedKeys, nFrontals)), SymbolicConditional::FromKeys(orderedKeys, nFrontals)),
boost::make_shared<SymbolicFactor>( boost::make_shared<SymbolicFactor>(