26 template<
class DERIVED,
class FACTORGRAPH>
30 conditional_ = eliminationResult.first;
34 template<
class DERIVED,
class FACTORGRAPH>
36 const DERIVED&
other,
double tol)
const 38 return (!conditional_ && !other.conditional())
39 || conditional_->equals(*other.conditional(),
tol);
43 template<
class DERIVED,
class FACTORGRAPH>
47 KeySet p_F_S_parents(this->conditional()->beginParents(), this->conditional()->endParents());
48 KeySet indicesB(B->conditional()->begin(), B->conditional()->end());
50 std::set_difference(p_F_S_parents.begin(), p_F_S_parents.end(),
51 indicesB.begin(), indicesB.end(), back_inserter(S_setminus_B));
56 template<
class DERIVED,
class FACTORGRAPH>
60 gttic(shortcut_indices);
62 KeySet indicesB(B->conditional()->begin(), B->conditional()->end());
63 KeyVector S_setminus_B = separator_setminus_B(B);
66 std::set_intersection(S_setminus_B.begin(), S_setminus_B.end(),
67 allKeys.begin(), allKeys.end(), back_inserter(keep));
69 std::set_intersection(indicesB.begin(), indicesB.end(),
70 allKeys.begin(), allKeys.end(), back_inserter(keep));
75 template<
class DERIVED,
class FACTORGRAPH>
79 conditional_->print(s, keyFormatter);
83 template<
class DERIVED,
class FACTORGRAPH>
87 size += child->treeSize();
92 template<
class DERIVED,
class FACTORGRAPH>
95 std::lock_guard<std::mutex> marginalLock(cachedSeparatorMarginalMutex_);
96 if (!cachedSeparatorMarginal_)
99 size_t subtree_count = 1;
101 subtree_count += child->numCachedSeparatorMarginals();
103 return subtree_count;
111 template<
class DERIVED,
class FACTORGRAPH>
115 gttic(BayesTreeCliqueBase_shortcut);
118 KeyVector S_setminus_B = separator_setminus_B(B);
119 if (!parent_.expired() && !S_setminus_B.empty())
123 gttoc(BayesTreeCliqueBase_shortcut);
125 gttic(BayesTreeCliqueBase_shortcut);
126 p_Cp_B.push_back(parent->conditional_);
129 KeyVector keep = shortcut_indices(B, p_Cp_B);
132 std::shared_ptr<FactorGraphType> p_S_B = p_Cp_B.marginal(keep,
function);
133 return *p_S_B->eliminatePartialSequential(S_setminus_B,
function).first;
145 template <
class DERIVED,
class FACTORGRAPH>
149 std::lock_guard<std::mutex> marginalLock(cachedSeparatorMarginalMutex_);
150 gttic(BayesTreeCliqueBase_separatorMarginal);
152 if (!cachedSeparatorMarginal_) {
153 gttic(BayesTreeCliqueBase_separatorMarginal_cachemiss);
156 if (parent_.expired() ) {
159 cachedSeparatorMarginal_ = empty;
162 gttoc(BayesTreeCliqueBase_separatorMarginal_cachemiss);
163 gttoc(BayesTreeCliqueBase_separatorMarginal);
170 gttic(BayesTreeCliqueBase_separatorMarginal);
171 gttic(BayesTreeCliqueBase_separatorMarginal_cachemiss);
174 p_Cp.push_back(parent->conditional_);
177 KeyVector indicesS(this->conditional()->beginParents(),
178 this->conditional()->endParents());
179 auto separatorMarginal =
180 p_Cp.marginalMultifrontalBayesNet(
Ordering(indicesS),
function);
181 cachedSeparatorMarginal_ = *separatorMarginal;
186 return *cachedSeparatorMarginal_;
193 template <
class DERIVED,
class FACTORGRAPH>
197 gttic(BayesTreeCliqueBase_marginal2);
201 p_C.
push_back(std::shared_ptr<FactorType>(this->conditional_));
206 template<
class DERIVED,
class FACTORGRAPH>
213 std::lock_guard<std::mutex> marginalLock(cachedSeparatorMarginalMutex_);
214 if (cachedSeparatorMarginal_) {
216 child->deleteCachedShortcuts();
220 cachedSeparatorMarginal_ = {};
FACTORGRAPH FactorGraphType
FactorGraphType::Eliminate Eliminate
IsDerived< DERIVEDFACTOR > push_back(std::shared_ptr< DERIVEDFACTOR > factor)
Add a factor directly using a shared_ptr.
EliminationTraitsType::BayesNetType BayesNetType
bool equals(const DERIVED &other, double tol=1e-9) const
std::shared_ptr< DerivedType > derived_ptr
void setEliminationResult(const typename FactorGraphType::EliminationResult &eliminationResult)
virtual void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const
size_t numCachedSeparatorMarginals() const
std::pair< std::shared_ptr< ConditionalType >, std::shared_ptr< _FactorType > > EliminationResult
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
BayesNetType shortcut(const derived_ptr &root, Eliminate function=EliminationTraitsType::DefaultEliminate) const
void deleteCachedShortcuts()
FactorGraphType separatorMarginal(Eliminate function=EliminationTraitsType::DefaultEliminate) const
FactorGraphType marginal2(Eliminate function=EliminationTraitsType::DefaultEliminate) const
KeyVector shortcut_indices(const derived_ptr &B, const FactorGraphType &p_Cp_B) const
KeyVector separator_setminus_B(const derived_ptr &B) const
Calculate set for shortcut calculations.
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Base class for cliques of a BayesTree.