aGrUM 3.0.0
a C++ library for (probabilistic) graphical models
gum::prm::ClusteredLayerGenerator< GUM_SCALAR > Class Template Reference

<agrum/PRM/generator/clusteredLayerGenerator.h> More...

#include <clusteredLayerGenerator.h>

Inheritance diagram for gum::prm::ClusteredLayerGenerator< GUM_SCALAR >:
Collaboration diagram for gum::prm::ClusteredLayerGenerator< GUM_SCALAR >:

Classes

struct  MyData

Public Member Functions

Constructors and destructor.
 ClusteredLayerGenerator ()
 Default constructor.
 ClusteredLayerGenerator (const ClusteredLayerGenerator &source)
 Copy constructor.
ClusteredLayerGeneratoroperator= (const ClusteredLayerGenerator &source)
 Copy operator.
virtual ~ClusteredLayerGenerator ()
 Destructor.
Size getDomainSize () const
 Getters and setters.
void setDomainSize (Size s)
 Set the domain size of generated types.
Size getMaxParents () const
 Returns the max number of parents allowed for any attribute or aggregator.
void setMaxParents (Size s)
 Returns the max number of parents allowed for any attribute or aggregator.
double getClusterRatio () const
 Returns the odds of a given class to be replaced by a cluster.
void setClusterRatio (double ratio)
 Define the odds of a given class to be replaced by a cluster.
void setLayers (const std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > &v)
 Defines the structure of each layers.
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > & getLayer ()
 Getters and setters.
const std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > & getLayer () const
 Getters and setters.
virtual PRM< GUM_SCALAR > * generate ()
 Proceeds with the generation of the PRM<GUM_SCALAR>.
void setNameGenerator (const NameGenerator &name_gen)
 Getters and setters.
const NameGeneratorgetNameGenerator () const
 Returns the NameGenerator used by this generator.

Protected Attributes

NameGenerator name_gen_
 The name generator used by this class.

Private Member Functions

std::string _generateType_ (PRMFactory< GUM_SCALAR > &f)
void _generateInterfaces_ (PRMFactory< GUM_SCALAR > &f, std::string_view type, std::vector< MyData > &l)
void _generateClasses_ (PRMFactory< GUM_SCALAR > &f, std::string_view type, std::vector< typename ClusteredLayerGenerator::MyData > &l)
void _generateCluster_ (PRMFactory< GUM_SCALAR > &f, std::string_view type, std::vector< typename ClusteredLayerGenerator::MyData > &l, Size lvl, Set< std::string > &i)
void _generateClass_ (PRMFactory< GUM_SCALAR > &f, std::string_view type, std::vector< typename ClusteredLayerGenerator::MyData > &l, Size lvl, Set< std::string > &i)
void _generateClassDag_ (Size lvl, DAG &dag, Bijection< std::string, NodeId > &names, std::vector< typename ClusteredLayerGenerator::MyData > &l)
void _generateSystem_ (PRMFactory< GUM_SCALAR > &factory, std::vector< typename ClusteredLayerGenerator::MyData > &l)

Private Attributes

std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > _layers_
Size _domain_size_
Size _max_parents_
double _cluster_ratio_
HashTable< std::string, std::vector< std::string > * > _cluster_map_

Detailed Description

template<GUM_Numeric GUM_SCALAR>
class gum::prm::ClusteredLayerGenerator< GUM_SCALAR >

<agrum/PRM/generator/clusteredLayerGenerator.h>

This class generates PRMs with a clustered layer structure.

Definition at line 74 of file clusteredLayerGenerator.h.

Constructor & Destructor Documentation

◆ ClusteredLayerGenerator() [1/2]

template<GUM_Numeric GUM_SCALAR>
gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::ClusteredLayerGenerator ( )

Default constructor.

Definition at line 521 of file clusteredLayerGenerator_tpl.h.

References ClusteredLayerGenerator(), _cluster_ratio_, _domain_size_, _layers_, and _max_parents_.

Referenced by ClusteredLayerGenerator(), ClusteredLayerGenerator(), ~ClusteredLayerGenerator(), and operator=().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ClusteredLayerGenerator() [2/2]

template<GUM_Numeric GUM_SCALAR>
gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::ClusteredLayerGenerator ( const ClusteredLayerGenerator< GUM_SCALAR > & source)

Copy constructor.

