-/* Copyright (C) 2006-2008 Joris Mooij [j dot mooij at science dot ru dot nl]
- Radboud University Nijmegen, The Netherlands
-
+/* Copyright (C) 2006-2008 Joris Mooij [joris dot mooij at tuebingen dot mpg dot de]
+ Radboud University Nijmegen, The Netherlands /
+ Max Planck Institute for Biological Cybernetics, Germany
+
This file is part of libDAI.
libDAI is free software; you can redistribute it and/or modify
Factor BinaryFactor( const Var &n, double field ) {
assert( n.states() == 2 );
double buf[2];
- buf[0] = exp(-field);
+ buf[0] = exp(-field);
buf[1] = exp(field);
return Factor(n, &buf[0]);
}
double buf[4];
buf[0] = (buf[3] = exp(coupling));
buf[1] = (buf[2] = exp(-coupling));
- return Factor(n1 | n2, &buf[0]);
+ return Factor( VarSet(n1, n2), &buf[0] );
}
Factor PottsFactor( const Var &n1, const Var &n2, double beta ) {
- Factor fac( n1 | n2, 1.0 );
+ Factor fac( VarSet( n1, n2 ), 1.0 );
assert( n1.states() == n2.states() );
for( size_t s = 0; s < n1.states(); s++ )
fac[ s * (n1.states() + 1) ] = exp(beta);
void MakeHOIFG( size_t N, size_t M, size_t k, double sigma, FactorGraph &fg ) {
- vector<Var> vars;
- vector<Factor> factors;
+ vector<Var> vars;
+ vector<Factor> factors;
vars.reserve(N);
- for( size_t i = 0; i < N; i++ )
- vars.push_back(Var(i,2));
-
- for( size_t I = 0; I < M; I++ ) {
- VarSet vars;
- while( vars.size() < k ) {
- do {
- size_t newind = (size_t)(N * rnd_uniform());
- Var newvar = Var(newind, 2);
- if( !vars.contains( newvar ) ) {
- vars |= newvar;
- break;
- }
- } while( 1 );
- }
+ for( size_t i = 0; i < N; i++ )
+ vars.push_back(Var(i,2));
+
+ for( size_t I = 0; I < M; I++ ) {
+ VarSet vars;
+ while( vars.size() < k ) {
+ do {
+ size_t newind = (size_t)(N * rnd_uniform());
+ Var newvar = Var(newind, 2);
+ if( !vars.contains( newvar ) ) {
+ vars |= newvar;
+ break;
+ }
+ } while( 1 );
+ }
factors.push_back( RandomFactor( vars, sigma ) );
- }
+ }
fg = FactorGraph( factors.begin(), factors.end(), vars.begin(), vars.end(), factors.size(), vars.size() );
}
void Make3DPotts( size_t n1, size_t n2, size_t n3, size_t states, double beta, FactorGraph &fg ) {
vector<Var> vars;
vector<Factor> factors;
-
+
for( size_t i1 = 0; i1 < n1; i1++ )
for( size_t i2 = 0; i2 < n2; i2++ )
for( size_t i3 = 0; i3 < n3; i3++ ) {
WTh2FG( w, th, fg );
}
-
+
void MakeGridNonbinaryFG( bool periodic, size_t n, size_t states, double beta, FactorGraph &fg ) {
size_t N = n*n;
for( size_t i = 0; i < n; i++ ) {
for( size_t j = 0; j < n; j++ ) {
if( i+1 < n || periodic )
- factors.push_back( RandomFactor( vars[i*n+j] | vars[((i+1)%n)*n+j], beta ) );
+ factors.push_back( RandomFactor( VarSet( vars[i*n+j], vars[((i+1)%n)*n+j] ), beta ) );
if( j+1 < n || periodic )
- factors.push_back( RandomFactor( vars[i*n+j] | vars[i*n+((j+1)%n)], beta ) );
+ factors.push_back( RandomFactor( VarSet( vars[i*n+j], vars[i*n+((j+1)%n)] ), beta ) );
}
}
factors.reserve( N );
for( size_t i = 0; i < N; i++ ) {
- factors.push_back( RandomFactor( vars[i] | vars[(i+1)%N], beta ) );
+ factors.push_back( RandomFactor( VarSet( vars[i], vars[(i+1)%N] ), beta ) );
}
fg = FactorGraph( factors.begin(), factors.end(), vars.begin(), vars.end(), factors.size(), vars.size() );
UEdgeVec g = RandomDRegularGraph( N, d );
for( size_t i = 0; i < g.size(); i++ )
w(g[i].n1, g[i].n2) = rnd_stdnormal() * sigma_w + mean_w;
-
+
for( size_t i = 0; i < N; i++ )
th[i] = rnd_stdnormal() * sigma_th + mean_th;
edges.push_back( BipartiteGraph::Edge(stubs1[e], stubs2[e]) );
// finish construction
- G.create( N, K, edges.begin(), edges.end() );
+ G.construct( N, K, edges.begin(), edges.end() );
return G;
}
do {
prod = (prod * x) % p;
n++;
- } while( prod != 1 );
+ } while( prod != 1 );
return n;
}
edges.push_back( Edge(1,3) ); edges.push_back( Edge(2,3) ); edges.push_back( Edge(3,3) );
// finish construction
- G.create( N, K, edges.begin(), edges.end() );
+ G.construct( N, K, edges.begin(), edges.end() );
return G;
}
}
// finish construction
- G.create( N, K, edges.begin(), edges.end() );
+ G.construct( N, K, edges.begin(), edges.end() );
return G;
}
int main( int argc, char *argv[] ) {
try {
- size_t N, K, k, d, j, n1, n2, n3;
+ size_t N, K, k, d, j, n1, n2, n3;
size_t prime;
size_t seed;
- double beta, sigma_w, sigma_th, noise, mean_w, mean_th;
+ double beta, sigma_w, sigma_th, noise, mean_w, mean_th;
string type;
size_t states = 2;
cout << "interactions with <states> states and inverse temperature <beta>." << endl;
} else
cerr << "Unknown type (should be one of 'full', 'grid', 'grid_torus', 'dreg', 'loop', 'tree', 'hoi', 'ldpc_random', 'ldpc_group', 'ldpc_small', 'potts3d')" << endl;
-
+
if( type == FULL_TYPE || type == GRID_TYPE || type == GRID_TORUS_TYPE || type == DREG_TYPE || type == LOOP_TYPE || type == TREE_TYPE ) {
if( type == GRID_TYPE || type == GRID_TORUS_TYPE || type == LOOP_TYPE ) {
cout << "if <states> > 2: factor entries are exponents of Gaussians with mean 0 and standard deviation beta; otherwise," << endl;
cout << "singleton interactions are Gaussian with mean <mean_th> and standard" << endl;
cout << "deviation <sigma_th>; pairwise interactions are Gaussian with mean" << endl;
cout << "<mean_w> and standard deviation <sigma_w>." << endl;
- }
+ }
}
cout << endl << desc << endl;
return 1;
MakeGridNonbinaryFG( periodic, n, states, beta, fg );
else
MakeGridFG( periodic, n, mean_w, mean_th, sigma_w, sigma_th, fg );
-
+
cout << "# n = " << n << endl;
cout << "# N = " << N << endl;
-
+
if( states > 2 )
cout << "# beta = " << beta << endl;
else {
throw "Please specify all required arguments";
do {
MakeHOIFG( N, K, k, beta, fg );
- } while( !fg.G.isConnected() );
+ } while( !fg.isConnected() );
cout << "# N = " << N << endl;
cout << "# K = " << K << endl;
// Add likelihoods
for( size_t i = 0; i < N; i++ )
- factors.push_back( Factor(Var(i,2), likelihood + output[i]*2) );
+ factors.push_back( Factor(Var(i,2), likelihood + output[i]*2) );
// Construct Factor Graph
fg = FactorGraph( factors );
cout << "# seed = " << seed << endl;
cout << fg;
- }
- catch(exception& e) {
- cerr << "Error: " << e.what() << endl;
- return 1;
- }
- catch(const char * e) {
+ } catch( const char *e ) {
cerr << "Error: " << e << endl;
return 1;
- }
- catch(...) {
- cerr << "Exception of unknown type!" << endl;
}
return 0;