aGrUM  0.14.2
clusteredLayerGenerator_tpl.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2005 by Christophe GONZALES and Pierre-Henri WUILLEMIN *
3  * {prenom.nom}_at_lip6.fr *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the *
17  * Free Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ***************************************************************************/
27 namespace gum {
28  namespace prm {
29 
30  template < typename GUM_SCALAR >
32  if (__layers.size() == 0) {
34  "cannot generate a layered PRM<GUM_SCALAR> without layers");
35  }
36 
37  std::vector< MyData > l;
39  std::string type = __generateType(factory);
40  __generateInterfaces(factory, type, l);
41  __generateClasses(factory, type, l);
42  __generateSystem(factory, l);
43  return factory.prm();
44  }
45 
46  template < typename GUM_SCALAR >
48  PRMFactory< GUM_SCALAR >& factory) {
49  std::string name = this->_name_gen.nextName(PRMObject::prm_type::TYPE);
50  factory.startDiscreteType(name);
51 
52  for (Size i = 0; i < __domain_size; ++i) {
53  std::stringstream sBuff;
54  sBuff << i;
55  factory.addLabel(sBuff.str());
56  }
57 
58  factory.endDiscreteType();
59  return name;
60  }
61 
62  template < typename GUM_SCALAR >
65  const std::string& type,
66  std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData >& l) {
67  for (Size lvl = 0; lvl < __layers.size(); ++lvl) {
69  l[lvl].i = this->_name_gen.nextName(PRMObject::prm_type::PRM_INTERFACE);
70  f.startInterface(l[lvl].i);
71 
72  for (Size a = 0; a < __layers[lvl].a; ++a) {
73  l[lvl].a.push_back(
74  this->_name_gen.nextName(PRMObject::prm_type::CLASS_ELT));
75  f.addAttribute(type, l[lvl].a.back());
76  }
77 
78  if (lvl) {
79  for (Size g = 0; g < __layers[lvl].g; ++g) {
80  l[lvl].g.push_back(
81  this->_name_gen.nextName(PRMObject::prm_type::CLASS_ELT));
82  f.addAttribute("boolean", l[lvl].g.back());
83  }
84 
85  l[lvl].r = this->_name_gen.nextName(PRMObject::prm_type::CLASS_ELT);
86  f.addReferenceSlot(l[lvl - 1].i, l[lvl].r, true);
87  }
88 
89  f.endInterface();
90  }
91  }
92 
93  template < typename GUM_SCALAR >
96  const std::string& type,
97  std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData >& l) {
98  // double ratio = getClusterRatio() + RAND_MAX;
100 
101  for (Size lvl = 0; lvl < __layers.size(); ++lvl) {
102  i.insert(l[lvl].i);
103 
104  for (Size c = 0; c < __layers[lvl].c; ++c) {
105  // if (std::rand() < ratio)
106  __generateCluster(f, type, l, lvl, i);
107  // else
108  // __generateClass(f, type, l, lvl, i);
109  }
110 
111  i.erase(l[lvl].i);
112  }
113  }
114 
115  template < typename GUM_SCALAR >
118  const std::string& type,
119  std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData >& l,
120  Size lvl,
121  Set< std::string >& i) {
122  Size size = 0;
123  GUM_SCALAR sum = 0.0;
124  std::string first, second, third;
125  std::vector< std::string >* v = 0;
126 
127  switch (std::rand() % 2) {
128  // Shape A->B
129  // v == [first, second, second.ref -> first]
130  case 0: {
131  v = new std::vector< std::string >();
132  __generateClass(f, type, l, lvl, i);
133  first = l[lvl].c.back();
134  v->push_back(first);
135  v->push_back(this->_name_gen.nextName(PRMObject::prm_type::CLASS));
136  f.startClass(v->back());
137  v->push_back(this->_name_gen.nextName(PRMObject::prm_type::CLASS_ELT));
138  f.addReferenceSlot(first, v->back(), true);
139  DAG dag;
141  __generateClassDag(lvl, dag, names, l);
142 
143  // Adding aggregates
144  for (std::vector< std::string >::iterator g = l[lvl].g.begin();
145  g != l[lvl].g.end();
146  ++g) {
147  std::stringstream s;
148  s << v->back() << "." << l[lvl].a[std::rand() % l[lvl].a.size()];
149  std::vector< std::string > chain(1, s.str()), param(1, "1");
150  f.addAggregator(*g, "exists", chain, param);
151  }
152 
153  // Adding attributes
154  for (std::vector< std::string >::iterator a = l[lvl].a.begin();
155  a != l[lvl].a.end();
156  ++a) {
157  f.startAttribute(type, *a, true);
158  size = getDomainSize();
159 
160  for (const auto par : dag.parents(names.second(*a))) {
161  f.addParent(names.first(par));
162  size *= f.retrieveClass(l[lvl].c.back())
163  .get(names.first(par))
164  .type()
165  ->domainSize();
166  }
167 
168  std::vector< GUM_SCALAR > cpf(size), val(getDomainSize());
169 
170  for (size_t norms = 0; norms < size; norms += getDomainSize()) {
171  sum = 0.0;
172 
173  for (size_t idx = 0; idx < getDomainSize(); ++idx) {
174  val[idx] = 1 + std::rand();
175  sum += val[idx];
176  }
177 
178  for (size_t idx = 0; idx < getDomainSize(); ++idx)
179  cpf[norms + idx] = val[idx] / sum;
180  }
181 
182  f.setRawCPFByLines(cpf);
183  f.endAttribute();
184  }
185 
186  f.endClass();
187  break;
188  }
189 
190  // Shape A -> B -> C
191  // v == [first, second, second.ref -> first, third, third.ref -> second]
192  case 1: {
193  v = new std::vector< std::string >();
194  __generateClass(f, type, l, lvl, i);
195  {
196  first = l[lvl].c.back();
197  v->push_back(first);
198  v->push_back(this->_name_gen.nextName(PRMObject::prm_type::CLASS));
199  second = v->back();
200  f.startClass(second);
201  v->push_back(this->_name_gen.nextName(PRMObject::prm_type::CLASS_ELT));
202  f.addReferenceSlot(first, v->back(), true);
203  DAG dag;
205  __generateClassDag(lvl, dag, names, l);
206 
207  // Adding aggregates
208  for (std::vector< std::string >::iterator g = l[lvl].g.begin();
209  g != l[lvl].g.end();
210  ++g) {
211  std::stringstream s;
212  s << v->back() << "." << l[lvl].a[std::rand() % l[lvl].a.size()];
213  std::vector< std::string > chain(1, s.str()), param(1, "1");
214  f.addAggregator(*g, "exists", chain, param);
215  }
216 
217  // Adding attributes
218  for (std::vector< std::string >::iterator a = l[lvl].a.begin();
219  a != l[lvl].a.end();
220  ++a) {
221  f.startAttribute(type, *a, true);
222  size = getDomainSize();
223 
224  for (const auto par : dag.parents(names.second(*a))) {
225  f.addParent(names.first(par));
226  size *= f.retrieveClass(l[lvl].c.back())
227  .get(names.first(par))
228  .type()
229  ->domainSize();
230  }
231 
232  std::vector< GUM_SCALAR > cpf(size), val(getDomainSize());
233 
234  for (size_t norms = 0; norms < size; norms += getDomainSize()) {
235  sum = 0.0;
236 
237  for (size_t idx = 0; idx < getDomainSize(); ++idx) {
238  val[idx] = 1 + std::rand();
239  sum += val[idx];
240  }
241 
242  for (size_t idx = 0; idx < getDomainSize(); ++idx)
243  cpf[norms + idx] = val[idx] / sum;
244  }
245 
246  f.setRawCPFByLines(cpf);
247  f.endAttribute();
248  }
249 
250  f.endClass();
251  }
252  {
253  v->push_back(this->_name_gen.nextName(PRMObject::prm_type::CLASS));
254  third = v->back();
255  f.startClass(third);
256  v->push_back(this->_name_gen.nextName(PRMObject::prm_type::CLASS_ELT));
257  f.addReferenceSlot(second, v->back(), true);
258  DAG dag;
260  __generateClassDag(lvl, dag, names, l);
261 
262  // Adding aggregates
263  for (std::vector< std::string >::iterator g = l[lvl].g.begin();
264  g != l[lvl].g.end();
265  ++g) {
266  std::stringstream s;
267  s << v->back() << "." << l[lvl].a[std::rand() % l[lvl].a.size()];
268  std::vector< std::string > chain(1, s.str()), param(1, "1");
269  f.addAggregator(*g, "exists", chain, param);
270  }
271 
272  // Adding attributes
273  for (std::vector< std::string >::iterator a = l[lvl].a.begin();
274  a != l[lvl].a.end();
275  ++a) {
276  f.startAttribute(type, *a, true);
277  size = getDomainSize();
278 
279  for (const auto par : dag.parents(names.second(*a))) {
280  f.addParent(names.first(par));
281  size *= f.retrieveClass(l[lvl].c.back())
282  .get(names.first(par))
283  .type()
284  ->domainSize();
285  }
286 
287  std::vector< GUM_SCALAR > cpf(size), val(getDomainSize());
288 
289  for (size_t norms = 0; norms < size; norms += getDomainSize()) {
290  sum = 0.0;
291 
292  for (size_t idx = 0; idx < getDomainSize(); ++idx) {
293  val[idx] = 1 + std::rand();
294  sum += val[idx];
295  }
296 
297  for (size_t idx = 0; idx < getDomainSize(); ++idx)
298  cpf[norms + idx] = val[idx] / sum;
299  }
300 
301  f.setRawCPFByLines(cpf);
302  f.endAttribute();
303  }
304 
305  f.endClass();
306  }
307  break;
308  }
309 
310  default: { GUM_ERROR(OperationNotAllowed, "unexpected value"); }
311  }
312 
313  __cluster_map.insert(first, v);
314  }
315 
316  template < typename GUM_SCALAR >
319  const std::string& type,
320  std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData >& l,
321  Size lvl,
322  Set< std::string >& i) {
323  Size size = 0;
324  GUM_SCALAR sum = 0.0;
325  l[lvl].c.push_back(this->_name_gen.nextName(PRMObject::prm_type::CLASS));
326  f.startClass(l[lvl].c.back(), "", &i);
327 
328  if (lvl) f.addReferenceSlot(l[lvl - 1].i, l[lvl].r, true);
329 
330  DAG dag;
332  __generateClassDag(lvl, dag, names, l);
333 
334  // Adding aggregates
335  if (lvl) {
336  for (const auto agg : l[lvl].g) {
337  std::stringstream s;
338  s << l[lvl].r << "." << l[lvl - 1].a[std::rand() % l[lvl - 1].a.size()];
339  std::vector< std::string > chain(1, s.str()), param(1, "1");
340  f.addAggregator(agg, "exists", chain, param);
341  }
342  }
343 
344  // Adding attributes
345  for (const auto attr : l[lvl].a) {
346  f.startAttribute(type, attr, true);
347  size = getDomainSize();
348 
349  for (const auto par : dag.parents(names.second(attr))) {
350  f.addParent(names.first(par));
351  size *= f.retrieveClass(l[lvl].c.back())
352  .get(names.first(par))
353  .type()
354  ->domainSize();
355  }
356 
357  std::vector< GUM_SCALAR > cpf(size), val(getDomainSize());
358 
359  for (size_t norms = 0; norms < size; norms += getDomainSize()) {
360  sum = 0.0;
361 
362  for (size_t idx = 0; idx < getDomainSize(); ++idx) {
363  val[idx] = 1 + std::rand();
364  sum += val[idx];
365  }
366 
367  for (size_t idx = 0; idx < getDomainSize(); ++idx)
368  cpf[norms + idx] = val[idx] / sum;
369  }
370 
371  f.setRawCPFByLines(cpf);
372  f.endAttribute();
373  }
374 
375  f.endClass();
376  }
377 
378  template < typename GUM_SCALAR >
380  Size lvl,
381  DAG& dag,
383  std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData >& l) {
384  float density = __layers[lvl].inner_density * RAND_MAX;
385  std::vector< NodeId > nodes;
386  NodeId id = 0;
387 
388  if (lvl) {
389  for (std::vector< std::string >::iterator g = l[lvl].g.begin();
390  g != l[lvl].g.end();
391  ++g) {
392  id = dag.addNode();
393  names.insert(*g, id);
394  nodes.push_back(id);
395  }
396  }
397 
398  for (std::vector< std::string >::iterator a = l[lvl].a.begin();
399  a != l[lvl].a.end();
400  ++a) {
401  id = dag.addNode();
402  names.insert(*a, id);
403 
404  for (std::vector< NodeId >::iterator prnt = nodes.begin();
405  prnt != nodes.end();
406  ++prnt)
407  if (std::rand() < density) dag.addArc(*prnt, names.second(*a));
408 
409  nodes.push_back(id);
410  }
411 
412  // For each nodes with #parents > __max_parents we randomly remove parents
413  // until
414  // #parents <= __max_parents
415  for (const auto node : dag.nodes()) {
416  if (dag.parents(node).size() > getMaxParents()) {
417  std::vector< NodeId > v;
418 
419  for (const auto par : dag.parents(node))
420  v.push_back(par);
421 
422  while (dag.parents(node).size() > getMaxParents()) {
423  size_t idx = std::rand() % v.size();
424  Arc arc(v[idx], node);
425  GUM_ASSERT(dag.existsArc(arc));
426  dag.eraseArc(arc);
427  v[idx] = v.back();
428  v.pop_back();
429  }
430  }
431  }
432  }
433 
434  template < typename GUM_SCALAR >
436  PRMFactory< GUM_SCALAR >& factory,
437  std::vector< typename ClusteredLayerGenerator< GUM_SCALAR >::MyData >& l) {
438  factory.startSystem(this->_name_gen.nextName(PRMObject::prm_type::SYSTEM));
439  std::vector< std::vector< std::string > > o(__layers.size());
440  std::string name, c, first, second, third;
441  std::vector< std::string >* v = 0;
442  size_t idx = 0;
443 
444  for (size_t lvl = 0; lvl < __layers.size(); ++lvl) {
445  float density = __layers[lvl].outter_density * RAND_MAX;
446 
447  for (size_t count = 0; count < __layers[lvl].o; ++count) {
448  c = l[lvl].c[std::rand() % l[lvl].c.size()];
449 
450  if (__cluster_map.exists(c)) {
451  v = __cluster_map[c];
452 
453  switch (v->size()) {
454  case 3: {
455  first = this->_name_gen.nextName(PRMObject::prm_type::INSTANCE);
456  factory.addInstance(c, first);
457  second = this->_name_gen.nextName(PRMObject::prm_type::INSTANCE);
458  factory.addInstance(v->at(1), second);
459  std::stringstream chain;
460  chain << second << "." << v->at(2);
461  factory.setReferenceSlot(chain.str(), first);
462  break;
463  }
464 
465  case 5: {
466  first = this->_name_gen.nextName(PRMObject::prm_type::INSTANCE);
467  factory.addInstance(c, first);
468  second = this->_name_gen.nextName(PRMObject::prm_type::INSTANCE);
469  factory.addInstance(v->at(1), second);
470  std::stringstream chain_1, chain_2;
471  chain_1 << second << "." << v->at(2);
472  factory.setReferenceSlot(chain_1.str(), first);
473  third = this->_name_gen.nextName(PRMObject::prm_type::INSTANCE);
474  factory.addInstance(v->at(3), third);
475  chain_2 << third << "." << v->at(4);
476  factory.setReferenceSlot(chain_2.str(), second);
477  break;
478  }
479 
480  default: {
481  GUM_ERROR(OperationNotAllowed, "unexpected vector size");
482  }
483  }
484 
485  // __cluster_map.erase(c);
486  // delete v;
487  name = first;
488  } else {
489  name = this->_name_gen.nextName(PRMObject::prm_type::INSTANCE);
490  factory.addInstance(c, name);
491  }
492 
493  o[lvl].push_back(name);
494 
495  if (lvl) {
496  std::stringstream chain;
497  chain << name << "." << l[lvl].r;
498  std::vector< std::string > ref2add;
499 
500  for (std::vector< std::string >::iterator iter = o[lvl - 1].begin();
501  iter != o[lvl - 1].end();
502  ++iter)
503  if (std::rand() <= density) ref2add.push_back(*iter);
504 
505  if (ref2add.empty())
506  factory.setReferenceSlot(
507  chain.str(), o[lvl - 1][std::rand() % o[lvl - 1].size()]);
508 
509  while (ref2add.size() > getMaxParents()) {
510  idx = std::rand() % ref2add.size();
511  ref2add[idx] = ref2add.back();
512  ref2add.pop_back();
513  }
514 
515  for (std::vector< std::string >::iterator iter = ref2add.begin();
516  iter != ref2add.end();
517  ++iter)
518  factory.setReferenceSlot(chain.str(), *iter);
519  }
520  }
521  }
522 
523  factory.endSystem();
524  }
525 
526  template < typename GUM_SCALAR >
528  __layers(), __domain_size(2), __max_parents(INT_MAX),
529  __cluster_ratio(0.0) {
530  GUM_CONSTRUCTOR(ClusteredLayerGenerator);
531  }
532 
533  template < typename GUM_SCALAR >
536  __layers(source.__layers),
538  GUM_CONS_CPY(ClusteredLayerGenerator);
539  }
540 
541  template < typename GUM_SCALAR >
543  GUM_DESTRUCTOR(ClusteredLayerGenerator);
544  // typedef HashTable<std::string, std::vector<std::string>*>::iterator
545  // Iter;
546  // for (Iter iter = __cluster_map.begin(); iter != __cluster_map.end();
547  // ++iter)
548  // {
549  // delete *iter;
550  // }
551  }
552 
553  template < typename GUM_SCALAR >
557  __layers = source.__layers;
558  __domain_size = source.__domain_size;
559  __max_parents = source.__max_parents;
560  return *this;
561  }
562 
563  template < typename GUM_SCALAR >
565  return __domain_size;
566  }
567 
568  template < typename GUM_SCALAR >
570  __domain_size = s;
571  }
572 
573  template < typename GUM_SCALAR >
575  return __max_parents;
576  }
577 
578  template < typename GUM_SCALAR >
580  __max_parents = s;
581  }
582 
583  template < typename GUM_SCALAR >
585  const std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData >& v) {
586  __layers = v;
587  }
588 
589  template < typename GUM_SCALAR >
590  INLINE std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData >&
592  return __layers;
593  }
594 
595  template < typename GUM_SCALAR >
596  INLINE const std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData >&
598  return __layers;
599  }
600 
601  template < typename GUM_SCALAR >
603  return __cluster_ratio;
604  }
605 
606  template < typename GUM_SCALAR >
607  INLINE void
609  __cluster_ratio = ratio;
610  }
611 
612  } /* namespace prm */
613 } /* namespace gum */
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.
<agrum/PRM/generator/clusteredLayerGenerator.h>
virtual void endInterface() override
Tells the factory that we finished an interface declaration.
virtual void addAggregator(const std::string &name, const std::string &agg_type, const std::vector< std::string > &chains, const std::vector< std::string > &params, std::string type="") override
Add an aggregator in the current declared class.
std::string __generateType(PRMFactory< GUM_SCALAR > &f)
virtual void setReferenceSlot(const std::string &left_instance, const std::string &left_reference, const std::string &right_instance) override
Instantiate a reference in the current model.
const T1 & first(const T2 &second) const
Returns the first value of a pair given its second value.
void __generateSystem(PRMFactory< GUM_SCALAR > &factory, std::vector< typename ClusteredLayerGenerator::MyData > &l)
void setLayers(const std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > &v)
Defines the structure of each layers.
virtual void addInstance(const std::string &type, const std::string &name) override
Add an instance to the model.
virtual void eraseArc(const Arc &arc)
removes an arc from the ArcGraphPart
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > & getLayer()
Getters and setters.
PRMClass< GUM_SCALAR > & retrieveClass(const std::string &name)
Returns a reference over a Class<GUM_SCALAR> given its name.
virtual void endAttribute() override
Tells the factory that we finished declaring an attribute.
virtual void startInterface(const std::string &i, const std::string &ext="", bool delayInheritance=false) override
Tells the factory that we start an interface declaration.
virtual void addReferenceSlot(const std::string &type, const std::string &name, bool isArray) override
Tells the factory that we started declaring a slot.
gum is the global namespace for all aGrUM entities
Definition: agrum.h:25
virtual void addAttribute(const std::string &type, const std::string &name) override
Add an attribute to an interface.
double getClusterRatio() const
Returns the odds of a given class to be replaced by a cluster.
virtual NodeId addNode()
insert a new node and return its id
virtual void startClass(const std::string &c, const std::string &ext="", const Set< std::string > *implements=nullptr, bool delayInheritance=false) override
Tells the factory that we start a class declaration.
ClusteredLayerGenerator & operator=(const ClusteredLayerGenerator &source)
Copy operator.
virtual void startSystem(const std::string &name) override
Tells the factory that we started declaring a model.
void __generateInterfaces(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< MyData > &l)
virtual void startAttribute(const std::string &type, const std::string &name, bool scalar_atttr=false) override
Tells the factory that we start an attribute declaration.
std::vector< typename LayerGenerator< GUM_SCALAR >::LayerData > __layers
Factory which builds a PRM<GUM_SCALAR>.
Definition: PRMType.h:47
void __generateClassDag(Size lvl, DAG &dag, Bijection< std::string, NodeId > &names, std::vector< typename ClusteredLayerGenerator::MyData > &l)
The base class for all directed edgesThis class is used as a basis for manipulating all directed edge...
const NodeSet & parents(const NodeId id) const
returns the set of nodes with arc ingoing to a given node
const NodeGraphPart & nodes() const
return *this as a NodeGraphPart
virtual void addArc(const NodeId tail, const NodeId head)
insert a new arc into the directed graph
Definition: DAG_inl.h:40
void __generateClasses(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< typename ClusteredLayerGenerator::MyData > &l)
virtual void endClass(bool checkImplementations=true) override
Tells the factory that we finished a class declaration.
void setRawCPFByLines(const std::vector< GUM_SCALAR > &array)
Gives the factory the CPF in its raw form.
virtual PRM< GUM_SCALAR > * generate()
Proceeds with the generation of the PRM<GUM_SCALAR>.
This class represents a Probabilistic Relational PRMSystem<GUM_SCALAR>.
Definition: PRM.h:63
virtual void startDiscreteType(const std::string &name, std::string super="") override
Start a discrete subtype declaration.
void __generateClass(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< typename ClusteredLayerGenerator::MyData > &l, Size lvl, Set< std::string > &i)
virtual void endDiscreteType() override
End the current discrete type declaration.
void setClusterRatio(double ratio)
Define the odds of a given class to be replaced by a cluster.
void setDomainSize(Size s)
Set the domain size of generated types.
void setMaxParents(Size s)
Returns the max number of parents allowed for any attribute or aggregator.
virtual void addLabel(const std::string &l, std::string ext="") override
Add a label to the current discrete type.
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
void __generateCluster(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< typename ClusteredLayerGenerator::MyData > &l, Size lvl, Set< std::string > &i)
Size size() const noexcept
Returns the number of elements in the set.
Definition: set_tpl.h:698
virtual void endSystem() override
Tells the factory that we finished declaring a model.
Base class for dag.
Definition: DAG.h:99
bool existsArc(const Arc &arc) const
indicates whether a given arc exists
Size getDomainSize() const
Getters and setters.
Size NodeId
Type for node ids.
Definition: graphElements.h:97
PRM< GUM_SCALAR > * prm() const
Returns a pointer on the PRM<GUM_SCALAR> created by this factory.
void insert(const Key &k)
Inserts a new element into the set.
Definition: set_tpl.h:610
virtual void addParent(const std::string &name) override
Tells the factory that we add a parent to the current declared attribute.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52