aGrUM  0.20.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 >:

Public Member Functions

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

Protected Attributes

NameGenerator name_gen_
 The name generator used by this class. More...
 

Classes

struct  MyData
 

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 56 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 532 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

532  :
533  layers__(), domain_size__(2), max_parents__(INT_MAX),
534  cluster_ratio__(0.0) {
535  GUM_CONSTRUCTOR(ClusteredLayerGenerator);
536  }
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
+ Here is the call 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 539 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

540  :
541  layers__(source.layers__),
542  domain_size__(source.domain_size__), max_parents__(source.max_parents__) {
543  GUM_CONS_CPY(ClusteredLayerGenerator);
544  }
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
+ 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 547 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

547  {
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  }
+ Here is the call graph for this function:

Member Function Documentation

◆ 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 33 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

33  {
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  }
void generateInterfaces__(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< MyData > &l)
std::string generateType__(PRMFactory< GUM_SCALAR > &f)
void generateSystem__(PRMFactory< GUM_SCALAR > &factory, std::vector< typename ClusteredLayerGenerator::MyData > &l)
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
void generateClasses__(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< typename ClusteredLayerGenerator::MyData > &l)
#define GUM_ERROR(type, msg)
Definition: exceptions.h:54
+ Here is the call graph for this function:

◆ 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 321 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

326  {
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;
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  }
const T2 & second(const T1 &first) const
Returns the second value of a pair given its first value.
void generateClassDag__(Size lvl, DAG &dag, Bijection< std::string, NodeId > &names, std::vector< typename ClusteredLayerGenerator::MyData > &l)
const T1 & first(const T2 &second) const
Returns the first value of a pair given its second value.
std::string nextName(PRMObject::prm_type type)
Getters and setters.
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:47
NameGenerator name_gen_
The name generator used by this class.
Definition: PRMGenerator.h:80
Size getDomainSize() const
Getters and setters.
+ Here is the call 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 383 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

387  {
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  }
void insert(const T1 &first, const T2 &second)
Inserts a new association in the gum::Bijection.
Size getMaxParents() const
Returns the max number of parents allowed for any attribute or aggregator.
const T2 & second(const T1 &first) const
Returns the second value of a pair given its first value.
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
Size NodeId
Type for node ids.
Definition: graphElements.h:97
+ Here is the call 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 96 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

99  {
100  // double ratio = getClusterRatio() + RAND_MAX;
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  }
void generateCluster__(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< typename ClusteredLayerGenerator::MyData > &l, Size lvl, Set< std::string > &i)
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:47
void insert(const Key &k)
Inserts a new element into the set.
Definition: set_tpl.h:632
+ Here is the call 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 118 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

123  {
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());
140  f.addReferenceSlot(first, v->back(), true);
141  DAG dag;
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);
204  f.addReferenceSlot(first, v->back(), true);
205  DAG dag;
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);
259  f.addReferenceSlot(second, v->back(), true);
260  DAG dag;
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  }
const T2 & second(const T1 &first) const
Returns the second value of a pair given its first value.
void generateClassDag__(Size lvl, DAG &dag, Bijection< std::string, NodeId > &names, std::vector< typename ClusteredLayerGenerator::MyData > &l)
const T1 & first(const T2 &second) const
Returns the first value of a pair given its second value.
void generateClass__(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< typename ClusteredLayerGenerator::MyData > &l, Size lvl, Set< std::string > &i)
std::string nextName(PRMObject::prm_type type)
Getters and setters.
HashTable< std::string, std::vector< std::string > *> cluster_map__
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:47
NameGenerator name_gen_
The name generator used by this class.
Definition: PRMGenerator.h:80
value_type & insert(const Key &key, const Val &val)
Adds a new element (actually a copy of this element) into the hash table.
Size getDomainSize() const
Getters and setters.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:54
+ Here is the call 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 65 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

