aGrUM  0.16.0
gum::prm::LayerGenerator< GUM_SCALAR > Class Template Reference

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

#include <layerGenerator.h>

+ Inheritance diagram for gum::prm::LayerGenerator< GUM_SCALAR >:
+ Collaboration diagram for gum::prm::LayerGenerator< GUM_SCALAR >:

Public Member Functions

Constructors and destructor.
 LayerGenerator ()
 Default constructor. More...
 
 LayerGenerator (const LayerGenerator &source)
 Copy constructor. More...
 
LayerGeneratoroperator= (const LayerGenerator &source)
 Copy operator. More...
 
virtual ~LayerGenerator ()
 Destructor. More...
 
Size getDomainSize () const
 Returns the domain size of generated types. 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...
 
void setLayers (const std::vector< LayerData > &v)
 Defines the structure of each layers. More...
 
std::vector< LayerData > & getLayer ()
 Returns the domain size of generated types. More...
 
const std::vector< LayerData > & getLayer () const
 Returns the domain size of generated types. 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  LayerData
 Getters and setters. More...
 
struct  MyData
 

Detailed Description

template<typename GUM_SCALAR>
class gum::prm::LayerGenerator< GUM_SCALAR >

<agrum/PRM/generator/layerGenerator.h>

This class generates PRMs with a layer structure.

Definition at line 56 of file layerGenerator.h.

Constructor & Destructor Documentation

◆ LayerGenerator() [1/2]

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

Default constructor.

Definition at line 271 of file layerGenerator_tpl.h.

271  :
272  __layers(), __domain_size(2), __max_parents(INT_MAX) {
273  GUM_CONSTRUCTOR(LayerGenerator);
274  }
std::vector< LayerData > __layers
LayerGenerator()
Default constructor.

◆ LayerGenerator() [2/2]

template<typename GUM_SCALAR >
INLINE gum::prm::LayerGenerator< GUM_SCALAR >::LayerGenerator ( const LayerGenerator< GUM_SCALAR > &  source)

Copy constructor.

Definition at line 277 of file layerGenerator_tpl.h.

278  :
279  __layers(source.__layers),
280  __domain_size(source.__domain_size), __max_parents(source.__max_parents) {
281  GUM_CONS_CPY(LayerGenerator);
282  }
std::vector< LayerData > __layers
LayerGenerator()
Default constructor.

◆ ~LayerGenerator()

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

Destructor.

Definition at line 285 of file layerGenerator_tpl.h.

References gum::prm::LayerGenerator< GUM_SCALAR >::operator=().

285  {
286  GUM_DESTRUCTOR(LayerGenerator);
287  }
LayerGenerator()
Default constructor.
+ Here is the call graph for this function:

Member Function Documentation

◆ __generateClassDag()

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

Definition at line 173 of file layerGenerator_tpl.h.

References gum::DAG::addArc(), gum::NodeGraphPart::addNode(), gum::ArcGraphPart::eraseArc(), gum::ArcGraphPart::existsArc(), gum::BijectionImplementation< T1, T2, Alloc, Gen >::insert(), gum::NodeGraphPart::nodes(), gum::ArcGraphPart::parents(), gum::BijectionImplementation< T1, T2, Alloc, Gen >::second(), and gum::Set< Key, Alloc >::size().

177  {
178  float density = __layers[lvl].inner_density * RAND_MAX;
179  std::vector< NodeId > nodes;
180  NodeId id = 0;
181 
182  if (lvl) {
183  for (const auto agg : l[lvl].g) {
184  id = dag.addNode();
185  names.insert(agg, id);
186  nodes.push_back(id);
187  }
188  }
189 
190  for (const auto attr : l[lvl].a) {
191  id = dag.addNode();
192  names.insert(attr, id);
193 
194  for (const auto node : nodes)
195  if (std::rand() < density) dag.addArc(node, names.second(attr));
196 
197  nodes.push_back(id);
198  }
199 
200  // For each nodes with #parents > __max_parents we randomly remove parents
201  // until
202  // #parents <= __max_parents
203  for (const auto node : dag.nodes()) {
204  if (dag.parents(node).size() > getMaxParents()) {
205  std::vector< NodeId > v;
206 
207  for (const auto par : dag.parents(node))
208  v.push_back(par);
209 
210  while (dag.parents(node).size() > getMaxParents()) {
211  size_t idx = std::rand() % v.size();
212  Arc arc(v[idx], node);
213  GUM_ASSERT(dag.existsArc(arc));
214  dag.eraseArc(arc);
215  v[idx] = v.back();
216  v.pop_back();
217  }
218  }
219  }
220  }
void insert(const T1 &first, const T2 &second)
Inserts a new association in the gum::Bijection.
const T2 & second(const T1 &first) const
Returns the second value of a pair given its first value.
std::vector< LayerData > __layers
Size getMaxParents() const
Returns the max number of parents allowed for any attribute or aggregator.
Size NodeId
Type for node ids.
Definition: graphElements.h:98
+ Here is the call graph for this function:

