+* [Frederik Eaton] Change cout to cerr in warnings and error messages
* [Giuseppe Passino] Optimised maximum-residual BP by using a reversed ordered
set instead of the linear search (which can yield enormous speedups - a factor
500 has been measured on a binary Ising grid with 128x128 variables!)
// Somehow NaNs do not often occur in BP...
double BP::run() {
if( props.verbose >= 1 )
- cout << "Starting " << identify() << "...";
+ cerr << "Starting " << identify() << "...";
if( props.verbose >= 3)
- cout << endl;
+ cerr << endl;
double tic = toc();
Diffs diffs(nrVars(), 1.0);
}
if( props.verbose >= 3 )
- cout << Name << "::run: maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
+ cerr << Name << "::run: maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
}
if( diffs.maxDiff() > _maxdiff )
if( props.verbose >= 1 ) {
if( diffs.maxDiff() > props.tol ) {
if( props.verbose == 1 )
- cout << endl;
- cout << Name << "::run: WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+ cerr << endl;
+ cerr << Name << "::run: WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
} else {
if( props.verbose >= 3 )
- cout << Name << "::run: ";
- cout << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
+ cerr << Name << "::run: ";
+ cerr << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
}
}
double ExactInf::run() {
if( props.verbose >= 1 )
- cout << "Starting " << identify() << "...";
+ cerr << "Starting " << identify() << "...";
Factor P;
for( size_t I = 0; I < nrFactors(); I++ )
_beliefsF[I] = P.marginal(factor(I).vars());
if( props.verbose >= 1 )
- cout << "finished" << endl;
+ cerr << "finished" << endl;
return 0.0;
}
if( is.fail() )
DAI_THROW(INVALID_FACTORGRAPH_FILE);
if( verbose >= 2 )
- cout << "Reading " << nr_Factors << " factors..." << endl;
+ cerr << "Reading " << nr_Factors << " factors..." << endl;
getline (is,line);
if( is.fail() )
map<long,size_t> vardims;
for( size_t I = 0; I < nr_Factors; I++ ) {
if( verbose >= 3 )
- cout << "Reading factor " << I << "..." << endl;
+ cerr << "Reading factor " << I << "..." << endl;
size_t nr_members;
while( (is.peek()) == '#' )
getline(is,line);
is >> nr_members;
if( verbose >= 3 )
- cout << " nr_members: " << nr_members << endl;
+ cerr << " nr_members: " << nr_members << endl;
vector<long> labels;
for( size_t mi = 0; mi < nr_members; mi++ ) {
labels.push_back(mi_label);
}
if( verbose >= 3 )
- cout << " labels: " << labels << endl;
+ cerr << " labels: " << labels << endl;
vector<size_t> dims;
for( size_t mi = 0; mi < nr_members; mi++ ) {
dims.push_back(mi_dim);
}
if( verbose >= 3 )
- cout << " dimensions: " << dims << endl;
+ cerr << " dimensions: " << dims << endl;
// add the Factor
VarSet I_vars;
sigma[mi] = j_loc - labels.begin();
}
if( verbose >= 3 )
- cout << " sigma: " << sigma << endl;
+ cerr << " sigma: " << sigma << endl;
// calculate multindices
Permute permindex( dims, sigma );
getline(is,line);
is >> nr_nonzeros;
if( verbose >= 3 )
- cout << " nonzeroes: " << nr_nonzeros << endl;
+ cerr << " nonzeroes: " << nr_nonzeros << endl;
for( size_t k = 0; k < nr_nonzeros; k++ ) {
size_t li;
double val;
}
if( verbose >= 3 )
- cout << "factors:" << facs << endl;
+ cerr << "factors:" << facs << endl;
fg = FactorGraph(facs);
double Gibbs::run() {
if( props.verbose >= 1 )
- cout << "Starting " << identify() << "...";
+ cerr << "Starting " << identify() << "...";
if( props.verbose >= 3 )
- cout << endl;
+ cerr << endl;
double tic = toc();
}
if( props.verbose >= 3 )
- cout << Name << "::run: ran " << props.iters << " passes (" << toc() - tic << " clocks)." << endl;
+ cerr << Name << "::run: ran " << props.iters << " passes (" << toc() - tic << " clocks)." << endl;
return 0.0;
}
for( set<VarSet>::const_iterator c = scl.begin(); c != scl.end(); c++ )
cl.push_back(*c);
if( props.verbose >= 3 ) {
- cout << Name << " uses the following clusters: " << endl;
+ cerr << Name << " uses the following clusters: " << endl;
for( vector<VarSet>::const_iterator cli = cl.begin(); cli != cl.end(); cli++ )
- cout << *cli << endl;
+ cerr << *cli << endl;
}
} else
DAI_THROW(INTERNAL_ERROR);
constructMessages();
if( props.verbose >= 3 )
- cout << Name << " regiongraph: " << *this << endl;
+ cerr << Name << " regiongraph: " << *this << endl;
}
double HAK::doGBP() {
if( props.verbose >= 1 )
- cout << "Starting " << identify() << "...";
+ cerr << "Starting " << identify() << "...";
if( props.verbose >= 3)
- cout << endl;
+ cerr << endl;
double tic = toc();
Qb_new.normalize();
if( Qb_new.hasNaNs() ) {
// TODO: WHAT TO DO IN THIS CASE?
- cout << Name << "::doGBP: Qb_new has NaNs!" << endl;
+ cerr << Name << "::doGBP: Qb_new has NaNs!" << endl;
return 1.0;
}
/* TODO: WHAT IS THE PURPOSE OF THE FOLLOWING CODE?
Qa_new ^= (1.0 / OR(alpha).c());
Qa_new.normalize();
if( Qa_new.hasNaNs() ) {
- cout << Name << "::doGBP: Qa_new has NaNs!" << endl;
+ cerr << Name << "::doGBP: Qa_new has NaNs!" << endl;
return 1.0;
}
/* TODO: WHAT IS THE PURPOSE OF THE FOLLOWING CODE?
}
if( props.verbose >= 3 )
- cout << Name << "::doGBP: maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
+ cerr << Name << "::doGBP: maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
}
if( diffs.maxDiff() > _maxdiff )
if( props.verbose >= 1 ) {
if( diffs.maxDiff() > props.tol ) {
if( props.verbose == 1 )
- cout << endl;
- cout << Name << "::doGBP: WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+ cerr << endl;
+ cerr << Name << "::doGBP: WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
} else {
if( props.verbose >= 2 )
- cout << Name << "::doGBP: ";
- cout << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
+ cerr << Name << "::doGBP: ";
+ cerr << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
}
}
double HAK::doDoubleLoop() {
if( props.verbose >= 1 )
- cout << "Starting " << identify() << "...";
+ cerr << "Starting " << identify() << "...";
if( props.verbose >= 3)
- cout << endl;
+ cerr << endl;
double tic = toc();
total_iter += Iterations();
if( props.verbose >= 3 )
- cout << Name << "::doDoubleLoop: maxdiff " << diffs.maxDiff() << " after " << total_iter << " passes" << endl;
+ cerr << Name << "::doDoubleLoop: maxdiff " << diffs.maxDiff() << " after " << total_iter << " passes" << endl;
}
// restore _maxiter, _verbose and _maxdiff
if( props.verbose >= 1 ) {
if( diffs.maxDiff() > props.tol ) {
if( props.verbose == 1 )
- cout << endl;
- cout << Name << "::doDoubleLoop: WARNING: not converged within " << outer_maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+ cerr << endl;
+ cerr << Name << "::doDoubleLoop: WARNING: not converged within " << outer_maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
} else {
if( props.verbose >= 3 )
- cout << Name << "::doDoubleLoop: ";
- cout << "converged in " << total_iter << " passes (" << toc() - tic << " seconds)." << endl;
+ cerr << Name << "::doDoubleLoop: ";
+ cerr << "converged in " << total_iter << " passes (" << toc() - tic << " seconds)." << endl;
}
}
ClusterGraph _cg( cl );
if( props.verbose >= 3 )
- cout << "Initial clusters: " << _cg << endl;
+ cerr << "Initial clusters: " << _cg << endl;
// Retain only maximal clusters
_cg.eraseNonMaximal();
if( props.verbose >= 3 )
- cout << "Maximal clusters: " << _cg << endl;
+ cerr << "Maximal clusters: " << _cg << endl;
vector<VarSet> ElimVec = _cg.VarElim_MinFill().eraseNonMaximal().toVector();
if( props.verbose >= 3 )
- cout << "VarElim_MinFill result: " << ElimVec << endl;
+ cerr << "VarElim_MinFill result: " << ElimVec << endl;
GenerateJT( ElimVec );
}
Check_Counting_Numbers();
if( props.verbose >= 3 ) {
- cout << "Resulting regiongraph: " << *this << endl;
+ cerr << "Resulting regiongraph: " << *this << endl;
}
}
double maxdiff = 0;
if( props.verbose >= 2 )
- cout << "Initing cavity " << var(i) << "(" << delta(i).size() << " vars, " << delta(i).nrStates() << " states)" << endl;
+ cerr << "Initing cavity " << var(i) << "(" << delta(i).size() << " vars, " << delta(i).nrStates() << " states)" << endl;
if( props.cavity == Properties::CavityType::UNIFORM )
Bi = Factor(delta(i));
double tic = toc();
if( props.verbose >= 1 ) {
- cout << Name << "::InitCavityDists: ";
+ cerr << Name << "::InitCavityDists: ";
if( props.cavity == Properties::CavityType::UNIFORM )
- cout << "Using uniform initial cavity distributions" << endl;
+ cerr << "Using uniform initial cavity distributions" << endl;
else if( props.cavity == Properties::CavityType::FULL )
- cout << "Using full " << name << opts << "...";
+ cerr << "Using full " << name << opts << "...";
else if( props.cavity == Properties::CavityType::PAIR )
- cout << "Using pairwise " << name << opts << "...";
+ cerr << "Using pairwise " << name << opts << "...";
else if( props.cavity == Properties::CavityType::PAIR2 )
- cout << "Using pairwise(new) " << name << opts << "...";
+ cerr << "Using pairwise(new) " << name << opts << "...";
}
double maxdiff = 0.0;
}
if( props.verbose >= 1 ) {
- cout << Name << "::InitCavityDists used " << toc() - tic << " seconds." << endl;
+ cerr << Name << "::InitCavityDists used " << toc() - tic << " seconds." << endl;
}
return maxdiff;
long LC::SetCavityDists( std::vector<Factor> &Q ) {
if( props.verbose >= 1 )
- cout << Name << "::SetCavityDists: Setting initial cavity distributions" << endl;
+ cerr << Name << "::SetCavityDists: Setting initial cavity distributions" << endl;
if( Q.size() != nrVars() )
return -1;
for( size_t i = 0; i < nrVars(); i++ ) {
piet.normalize();
if( piet.hasNaNs() ) {
- cout << Name << "::NewPancake(" << i << ", " << _I << "): has NaNs!" << endl;
+ cerr << Name << "::NewPancake(" << i << ", " << _I << "): has NaNs!" << endl;
hasNaNs = true;
}
double LC::run() {
if( props.verbose >= 1 )
- cout << "Starting " << identify() << "...";
+ cerr << "Starting " << identify() << "...";
if( props.verbose >= 2 )
- cout << endl;
+ cerr << endl;
double tic = toc();
Diffs diffs(nrVars(), 1.0);
break;
}
if( hasNaNs ) {
- cout << Name << "::run: initial _pancakes has NaNs!" << endl;
+ cerr << Name << "::run: initial _pancakes has NaNs!" << endl;
return 1.0;
}
}
if( props.verbose >= 3 )
- cout << Name << "::run: maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
+ cerr << Name << "::run: maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
}
if( diffs.maxDiff() > _maxdiff )
if( props.verbose >= 1 ) {
if( diffs.maxDiff() > props.tol ) {
if( props.verbose == 1 )
- cout << endl;
- cout << Name << "::run: WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+ cerr << endl;
+ cerr << Name << "::run: WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
} else {
if( props.verbose >= 2 )
- cout << Name << "::run: ";
- cout << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
+ cerr << Name << "::run: ";
+ cerr << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
}
}
// interpret psi, linear cell array of cptabs
for( size_t cellind = 0; cellind < nr_f; cellind++ ) {
if( verbose >= 3 )
- cout << "reading factor " << cellind << ": " << endl;
+ cerr << "reading factor " << cellind << ": " << endl;
mxArray *cell = mxGetCell(psi, cellind);
mxArray *mx_member = mxGetField(cell, 0, "Member");
size_t nr_mem = mxGetN(mx_member);
VarSet factorvars;
vector<long> labels(nr_mem,0);
if( verbose >= 3 )
- cout << " vars: ";
+ cerr << " vars: ";
for( size_t mi = 0; mi < nr_mem; mi++ ) {
labels[mi] = (long)members[mi];
if( verbose >= 3 )
- cout << labels[mi] << "(" << dims[mi] << ") ";
+ cerr << labels[mi] << "(" << dims[mi] << ") ";
vars.insert( Var(labels[mi], dims[mi]) );
factorvars |= Var(labels[mi], dims[mi]);
}
}
if( verbose >= 3 ) {
- cout << endl << " perm: ";
+ cerr << endl << " perm: ";
for( vector<size_t>::iterator r=perm.begin(); r!=perm.end(); r++ )
- cout << *r << " ";
- cout << endl;
+ cerr << *r << " ";
+ cerr << endl;
}
// read Factor
if( verbose >= 3 ) {
for(vector<Factor>::const_iterator I=factors.begin(); I!=factors.end(); I++ )
- cout << *I << endl;
+ cerr << *I << endl;
}
return( factors );
double tic = toc();
if( props.verbose >= 1 )
- cout << "Starting " << identify() << "...";
+ cerr << "Starting " << identify() << "...";
size_t pass_size = _beliefs.size();
Diffs diffs(pass_size * 3, 1.0);
jan.normalize();
if( jan.hasNaNs() ) {
- cout << Name << "::run(): ERROR: jan has NaNs!" << endl;
+ cerr << Name << "::run(): ERROR: jan has NaNs!" << endl;
return 1.0;
}
if( props.verbose >= 1 ) {
if( diffs.maxDiff() > props.tol ) {
if( props.verbose == 1 )
- cout << endl;
- cout << Name << "::run: WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+ cerr << endl;
+ cerr << Name << "::run: WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
} else {
if( props.verbose >= 2 )
- cout << Name << "::run: ";
- cout << "converged in " << t / pass_size << " passes (" << toc() - tic << " seconds)." << endl;
+ cerr << Name << "::run: ";
+ cerr << "converged in " << t / pass_size << " passes (" << toc() - tic << " seconds)." << endl;
}
}
} while((md > props.tol)&&(runx<runs)); // Precision condition reached -> BP and RP finished
if(runx==runs)
if( props.verbose >= 2 )
- cout << "init_cor_resp: Convergence not reached (md=" << md << ")..." << endl;
+ cerr << "init_cor_resp: Convergence not reached (md=" << md << ")..." << endl;
if(md > maxdev)
maxdev = md;
if(run==maxruns){
if( props.verbose >= 1 )
- cout << "solve_mcav: Convergence not reached (maxdev=" << maxdev << ")..." << endl;
+ cerr << "solve_mcav: Convergence not reached (maxdev=" << maxdev << ")..." << endl;
}
}
double MR::run() {
if( supported ) {
if( props.verbose >= 1 )
- cout << "Starting " << identify() << "...";
+ cerr << "Starting " << identify() << "...";
double tic = toc();
// Diffs diffs(nrVars(), 1.0);
solveM();
if( props.verbose >= 1 )
- cout << Name << " needed " << toc() - tic << " seconds." << endl;
+ cerr << Name << " needed " << toc() - tic << " seconds." << endl;
return 0.0;
} else
c_n += IR(beta).c();
if( fabs(c_n - 1.0) > 1e-15 ) {
all_valid = false;
- cout << "WARNING: counting numbers do not satisfy relation for " << *n << "(c_n = " << c_n << ")." << endl;
+ cerr << "WARNING: counting numbers do not satisfy relation for " << *n << "(c_n = " << c_n << ")." << endl;
}
}
/*size_t subTreeSize =*/ findEfficientTree( factor(I).vars(), subTree, PreviousRoot );
PreviousRoot = subTree[0].n1;
//subTree.resize( subTreeSize ); // FIXME
-// cout << "subtree " << I << " has size " << subTreeSize << endl;
+// cerr << "subtree " << I << " has size " << subTreeSize << endl;
TreeEPSubTree QI( subTree, RTree, Qa, Qb, &factor(I) );
_Q[I] = QI;
/*size_t subTreeSize =*/ findEfficientTree( factor(I).vars(), subTree, PreviousRoot );
PreviousRoot = subTree[0].n1;
//subTree.resize( subTreeSize ); // FIXME
-// cout << "subtree " << I << " has size " << subTreeSize << endl;
+// cerr << "subtree " << I << " has size " << subTreeSize << endl;
TreeEPSubTree QI( subTree, RTree, Qa, Qb, &factor(I) );
_Q[I] = QI;
}
if( props.verbose >= 3 ) {
- cout << "Resulting regiongraph: " << *this << endl;
+ cerr << "Resulting regiongraph: " << *this << endl;
}
}
double TreeEP::run() {
if( props.verbose >= 1 )
- cout << "Starting " << identify() << "...";
+ cerr << "Starting " << identify() << "...";
if( props.verbose >= 3)
- cout << endl;
+ cerr << endl;
double tic = toc();
Diffs diffs(nrVars(), 1.0);
}
if( props.verbose >= 3 )
- cout << Name << "::run: maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
+ cerr << Name << "::run: maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
}
if( diffs.maxDiff() > _maxdiff )
if( props.verbose >= 1 ) {
if( diffs.maxDiff() > props.tol ) {
if( props.verbose == 1 )
- cout << endl;
- cout << Name << "::run: WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+ cerr << endl;
+ cerr << Name << "::run: WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
} else {
if( props.verbose >= 3 )
- cout << Name << "::run: ";
- cout << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
+ cerr << Name << "::run: ";
+ cerr << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
}
}