aGrUM
0.20.2
a C++ library for (probabilistic) graphical models
clusteredLayerGenerator_tpl.h
Go to the documentation of this file.
1
/**
2
*
3
* Copyright 2005-2020 Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
4
* info_at_agrum_dot_org
5
*
6
* This library is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU Lesser General Public License as published by
8
* the Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
10
*
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public License
17
* along with this library. If not, see <http://www.gnu.org/licenses/>.
18
*
19
*/
20
21
22
/**
23
* @file
24
* @brief Inline implementation of ClusteredLayerGenerator.
25
*
26
* @author Lionel TORTI and Pierre-Henri WUILLEMIN(@LIP6)
27
*/
28
29
namespace
gum
{
30
namespace
prm
{
31
32
template
<
typename
GUM_SCALAR >
33
PRM< GUM_SCALAR >* ClusteredLayerGenerator<
GUM_SCALAR
>::
generate
() {
34
if
(
layers__
.
size
() == 0) {
35
GUM_ERROR
(
OperationNotAllowed
,
36
"cannot generate a layered PRM<GUM_SCALAR> without layers"
);
37
}
38
39
std
::
vector
<
MyData
>
l
;
40
PRMFactory
<
GUM_SCALAR
>
factory
;
41
std
::
string
type
=
generateType__
(
factory
);
42
generateInterfaces__
(
factory
,
type
,
l
);
43
generateClasses__
(
factory
,
type
,
l
);
44
generateSystem__
(
factory
,
l
);
45
return
factory
.
prm
();
46
}
47
48
template
<
typename
GUM_SCALAR
>
49
std
::
string
ClusteredLayerGenerator
<
GUM_SCALAR
>::
generateType__
(
50
PRMFactory
<
GUM_SCALAR
>&
factory
) {
51
std
::
string
name
=
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
TYPE
);
52
factory
.
startDiscreteType
(
name
);
53
54
for
(
Size
i
= 0;
i
<
domain_size__
; ++
i
) {
55
std
::
stringstream
sBuff
;
56
sBuff
<<
i
;
57
factory
.
addLabel
(
sBuff
.
str
());
58
}
59
60
factory
.
endDiscreteType
();
61
return
name
;
62
}
63
64
template
<
typename
GUM_SCALAR
>
65
void
ClusteredLayerGenerator
<
GUM_SCALAR
>::
generateInterfaces__
(
66
PRMFactory
<
GUM_SCALAR
>&
f
,
67
const
std
::
string
&
type
,
68
std
::
vector
<
typename
ClusteredLayerGenerator
<
GUM_SCALAR
>::
MyData
>&
l
) {
69
for
(
Size
lvl
= 0;
lvl
<
layers__
.
size
(); ++
lvl
) {
70
l
.
push_back
(
ClusteredLayerGenerator
<
GUM_SCALAR
>::
MyData
());
71
l
[
lvl
].
i
=
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
PRM_INTERFACE
);
72
f
.
startInterface
(
l
[
lvl
].
i
);
73
74
for
(
Size
a
= 0;
a
<
layers__
[
lvl
].
a
; ++
a
) {
75
l
[
lvl
].
a
.
push_back
(
76
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
CLASS_ELT
));
77
f
.
addAttribute
(
type
,
l
[
lvl
].
a
.
back
());
78
}
79
80
if
(
lvl
) {
81
for
(
Size
g
= 0;
g
<
layers__
[
lvl
].
g
; ++
g
) {
82
l
[
lvl
].
g
.
push_back
(
83
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
CLASS_ELT
));
84
f
.
addAttribute
(
"boolean"
,
l
[
lvl
].
g
.
back
());
85
}
86
87
l
[
lvl
].
r
=
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
CLASS_ELT
);
88
f
.
addReferenceSlot
(
l
[
lvl
- 1].
i
,
l
[
lvl
].
r
,
true
);
89
}
90
91
f
.
endInterface
();
92
}
93
}
94
95
template
<
typename
GUM_SCALAR
>
96
void
ClusteredLayerGenerator
<
GUM_SCALAR
>::
generateClasses__
(
97
PRMFactory
<
GUM_SCALAR
>&
f
,
98
const
std
::
string
&
type
,
99
std
::
vector
<
typename
ClusteredLayerGenerator
<
GUM_SCALAR
>::
MyData
>&
l
) {
100
// double ratio = getClusterRatio() + RAND_MAX;
101
Set
<
std
::
string
>
i
;
102
103
for
(
Size
lvl
= 0;
lvl
<
layers__
.
size
(); ++
lvl
) {
104
i
.
insert
(
l
[
lvl
].
i
);
105
106
for
(
Size
c
= 0;
c
<
layers__
[
lvl
].
c
; ++
c
) {
107
// if (std::rand() < ratio)
108
generateCluster__
(
f
,
type
,
l
,
lvl
,
i
);
109
// else
110
// generateClass__(f, type, l, lvl, i);
111
}
112
113
i
.
erase
(
l
[
lvl
].
i
);
114
}
115
}
116
117
template
<
typename
GUM_SCALAR
>
118
void
ClusteredLayerGenerator
<
GUM_SCALAR
>::
generateCluster__
(
119
PRMFactory
<
GUM_SCALAR
>&
f
,
120
const
std
::
string
&
type
,
121
std
::
vector
<
typename
ClusteredLayerGenerator
<
GUM_SCALAR
>::
MyData
>&
l
,
122
Size
lvl
,
123
Set
<
std
::
string
>&
i
) {
124
Size
size
= 0;
125
GUM_SCALAR
sum
= 0.0;
126
std
::
string
first
,
second
,
third
;
127
std
::
vector
<
std
::
string
>*
v
= 0;
128
129
switch
(
std
::
rand
() % 2) {
130
// Shape A->B
131
// v == [first, second, second.ref -> first]
132
case
0: {
133
v
=
new
std
::
vector
<
std
::
string
>();
134
generateClass__
(
f
,
type
,
l
,
lvl
,
i
);
135
first
=
l
[
lvl
].
c
.
back
();
136
v
->
push_back
(
first
);
137
v
->
push_back
(
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
CLASS
));
138
f
.
startClass
(
v
->
back
());
139
v
->
push_back
(
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
CLASS_ELT
));
140
f
.
addReferenceSlot
(
first
,
v
->
back
(),
true
);
141
DAG
dag
;
142
Bijection
<
std
::
string
,
NodeId
>
names
;
143
generateClassDag__
(
lvl
,
dag
,
names
,
l
);
144
145
// Adding aggregates
146
for
(
std
::
vector
<
std
::
string
>::
iterator
g
=
l
[
lvl
].
g
.
begin
();
147
g
!=
l
[
lvl
].
g
.
end
();
148
++
g
) {
149
std
::
stringstream
s
;
150
s
<<
v
->
back
() <<
"."
<<
l
[
lvl
].
a
[
std
::
rand
() %
l
[
lvl
].
a
.
size
()];
151
std
::
vector
<
std
::
string
>
chain
(1,
s
.
str
()),
param
(1,
"1"
);
152
f
.
addAggregator
(*
g
,
"exists"
,
chain
,
param
);
153
}
154
155
// Adding attributes
156
for
(
std
::
vector
<
std
::
string
>::
iterator
a
=
l
[
lvl
].
a
.
begin
();
157
a
!=
l
[
lvl
].
a
.
end
();
158
++
a
) {
159
f
.
startAttribute
(
type
, *
a
,
true
);
160
size
=
getDomainSize
();
161
162
for
(
const
auto
par
:
dag
.
parents
(
names
.
second
(*
a
))) {
163
f
.
addParent
(
names
.
first
(
par
));
164
size
*=
f
.
retrieveClass
(
l
[
lvl
].
c
.
back
())
165
.
get
(
names
.
first
(
par
))
166
.
type
()
167
->
domainSize
();
168
}
169
170
std
::
vector
<
GUM_SCALAR
>
cpf
(
size
),
val
(
getDomainSize
());
171
172
for
(
size_t
norms
= 0;
norms
<
size
;
norms
+=
getDomainSize
()) {
173
sum
= 0.0;
174
175
for
(
size_t
idx
= 0;
idx
<
getDomainSize
(); ++
idx
) {
176
val
[
idx
] = 1 +
std
::
rand
();
177
sum
+=
val
[
idx
];
178
}
179
180
for
(
size_t
idx
= 0;
idx
<
getDomainSize
(); ++
idx
)
181
cpf
[
norms
+
idx
] =
val
[
idx
] /
sum
;
182
}
183
184
f
.
setRawCPFByLines
(
cpf
);
185
f
.
endAttribute
();
186
}
187
188
f
.
endClass
();
189
break
;
190
}
191
192
// Shape A -> B -> C
193
// v == [first, second, second.ref -> first, third, third.ref -> second]
194
case
1: {
195
v
=
new
std
::
vector
<
std
::
string
>();
196
generateClass__
(
f
,
type
,
l
,
lvl
,
i
);
197
{
198
first
=
l
[
lvl
].
c
.
back
();
199
v
->
push_back
(
first
);
200
v
->
push_back
(
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
CLASS
));
201
second
=
v
->
back
();
202
f
.
startClass
(
second
);
203
v
->
push_back
(
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
CLASS_ELT
));
204
f
.
addReferenceSlot
(
first
,
v
->
back
(),
true
);
205
DAG
dag
;
206
Bijection
<
std
::
string
,
NodeId
>
names
;
207
generateClassDag__
(
lvl
,
dag
,
names
,
l
);
208
209
// Adding aggregates
210
for
(
std
::
vector
<
std
::
string
>::
iterator
g
=
l
[
lvl
].
g
.
begin
();
211
g
!=
l
[
lvl
].
g
.
end
();
212
++
g
) {
213
std
::
stringstream
s
;
214
s
<<
v
->
back
() <<
"."
<<
l
[
lvl
].
a
[
std
::
rand
() %
l
[
lvl
].
a
.
size
()];
215
std
::
vector
<
std
::
string
>
chain
(1,
s
.
str
()),
param
(1,
"1"
);
216
f
.
addAggregator
(*
g
,
"exists"
,
chain
,
param
);
217
}
218
219
// Adding attributes
220
for
(
std
::
vector
<
std
::
string
>::
iterator
a
=
l
[
lvl
].
a
.
begin
();
221
a
!=
l
[
lvl
].
a
.
end
();
222
++
a
) {
223
f
.
startAttribute
(
type
, *
a
,
true
);
224
size
=
getDomainSize
();
225
226
for
(
const
auto
par
:
dag
.
parents
(
names
.
second
(*
a
))) {
227
f
.
addParent
(
names
.
first
(
par
));
228
size
*=
f
.
retrieveClass
(
l
[
lvl
].
c
.
back
())
229
.
get
(
names
.
first
(
par
))
230
.
type
()
231
->
domainSize
();
232
}
233
234
std
::
vector
<
GUM_SCALAR
>
cpf
(
size
),
val
(
getDomainSize
());
235
236
for
(
size_t
norms
= 0;
norms
<
size
;
norms
+=
getDomainSize
()) {
237
sum
= 0.0;
238
239
for
(
size_t
idx
= 0;
idx
<
getDomainSize
(); ++
idx
) {
240
val
[
idx
] = 1 +
std
::
rand
();
241
sum
+=
val
[
idx
];
242
}
243
244
for
(
size_t
idx
= 0;
idx
<
getDomainSize
(); ++
idx
)
245
cpf
[
norms
+
idx
] =
val
[
idx
] /
sum
;
246
}
247
248
f
.
setRawCPFByLines
(
cpf
);
249
f
.
endAttribute
();
250
}
251
252
f
.
endClass
();
253
}
254
{
255
v
->
push_back
(
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
CLASS
));
256
third
=
v
->
back
();
257
f
.
startClass
(
third
);
258
v
->
push_back
(
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
CLASS_ELT
));
259
f
.
addReferenceSlot
(
second
,
v
->
back
(),
true
);
260
DAG
dag
;
261
Bijection
<
std
::
string
,
NodeId
>
names
;
262
generateClassDag__
(
lvl
,
dag
,
names
,
l
);
263
264
// Adding aggregates
265
for
(
std
::
vector
<
std
::
string
>::
iterator
g
=
l
[
lvl
].
g
.
begin
();
266
g
!=
l
[
lvl
].
g
.
end
();
267
++
g
) {
268
std
::
stringstream
s
;
269
s
<<
v
->
back
() <<
"."
<<
l
[
lvl
].
a
[
std
::
rand
() %
l
[
lvl
].
a
.
size
()];
270
std
::
vector
<
std
::
string
>
chain
(1,
s
.
str
()),
param
(1,
"1"
);
271
f
.
addAggregator
(*
g
,
"exists"
,
chain
,
param
);
272
}
273
274
// Adding attributes
275
for
(
std
::
vector
<
std
::
string
>::
iterator
a
=
l
[
lvl
].
a
.
begin
();
276
a
!=
l
[
lvl
].
a
.
end
();
277
++
a
) {
278
f
.
startAttribute
(
type
, *
a
,
true
);
279
size
=
getDomainSize
();
280
281
for
(
const
auto
par
:
dag
.
parents
(
names
.
second
(*
a
))) {
282
f
.
addParent
(
names
.
first
(
par
));
283
size
*=
f
.
retrieveClass
(
l
[
lvl
].
c
.
back
())
284
.
get
(
names
.
first
(
par
))
285
.
type
()
286
->
domainSize
();
287
}
288
289
std
::
vector
<
GUM_SCALAR
>
cpf
(
size
),
val
(
getDomainSize
());
290
291
for
(
size_t
norms
= 0;
norms
<
size
;
norms
+=
getDomainSize
()) {
292
sum
= 0.0;
293
294
for
(
size_t
idx
= 0;
idx
<
getDomainSize
(); ++
idx
) {
295
val
[
idx
] = 1 +
std
::
rand
();
296
sum
+=
val
[
idx
];
297
}
298
299
for
(
size_t
idx
= 0;
idx
<
getDomainSize
(); ++
idx
)
300
cpf
[
norms
+
idx
] =
val
[
idx
] /
sum
;
301
}
302
303
f
.
setRawCPFByLines
(
cpf
);
304
f
.
endAttribute
();
305
}
306
307
f
.
endClass
();
308
}
309
break
;
310
}
311
312
default
: {
313
GUM_ERROR
(
OperationNotAllowed
,
"unexpected value"
);
314
}
315
}
316
317
cluster_map__
.
insert
(
first
,
v
);
318
}
319
320
template
<
typename
GUM_SCALAR
>
321
void
ClusteredLayerGenerator
<
GUM_SCALAR
>::
generateClass__
(
322
PRMFactory
<
GUM_SCALAR
>&
f
,
323
const
std
::
string
&
type
,
324
std
::
vector
<
typename
ClusteredLayerGenerator
<
GUM_SCALAR
>::
MyData
>&
l
,
325
Size
lvl
,
326
Set
<
std
::
string
>&
i
) {
327
Size
size
= 0;
328
GUM_SCALAR
sum
= 0.0;
329
l
[
lvl
].
c
.
push_back
(
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
CLASS
));
330
f
.
startClass
(
l
[
lvl
].
c
.
back
(),
""
, &
i
);
331
332
if
(
lvl
)
f
.
addReferenceSlot
(
l
[
lvl
- 1].
i
,
l
[
lvl
].
r
,
true
);
333
334
DAG
dag
;
335
Bijection
<
std
::
string
,
NodeId
>
names
;
336
generateClassDag__
(
lvl
,
dag
,
names
,
l
);
337
338
// Adding aggregates
339
if
(
lvl
) {
340
for
(
const
auto
agg
:
l
[
lvl
].
g
) {
341
std
::
stringstream
s
;
342
s
<<
l
[
lvl
].
r
<<
"."
<<
l
[
lvl
- 1].
a
[
std
::
rand
() %
l
[
lvl
- 1].
a
.
size
()];
343
std
::
vector
<
std
::
string
>
chain
(1,
s
.
str
()),
param
(1,
"1"
);
344
f
.
addAggregator
(
agg
,
"exists"
,
chain
,
param
);
345
}
346
}
347
348
// Adding attributes
349
for
(
const
auto
attr
:
l
[
lvl
].
a
) {
350
f
.
startAttribute
(
type
,
attr
,
true
);
351
size
=
getDomainSize
();
352
353
for
(
const
auto
par
:
dag
.
parents
(
names
.
second
(
attr
))) {
354
f
.
addParent
(
names
.
first
(
par
));
355
size
*=
f
.
retrieveClass
(
l
[
lvl
].
c
.
back
())
356
.
get
(
names
.
first
(
par
))
357
.
type
()
358
->
domainSize
();
359
}
360
361
std
::
vector
<
GUM_SCALAR
>
cpf
(
size
),
val
(
getDomainSize
());
362
363
for
(
size_t
norms
= 0;
norms
<
size
;
norms
+=
getDomainSize
()) {
364
sum
= 0.0;
365
366
for
(
size_t
idx
= 0;
idx
<
getDomainSize
(); ++
idx
) {
367
val
[
idx
] = 1 +
std
::
rand
();
368
sum
+=
val
[
idx
];
369
}
370
371
for
(
size_t
idx
= 0;
idx
<
getDomainSize
(); ++
idx
)
372
cpf
[
norms
+
idx
] =
val
[
idx
] /
sum
;
373
}
374
375
f
.
setRawCPFByLines
(
cpf
);
376
f
.
endAttribute
();
377
}
378
379
f
.
endClass
();
380
}
381
382
template
<
typename
GUM_SCALAR
>
383
void
ClusteredLayerGenerator
<
GUM_SCALAR
>::
generateClassDag__
(
384
Size
lvl
,
385
DAG
&
dag
,
386
Bijection
<
std
::
string
,
NodeId
>&
names
,
387
std
::
vector
<
typename
ClusteredLayerGenerator
<
GUM_SCALAR
>::
MyData
>&
l
) {
388
float
density
=
layers__
[
lvl
].
inner_density
*
RAND_MAX
;
389
std
::
vector
<
NodeId
>
nodes
;
390
NodeId
id
= 0;
391
392
if
(
lvl
) {
393
for
(
std
::
vector
<
std
::
string
>::
iterator
g
=
l
[
lvl
].
g
.
begin
();
394
g
!=
l
[
lvl
].
g
.
end
();
395
++
g
) {
396
id
=
dag
.
addNode
();
397
names
.
insert
(*
g
,
id
);
398
nodes
.
push_back
(
id
);
399
}
400
}
401
402
for
(
std
::
vector
<
std
::
string
>::
iterator
a
=
l
[
lvl
].
a
.
begin
();
403
a
!=
l
[
lvl
].
a
.
end
();
404
++
a
) {
405
id
=
dag
.
addNode
();
406
names
.
insert
(*
a
,
id
);
407
408
for
(
std
::
vector
<
NodeId
>::
iterator
prnt
=
nodes
.
begin
();
409
prnt
!=
nodes
.
end
();
410
++
prnt
)
411
if
(
std
::
rand
() <
density
)
dag
.
addArc
(*
prnt
,
names
.
second
(*
a
));
412
413
nodes
.
push_back
(
id
);
414
}
415
416
// For each nodes with #parents > max_parents__ we randomly remove parents
417
// until
418
// #parents <= max_parents__
419
for
(
const
auto
node
:
dag
.
nodes
()) {
420
if
(
dag
.
parents
(
node
).
size
() >
getMaxParents
()) {
421
std
::
vector
<
NodeId
>
v
;
422
423
for
(
const
auto
par
:
dag
.
parents
(
node
))
424
v
.
push_back
(
par
);
425
426
while
(
dag
.
parents
(
node
).
size
() >
getMaxParents
()) {
427
size_t
idx
=
std
::
rand
() %
v
.
size
();
428
Arc
arc
(
v
[
idx
],
node
);
429
GUM_ASSERT
(
dag
.
existsArc
(
arc
));
430
dag
.
eraseArc
(
arc
);
431
v
[
idx
] =
v
.
back
();
432
v
.
pop_back
();
433
}
434
}
435
}
436
}
437
438
template
<
typename
GUM_SCALAR
>
439
void
ClusteredLayerGenerator
<
GUM_SCALAR
>::
generateSystem__
(
440
PRMFactory
<
GUM_SCALAR
>&
factory
,
441
std
::
vector
<
typename
ClusteredLayerGenerator
<
GUM_SCALAR
>::
MyData
>&
l
) {
442
factory
.
startSystem
(
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
SYSTEM
));
443
std
::
vector
<
std
::
vector
<
std
::
string
> >
o
(
layers__
.
size
());
444
std
::
string
name
,
c
,
first
,
second
,
third
;
445
std
::
vector
<
std
::
string
>*
v
= 0;
446
size_t
idx
= 0;
447
448
for
(
size_t
lvl
= 0;
lvl
<
layers__
.
size
(); ++
lvl
) {
449
float
density
=
layers__
[
lvl
].
outter_density
*
RAND_MAX
;
450
451
for
(
size_t
count
= 0;
count
<
layers__
[
lvl
].
o
; ++
count
) {
452
c
=
l
[
lvl
].
c
[
std
::
rand
() %
l
[
lvl
].
c
.
size
()];
453
454
if
(
cluster_map__
.
exists
(
c
)) {
455
v
=
cluster_map__
[
c
];
456
457
switch
(
v
->
size
()) {
458
case
3: {
459
first
=
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
INSTANCE
);
460
factory
.
addInstance
(
c
,
first
);
461
second
=
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
INSTANCE
);
462
factory
.
addInstance
(
v
->
at
(1),
second
);
463
std
::
stringstream
chain
;
464
chain
<<
second
<<
"."
<<
v
->
at
(2);
465
factory
.
setReferenceSlot
(
chain
.
str
(),
first
);
466
break
;
467
}
468
469
case
5: {
470
first
=
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
INSTANCE
);
471
factory
.
addInstance
(
c
,
first
);
472
second
=
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
INSTANCE
);
473
factory
.
addInstance
(
v
->
at
(1),
second
);
474
std
::
stringstream
chain_1
,
chain_2
;
475
chain_1
<<
second
<<
"."
<<
v
->
at
(2);
476
factory
.
setReferenceSlot
(
chain_1
.
str
(),
first
);
477
third
=
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
INSTANCE
);
478
factory
.
addInstance
(
v
->
at
(3),
third
);
479
chain_2
<<
third
<<
"."
<<
v
->
at
(4);
480
factory
.
setReferenceSlot
(
chain_2
.
str
(),
second
);
481
break
;
482
}
483
484
default
: {
485
GUM_ERROR
(
OperationNotAllowed
,
"unexpected vector size"
);
486
}
487
}
488
489
// cluster_map__.erase(c);
490
// delete v;
491
name
=
first
;
492
}
else
{
493
name
=
this
->
name_gen_
.
nextName
(
PRMObject
::
prm_type
::
INSTANCE
);
494
factory
.
addInstance
(
c
,
name
);
495
}
496
497
o
[
lvl
].
push_back
(
name
);
498
499
if
(
lvl
) {
500
std
::
stringstream
chain
;
501
chain
<<
name
<<
"."
<<
l
[
lvl
].
r
;
502
std
::
vector
<
std
::
string
>
ref2add
;
503
504
for
(
std
::
vector
<
std
::
string
>::
iterator
iter
=
o
[
lvl
- 1].
begin
();
505
iter
!=
o
[
lvl
- 1].
end
();
506
++
iter
)
507
if
(
std
::
rand
() <=
density
)
ref2add
.
push_back
(*
iter
);
508
509
if
(
ref2add
.
empty
())
510
factory
.
setReferenceSlot
(
511
chain
.
str
(),
512
o
[
lvl
- 1][
std
::
rand
() %
o
[
lvl
- 1].
size
()]);
513
514
while
(
ref2add
.
size
() >
getMaxParents
()) {
515
idx
=
std
::
rand
() %
ref2add
.
size
();
516
ref2add
[
idx
] =
ref2add
.
back
();
517
ref2add
.
pop_back
();
518
}
519
520
for
(
std
::
vector
<
std
::
string
>::
iterator
iter
=
ref2add
.
begin
();
521
iter
!=
ref2add
.
end
();
522
++
iter
)
523
factory
.
setReferenceSlot
(
chain
.
str
(), *
iter
);
524
}
525
}
526
}
527
528
factory
.
endSystem
();
529
}
530
531
template
<
typename
GUM_SCALAR
>
532
INLINE
ClusteredLayerGenerator
<
GUM_SCALAR
>::
ClusteredLayerGenerator
() :
533
layers__
(),
domain_size__
(2),
max_parents__
(
INT_MAX
),
534
cluster_ratio__
(0.0) {
535
GUM_CONSTRUCTOR
(
ClusteredLayerGenerator
);
536
}
537
538
template
<
typename
GUM_SCALAR
>
539
INLINE
ClusteredLayerGenerator
<
GUM_SCALAR
>::
ClusteredLayerGenerator
(
540
const
ClusteredLayerGenerator
<
GUM_SCALAR
>&
source
) :
541
layers__
(
source
.
layers__
),
542
domain_size__
(
source
.
domain_size__
),
max_parents__
(
source
.
max_parents__
) {
543
GUM_CONS_CPY
(
ClusteredLayerGenerator
);
544
}
545
546
template
<
typename
GUM_SCALAR
>
547
INLINE
ClusteredLayerGenerator
<
GUM_SCALAR
>::~
ClusteredLayerGenerator
() {
548
GUM_DESTRUCTOR
(
ClusteredLayerGenerator
);
549
// typedef HashTable<std::string, std::vector<std::string>*>::iterator
550
// Iter;
551
// for (Iter iter = cluster_map__.begin(); iter != cluster_map__.end();
552
// ++iter)
553
// {
554
// delete *iter;
555
// }
556
}
557
558
template
<
typename
GUM_SCALAR
>
559
INLINE
ClusteredLayerGenerator
<
GUM_SCALAR
>&
560
ClusteredLayerGenerator
<
GUM_SCALAR
>::
operator
=(
561
const
ClusteredLayerGenerator
<
GUM_SCALAR
>&
source
) {
562
layers__
=
source
.
layers__
;
563
domain_size__
=
source
.
domain_size__
;
564
max_parents__
=
source
.
max_parents__
;
565
return
*
this
;
566
}
567
568
template
<
typename
GUM_SCALAR
>
569
INLINE
Size
ClusteredLayerGenerator
<
GUM_SCALAR
>::
getDomainSize
()
const
{
570
return
domain_size__
;
571
}
572
573
template
<
typename
GUM_SCALAR
>
574
INLINE
void
ClusteredLayerGenerator
<
GUM_SCALAR
>::
setDomainSize
(
Size
s
) {
575
domain_size__
=
s
;
576
}
577
578
template
<
typename
GUM_SCALAR
>
579
INLINE
Size
ClusteredLayerGenerator
<
GUM_SCALAR
>::
getMaxParents
()
const
{
580
return
max_parents__
;
581
}
582
583
template
<
typename
GUM_SCALAR
>
584
INLINE
void
ClusteredLayerGenerator
<
GUM_SCALAR
>::
setMaxParents
(
Size
s
) {
585
max_parents__
=
s
;
586
}
587
588
template
<
typename
GUM_SCALAR
>
589
INLINE
void
ClusteredLayerGenerator
<
GUM_SCALAR
>::
setLayers
(
590
const
std
::
vector
<
typename
LayerGenerator
<
GUM_SCALAR
>::
LayerData
>&
v
) {
591
layers__
=
v
;
592
}
593
594
template
<
typename
GUM_SCALAR
>
595
INLINE
std
::
vector
<
typename
LayerGenerator
<
GUM_SCALAR
>::
LayerData
>&
596
ClusteredLayerGenerator
<
GUM_SCALAR
>::
getLayer
() {
597
return
layers__
;
598
}
599
600
template
<
typename
GUM_SCALAR
>
601
INLINE
const
std
::
vector
<
typename
LayerGenerator
<
GUM_SCALAR
>::
LayerData
>&
602
ClusteredLayerGenerator
<
GUM_SCALAR
>::
getLayer
()
const
{
603
return
layers__
;
604
}
605
606
template
<
typename
GUM_SCALAR
>
607
INLINE
double
ClusteredLayerGenerator
<
GUM_SCALAR
>::
getClusterRatio
()
const
{
608
return
cluster_ratio__
;
609
}
610
611
template
<
typename
GUM_SCALAR
>
612
INLINE
void
613
ClusteredLayerGenerator
<
GUM_SCALAR
>::
setClusterRatio
(
double
ratio
) {
614
cluster_ratio__
=
ratio
;
615
}
616
617
}
/* namespace prm */
618
}
/* namespace gum */
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:669
gum::prm::ParamScopeData::ParamScopeData
ParamScopeData(const std::string &s, const PRMReferenceSlot< GUM_SCALAR > &ref, Idx d)
Definition:
PRMClass_tpl.h:1101