+ ClusterGraph VarElim_MinFill() const {
+ return VarElim( eliminationChoice_MinFill );
+ }
+
+ /// Performs Variable Elimination, only keeping track of the interactions that are created along the way.
+ /** \tparam EliminationChoice should support "size_t operator()( const ClusterGraph &cl, const std::set<size_t> &remainingVars )"
+ * \param f function object which returns the next variable index to eliminate; for example, eliminationChoice_MinFill()
+ * \return A set of elimination "cliques"
+ */
+ template<class EliminationChoice>
+ ClusterGraph VarElim( EliminationChoice &f ) const {
+ // Make a copy
+ ClusterGraph cl(*this);
+ cl.eraseNonMaximal();
+
+ ClusterGraph result;
+
+ // Construct set of variable indices
+ std::set<size_t> varindices;
+ for( size_t i = 0; i < vars.size(); ++i )
+ varindices.insert( i );
+
+ // Do variable elimination
+ while( !varindices.empty() ) {
+ size_t i = f( cl, varindices );
+ result.insert( cl.Delta( i ) );
+ cl.insert( cl.delta( i ) );
+ cl.eraseSubsuming( i );
+ cl.eraseNonMaximal();
+ varindices.erase( i );
+ }
+
+ return result;
+ }