Definition at line 527 of file clusteredLayerGenerator_tpl.h.

References ClusteredLayerGenerator(), _domain_size_, _layers_, and _max_parents_.

Here is the call graph for this function:

◆ ~ClusteredLayerGenerator()

template<GUM_Numeric GUM_SCALAR>
gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::~ClusteredLayerGenerator ( )
virtual

Destructor.

Definition at line 535 of file clusteredLayerGenerator_tpl.h.

References ClusteredLayerGenerator().

Here is the call graph for this function:

Member Function Documentation

◆ _generateClass_()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateClass_ ( PRMFactory< GUM_SCALAR > & f,
std::string_view type,
std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData > & l,
Size lvl,
Set< std::string > & i )
private

Definition at line 327 of file clusteredLayerGenerator_tpl.h.

332 {
333 Size size = 0;
334 GUM_SCALAR sum = 0.0;
335 l[lvl].c.push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS));
336 f.startClass(l[lvl].c.back(), "", &i);
337
338 if (lvl) f.addReferenceSlot(l[lvl - 1].i, l[lvl].r, true);
339
340 DAG dag;
343
344 // Adding aggregates
345 if (lvl) {
346 for (const auto& agg: l[lvl].g) {
348 1,
349 std::format("{}.{}", l[lvl].r, l[lvl - 1].a[randomValue(l[lvl - 1].a.size())])),
350 param(1, "1");
351 f.addAggregator(agg, "exists", chain, param);
352 }
353 }
354
355 // Adding attributes
356 for (const auto& attr: l[lvl].a) {
357 f.startAttribute(type, attr, true);
359
360 for (const auto par: dag.parents(names.second(attr))) {
361 f.addParent(names.first(par));
362 size *= f.retrieveClass(l[lvl].c.back()).get(names.first(par)).type()->domainSize();
363 }
364
366
367 for (size_t norms = 0; norms < size; norms += getDomainSize()) {
368 sum = 0.0;
369
370 for (size_t idx = 0; idx < getDomainSize(); ++idx) {
371 val[idx] = 1 + std::rand();
372 sum += val[idx];
373 }
374
375 for (size_t idx = 0; idx < getDomainSize(); ++idx)
376 cpf[norms + idx] = val[idx] / sum;
377 }
378
379 f.setRawCPFByLines(cpf);
380 f.endAttribute();
381 }
382
383 f.endClass();
384 }
void _generateClassDag_(Size lvl, DAG &dag, Bijection< std::string, NodeId > &names, std::vector< typename ClusteredLayerGenerator::MyData > &l)
Size getDomainSize() const
Getters and setters.
NameGenerator name_gen_
The name generator used by this class.
Idx randomValue(const Size max=2)
Returns a random Idx between 0 and max-1 included.

References _generateClassDag_(), gum::prm::PRMFactory< GUM_SCALAR >::addAggregator(), gum::prm::PRMFactory< GUM_SCALAR >::addParent(), gum::prm::PRMFactory< GUM_SCALAR >::addReferenceSlot(), gum::prm::PRMObject::CLASS, gum::prm::PRMFactory< GUM_SCALAR >::endAttribute(), gum::prm::PRMFactory< GUM_SCALAR >::endClass(), gum::BijectionImplementation< T1, T2, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::first(), getDomainSize(), gum::prm::PRMGenerator< GUM_SCALAR >::name_gen_, gum::ArcGraphPart::parents(), gum::randomValue(), gum::prm::PRMFactory< GUM_SCALAR >::retrieveClass(), gum::BijectionImplementation< T1, T2, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::second(), gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByLines(), gum::prm::PRMFactory< GUM_SCALAR >::startAttribute(), and gum::prm::PRMFactory< GUM_SCALAR >::startClass().

Referenced by _generateCluster_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _generateClassDag_()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateClassDag_ ( Size lvl,
DAG & dag,
Bijection< std::string, NodeId > & names,
std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData > & l )
private

Definition at line 387 of file clusteredLayerGenerator_tpl.h.