68  {
69  for (Size lvl = 0; lvl < layers__.size(); ++lvl) {
70  l.push_back(ClusteredLayerGenerator< GUM_SCALAR >::MyData());
72  f.startInterface(l[lvl].i);
73 
74  for (Size a = 0; a < layers__[lvl].a; ++a) {
75  l[lvl].a.push_back(
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(
84  f.addAttribute("boolean", l[lvl].g.back());
85  }
86 
88  f.addReferenceSlot(l[lvl - 1].i, l[lvl].r, true);
89  }
90 
91  f.endInterface();
92  }
93  }
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
std::string nextName(PRMObject::prm_type type)
Getters and setters.
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:47
NameGenerator name_gen_
The name generator used by this class.
Definition: PRMGenerator.h:80
+ Here is the call 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 439 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

441  {
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: {
460  factory.addInstance(c, first);
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: {
471  factory.addInstance(c, first);
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);
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 {
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  }
Size getMaxParents() const
Returns the max number of parents allowed for any attribute or aggregator.
bool exists(const Key &key) const
Checks whether there exists an element with a given key in the hashtable.
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
std::string nextName(PRMObject::prm_type type)
Getters and setters.
HashTable< std::string, std::vector< std::string > *> cluster_map__
NameGenerator name_gen_
The name generator used by this class.
Definition: PRMGenerator.h:80
#define GUM_ERROR(type, msg)
Definition: exceptions.h:54
+ Here is the call 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 49 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

50  {
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  }
std::string nextName(PRMObject::prm_type type)
Getters and setters.
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:47
NameGenerator name_gen_
The name generator used by this class.
Definition: PRMGenerator.h:80
+ 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 607 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

607  {
608  return cluster_ratio__;
609  }
+ Here is the call graph for this function:

◆ 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 569 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

569  {
570  return domain_size__;
571  }
+ Here is the call 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 596 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

596  {
597  return layers__;
598  }
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
+ Here is the call graph for this function:

◆ 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 602 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

602  {
603  return layers__;
604  }
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
+ Here is the call graph for this function:

◆ 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 579 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

579  {
580  return max_parents__;
581  }
+ Here is the call 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 57 of file PRMGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

57  {
58  return name_gen_;
59  }
NameGenerator name_gen_
The name generator used by this class.
Definition: PRMGenerator.h:80
+ Here is the call graph for this function:

◆ 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 560 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

561  {
562  layers__ = source.layers__;
563  domain_size__ = source.domain_size__;
564  max_parents__ = source.max_parents__;
565  return *this;
566  }
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
+ 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 613 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

613  {
614  cluster_ratio__ = ratio;
615  }
+ Here is the call graph for this function:

◆ 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 574 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

+ Here is the call graph for this function:

◆ 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 589 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

590  {
591  layers__ = v;
592  }
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > layers__
+ Here is the call graph for this function:

◆ 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 584 of file clusteredLayerGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

+ Here is the call graph for this function:

◆ 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 50 of file PRMGenerator_tpl.h.

References gum::prm::ParamScopeData< GUM_SCALAR >::ParamScopeData().

51  {
52  name_gen_ = name_gen;
53  }
NameGenerator name_gen_
The name generator used by this class.
Definition: PRMGenerator.h:80
+ Here is the call graph for this function:

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 121 of file clusteredLayerGenerator.h.

◆ cluster_ratio__

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

Definition at line 120 of file clusteredLayerGenerator.h.

◆ domain_size__

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

Definition at line 118 of file clusteredLayerGenerator.h.

◆ layers__

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

Definition at line 117 of file clusteredLayerGenerator.h.

◆ max_parents__

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

Definition at line 119 of file clusteredLayerGenerator.h.

◆ name_gen_

template<typename GUM_SCALAR >
NameGenerator gum::prm::PRMGenerator< GUM_SCALAR >::name_gen_
protectedinherited

The name generator used by this class.

Definition at line 80 of file PRMGenerator.h.


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