◆ __generateClasses()

template<typename GUM_SCALAR>
void gum::prm::LayerGenerator< GUM_SCALAR >::__generateClasses ( PRMFactory< GUM_SCALAR > &  f,
const std::string &  type,
std::vector< typename LayerGenerator< GUM_SCALAR >::MyData > &  l 
)
private

Definition at line 98 of file layerGenerator_tpl.h.

References 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, Alloc, Gen >::first(), gum::Set< Key, Alloc >::insert(), gum::ArcGraphPart::parents(), gum::prm::PRMFactory< GUM_SCALAR >::retrieveClass(), gum::BijectionImplementation< T1, T2, Alloc, Gen >::second(), gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByLines(), gum::prm::PRMFactory< GUM_SCALAR >::startAttribute(), and gum::prm::PRMFactory< GUM_SCALAR >::startClass().

101  {
102  Size size = 0;
103  GUM_SCALAR sum = 0.0;
105 
106  for (Size lvl = 0; lvl < __layers.size(); ++lvl) {
107  i.insert(l[lvl].i);
108 
109  for (Size c = 0; c < __layers[lvl].c; ++c) {
110  l[lvl].c.push_back(this->_name_gen.nextName(PRMObject::prm_type::CLASS));
111  f.startClass(l[lvl].c.back(), "", &i);
112 
113  if (lvl) f.addReferenceSlot(l[lvl - 1].i, l[lvl].r, true);
114 
115  DAG dag;
117  __generateClassDag(lvl, dag, names, l);
118 
119  // Adding aggregates
120  if (lvl) {
121  for (std::vector< std::string >::iterator g = l[lvl].g.begin();
122  g != l[lvl].g.end();
123  ++g) {
124  std::stringstream s;
125  s << l[lvl].r << "."
126  << l[lvl - 1].a[std::rand() % l[lvl - 1].a.size()];
127  std::vector< std::string > chain(1, s.str()), param(1, "1");
128  f.addAggregator(*g, "exists", chain, param);
129  }
130  }
131 
132  // Adding attributes
133  for (std::vector< std::string >::iterator a = l[lvl].a.begin();
134  a != l[lvl].a.end();
135  ++a) {
136  f.startAttribute(type, *a, true);
137  size = getDomainSize();
138 
139  for (const auto par : dag.parents(names.second(*a))) {
140  f.addParent(names.first(par));
141  size *= f.retrieveClass(l[lvl].c.back())
142  .get(names.first(par))
143  .type()
144  ->domainSize();
145  }
146 
147  std::vector< GUM_SCALAR > cpf(size), val(getDomainSize());
148 
149  for (size_t norms = 0; norms < size; norms += getDomainSize()) {
150  sum = 0.0;
151 
152  for (size_t idx = 0; idx < getDomainSize(); ++idx) {
153  val[idx] = 1 + std::rand();
154  sum += val[idx];
155  }
156 
157  for (size_t idx = 0; idx < getDomainSize(); ++idx)
158  cpf[norms + idx] = val[idx] / sum;
159  }
160 
161  f.setRawCPFByLines(cpf);
162  f.endAttribute();
163  }
164 
165  f.endClass();
166  }
167 
168  i.erase(l[lvl].i);
169  }
170  }
const T2 & second(const T1 &first) const
Returns the second value of a pair given its first value.
const T1 & first(const T2 &second) const
Returns the first value of a pair given its second value.
std::vector< LayerData > __layers
Size getDomainSize() const
Returns the domain size of generated types.
NameGenerator _name_gen
The name generator used by this class.
Definition: PRMGenerator.h:81
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:48
void insert(const Key &k)
Inserts a new element into the set.
Definition: set_tpl.h:613
void __generateClassDag(Size lvl, DAG &dag, Bijection< std::string, NodeId > &names, std::vector< typename LayerGenerator::MyData > &l)
+ Here is the call graph for this function:

◆ __generateInterfaces()

template<typename GUM_SCALAR>
void gum::prm::LayerGenerator< GUM_SCALAR >::__generateInterfaces ( PRMFactory< GUM_SCALAR > &  f,
const std::string &  type,
std::vector< MyData > &  l 
)
private