391 {
392 float density = _layers_[lvl].inner_density;
394 NodeId id = 0;
395
396 if (lvl) {
397 for (std::vector< std::string >::iterator g = l[lvl].g.begin(); g != l[lvl].g.end(); ++g) {
398 id = dag.addNode();
399 names.insert(*g, id);
400 nodes.push_back(id);
401 }
402 }
403
404 for (std::vector< std::string >::iterator a = l[lvl].a.begin(); a != l[lvl].a.end(); ++a) {
405 id = dag.addNode();
406 names.insert(*a, id);
407
408 for (std::vector< NodeId >::iterator prnt = nodes.begin(); prnt != nodes.end(); ++prnt)
409 if (randomProba() < density) dag.addArc(*prnt, names.second(*a));
410
411 nodes.push_back(id);
412 }
413
414 // For each nodes with #parents > _max_parents_ we randomly remove parents
415 // until
416 // #parents <= _max_parents_
417 for (const auto node: dag.nodes()) {
418 if (dag.parents(node).size() > getMaxParents()) {
420
421 for (const auto par: dag.parents(node))
422 v.push_back(par);
423
424 while (dag.parents(node).size() > getMaxParents()) {
425 size_t idx = randomValue(v.size());
426 Arc arc(v[idx], node);
427 GUM_ASSERT(dag.existsArc(arc));
428 dag.eraseArc(arc);
429 v[idx] = v.back();
430 v.pop_back();
431 }
432 }
433 }
434 }
Size getMaxParents() const
Returns the max number of parents allowed for any attribute or aggregator.
double randomProba()
Returns a random double between 0 and 1 included (i.e.

References _layers_, gum::DAG::addArc(), gum::NodeGraphPart::addNode(), gum::ArcGraphPart::eraseArc(), gum::ArcGraphPart::existsArc(), getMaxParents(), gum::BijectionImplementation< T1, T2, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::insert(), gum::NodeGraphPart::nodes(), gum::ArcGraphPart::parents(), gum::randomProba(), gum::randomValue(), gum::BijectionImplementation< T1, T2, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::second(), and gum::Set< Key >::size().

Referenced by _generateClass_(), and _generateCluster_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _generateClasses_()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateClasses_ ( PRMFactory< GUM_SCALAR > & f,
std::string_view type,
std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData > & l )
private

Definition at line 114 of file clusteredLayerGenerator_tpl.h.

117 {
118 // double ratio = getClusterRatio() + RAND_MAX;
120
121 for (Size lvl = 0; lvl < _layers_.size(); ++lvl) {
122 i.insert(l[lvl].i);
123
124 for (Size c = 0; c < _layers_[lvl].c; ++c) {
125 // if (std::rand() < ratio)
127 // else
128 // _generateClass_(f, type, l, lvl, i);
129 }
130
131 i.erase(l[lvl].i);
132 }
133 }
void _generateCluster_(PRMFactory< GUM_SCALAR > &f, std::string_view type, std::vector< typename ClusteredLayerGenerator::MyData > &l, Size lvl, Set< std::string > &i)

References _generateCluster_(), _layers_, and gum::Set< Key >::insert().

Referenced by generate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _generateCluster_()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateCluster_ ( PRMFactory< GUM_SCALAR > & f,
std::string_view type,
std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData > & l,
Size lvl,
Set< std::string > & i )
private

Definition at line 136 of file clusteredLayerGenerator_tpl.h.

141 {
142 Size size = 0;
143 GUM_SCALAR sum = 0.0;
146
147 switch (randomValue(2)) {
148 // Shape A->B
149 // v == [first, second, second.ref -> first]
150 case 0 : {
153 first = l[lvl].c.back();
154 v->push_back(first);
155 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS));
156 f.startClass(v->back());
157 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS_ELT));
158 f.addReferenceSlot(first, v->back(), true);
159 DAG dag;
162
163 // Adding aggregates
164 for (std::vector< std::string >::iterator g = l[lvl].g.begin(); g != l[lvl].g.end();
165 ++g) {
167 1,
168 std::format("{}.{}", v->back(), l[lvl].a[randomValue(l[lvl].a.size())])),
169 param(1, "1");
170 f.addAggregator(*g, "exists", chain, param);
171 }
172
173 // Adding attributes
174 for (std::vector< std::string >::iterator a = l[lvl].a.begin(); a != l[lvl].a.end();
175 ++a) {
176 f.startAttribute(type, *a, true);
178
179 for (const auto par: dag.parents(names.second(*a))) {
180 f.addParent(names.first(par));
181 size *= f.retrieveClass(l[lvl].c.back()).get(names.first(par)).type()->domainSize();
182 }
183
185
186 for (size_t norms = 0; norms < size; norms += getDomainSize()) {
187 sum = 0.0;
188
189 for (size_t idx = 0; idx < getDomainSize(); ++idx) {
190 val[idx] = 1 + std::rand();
191 sum += val[idx];
192 }
193
194 for (size_t idx = 0; idx < getDomainSize(); ++idx)
195 cpf[norms + idx] = val[idx] / sum;
196 }
197
198 f.setRawCPFByLines(cpf);
199 f.endAttribute();
200 }
201
202 f.endClass();
203 break;
204 }
205
206 // Shape A -> B -> C
207 // v == [first, second, second.ref -> first, third, third.ref -> second]
208 case 1 : {
211 {
212 first = l[lvl].c.back();
213 v->push_back(first);
214 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS));
215 second = v->back();
216 f.startClass(second);
217 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS_ELT));
218 f.addReferenceSlot(first, v->back(), true);
219 DAG dag;
222
223 // Adding aggregates
224 for (std::vector< std::string >::iterator g = l[lvl].g.begin(); g != l[lvl].g.end();
225 ++g) {
227 1,
228 std::format("{}.{}", v->back(), l[lvl].a[randomValue(l[lvl].a.size())])),
229 param(1, "1");
230 f.addAggregator(*g, "exists", chain, param);
231 }
232
233 // Adding attributes
234 for (std::vector< std::string >::iterator a = l[lvl].a.begin(); a != l[lvl].a.end();
235 ++a) {
236 f.startAttribute(type, *a, true);
238
239 for (const auto par: dag.parents(names.second(*a))) {
240 f.addParent(names.first(par));
241 size *= f.retrieveClass(l[lvl].c.back()).get(names.first(par)).type()->domainSize();
242 }
243
245
246 for (size_t norms = 0; norms < size; norms += getDomainSize()) {
247 sum = 0.0;
248
249 for (size_t idx = 0; idx < getDomainSize(); ++idx) {
250 val[idx] = 1 + std::rand();
251 sum += val[idx];
252 }
253
254 for (size_t idx = 0; idx < getDomainSize(); ++idx)
255 cpf[norms + idx] = val[idx] / sum;
256 }
257
258 f.setRawCPFByLines(cpf);
259 f.endAttribute();
260 }
261
262 f.endClass();
263 }
264 {
265 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS));
266 third = v->back();
267 f.startClass(third);
268 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS_ELT));
269 f.addReferenceSlot(second, v->back(), true);
270 DAG dag;
273
274 // Adding aggregates
275 for (std::vector< std::string >::iterator g = l[lvl].g.begin(); g != l[lvl].g.end();
276 ++g) {
278 1,
279 std::format("{}.{}", v->back(), l[lvl].a[randomValue(l[lvl].a.size())])),
280 param(1, "1");
281 f.addAggregator(*g, "exists", chain, param);
282 }
283
284 // Adding attributes
285 for (std::vector< std::string >::iterator a = l[lvl].a.begin(); a != l[lvl].a.end();
286 ++a) {
287 f.startAttribute(type, *a, true);
289
290 for (const auto par: dag.parents(names.second(*a))) {
291 f.addParent(names.first(par));
292 size *= f.retrieveClass(l[lvl].c.back()).get(names.first(par)).type()->domainSize();
293 }
294
296
297 for (size_t norms = 0; norms < size; norms += getDomainSize()) {
298 sum = 0.0;
299
300 for (size_t idx = 0; idx < getDomainSize(); ++idx) {
301 val[idx] = 1 + std::rand();
302 sum += val[idx];
303 }
304
305 for (size_t idx = 0; idx < getDomainSize(); ++idx)
306 cpf[norms + idx] = val[idx] / sum;
307 }
308
309 f.setRawCPFByLines(cpf);
310 f.endAttribute();
311 }
312
313 f.endClass();
314 }
315 break;
316 }
317
318 default : {
319 GUM_ERROR(OperationNotAllowed, "unexpected value")
320 }
321 }
322
323 _cluster_map_.insert(first, v);
324 }
void _generateClass_(PRMFactory< GUM_SCALAR > &f, std::string_view type, std::vector< typename ClusteredLayerGenerator::MyData > &l, Size lvl, Set< std::string > &i)
HashTable< std::string, std::vector< std::string > * > _cluster_map_
#define GUM_ERROR(type, msg)
Definition exceptions.h:76

