Small misc changes
authorJoris Mooij <jorism@marvin.jorismooij.nl>
Mon, 8 Sep 2008 16:49:46 +0000 (18:49 +0200)
committerJoris Mooij <jorism@marvin.jorismooij.nl>
Mon, 8 Sep 2008 16:49:46 +0000 (18:49 +0200)
- Renamed VarSet::stateSpace() -> VarSet::states()
- Renamed *::Regenerate() -> *::create()
- Optimized Diffs (merged version from SVN head)

15 files changed:
Makefile
include/dai/bp.h
include/dai/diffs.h
include/dai/factor.h
include/dai/mf.h
include/dai/varset.h
matlab/matlab.cpp
src/bp.cpp
src/factorgraph.cpp
src/hak.cpp
src/jtree.cpp
src/lc.cpp
src/mf.cpp
utils/createfg.cpp
utils/fginfo.cpp

index a3e5c35..b87d177 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -176,8 +176,8 @@ x2x.o : $(SRC)/x2x.cpp $(HEADERS)
 # EXAMPLE
 ##########
 
-example : $(SRC)/example.cpp $(HEADERS) $(LIB)/libdai.a
-       $(CC) $(CCFLAGS) -o example $(SRC)/example.cpp -ldai
+example : example.cpp $(HEADERS) $(LIB)/libdai.a
+       $(CC) $(CCFLAGS) -o example example.cpp -ldai
 
 # TESTS
 ########
