192 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			192 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#include <sstream>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "Variable.h"
							 | 
						||
| 
								 | 
							
								#include "Shared.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace SolverOptions {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool runBayesBall         = false;
							 | 
						||
| 
								 | 
							
								bool convertBn2Fg         = true;
							 | 
						||
| 
								 | 
							
								bool compressFactorGraph  = true;
							 | 
						||
| 
								 | 
							
								Schedule schedule = S_SEQ_FIXED;
							 | 
						||
| 
								 | 
							
								//Schedule schedule = S_SEQ_RANDOM;
							 | 
						||
| 
								 | 
							
								//Schedule schedule = S_PARALLEL;
							 | 
						||
| 
								 | 
							
								//Schedule schedule = S_MAX_RESIDUAL;
							 | 
						||
| 
								 | 
							
								double accuracy  = 0.0001;
							 | 
						||
| 
								 | 
							
								unsigned maxIter = 1000; //FIXME
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								unsigned Statistics::numCreatedNets      = 0;
							 | 
						||
| 
								 | 
							
								unsigned Statistics::numSolvedPolyTrees  = 0;
							 | 
						||
| 
								 | 
							
								unsigned Statistics::numSolvedLoopyNets  = 0;
							 | 
						||
| 
								 | 
							
								unsigned Statistics::numUnconvergedRuns  = 0;
							 | 
						||
| 
								 | 
							
								unsigned Statistics::maxIterations       = 0;
							 | 
						||
| 
								 | 
							
								unsigned Statistics::totalOfIterations   = 0;
							 | 
						||
| 
								 | 
							
								vector<CompressInfo> Statistics::compressInfo_;
							 | 
						||
