aGrUM 2.3.2
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, const std::string &type, std::vector< MyData > &l)
void _generateClasses_ (PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< typename ClusteredLayerGenerator::MyData > &l)
void _generateCluster_ (PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< typename ClusteredLayerGenerator::MyData > &l, Size lvl, Set< std::string > &i)
void _generateClass_ (PRMFactory< GUM_SCALAR > &f, const std::string &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<typename 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 72 of file clusteredLayerGenerator.h.

Constructor & Destructor Documentation

◆ ClusteredLayerGenerator() [1/2]

template<typename GUM_SCALAR>
INLINE gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::ClusteredLayerGenerator ( )

Default constructor.

Definition at line 522 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<typename GUM_SCALAR>
INLINE gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::ClusteredLayerGenerator ( const ClusteredLayerGenerator< GUM_SCALAR > & source)

Copy constructor.

Definition at line 528 of file clusteredLayerGenerator_tpl.h.

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

Here is the call graph for this function:

◆ ~ClusteredLayerGenerator()

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

Destructor.

Definition at line 536 of file clusteredLayerGenerator_tpl.h.

References ClusteredLayerGenerator().

Here is the call graph for this function:

Member Function Documentation

◆ _generateClass_()

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

Definition at line 323 of file clusteredLayerGenerator_tpl.h.

328 {
329 Size size = 0;
330 GUM_SCALAR sum = 0.0;
331 l[lvl].c.push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS));
332 f.startClass(l[lvl].c.back(), "", &i);
333
334 if (lvl) f.addReferenceSlot(l[lvl - 1].i, l[lvl].r, true);
335
336 DAG dag;
339
340 // Adding aggregates
341 if (lvl) {
342 for (const auto& agg: l[lvl].g) {
344 s << l[lvl].r << "." << l[lvl - 1].a[randomValue(l[lvl - 1].a.size())];
345 std::vector< std::string > chain(1, s.str()), param(1, "1");
346 f.addAggregator(agg, "exists", chain, param);
347 }
348 }
349
350 // Adding attributes
351 for (const auto& attr: l[lvl].a) {
352 f.startAttribute(type, attr, true);
354
355 for (const auto par: dag.parents(names.second(attr))) {
356 f.addParent(names.first(par));
357 size *= f.retrieveClass(l[lvl].c.back()).get(names.first(par)).type()->domainSize();
358 }
359
361
362 for (size_t norms = 0; norms < size; norms += getDomainSize()) {
363 sum = 0.0;
364
365 for (size_t idx = 0; idx < getDomainSize(); ++idx) {
366 val[idx] = 1 + std::rand();
367 sum += val[idx];
368 }
369
370 for (size_t idx = 0; idx < getDomainSize(); ++idx)
371 cpf[norms + idx] = val[idx] / sum;
372 }
373
374 f.setRawCPFByLines(cpf);
375 f.endAttribute();
376 }
377
378 f.endClass();
379 }
Size getDomainSize() const
Getters and setters.
void _generateClassDag_(Size lvl, DAG &dag, Bijection< std::string, NodeId > &names, std::vector< typename ClusteredLayerGenerator::MyData > &l)
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<typename 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 382 of file clusteredLayerGenerator_tpl.h.

386 {
387 float density = _layers_[lvl].inner_density;
389 NodeId id = 0;
390
391 if (lvl) {
392 for (std::vector< std::string >::iterator g = l[lvl].g.begin(); g != l[lvl].g.end(); ++g) {
393 id = dag.addNode();
394 names.insert(*g, id);
395 nodes.push_back(id);
396 }
397 }
398
399 for (std::vector< std::string >::iterator a = l[lvl].a.begin(); a != l[lvl].a.end(); ++a) {
400 id = dag.addNode();
401 names.insert(*a, id);
402
403 for (std::vector< NodeId >::iterator prnt = nodes.begin(); prnt != nodes.end(); ++prnt)
404 if (randomProba() < density) dag.addArc(*prnt, names.second(*a));
405
406 nodes.push_back(id);
407 }
408
409 // For each nodes with #parents > _max_parents_ we randomly remove parents
410 // until
411 // #parents <= _max_parents_
412 for (const auto node: dag.nodes()) {
413 if (dag.parents(node).size() > getMaxParents()) {
415
416 for (const auto par: dag.parents(node))
417 v.push_back(par);
418
419 while (dag.parents(node).size() > getMaxParents()) {
420 size_t idx = randomValue(v.size());
421 Arc arc(v[idx], node);
422 GUM_ASSERT(dag.existsArc(arc));
423 dag.eraseArc(arc);
424 v[idx] = v.back();
425 v.pop_back();
426 }
427 }
428 }
429 }
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<typename GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateClasses_ ( PRMFactory< GUM_SCALAR > & f,
const std::string & type,
std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData > & l )
private