Definition at line 67 of file layerGenerator_tpl.h.

References 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::PRMObject::PRM_INTERFACE, and gum::prm::PRMFactory< GUM_SCALAR >::startInterface().

70  {
71  for (Size lvl = 0; lvl < __layers.size(); ++lvl) {
72  l.push_back(LayerGenerator< GUM_SCALAR >::MyData());
74  f.startInterface(l[lvl].i);
75 
76  for (Size a = 0; a < __layers[lvl].a; ++a) {
77  l[lvl].a.push_back(
79  f.addAttribute(type, l[lvl].a.back());
80  }
81 
82  if (lvl) {
83  for (Size g = 0; g < __layers[lvl].g; ++g) {
84  l[lvl].g.push_back(
86  f.addAttribute("boolean", l[lvl].g.back());
87  }
88 
90  f.addReferenceSlot(l[lvl - 1].i, l[lvl].r, true);
91  }
92 
93  f.endInterface();
94  }
95  }
std::vector< LayerData > __layers
NameGenerator _name_gen
The name generator used by this class.
Definition: PRMGenerator.h:81
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:48
+ Here is the call graph for this function:

◆ __generateSystem()

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

Definition at line 223 of file layerGenerator_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::addInstance(), gum::prm::PRMFactory< GUM_SCALAR >::endSystem(), gum::prm::PRMObject::PRM_INTERFACE, gum::prm::PRMFactory< GUM_SCALAR >::setReferenceSlot(), gum::prm::PRMFactory< GUM_SCALAR >::startSystem(), and gum::prm::PRMObject::SYSTEM.

225  {
226  factory.startSystem(this->_name_gen.nextName(PRMObject::prm_type::SYSTEM));
227  std::vector< std::vector< std::string > > o(__layers.size());
228  std::string name;
229  size_t idx = 0;
230 
231  for (size_t lvl = 0; lvl < __layers.size(); ++lvl) {
232  float density = __layers[lvl].outter_density * RAND_MAX;
233 
234  for (size_t count = 0; count < __layers[lvl].o; ++count) {
236  factory.addInstance(l[lvl].c[std::rand() % l[lvl].c.size()], name);
237  o[lvl].push_back(name);
238 
239  if (lvl) {
240  std::stringstream chain;
241  chain << name << "." << l[lvl].r;
242  std::vector< std::string > ref2add;
243 
244  for (std::vector< std::string >::iterator iter = o[lvl - 1].begin();
245  iter != o[lvl - 1].end();
246  ++iter)
247  if (std::rand() <= density) ref2add.push_back(*iter);
248 
249  if (ref2add.empty())
250  factory.setReferenceSlot(
251  chain.str(), o[lvl - 1][std::rand() % o[lvl - 1].size()]);
252 
253  while (ref2add.size() > getMaxParents()) {
254  idx = std::rand() % ref2add.size();
255  ref2add[idx] = ref2add.back();
256  ref2add.pop_back();
257  }
258 
259  for (std::vector< std::string >::iterator iter = ref2add.begin();
260  iter != ref2add.end();
261  ++iter)
262  factory.setReferenceSlot(chain.str(), *iter);
263  }
264  }
265  }
266 
267  factory.endSystem();
268  }
std::vector< LayerData > __layers
Size getMaxParents() const
Returns the max number of parents allowed for any attribute or aggregator.
NameGenerator _name_gen
The name generator used by this class.
Definition: PRMGenerator.h:81
std::string nextName(PRMObject::prm_type type)
Getters and setters.
+ Here is the call graph for this function:

◆ __generateType()

template<typename GUM_SCALAR >
std::string gum::prm::LayerGenerator< GUM_SCALAR >::__generateType ( PRMFactory< GUM_SCALAR > &  f)
private

Definition at line 51 of file layerGenerator_tpl.h.

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

52  {
53  std::string name = this->_name_gen.nextName(PRMObject::prm_type::TYPE);
54  factory.startDiscreteType(name);
55 
56  for (Size i = 0; i < __domain_size; ++i) {
57  std::stringstream sBuff;
58  sBuff << i;
59  factory.addLabel(sBuff.str());
60  }
61 
62  factory.endDiscreteType();
63  return name;
64  }
NameGenerator _name_gen
The name generator used by this class.
Definition: PRMGenerator.h:81
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:48
+ Here is the call graph for this function:

◆ generate()

template<typename GUM_SCALAR >
PRM< GUM_SCALAR > * gum::prm::LayerGenerator< GUM_SCALAR >::generate ( )
virtual

Proceeds with the generation of the PRM<GUM_SCALAR>.

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

Definition at line 35 of file layerGenerator_tpl.h.

References GUM_ERROR, and gum::prm::PRMFactory< GUM_SCALAR >::prm().

35  {
36  if (__layers.size() == 0) {
37  GUM_ERROR(OperationNotAllowed,
38  "cannot generate a layered PRM<GUM_SCALAR> without layers");
39  }
40 
41  std::vector< MyData > l;
42  PRMFactory< GUM_SCALAR > factory;
43  std::string type = __generateType(factory);
44  __generateInterfaces(factory, type, l);
45  __generateClasses(factory, type, l);
46  __generateSystem(factory, l);
47  return factory.prm();
48  }
void __generateInterfaces(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< MyData > &l)
std::vector< LayerData > __layers
void __generateClasses(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< typename LayerGenerator::MyData > &l)
void __generateSystem(PRMFactory< GUM_SCALAR > &factory, std::vector< typename LayerGenerator::MyData > &l)
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
std::string __generateType(PRMFactory< GUM_SCALAR > &f)
+ Here is the call graph for this function:

◆ getDomainSize()

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

Returns the domain size of generated types.

Definition at line 299 of file layerGenerator_tpl.h.

References gum::prm::LayerGenerator< GUM_SCALAR >::__domain_size.

299  {
300  return __domain_size;
301  }

◆ getLayer() [1/2]

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

Returns the domain size of generated types.

Definition at line 326 of file layerGenerator_tpl.h.

References gum::prm::LayerGenerator< GUM_SCALAR >::__layers.

326  {
327  return __layers;
328  }
std::vector< LayerData > __layers

◆ getLayer() [2/2]

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

Returns the domain size of generated types.

Definition at line 332 of file layerGenerator_tpl.h.

References gum::prm::LayerGenerator< GUM_SCALAR >::__layers.

332  {
333  return __layers;
334  }
std::vector< LayerData > __layers

◆ getMaxParents()

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

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

Definition at line 309 of file layerGenerator_tpl.h.

References gum::prm::LayerGenerator< GUM_SCALAR >::__max_parents.

309  {
310  return __max_parents;
311  }

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

References gum::prm::PRMGenerator< GUM_SCALAR >::_name_gen.

58  {
59  return _name_gen;
60  }
NameGenerator _name_gen
The name generator used by this class.
Definition: PRMGenerator.h:81

◆ operator=()

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

Copy operator.

Definition at line 291 of file layerGenerator_tpl.h.

References gum::prm::LayerGenerator< GUM_SCALAR >::__domain_size, gum::prm::LayerGenerator< GUM_SCALAR >::__layers, and gum::prm::LayerGenerator< GUM_SCALAR >::__max_parents.

Referenced by gum::prm::LayerGenerator< GUM_SCALAR >::~LayerGenerator().

291  {
292  __layers = source.__layers;
293  __domain_size = source.__domain_size;
294  __max_parents = source.__max_parents;
295  return *this;
296  }
std::vector< LayerData > __layers
+ Here is the caller graph for this function:

◆ setDomainSize()

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

Set the domain size of generated types.

Definition at line 304 of file layerGenerator_tpl.h.

References gum::prm::LayerGenerator< GUM_SCALAR >::__domain_size.

304  {
305  __domain_size = s;
306  }

◆ setLayers()

template<typename GUM_SCALAR>
INLINE void gum::prm::LayerGenerator< GUM_SCALAR >::setLayers ( const std::vector< 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 319 of file layerGenerator_tpl.h.

References gum::prm::LayerGenerator< GUM_SCALAR >::__layers.

320  {
321  __layers = v;
322  }
std::vector< LayerData > __layers

◆ setMaxParents()

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

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

Definition at line 314 of file layerGenerator_tpl.h.

References gum::prm::LayerGenerator< GUM_SCALAR >::__max_parents.

314  {
315  __max_parents = s;
316  }

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

References gum::prm::PRMGenerator< GUM_SCALAR >::_name_gen.

52  {
53  _name_gen = name_gen;
54  }
NameGenerator _name_gen
The name generator used by this class.
Definition: PRMGenerator.h:81

Member Data Documentation

◆ __domain_size

◆ __layers

◆ __max_parents

◆ _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 81 of file PRMGenerator.h.

Referenced by gum::prm::PRMGenerator< GUM_SCALAR >::getNameGenerator(), and gum::prm::PRMGenerator< GUM_SCALAR >::setNameGenerator().


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