| 
								 | 
							
								StatisticMap Statistics::stats_;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Util {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void
							 | 
						||
| 
								 | 
							
								normalize (ParamSet& v)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  double sum = 0.0;
							 | 
						||
| 
								 | 
							
								  for (unsigned i = 0; i < v.size(); i++) {
							 | 
						||
| 
								 | 
							
								    sum += v[i];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  assert (sum != 0.0);
							 | 
						||
| 
								 | 
							
								  for (unsigned i = 0; i < v.size(); i++) {
							 | 
						||
| 
								 | 
							
								    v[i] /= sum;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void
							 | 
						||
| 
								 | 
							
								pow (ParamSet& v, unsigned expoent)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  for (unsigned i = 0; i < v.size(); i++) {
							 | 
						||
| 
								 | 
							
								    double value = 1;
							 | 
						||
| 
								 | 
							
								    for (unsigned j = 0; j < expoent; j++) {
							 | 
						||
| 
								 | 
							
								      value *= v[i];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    v[i] = value;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								double
							 | 
						||
| 
								 | 
							
								getL1dist (const ParamSet& v1, const ParamSet& v2)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  assert (v1.size() == v2.size());
							 | 
						||
| 
								 | 
							
								  double dist = 0.0;
							 | 
						||
| 
								 | 
							
								  for (unsigned i = 0; i < v1.size(); i++) {
							 | 
						||
| 
								 | 
							
								    dist += abs (v1[i] - v2[i]);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return dist;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								double
							 | 
						||
| 
								 | 
							
								getMaxNorm (const ParamSet& v1, const ParamSet& v2)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  assert (v1.size() == v2.size());
							 | 
						||
| 
								 | 
							
								  double max = 0.0;
							 | 
						||
| 
								 | 
							
								  for (unsigned i = 0; i < v1.size(); i++) {
							 | 
						||
| 
								 | 
							
								    double diff = abs (v1[i] - v2[i]);
							 | 
						||
| 
								 | 
							
								    if (diff > max) {
							 | 
						||
| 
								 | 
							
								      max = diff;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return max;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool
							 | 
						||
| 
								 | 
							
								isInteger (const string& s)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  stringstream ss1 (s);
							 | 
						||
| 
								 | 
							
								  stringstream ss2;
							 | 
						||
| 
								 | 
							
								  int integer;
							 | 
						||
| 
								 | 
							
								  ss1 >> integer;
							 | 
						||
| 
								 | 
							
								  ss2 << integer;
							 | 
						||
| 
								 | 
							
								  return (ss1.str() == ss2.str());
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								string
							 | 
						||
| 
								 | 
							
								parametersToString (CParamSet v)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  stringstream ss;  
							 | 
						||
| 
								 | 
							
								  ss << "[" ; 
							 | 
						||
| 
								 | 
							
								  for (unsigned i = 0; i < v.size() - 1; i++) {
							 | 
						||
| 
								 | 
							
								    ss << v[i] << ", " ;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (v.size() != 0) {
							 | 
						||
| 
								 | 
							
								    ss << v[v.size() - 1];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ss << "]" ;
							 | 
						||
| 
								 | 
							
								  return ss.str();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								vector<DConf>
							 | 
						||
| 
								 | 
							
								getDomainConfigurations (const VarSet& vars)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  unsigned nConfs = 1;
							 | 
						||
| 
								 | 
							
								  for (unsigned i = 0; i < vars.size(); i++) {
							 | 
						||
| 
								 | 
							
								    nConfs *= vars[i]->getDomainSize();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  vector<DConf> confs (nConfs);
							 | 
						||
| 
								 | 
							
								  for (unsigned i = 0; i < nConfs; i++) {
							 | 
						||
| 
								 | 
							
								    confs[i].resize (vars.size());
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unsigned nReps = 1;
							 | 
						||
| 
								 | 
							
								  for (int i = vars.size() - 1; i >= 0; i--) {
							 | 
						||
| 
								 | 
							
								    unsigned index = 0;
							 | 
						||
| 
								 | 
							
								    while (index < nConfs) {
							 | 
						||
| 
								 | 
							
								      for (unsigned j = 0; j < vars[i]->getDomainSize(); j++) {
							 | 
						||
| 
								 | 
							
								        for (unsigned r = 0; r < nReps; r++) {
							 | 
						||
| 
								 | 
							
								          confs[index][i] = j; 
							 | 
						||
| 
								 | 
							
								          index++;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    nReps *= vars[i]->getDomainSize();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return confs;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								vector<string>
							 | 
						||
| 
								 | 
							
								getInstantiations (const VarSet& vars)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  //FIXME handle variables without domain
							 | 
						||
| 
								 | 
							
								  /*
							 | 
						||
| 
								 | 
							
								  char c = 'a' ;
							 | 
						||
| 
								 | 
							
								  const DConf& conf = entries[i].getDomainConfiguration();
							 | 
						||
| 
								 | 
							
								  for (unsigned j = 0; j < conf.size(); j++) {
							 | 
						||
| 
								 | 
							
								    if (j != 0) ss << "," ;
							 | 
						||
| 
								 | 
							
								    ss << c << conf[j] + 1;
							 | 
						||
| 
								 | 
							
								    c ++;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  */
							 | 
						||
| 
								 | 
							
								  unsigned rowSize  = 1;
							 | 
						||
| 
								 | 
							
								  for (unsigned i = 0; i < vars.size(); i++) {
							 | 
						||
| 
								 | 
							
								    rowSize *= vars[i]->getDomainSize();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  vector<string> headers (rowSize);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unsigned nReps = 1;
							 | 
						||
| 
								 | 
							
								  for (int i = vars.size() - 1; i >= 0; i--) {
							 | 
						||
| 
								 | 
							
								    Domain domain = vars[i]->getDomain();
							 | 
						||
| 
								 | 
							
								    unsigned index = 0;
							 | 
						||
| 
								 | 
							
								    while (index < rowSize) {
							 | 
						||
| 
								 | 
							
								      for (unsigned j = 0; j < vars[i]->getDomainSize(); j++) {
							 | 
						||
| 
								 | 
							
								        for (unsigned r = 0; r < nReps; r++) {
							 | 
						||
| 
								 | 
							
								          if (headers[index] != "") {
							 | 
						||
| 
								 | 
							
								            headers[index] = domain[j] + ", " + headers[index];
							 | 
						||
| 
								 | 
							
								          } else {
							 | 
						||
| 
								 | 
							
								            headers[index] = domain[j];
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          index++;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    nReps *= vars[i]->getDomainSize();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return headers;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |