2 #ifndef OPENGM_SYNTHETIC_MODEL_GENERATOR_HXX
3 #define OPENGM_SYNTHETIC_MODEL_GENERATOR_HXX
17 template<
class GM>
class SyntheticModelGenerator
19 typedef GM GraphicalModelType;
20 typedef typename GM::ValueType ValueType;
21 typedef typename GM::ExplicitFunctionType ExplicitFunctionType;
24 typedef typename GM::FunctionIdentifier FunctionIdentifier;
25 typedef typename GM::OperatorType OperatorType;
28 enum FunktionTypes {
RANDOM, Potts, GPotts};
29 bool randomNumberOfStates_;
30 SyntheticModelGenerator();
31 SyntheticModelGenerator(
bool randomNumberOfStates);
32 GM buildGrid2(
size_t height,
size_t width,
size_t numStates,
unsigned int id, FunktionTypes ft2, ValueType l1, ValueType l2);
33 GM buildGrid02(
size_t height,
size_t width,
size_t numStates,
unsigned int id, FunktionTypes ft2, ValueType l2);
34 GM buildFull2(
size_t var,
size_t numStates,
unsigned int id, FunktionTypes ft2, ValueType l1, ValueType l2);
35 GM buildFull02(
size_t var,
size_t numStates,
unsigned int id, FunktionTypes ft2, ValueType l2);
36 GM buildStar2(
size_t var,
size_t numStates,
unsigned int id, FunktionTypes ft2, ValueType l1, ValueType l2);
39 GM buildPottsGrid2(
size_t height,
size_t width,
size_t numStates,
unsigned int id, ValueType l1=3, ValueType l2=1);
40 GM buildPottsFull2(
size_t numVar,
size_t numStates,
unsigned int id, ValueType l1=3, ValueType l2=1);
41 GM buildGPottsFull02(
size_t numVar,
size_t numStates,
unsigned int id, ValueType l2=1);
42 GM buildGPottsGrid02(
size_t height,
size_t width,
size_t numStates,
unsigned int id, ValueType l2=1);
43 GM buildPottsFull02(
size_t numVar,
size_t numStates,
unsigned int id, ValueType l2=1);
44 GM buildPottsGrid02(
size_t height,
size_t width,
size_t numStates,
unsigned int id, ValueType l2=1);
45 GM buildRandomFull2(
size_t numVar,
size_t numStates,
unsigned int id, ValueType l1=1, ValueType l2=1);
46 GM buildRandomGrid2(
size_t height,
size_t width,
size_t numStates,
unsigned int id, ValueType l1=3, ValueType l2=1);
47 GM buildRandomStar2(
size_t numVar,
size_t numStates,
unsigned int id, ValueType l1=3, ValueType l2=1);
51 void addUnaries(GM& gm, ValueType lambda);
52 FunctionIdentifier addFunktion(GM& gm, ValueType lambda, FunktionTypes ft,
size_t* beginShape,
size_t* endShape);
55 SyntheticModelGenerator<GM>::SyntheticModelGenerator()
57 randomNumberOfStates_ =
false;
60 SyntheticModelGenerator<GM>::SyntheticModelGenerator(
bool randomNumberOfStates)
62 randomNumberOfStates_ = randomNumberOfStates;
65 void SyntheticModelGenerator<GM>::addUnaries(GM& gm, ValueType lambda1)
69 for(
size_t i=0;i<gm.numberOfVariables();++i) {
70 shape[0] = gm.numberOfLabels(i);
72 ExplicitFunctionType
function(shape,shape+1);
73 for(
size_t ni=0; ni<shape[0]; ++ni) {
74 function(ni)= lambda1 * (rand() % 1000000)*0.000001 + 1;
76 FunctionIdentifier funcId=gm.addFunction(
function);
77 gm.addFactor(funcId,var,var+1);
81 typename GM::FunctionIdentifier SyntheticModelGenerator<GM>::addFunktion
91 ExplicitFunctionType
function(beginShape,endShape);
92 for(
size_t ni=0; ni<beginShape[0]; ++ni) {
93 for(
size_t nj=0; nj<beginShape[1]; ++nj) {
94 function(ni,nj) = lambda * (rand() % 1000000)*0.000001 + 1;
97 FunctionIdentifier funcId=gm.addFunction(
function);
101 ExplicitFunctionType
function(beginShape,endShape);
102 for(
size_t ni=0; ni<beginShape[0]; ++ni) {
103 for(
size_t nj=0; nj<beginShape[1]; ++nj) {
104 if(ni==nj)
function(ni,nj) = 0;
105 else function(ni,nj) = lambda;
108 FunctionIdentifier funcId=gm.addFunction(
function);
111 else if(ft==GPotts) {
112 double v = ((rand()%10000)-5000)/5000.0;
113 ExplicitFunctionType
function(beginShape,endShape);
114 for(
size_t ni=0; ni<beginShape[0]; ++ni) {
115 for(
size_t nj=0; nj<beginShape[1]; ++nj) {
116 if(ni==nj)
function(ni,nj) = 0;
117 else function(ni,nj) = lambda * v;
120 FunctionIdentifier funcId=gm.addFunction(
function);
125 FunctionIdentifier funcId;
130 GM SyntheticModelGenerator<GM>::buildGrid2
142 size_t N=height*width;
143 std::vector<size_t> variableStates(N,numStates);
144 if(randomNumberOfStates_) {
145 for(
size_t i=0; i<N;++i) {
146 variableStates[i] = (rand() % (numStates-1))+1;
149 GraphicalModelType gm(variableStates.begin(),variableStates.end());
151 addUnaries(gm, lambda1);
155 if(randomNumberOfStates_==
false ) {
156 shape[0] = shape[1] =gm.numberOfLabels(0);
157 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
158 for(
size_t i=0;i<height;++i) {
159 for(
size_t j=0;j<width;++j) {
160 size_t v = i+height*j;
163 var[1] = i+1+height*j;
164 gm.addFactor(funcId,var,var+2);
168 var[1] = i+height*(j+1);
169 gm.addFactor(funcId,var,var+2);
175 for(
size_t i=0;i<height;++i) {
176 for(
size_t j=0;j<width;++j) {
177 size_t v = i+height*j;
180 var[1] = i+1+height*j;
181 shape[0] = gm.numberOfLabels(var[0]);
182 shape[1] = gm.numberOfLabels(var[1]);
183 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
184 gm.addFactor(funcId,var,var+2);
188 var[1] = i+height*(j+1);
189 shape[0] = gm.numberOfLabels(var[0]);
190 shape[1] = gm.numberOfLabels(var[1]);
191 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
192 gm.addFactor(funcId,var,var+2);
200 GM SyntheticModelGenerator<GM>::buildGrid02
211 size_t N=height*width;
212 std::vector<size_t> variableStates(N,numStates);
213 if(randomNumberOfStates_) {
214 for(
size_t i=0; i<N;++i) {
215 variableStates[i] = (rand() % (numStates-1))+1;
218 GraphicalModelType gm(variableStates.begin(),variableStates.end());
222 if(randomNumberOfStates_==
false ) {
223 shape[0] = shape[1] =gm.numberOfLabels(0);
224 for(
size_t i=0;i<height;++i) {
225 for(
size_t j=0;j<width;++j) {
226 size_t v = i+height*j;
229 var[1] = i+1+height*j;
230 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
231 gm.addFactor(funcId,var,var+2);
235 var[1] = i+height*(j+1);
236 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
237 gm.addFactor(funcId,var,var+2);
243 for(
size_t i=0;i<height;++i) {
244 for(
size_t j=0;j<width;++j) {
245 size_t v = i+height*j;
248 var[1] = i+1+height*j;
249 shape[0] = gm.numberOfLabels(var[0]);
250 shape[1] = gm.numberOfLabels(var[1]);
251 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
252 gm.addFactor(funcId,var,var+2);
256 var[1] = i+height*(j+1);
257 shape[0] = gm.numberOfLabels(var[0]);
258 shape[1] = gm.numberOfLabels(var[1]);
259 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
260 gm.addFactor(funcId,var,var+2);
268 GM SyntheticModelGenerator<GM>::buildFull2
270 size_t numberOfVariables,
271 size_t numberOfLabels,
279 std::vector<size_t> variableStates(numberOfVariables,numberOfLabels);
280 if(randomNumberOfStates_) {
281 for(
size_t i=0; i<numberOfVariables;++i) {
282 variableStates[i] = (rand() % (numberOfLabels-1))+1;
285 GraphicalModelType gm(variableStates.begin(),variableStates.end());
287 addUnaries(gm, lambda1);
291 if(randomNumberOfStates_==
false )
293 shape[0]=gm.numberOfLabels(0);
294 shape[1]=gm.numberOfLabels(0);
295 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape, shape+2);
296 for(
size_t i=0;i<numberOfVariables;++i)
298 for(
size_t j=i+1;j<numberOfVariables;++j)
302 gm.addFactor(funcId,var,var+2);
307 for(
size_t i=0;i<numberOfVariables;++i) {
308 for(
size_t j=i+1;j<numberOfVariables;++j) {
311 shape[0] = gm.numberOfLabels(var[0]);
312 shape[1] = gm.numberOfLabels(var[1]);
313 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
314 gm.addFactor(funcId,var,var+2);
321 GM SyntheticModelGenerator<GM>::buildFull02
323 size_t numberOfVariables,
324 size_t numberOfLabels,
331 std::vector<size_t> variableStates(numberOfVariables,numberOfLabels);
332 if(randomNumberOfStates_) {
333 for(
size_t i=0; i<numberOfVariables;++i) {
334 variableStates[i] = (rand() % (numberOfLabels-1))+1;
337 GraphicalModelType gm(variableStates.begin(),variableStates.end());
341 if(randomNumberOfStates_==
false )
343 shape[0]=gm.numberOfLabels(0);
344 shape[1]=gm.numberOfLabels(0);
345 for(
size_t i=0;i<numberOfVariables;++i)
347 for(
size_t j=i+1;j<numberOfVariables;++j)
351 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape, shape+2);
352 gm.addFactor(funcId,var,var+2);
357 for(
size_t i=0;i<numberOfVariables;++i) {
358 for(
size_t j=i+1;j<numberOfVariables;++j) {
361 shape[0] = gm.numberOfLabels(var[0]);
362 shape[1] = gm.numberOfLabels(var[1]);
363 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
364 gm.addFactor(funcId,var,var+2);
371 GM SyntheticModelGenerator<GM>::buildStar2
373 size_t numberOfVariables,
374 size_t numberOfLabels,
382 std::vector<size_t> variableStates(numberOfVariables,numberOfLabels);
383 if(randomNumberOfStates_) {
384 for(
size_t i=0; i<numberOfVariables;++i) {
385 variableStates[i] = (rand() % (numberOfLabels-1))+1;
388 GraphicalModelType gm(variableStates.begin(),variableStates.end());
389 size_t root = (rand() % numberOfVariables);
391 addUnaries(gm, lambda1);
395 if(randomNumberOfStates_==
false ) {
396 shape[0] = shape[1] =gm.numberOfLabels(0);
397 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
398 for(
size_t i=0;i<root;++i) {
401 gm.addFactor(funcId,var,var+2);
403 for(
size_t i=root+1;i<numberOfVariables;++i) {
406 gm.addFactor(funcId,var,var+2);
410 for(
size_t i=0;i<root;++i) {
413 shape[0] = gm.numberOfLabels(var[0]);
414 shape[1] = gm.numberOfLabels(var[1]);
415 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
416 gm.addFactor(funcId,var,var+2);
418 for(
size_t i=root+1;i<numberOfVariables;++i) {
421 shape[0] = gm.numberOfLabels(var[0]);
422 shape[1] = gm.numberOfLabels(var[1]);
423 FunctionIdentifier funcId = addFunktion(gm,lambda2,ft2, shape,shape+2);
424 gm.addFactor(funcId,var,var+2);
434 GM SyntheticModelGenerator<GM>::buildPottsGrid2
435 (
size_t height,
size_t width,
size_t numStates,
unsigned int id, ValueType l1, ValueType l2)
436 {
return buildGrid2(height, width, numStates,
id, Potts, l1, l2);}
438 GM SyntheticModelGenerator<GM>::buildPottsGrid02
439 (
size_t height,
size_t width,
size_t numStates,
unsigned int id, ValueType l2)
440 {
return buildGrid02(height, width, numStates,
id, Potts, l2);}
442 GM SyntheticModelGenerator<GM>::buildGPottsGrid02
443 (
size_t height,
size_t width,
size_t numStates,
unsigned int id, ValueType l2)
444 {
return buildGrid02(height, width, numStates,
id, GPotts, l2);}
446 GM SyntheticModelGenerator<GM>::buildRandomGrid2
447 (
size_t height,
size_t width,
size_t numStates,
unsigned int id, ValueType l1, ValueType l2)
448 {
return buildGrid2(height, width, numStates,
id,
RANDOM, l1, l2);}
450 GM SyntheticModelGenerator<GM>::buildPottsFull2
451 (
size_t numVar,
size_t numStates,
unsigned int id, ValueType l1, ValueType l2)
452 {
return buildFull2(numVar, numStates,
id, Potts, l1, l2);}
454 GM SyntheticModelGenerator<GM>::buildPottsFull02
455 (
size_t numVar,
size_t numStates,
unsigned int id, ValueType l2)
456 {
return buildFull02(numVar, numStates,
id, Potts, l2);}
458 GM SyntheticModelGenerator<GM>::buildGPottsFull02
459 (
size_t numVar,
size_t numStates,
unsigned int id, ValueType l2)
460 {
return buildFull02(numVar, numStates,
id, GPotts, l2);}
462 GM SyntheticModelGenerator<GM>::buildRandomFull2
463 (
size_t numVar,
size_t numStates,
unsigned int id, ValueType l1, ValueType l2)
464 {
return buildFull2(numVar, numStates,
id,
RANDOM, l1, l2);}
466 GM SyntheticModelGenerator<GM>::buildRandomStar2
467 (
size_t numVar,
size_t numStates,
unsigned int id, ValueType l1, ValueType l2)
468 {
return buildStar2(numVar, numStates,
id,
RANDOM, l1, l2);}