void MF::setProperties( const PropertySet &opts ) {
assert( opts.hasKey("tol") );
assert( opts.hasKey("maxiter") );
- assert( opts.hasKey("verbose") );
props.tol = opts.getStringAs<double>("tol");
props.maxiter = opts.getStringAs<size_t>("maxiter");
- props.verbose = opts.getStringAs<size_t>("verbose");
+ if( opts.hasKey("verbose") )
+ props.verbose = opts.getStringAs<size_t>("verbose");
+ else
+ props.verbose = 0U;
+ if( opts.hasKey("damping") )
+ props.damping = opts.getStringAs<double>("damping");
+ else
+ props.damping = 0.0;
}
opts.Set( "tol", props.tol );
opts.Set( "maxiter", props.maxiter );
opts.Set( "verbose", props.verbose );
+ opts.Set( "damping", props.damping );
return opts;
}
s << "[";
s << "tol=" << props.tol << ",";
s << "maxiter=" << props.maxiter << ",";
- s << "verbose=" << props.verbose << "]";
+ s << "verbose=" << props.verbose << ",";
+ s << "damping=" << props.damping << "]";
return s.str();
}
-void MF::create() {
- // clear beliefs
+void MF::construct() {
+ // create beliefs
_beliefs.clear();
_beliefs.reserve( nrVars() );
-
- // create beliefs
for( size_t i = 0; i < nrVars(); ++i )
- _beliefs.push_back(Factor(var(i)));
+ _beliefs.push_back( Factor( var(i) ) );
}
jan *= piet;
}
- jan.normalize( Prob::NORMPROB );
+ jan.normalize();
if( jan.hasNaNs() ) {
cout << "MF::run(): ERROR: jan has NaNs!" << endl;
return 1.0;
}
+ if( props.damping != 0.0 )
+ jan = (jan^(1.0 - props.damping)) * (_beliefs[i]^props.damping);
diffs.push( dist( jan, _beliefs[i], Prob::DISTLINF ) );
_beliefs[i] = jan;
}
- if( diffs.maxDiff() > maxdiff )
- maxdiff = diffs.maxDiff();
+ _iters = t / pass_size;
+ if( diffs.maxDiff() > _maxdiff )
+ _maxdiff = diffs.maxDiff();
if( props.verbose >= 1 ) {
if( diffs.maxDiff() > props.tol ) {
}
-Factor MF::beliefV (size_t i) const {
+Factor MF::beliefV( size_t i ) const {
Factor piet;
piet = _beliefs[i];
- piet.normalize( Prob::NORMPROB );
+ piet.normalize();
return(piet);
}
Factor henk;
foreach( const Neighbor &j, nbF(I) ) // for all j in I
henk *= _beliefs[j];
- henk.normalize( Prob::NORMPROB );
+ henk.normalize();
Factor piet;
piet = factor(I).log0();
piet *= henk;