index 7ec76f0..b2d78a4 100644 (file)
@@ -56,7 +56,7 @@ class BP : public DAIAlgFG {
         // construct BP object from FactorGraph
         BP(const FactorGraph & fg, const Properties &opts) : DAIAlgFG(fg, opts) {
             assert( checkProperties() );
-            Regenerate();
+            create();
         }
         // assignment operator
         BP & operator=(const BP & x) {
@@ -80,7 +80,7 @@ class BP : public DAIAlgFG {
         void findMaxResidual( size_t &i, size_t &_I );
 
         std::string identify() const;
-        void Regenerate();
+        void create();
         void init();
         void calcNewMessage( size_t i, size_t _I );
         double run();
index bf0657a..a34f435 100644 (file)
@@ -51,7 +51,14 @@ class Diffs : public std::vector<double> {
             if( size() < _maxsize ) {
                 push_back(x);
                 _pos = end();
-                _maxpos = max_element(begin(),end());
+                if( size() > 1 ) {
+                    if( *_maxpos < back() ) {
+                        _maxpos = end();
+                        _maxpos--;
+                    }
+                } else {
+                    _maxpos = begin();
+                }
             }
             else {
                 if( _pos == end() )
@@ -66,6 +73,7 @@ class Diffs : public std::vector<double> {
                 }
             }
         }
+        size_t max_size() { return _maxsize; }
 };
 
 
index 5f13988..d1fea49 100644 (file)
@@ -55,18 +55,18 @@ template <typename T> class TFactor {
         TFactor () : _vs(), _p(1,1.0) {}
         
         // Construct Factor from VarSet
-        TFactor( const VarSet& ns ) : _vs(ns), _p(_vs.stateSpace()) {}
+        TFactor( const VarSet& ns ) : _vs(ns), _p(_vs.states()) {}
         
         // Construct Factor from VarSet and initial value
-        TFactor( const VarSet& ns, Real p ) : _vs(ns), _p(_vs.stateSpace(),p) {}
+        TFactor( const VarSet& ns, Real p ) : _vs(ns), _p(_vs.states(),p) {}
         
         // Construct Factor from VarSet and initial array
-        TFactor( const VarSet& ns, const Real* p ) : _vs(ns), _p(_vs.stateSpace(),p) {}
+        TFactor( const VarSet& ns, const Real* p ) : _vs(ns), _p(_vs.states(),p) {}
 
         // Construct Factor from VarSet and TProb<T>
         TFactor( const VarSet& ns, const TProb<T> p ) : _vs(ns), _p(p) {
 #ifdef DAI_DEBUG
-            assert( _vs.stateSpace() == _p.size() );
+            assert( _vs.states() == _p.size() );
 #endif
         }
         
@@ -88,9 +88,9 @@ template <typename T> class TFactor {
         const TProb<T> & p() const { return _p; }
         TProb<T> & p() { return _p; }
         const VarSet & vars() const { return _vs; }
-        size_t stateSpace() const { 
+        size_t states() const { 
 #ifdef DAI_DEBUG
-            assert( _vs.stateSpace() == _p.size() );
+            assert( _vs.states() == _p.size() );
 #endif
             return _p.size();
         }
@@ -229,7 +229,7 @@ template <typename T> class TFactor {
             // OPTIMIZE ME
             Index i_ns (ns, _vs);
             Index i_nsrem (nsrem, _vs);
-            for( size_t i = 0; i < stateSpace(); i++, ++i_ns, ++i_nsrem )
+            for( size_t i = 0; i < states(); i++, ++i_ns, ++i_nsrem )
                 if( (size_t)i_ns == ns_state )
                     result._p[i_nsrem] = _p[i];
 
index 29aa907..7f35546 100644 (file)
@@ -44,7 +44,7 @@ class MF : public DAIAlgFG {
         // construct MF object from FactorGraph
         MF(const FactorGraph & fg, const Properties &opts) : DAIAlgFG(fg, opts) {
             assert( checkProperties() );
-            Regenerate();
+            create();
         }
         // assignment operator
         MF & operator=(const MF & x) {
@@ -57,7 +57,7 @@ class MF : public DAIAlgFG {
 
         static const char *Name;
         std::string identify() const;
-        void Regenerate();
+        void create();
         void init();
         double run();
         Factor beliefV (size_t i) const;
index d60d4dd..d13a2bc 100644 (file)
@@ -91,7 +91,7 @@ class VarSet : private std::set<Var> {
         
 
         /// Return statespace, i.e. the product of the number of states of each variable
-        size_t stateSpace() const { 
+        size_t states() const { 
 #ifdef DAI_DEBUG
             size_t x = 1;
             for( const_iterator i = begin(); i != end(); ++i )
index 6fc3415..1e7ee2a 100644 (file)
@@ -49,10 +49,10 @@ mxArray *Factors2mx(const vector<Factor> &Ps) {
             dims.push_back( j->states() );
         }
 
-        //      mxArray *BiP = mxCreateDoubleMatrix(I->stateSpace(),1,mxREAL);
+        //      mxArray *BiP = mxCreateDoubleMatrix(I->states(),1,mxREAL);
         mxArray *BiP = mxCreateNumericArray(I->vars().size(), &(*(dims.begin())), mxDOUBLE_CLASS, mxREAL);
         double *BiP_data = mxGetPr(BiP);
-        for( size_t j = 0; j < I->stateSpace(); j++ )
+        for( size_t j = 0; j < I->states(); j++ )
             BiP_data[j] = (*I)[j];
 
         mxSetField(Bi,0,"Member",BiMember);
index 0d65992..ce27640 100644 (file)
@@ -58,7 +58,7 @@ bool BP::checkProperties() {
 }
 
 
-void BP::Regenerate() {
+void BP::create() {
     // create edge properties
     edges.clear();
     edges.reserve( nrVars() );
@@ -70,7 +70,7 @@ void BP::Regenerate() {
             newEP.message = Prob( var(i).states() );
             newEP.newMessage = Prob( var(i).states() );
 
-            newEP.index.reserve( factor(I).stateSpace() );
+            newEP.index.reserve( factor(I).states() );
             for( Index k( var(i), factor(I).vars() ); k >= 0; ++k )
                 newEP.index.push_back( k );
 
index 1d5f1a2..0b65e58 100644 (file)
@@ -95,11 +95,11 @@ ostream& operator << (ostream& os, const FactorGraph& fg) {
             os << i->states() << " ";
         os << endl;
         size_t nr_nonzeros = 0;
-        for( size_t k = 0; k < fg.factor(I).stateSpace(); k++ )
+        for( size_t k = 0; k < fg.factor(I).states(); k++ )
             if( fg.factor(I)[k] != 0.0 )
                 nr_nonzeros++;
         os << nr_nonzeros << endl;
-        for( size_t k = 0; k < fg.factor(I).stateSpace(); k++ )
+        for( size_t k = 0; k < fg.factor(I).states(); k++ )
             if( fg.factor(I)[k] != 0.0 ) {
                 char buf[20];
                 sprintf(buf,"%18.14g", fg.factor(I)[k]);
@@ -413,45 +413,7 @@ vector<VarSet> FactorGraph::Cliques() const {
 void FactorGraph::clamp( const Var & n, size_t i ) {
     assert( i <= n.states() );
 
-/*  if( do_surgery ) {
-        size_t ni = find( vars().begin(), vars().end(), n) - vars().begin();
-
-        if( ni != nrVars() ) {
-            for( _nb_cit I = nb1(ni).begin(); I != nb1(ni).end(); I++ ) {
-                if( factor(*I).size() == 1 )
-                    // Remove this single-variable factor
-    //              I = (_V2.erase(I))--;
-                    _E12.erase( _E12.begin() + VV2E(ni, *I) );
-                else {
-                    // Replace it by the slice
-                    Index ind_I_min_n( factor(*I), factor(*I) / n );
-                    Index ind_n( factor(*I), n );
-                    Factor slice_I( factor(*I) / n );
-                    for( size_t ind_I = 0; ind_I < factor(*I).stateSpace(); ++ind_I, ++ind_I_min_n, ++ind_n )
-                        if( ind_n == i )
-                            slice_I[ind_I_min_n] = factor(*I)[ind_I];
-                    factor(*I) = slice_I;
-
-                    // Remove the edge between n and I
-                    _E12.erase( _E12.begin() + VV2E(ni, *I) );
-                }
-            }
-
-            Regenerate();
-            
-            // remove all unconnected factors
-            for( size_t I = 0; I < nrFactors(); I++ )
-                if( nb2(I).size() == 0 )
-                    DeleteFactor(I--);
-
-            DeleteVar( ni );
-
-            // FIXME
-        }
-    } */
-
-    // The cheap solution (at least in terms of coding time) is to multiply every factor
-    // that contains the variable with a delta function
+    // Multiply each factor that contains the variable with a delta function
 
     Factor delta_n_i(n,0.0);
     delta_n_i[i] = 1.0;
index aaa673b..cff1e41 100644 (file)
@@ -157,15 +157,15 @@ string HAK::identify() const {
 void HAK::init( const VarSet &ns ) {
     for( vector<Factor>::iterator alpha = _Qa.begin(); alpha != _Qa.end(); alpha++ )
         if( alpha->vars() && ns )
-            alpha->fill( 1.0 / alpha->stateSpace() );
+            alpha->fill( 1.0 / alpha->states() );
 
     for( size_t beta = 0; beta < nrIRs(); beta++ )
         if( IR(beta) && ns ) {
-            _Qb[beta].fill( 1.0 / IR(beta).stateSpace() );
+            _Qb[beta].fill( 1.0 );
             foreach( const Neighbor &alpha, nbIR(beta) ) {
                 size_t _beta = alpha.dual;
-                muab( alpha, _beta ).fill( 1.0 / IR(beta).stateSpace() );
-                muba( alpha, _beta ).fill( 1.0 / IR(beta).stateSpace() );
+                muab( alpha, _beta ).fill( 1.0 / IR(beta).states() );
+                muba( alpha, _beta ).fill( 1.0 / IR(beta).states() );
             }
         }
 }
@@ -175,16 +175,16 @@ void HAK::init() {
     assert( checkProperties() );
 
     for( vector<Factor>::iterator alpha = _Qa.begin(); alpha != _Qa.end(); alpha++ )
-        alpha->fill( 1.0 / alpha->stateSpace() );
+        alpha->fill( 1.0 / alpha->states() );
 
     for( vector<Factor>::iterator beta = _Qb.begin(); beta != _Qb.end(); beta++ )
-        beta->fill( 1.0 / beta->stateSpace() );
+        beta->fill( 1.0 / beta->states() );
 
     for( size_t alpha = 0; alpha < nrORs(); alpha++ )
         foreach( const Neighbor &beta, nbOR(alpha) ) {
             size_t _beta = beta.iter;
-            muab( alpha, _beta ).fill( 1.0 / muab( alpha, _beta ).stateSpace() );
-            muba( alpha, _beta ).fill( 1.0 / muab( alpha, _beta ).stateSpace() );
+            muab( alpha, _beta ).fill( 1.0 / muab( alpha, _beta ).states() );
+            muba( alpha, _beta ).fill( 1.0 / muab( alpha, _beta ).states() );
         }
 }
 
index 7fb6d4b..774c12f 100644 (file)
@@ -315,7 +315,7 @@ size_t JTree::findEfficientTree( const VarSet& ns, DEdgeVec &Tree, size_t Previo
     // find new root clique (the one with maximal statespace overlap with ns)
     size_t maxval = 0, maxalpha = 0;
     for( size_t alpha = 0; alpha < nrORs(); alpha++ ) {
-        size_t val = (ns & OR(alpha).vars()).stateSpace();
+        size_t val = (ns & OR(alpha).vars()).states();
         if( val > maxval ) {
             maxval = val;
             maxalpha = alpha;
index 2748550..ff5fed5 100644 (file)
@@ -110,7 +110,7 @@ double LC::CalcCavityDist (size_t i, const string &name, const Properties &opts)
     double maxdiff = 0;
 
     if( Verbose() >= 2 )
-        cout << "Initing cavity " << var(i) << "(" << delta(i).size() << " vars, " << delta(i).stateSpace() << " states)" << endl;
+        cout << "Initing cavity " << var(i) << "(" << delta(i).size() << " vars, " << delta(i).states() << " states)" << endl;
 
     if( Cavity() == CavityType::UNIFORM )
         Bi = Factor(delta(i));
index 7fe6958..5f59803 100644 (file)
@@ -53,9 +53,7 @@ bool MF::checkProperties() {
 }
 
 
-void MF::Regenerate() {
-//    DAIAlgFG::Regenerate();
-
+void MF::create() {
     // clear beliefs
     _beliefs.clear();
     _beliefs.reserve( nrVars() );
index ff29c84..e5f78f4 100644 (file)
@@ -52,7 +52,7 @@ void MakeHOIFG( size_t N, size_t M, size_t k, double sigma, FactorGraph &fg ) {
                        } while( 1 );
                }
                Factor newfac(vars);
-               for( size_t t = 0; t < newfac.stateSpace(); t++ )
+               for( size_t t = 0; t < newfac.states(); t++ )
                        newfac[t] = exp(rnd_stdnormal() * sigma);
                factors.push_back(newfac);
        }
index e957abd..5498b3c 100644 (file)
@@ -52,10 +52,10 @@ int main( int argc, char *argv[] ) {
             size_t max_Delta_size = 0;
             for( size_t i = 0; i < fg.nrVars(); i++ ) {
                 VarSet di = fg.delta(i);
-                size_t Ds = fg.Delta(i).stateSpace();
+                size_t Ds = fg.Delta(i).states();
                 if( Ds > max_Delta_size )
                     max_Delta_size = Ds;
-                cavsum_lcbp += di.stateSpace();
+                cavsum_lcbp += di.states();
                 for( VarSet::const_iterator j = di.begin(); j != di.end(); j++ )
                     cavsum_lcbp2 += j->states();
             }