References _cluster_map_, _generateClass_(), _generateClassDag_(), gum::prm::PRMFactory< GUM_SCALAR >::addAggregator(), gum::prm::PRMFactory< GUM_SCALAR >::addParent(), gum::prm::PRMFactory< GUM_SCALAR >::addReferenceSlot(), gum::prm::PRMObject::CLASS, gum::prm::PRMObject::CLASS_ELT, gum::prm::PRMFactory< GUM_SCALAR >::endAttribute(), gum::prm::PRMFactory< GUM_SCALAR >::endClass(), gum::BijectionImplementation< T1, T2, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::first(), getDomainSize(), GUM_ERROR, gum::prm::PRMGenerator< GUM_SCALAR >::name_gen_, gum::ArcGraphPart::parents(), gum::randomValue(), gum::prm::PRMFactory< GUM_SCALAR >::retrieveClass(), gum::BijectionImplementation< T1, T2, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::second(), gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByLines(), gum::prm::PRMFactory< GUM_SCALAR >::startAttribute(), and gum::prm::PRMFactory< GUM_SCALAR >::startClass().

Referenced by _generateClasses_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _generateInterfaces_()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateInterfaces_ ( PRMFactory< GUM_SCALAR > & f,
std::string_view type,
std::vector< MyData > & l )
private

