+ setFactors( facs );
+}
+
+
+void FactorGraph::restoreFactors() {
+ setFactors( _backupFactors );
+ _backupFactors.clear();
+}
+
+void FactorGraph::backupFactors( const std::set<size_t> & facs ) {
+ for( std::set<size_t>::const_iterator fac = facs.begin(); fac != facs.end(); fac++ )
+ backupFactor( *fac );
+}
+
+
+bool FactorGraph::isPairwise() const {
+ bool pairwise = true;
+ for( size_t I = 0; I < nrFactors() && pairwise; I++ )
+ if( factor(I).vars().size() > 2 )
+ pairwise = false;
+ return pairwise;
+}
+
+
+bool FactorGraph::isBinary() const {
+ bool binary = true;
+ for( size_t i = 0; i < nrVars() && binary; i++ )
+ if( var(i).states() > 2 )
+ binary = false;
+ return binary;
+}
+
+
+FactorGraph FactorGraph::clamped( const Var & v_i, size_t state ) const {
+ Real zeroth_order = 1.0;
+ vector<Factor> clamped_facs;
+ for( size_t I = 0; I < nrFactors(); I++ ) {
+ VarSet v_I = factor(I).vars();
+ Factor new_factor;
+ if( v_I.intersects( v_i ) )
+ new_factor = factor(I).slice( v_i, state );
+ else
+ new_factor = factor(I);
+
+ if( new_factor.vars().size() != 0 ) {
+ size_t J = 0;
+ // if it can be merged with a previous one, do that
+ for( J = 0; J < clamped_facs.size(); J++ )
+ if( clamped_facs[J].vars() == new_factor.vars() ) {
+ clamped_facs[J] *= new_factor;
+ break;
+ }
+ // otherwise, push it back
+ if( J == clamped_facs.size() || clamped_facs.size() == 0 )
+ clamped_facs.push_back( new_factor );
+ } else
+ zeroth_order *= new_factor[0];
+ }
+ *(clamped_facs.begin()) *= zeroth_order;
+ return FactorGraph( clamped_facs );
+}
+
+
+FactorGraph FactorGraph::maximalFactors() const {
+ vector<size_t> maxfac( nrFactors() );
+ map<size_t,size_t> newindex;
+ size_t nrmax = 0;
+ for( size_t I = 0; I < nrFactors(); I++ ) {
+ maxfac[I] = I;
+ VarSet maxfacvars = factor(maxfac[I]).vars();
+ for( size_t J = 0; J < nrFactors(); J++ ) {
+ VarSet Jvars = factor(J).vars();
+ if( Jvars >> maxfacvars && (Jvars != maxfacvars) ) {
+ maxfac[I] = J;
+ maxfacvars = factor(maxfac[I]).vars();
+ }
+ }
+ if( maxfac[I] == I )
+ newindex[I] = nrmax++;
+ }
+
+ vector<Factor> facs( nrmax );
+ for( size_t I = 0; I < nrFactors(); I++ )
+ facs[newindex[maxfac[I]]] *= factor(I);
+
+ return FactorGraph( facs.begin(), facs.end(), vars().begin(), vars().end(), facs.size(), nrVars() );