Definition at line 113 of file clusteredLayerGenerator_tpl.h.

116 {
117 // double ratio = getClusterRatio() + RAND_MAX;
119
120 for (Size lvl = 0; lvl < _layers_.size(); ++lvl) {
121 i.insert(l[lvl].i);
122
123 for (Size c = 0; c < _layers_[lvl].c; ++c) {
124 // if (std::rand() < ratio)
126 // else
127 // _generateClass_(f, type, l, lvl, i);
128 }
129
130 i.erase(l[lvl].i);
131 }
132 }
void _generateCluster_(PRMFactory< GUM_SCALAR > &f, const std::string &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<typename GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateCluster_ ( PRMFactory< GUM_SCALAR > & f,
const std::string & type,
std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData > & l,
Size lvl,
Set< std::string > & i )
private

Definition at line 135 of file clusteredLayerGenerator_tpl.h.

140 {
141 Size size = 0;
142 GUM_SCALAR sum = 0.0;
145
146 switch (randomValue(2)) {
147 // Shape A->B
148 // v == [first, second, second.ref -> first]
149 case 0 : {
152 first = l[lvl].c.back();
153 v->push_back(first);
154 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS));
155 f.startClass(v->back());
156 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS_ELT));
157 f.addReferenceSlot(first, v->back(), true);
158 DAG dag;
161
162 // Adding aggregates
163 for (std::vector< std::string >::iterator g = l[lvl].g.begin(); g != l[lvl].g.end();
164 ++g) {
166 s << v->back() << "." << l[lvl].a[randomValue(l[lvl].a.size())];
167 std::vector< std::string > chain(1, s.str()), param(1, "1");
168 f.addAggregator(*g, "exists", chain, param);
169 }
170
171 // Adding attributes
172 for (std::vector< std::string >::iterator a = l[lvl].a.begin(); a != l[lvl].a.end();
173 ++a) {
174 f.startAttribute(type, *a, true);
176
177 for (const auto par: dag.parents(names.second(*a))) {
178 f.addParent(names.first(par));
179 size *= f.retrieveClass(l[lvl].c.back()).get(names.first(par)).type()->domainSize();
180 }
181
183
184 for (size_t norms = 0; norms < size; norms += getDomainSize()) {
185 sum = 0.0;
186
187 for (size_t idx = 0; idx < getDomainSize(); ++idx) {
188 val[idx] = 1 + std::rand();
189 sum += val[idx];
190 }
191
192 for (size_t idx = 0; idx < getDomainSize(); ++idx)
193 cpf[norms + idx] = val[idx] / sum;
194 }
195
196 f.setRawCPFByLines(cpf);
197 f.endAttribute();
198 }
199
200 f.endClass();
201 break;
202 }
203
204 // Shape A -> B -> C
205 // v == [first, second, second.ref -> first, third, third.ref -> second]
206 case 1 : {
209 {
210 first = l[lvl].c.back();
211 v->push_back(first);
212 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS));
213 second = v->back();
214 f.startClass(second);
215 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS_ELT));
216 f.addReferenceSlot(first, v->back(), true);
217 DAG dag;
220
221 // Adding aggregates
222 for (std::vector< std::string >::iterator g = l[lvl].g.begin(); g != l[lvl].g.end();
223 ++g) {
225 s << v->back() << "." << l[lvl].a[randomValue(l[lvl].a.size())];
226 std::vector< std::string > chain(1, s.str()), param(1, "1");
227 f.addAggregator(*g, "exists", chain, param);
228 }
229
230 // Adding attributes
231 for (std::vector< std::string >::iterator a = l[lvl].a.begin(); a != l[lvl].a.end();
232 ++a) {
233 f.startAttribute(type, *a, true);
235
236 for (const auto par: dag.parents(names.second(*a))) {
237 f.addParent(names.first(par));
238 size *= f.retrieveClass(l[lvl].c.back()).get(names.first(par)).type()->domainSize();
239 }
240
242
243 for (size_t norms = 0; norms < size; norms += getDomainSize()) {
244 sum = 0.0;
245
246 for (size_t idx = 0; idx < getDomainSize(); ++idx) {
247 val[idx] = 1 + std::rand();
248 sum += val[idx];
249 }
250
251 for (size_t idx = 0; idx < getDomainSize(); ++idx)
252 cpf[norms + idx] = val[idx] / sum;
253 }
254
255 f.setRawCPFByLines(cpf);
256 f.endAttribute();
257 }
258
259 f.endClass();
260 }
261 {
262 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS));
263 third = v->back();
264 f.startClass(third);
265 v->push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS_ELT));
266 f.addReferenceSlot(second, v->back(), true);
267 DAG dag;
270
271 // Adding aggregates
272 for (std::vector< std::string >::iterator g = l[lvl].g.begin(); g != l[lvl].g.end();
273 ++g) {
275 s << v->back() << "." << l[lvl].a[randomValue(l[lvl].a.size())];
276 std::vector< std::string > chain(1, s.str()), param(1, "1");
277 f.addAggregator(*g, "exists", chain, param);
278 }
279
280 // Adding attributes
281 for (std::vector< std::string >::iterator a = l[lvl].a.begin(); a != l[lvl].a.end();
282 ++a) {
283 f.startAttribute(type, *a, true);
285
286 for (const auto par: dag.parents(names.second(*a))) {
287 f.addParent(names.first(par));
288 size *= f.retrieveClass(l[lvl].c.back()).get(names.first(par)).type()->domainSize();
289 }
290
292
293 for (size_t norms = 0; norms < size; norms += getDomainSize()) {
294 sum = 0.0;
295
296 for (size_t idx = 0; idx < getDomainSize(); ++idx) {
297 val[idx] = 1 + std::rand();
298 sum += val[idx];
299 }
300
301 for (size_t idx = 0; idx < getDomainSize(); ++idx)
302 cpf[norms + idx] = val[idx] / sum;
303 }
304
305 f.setRawCPFByLines(cpf);
306 f.endAttribute();
307 }
308
309 f.endClass();
310 }
311 break;
312 }
313
314 default : {
315 GUM_ERROR(OperationNotAllowed, "unexpected value")
316 }
317 }
318
319 _cluster_map_.insert(first, v);
320 }
void _generateClass_(PRMFactory< GUM_SCALAR > &f, const std::string &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:72

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<typename GUM_SCALAR>
void gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateInterfaces_ ( PRMFactory< GUM_SCALAR > & f,
const std::string & type,
std::vector< MyData > & l )
private

Definition at line 84 of file clusteredLayerGenerator_tpl.h.

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

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<typename 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 432 of file clusteredLayerGenerator_tpl.h.

434 {
435 factory.startSystem(this->name_gen_.nextName(PRMObject::prm_type::SYSTEM));
439 size_t idx = 0;
440
441 for (size_t lvl = 0; lvl < _layers_.size(); ++lvl) {
442 float density = _layers_[lvl].outter_density;
443
444 for (size_t count = 0; count < _layers_[lvl].o; ++count) {
445 c = l[lvl].c[randomValue(l[lvl].c.size())];
446
447 if (_cluster_map_.exists(c)) {
448 v = _cluster_map_[c];
449
450 switch (v->size()) {
451 case 3 : {
453 factory.addInstance(c, first);
455 factory.addInstance(v->at(1), second);
457 chain << second << "." << v->at(2);
458 factory.setReferenceSlot(chain.str(), first);
459 break;
460 }
461
462 case 5 : {
464 factory.addInstance(c, first);
466 factory.addInstance(v->at(1), second);
468 chain_1 << second << "." << v->at(2);
469 factory.setReferenceSlot(chain_1.str(), first);
471 factory.addInstance(v->at(3), third);
472 chain_2 << third << "." << v->at(4);
473 factory.setReferenceSlot(chain_2.str(), 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) {
494 chain << name << "." << l[lvl].r;
496
498 iter != o[lvl - 1].end();
499 ++iter)
500 if (randomProba() <= density) ref2add.push_back(*iter);
501
502 if (ref2add.empty())
503 factory.setReferenceSlot(chain.str(), o[lvl - 1][randomValue(o[lvl - 1].size())]);
504
505 while (ref2add.size() > getMaxParents()) {
506 idx = randomValue(ref2add.size());
507 ref2add[idx] = ref2add.back();
508 ref2add.pop_back();
509 }
510
512 ++iter)
513 factory.setReferenceSlot(chain.str(), *iter);
514 }
515 }
516 }
517
518 factory.endSystem();
519 }

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<typename GUM_SCALAR>
std::string gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::_generateType_ ( PRMFactory< GUM_SCALAR > & f)
private

Definition at line 69 of file clusteredLayerGenerator_tpl.h.

69 {
71 factory.startDiscreteType(name);
72
73 for (Size i = 0; i < _domain_size_; ++i) {
75 sBuff << i;
76 factory.addLabel(sBuff.str());
77 }
78
79 factory.endDiscreteType();
80 return name;
81 }

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<typename 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 53 of file clusteredLayerGenerator_tpl.h.

53 {
54 if (_layers_.size() == 0) {
55 GUM_ERROR(OperationNotAllowed, "cannot generate a layered PRM<GUM_SCALAR> without layers")
56 }
57
64 return factory.prm();
65 }
void _generateClasses_(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< typename ClusteredLayerGenerator::MyData > &l)
void _generateSystem_(PRMFactory< GUM_SCALAR > &factory, std::vector< typename ClusteredLayerGenerator::MyData > &l)
std::string _generateType_(PRMFactory< GUM_SCALAR > &f)
void _generateInterfaces_(PRMFactory< GUM_SCALAR > &f, const std::string &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<typename GUM_SCALAR>
INLINE double gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::getClusterRatio ( ) const

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

Definition at line 588 of file clusteredLayerGenerator_tpl.h.

588 {
589 return _cluster_ratio_;
590 }

References _cluster_ratio_.

◆ getDomainSize()

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

Getters and setters.

Returns the domain size of generated types.

Definition at line 550 of file clusteredLayerGenerator_tpl.h.

550 {
551 return _domain_size_;
552 }

References _domain_size_.

Referenced by _generateClass_(), and _generateCluster_().

Here is the caller graph for this function:

◆ getLayer() [1/2]

template<typename GUM_SCALAR>
INLINE 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 577 of file clusteredLayerGenerator_tpl.h.

577 {
578 return _layers_;
579 }

References _layers_.

◆ getLayer() [2/2]

template<typename GUM_SCALAR>
INLINE 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 583 of file clusteredLayerGenerator_tpl.h.

583 {
584 return _layers_;
585 }

References _layers_.

◆ getMaxParents()

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

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

Definition at line 560 of file clusteredLayerGenerator_tpl.h.

560 {
561 return _max_parents_;
562 }

References _max_parents_.

Referenced by _generateClassDag_(), and _generateSystem_().

Here is the caller graph for this function:

◆ getNameGenerator()

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

Returns the NameGenerator used by this generator.

Definition at line 76 of file PRMGenerator_tpl.h.

76 {
77 return name_gen_;
78 }

References name_gen_.

◆ operator=()

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

Copy operator.

Definition at line 541 of file clusteredLayerGenerator_tpl.h.

542 {
546 return *this;
547 }

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

Here is the call graph for this function:

◆ setClusterRatio()

template<typename GUM_SCALAR>
INLINE 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 593 of file clusteredLayerGenerator_tpl.h.

593 {
595 }

References _cluster_ratio_.

◆ setDomainSize()

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

Set the domain size of generated types.

Definition at line 555 of file clusteredLayerGenerator_tpl.h.

555 {
557 }

References _domain_size_.

◆ setLayers()

template<typename GUM_SCALAR>
INLINE 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 570 of file clusteredLayerGenerator_tpl.h.

571 {
572 _layers_ = v;
573 }

References _layers_.

◆ setMaxParents()

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

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

Definition at line 565 of file clusteredLayerGenerator_tpl.h.

565 {
567 }

References _max_parents_.

◆ setNameGenerator()

template<typename GUM_SCALAR>
INLINE 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 71 of file PRMGenerator_tpl.h.

71 {
73 }
This class is the base class to all PRM generators.

References name_gen_.

Member Data Documentation

◆ _cluster_map_

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

Definition at line 136 of file clusteredLayerGenerator.h.

Referenced by _generateCluster_(), and _generateSystem_().

◆ _cluster_ratio_

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

◆ _domain_size_

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

◆ _layers_

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

◆ _max_parents_

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

◆ name_gen_


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