Definition at line 85 of file clusteredLayerGenerator_tpl.h.

88 {
89 for (Size lvl = 0; lvl < _layers_.size(); ++lvl) {
92 f.startInterface(l[lvl].i);
93
94 for (Size a = 0; a < _layers_[lvl].a; ++a) {
95 l[lvl].a.push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS_ELT));
96 f.addAttribute(type, l[lvl].a.back());
97 }
98
99 if (lvl) {
100 for (Size g = 0; g < _layers_[lvl].g; ++g) {
101 l[lvl].g.push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS_ELT));
102 f.addAttribute("boolean", l[lvl].g.back());
103 }
104
105 l[lvl].r = this->name_gen_.nextName(PRMObject::prm_type::CLASS_ELT);
106 f.addReferenceSlot(l[lvl - 1].i, l[lvl].r, true);
107 }
108
109 f.endInterface();
110 }
111 }

References _layers_, gum::prm::PRMFactory< GUM_SCALAR >::addAttribute(), gum::prm::PRMFactory< GUM_SCALAR >::addReferenceSlot(), gum::prm::PRMObject::CLASS_ELT, gum::prm::PRMFactory< GUM_SCALAR >::endInterface(), gum::prm::PRMGenerator< GUM_SCALAR >::name_gen_, gum::prm::PRMObject::PRM_INTERFACE, and gum::prm::PRMFactory< GUM_SCALAR >::startInterface().

Referenced by generate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _generateSystem_()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateSystem_ ( PRMFactory< GUM_SCALAR > & factory,
std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData > & l )
private

Definition at line 437 of file clusteredLayerGenerator_tpl.h.

439 {
440 factory.startSystem(this->name_gen_.nextName(PRMObject::prm_type::SYSTEM));
444 size_t idx = 0;
445
446 for (size_t lvl = 0; lvl < _layers_.size(); ++lvl) {
447 float density = _layers_[lvl].outter_density;
448
449 for (size_t count = 0; count < _layers_[lvl].o; ++count) {
450 c = l[lvl].c[randomValue(l[lvl].c.size())];
451
452 if (_cluster_map_.exists(c)) {
453 v = _cluster_map_[c];
454
455 switch (v->size()) {
456 case 3 : {
458 factory.addInstance(c, first);
460 factory.addInstance(v->at(1), second);
461 factory.setReferenceSlot(std::format("{}.{}", second, v->at(2)), first);
462 break;
463 }
464
465 case 5 : {
467 factory.addInstance(c, first);
469 factory.addInstance(v->at(1), second);
470 factory.setReferenceSlot(std::format("{}.{}", second, v->at(2)), first);
472 factory.addInstance(v->at(3), third);
473 factory.setReferenceSlot(std::format("{}.{}", third, v->at(4)), second);
474 break;
475 }
476
477 default : {
478 GUM_ERROR(OperationNotAllowed, "unexpected vector size")
479 }
480 }
481
482 // _cluster_map_.erase(c);
483 // delete v;
484 name = first;
485 } else {
487 factory.addInstance(c, name);
488 }
489
490 o[lvl].push_back(name);
491
492 if (lvl) {
493 std::string chain = std::format("{}.{}", name, l[lvl].r);
495
497 iter != o[lvl - 1].end();
498 ++iter)
499 if (randomProba() <= density) ref2add.push_back(*iter);
500
501 if (ref2add.empty())
502 factory.setReferenceSlot(chain, o[lvl - 1][randomValue(o[lvl - 1].size())]);
503
504 while (ref2add.size() > getMaxParents()) {
505 idx = randomValue(ref2add.size());
506 ref2add[idx] = ref2add.back();
507 ref2add.pop_back();
508 }
509
511 ++iter)
512 factory.setReferenceSlot(chain, *iter);
513 }
514 }
515 }
516
517 factory.endSystem();
518 }

References _cluster_map_, _layers_, gum::prm::PRMFactory< GUM_SCALAR >::addInstance(), gum::prm::PRMFactory< GUM_SCALAR >::endSystem(), getMaxParents(), GUM_ERROR, gum::prm::PRMObject::INSTANCE, gum::prm::PRMGenerator< GUM_SCALAR >::name_gen_, gum::randomProba(), gum::randomValue(), gum::prm::PRMFactory< GUM_SCALAR >::setReferenceSlot(), gum::prm::PRMFactory< GUM_SCALAR >::startSystem(), and gum::prm::PRMObject::SYSTEM.

Referenced by generate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _generateType_()

template<GUM_Numeric GUM_SCALAR>
std::string gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateType_ ( PRMFactory< GUM_SCALAR > & f)
private

Definition at line 72 of file clusteredLayerGenerator_tpl.h.

72 {
74 factory.startDiscreteType(name);
75
76 for (Size i = 0; i < _domain_size_; ++i) {
77 factory.addLabel(std::to_string(i));
78 }
79
80 factory.endDiscreteType();
81 return name;
82 }

References _domain_size_, gum::prm::PRMFactory< GUM_SCALAR >::addLabel(), gum::prm::PRMFactory< GUM_SCALAR >::endDiscreteType(), gum::prm::PRMGenerator< GUM_SCALAR >::name_gen_, gum::prm::PRMFactory< GUM_SCALAR >::startDiscreteType(), and gum::prm::PRMObject::TYPE.

Referenced by generate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ generate()

template<GUM_Numeric GUM_SCALAR>
PRM< GUM_SCALAR > * gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::generate ( )
virtual

Proceeds with the generation of the PRM<GUM_SCALAR>.

Implements gum::prm::PRMGenerator< GUM_SCALAR >.

Definition at line 56 of file clusteredLayerGenerator_tpl.h.

56 {
57 if (_layers_.size() == 0) {
58 GUM_ERROR(OperationNotAllowed, "cannot generate a layered PRM<GUM_SCALAR> without layers")
59 }
60
67 return factory.prm();
68 }
void _generateSystem_(PRMFactory< GUM_SCALAR > &factory, std::vector< typename ClusteredLayerGenerator::MyData > &l)
std::string _generateType_(PRMFactory< GUM_SCALAR > &f)
void _generateClasses_(PRMFactory< GUM_SCALAR > &f, std::string_view type, std::vector< typename ClusteredLayerGenerator::MyData > &l)
void _generateInterfaces_(PRMFactory< GUM_SCALAR > &f, std::string_view type, std::vector< MyData > &l)

References _generateClasses_(), _generateInterfaces_(), _generateSystem_(), _generateType_(), _layers_, GUM_ERROR, and gum::prm::PRMFactory< GUM_SCALAR >::prm().

Here is the call graph for this function:

◆ getClusterRatio()

template<GUM_Numeric GUM_SCALAR>
double gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::getClusterRatio ( ) const

Returns the odds of a given class to be replaced by a cluster.

Definition at line 587 of file clusteredLayerGenerator_tpl.h.

587 {
588 return _cluster_ratio_;
589 }

References _cluster_ratio_.

◆ getDomainSize()

template<GUM_Numeric GUM_SCALAR>
Size gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::getDomainSize ( ) const

Getters and setters.

Returns the domain size of generated types.

Definition at line 549 of file clusteredLayerGenerator_tpl.h.

549 {
550 return _domain_size_;
551 }

References _domain_size_.

Referenced by _generateClass_(), and _generateCluster_().

Here is the caller graph for this function:

◆ getLayer() [1/2]

template<GUM_Numeric GUM_SCALAR>
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > & gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::getLayer ( )

Getters and setters.

Returns the domain size of generated types.

Definition at line 576 of file clusteredLayerGenerator_tpl.h.

576 {
577 return _layers_;
578 }

References _layers_.

◆ getLayer() [2/2]

template<GUM_Numeric GUM_SCALAR>
const std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > & gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::getLayer ( ) const

Getters and setters.

Returns the domain size of generated types.

Definition at line 582 of file clusteredLayerGenerator_tpl.h.

582 {
583 return _layers_;
584 }

References _layers_.

◆ getMaxParents()

template<GUM_Numeric GUM_SCALAR>
Size gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::getMaxParents ( ) const

Returns the max number of parents allowed for any attribute or aggregator.

Definition at line 559 of file clusteredLayerGenerator_tpl.h.

559 {
560 return _max_parents_;
561 }

References _max_parents_.

Referenced by _generateClassDag_(), and _generateSystem_().

Here is the caller graph for this function:

◆ getNameGenerator()

template<GUM_Numeric GUM_SCALAR>
const NameGenerator & gum::prm::PRMGenerator< GUM_SCALAR >::getNameGenerator ( ) const
inherited

Returns the NameGenerator used by this generator.

Definition at line 77 of file PRMGenerator_tpl.h.

77 {
78 return name_gen_;
79 }

References name_gen_.

◆ operator=()

template<GUM_Numeric GUM_SCALAR>
ClusteredLayerGenerator< GUM_SCALAR > & gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::operator= ( const ClusteredLayerGenerator< GUM_SCALAR > & source)

Copy operator.

Definition at line 540 of file clusteredLayerGenerator_tpl.h.

541 {
545 return *this;
546 }

References ClusteredLayerGenerator(), _domain_size_, _layers_, and _max_parents_.

Here is the call graph for this function:

◆ setClusterRatio()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::setClusterRatio ( double ratio)

Define the odds of a given class to be replaced by a cluster.

Definition at line 592 of file clusteredLayerGenerator_tpl.h.

592 {
594 }

References _cluster_ratio_.

◆ setDomainSize()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::setDomainSize ( Size s)

Set the domain size of generated types.

Definition at line 554 of file clusteredLayerGenerator_tpl.h.

554 {
556 }

References _domain_size_.

◆ setLayers()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::setLayers ( const std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > & v)

Defines the structure of each layers.

Each value in v defines a layer, were v[i].first is the number of different classes in the i-th layer and v[i].second is the number of instances in the i-th layer.

Parameters
vA vector describing each layer.

Definition at line 569 of file clusteredLayerGenerator_tpl.h.

570 {
571 _layers_ = v;
572 }

References _layers_.

◆ setMaxParents()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::setMaxParents ( Size s)

Returns the max number of parents allowed for any attribute or aggregator.

Definition at line 564 of file clusteredLayerGenerator_tpl.h.

564 {
566 }

References _max_parents_.

◆ setNameGenerator()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::PRMGenerator< GUM_SCALAR >::setNameGenerator ( const NameGenerator & name_gen)
inherited

Getters and setters.

Defines the NameGenerator used by this generator.

Definition at line 72 of file PRMGenerator_tpl.h.

72 {
74 }
This class is the base class to all PRM generators.

References name_gen_.

Member Data Documentation

◆ _cluster_map_

template<GUM_Numeric GUM_SCALAR>
HashTable< std::string, std::vector< std::string >* > gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_cluster_map_
private

Definition at line 138 of file clusteredLayerGenerator.h.

Referenced by _generateCluster_(), and _generateSystem_().

◆ _cluster_ratio_

template<GUM_Numeric GUM_SCALAR>
double gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_cluster_ratio_
private

◆ _domain_size_

template<GUM_Numeric GUM_SCALAR>
Size gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_domain_size_
private

◆ _layers_

template<GUM_Numeric GUM_SCALAR>
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_layers_
private

◆ _max_parents_

template<GUM_Numeric GUM_SCALAR>
Size gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_max_parents_
private

◆ name_gen_


The documentation for this class was generated from the following files: