aGrUM 2.3.2
a C++ library for (probabilistic) graphical models
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 >:

Classes

struct  LayerData
 Getters and setters. More...
struct  MyData

Public Member Functions

Constructors and destructor.
 LayerGenerator ()
 Default constructor.
 LayerGenerator (const LayerGenerator &source)
 Copy constructor.
LayerGeneratoroperator= (const LayerGenerator &source)
 Copy operator.
virtual ~LayerGenerator ()
 Destructor.
Size getDomainSize () const
 Returns the domain size of generated types.
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.
void setLayers (const std::vector< LayerData > &v)
 Defines the structure of each layers.
std::vector< LayerData > & getLayer ()
 Returns the domain size of generated types.
const std::vector< LayerData > & getLayer () const
 Returns the domain size of generated types.
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 LayerGenerator::MyData > &l)
void _generateClassDag_ (Size lvl, DAG &dag, Bijection< std::string, NodeId > &names, std::vector< typename LayerGenerator::MyData > &l)
void _generateSystem_ (PRMFactory< GUM_SCALAR > &factory, std::vector< typename LayerGenerator::MyData > &l)

Private Attributes

std::vector< LayerData_layers_
Size _domain_size_
Size _max_parents_

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 73 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 279 of file layerGenerator_tpl.h.

279 :
282 }
<agrum/PRM/generator/layerGenerator.h>
std::vector< LayerData > _layers_
LayerGenerator()
Default constructor.

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

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

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

◆ LayerGenerator() [2/2]

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

Copy constructor.

Definition at line 286 of file layerGenerator_tpl.h.

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

Here is the call graph for this function:

◆ ~LayerGenerator()

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

Destructor.

Definition at line 293 of file layerGenerator_tpl.h.

293 {
295 }

References LayerGenerator().

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 183 of file layerGenerator_tpl.h.

187 {
188 float density = _layers_[lvl].inner_density;
190 NodeId id = 0;
191
192 if (lvl) {
193 for (const auto& agg: l[lvl].g) {
194 id = dag.addNode();
195 names.insert(agg, id);
196 nodes.push_back(id);
197 }
198 }
199
200 for (const auto& attr: l[lvl].a) {
201 id = dag.addNode();
202 names.insert(attr, id);
203
204 for (const auto node: nodes)
205 if (randomProba() < density) dag.addArc(node, names.second(attr));
206
207 nodes.push_back(id);
208 }
209
210 // For each nodes with #parents > _max_parents_ we randomly remove parents
211 // until
212 // #parents <= _max_parents_
213 for (const auto node: dag.nodes()) {
214 if (dag.parents(node).size() > getMaxParents()) {
216
217 for (const auto par: dag.parents(node))
218 v.push_back(par);
219
220 while (dag.parents(node).size() > getMaxParents()) {
221 size_t idx = randomValue(v.size());
222 Arc arc(v[idx], node);
223 GUM_ASSERT(dag.existsArc(arc));
224 dag.eraseArc(arc);
225 v[idx] = v.back();
226 v.pop_back();
227 }
228 }
229 }
230 }
Size getMaxParents() const
Returns the max number of parents allowed for any attribute or aggregator.
Idx randomValue(const Size max=2)
Returns a random Idx between 0 and max-1 included.
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 _generateClasses_().

Here is the call graph for this function:
Here is the caller 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 114 of file layerGenerator_tpl.h.

117 {
118 Size size = 0;
119 GUM_SCALAR sum = 0.0;
121
122 for (Size lvl = 0; lvl < _layers_.size(); ++lvl) {
123 i.insert(l[lvl].i);
124
125 for (Size c = 0; c < _layers_[lvl].c; ++c) {
126 l[lvl].c.push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS));
127 f.startClass(l[lvl].c.back(), "", &i);
128
129 if (lvl) f.addReferenceSlot(l[lvl - 1].i, l[lvl].r, true);
130
131 DAG dag;
134
135 // Adding aggregates
136 if (lvl) {
137 for (std::vector< std::string >::iterator g = l[lvl].g.begin(); g != l[lvl].g.end();
138 ++g) {
140 s << l[lvl].r << "." << l[lvl - 1].a[randomValue(l[lvl - 1].a.size())];
141 std::vector< std::string > chain(1, s.str()), param(1, "1");
142 f.addAggregator(*g, "exists", chain, param);
143 }
144 }
145
146 // Adding attributes
147 for (std::vector< std::string >::iterator a = l[lvl].a.begin(); a != l[lvl].a.end();
148 ++a) {
149 f.startAttribute(type, *a, true);
151
152 for (const auto par: dag.parents(names.second(*a))) {
153 f.addParent(names.first(par));
154 size *= f.retrieveClass(l[lvl].c.back()).get(names.first(par)).type()->domainSize();
155 }
156
158
159 for (size_t norms = 0; norms < size; norms += getDomainSize()) {
160 sum = 0.0;
161
162 for (size_t idx = 0; idx < getDomainSize(); ++idx) {
163 val[idx] = 1 + std::rand();
164 sum += val[idx];
165 }
166
167 for (size_t idx = 0; idx < getDomainSize(); ++idx)
168 cpf[norms + idx] = val[idx] / sum;
169 }
170
171 f.setRawCPFByLines(cpf);
172 f.endAttribute();
173 }
174
175 f.endClass();
176 }
177
178 i.erase(l[lvl].i);
179 }
180 }
void _generateClassDag_(Size lvl, DAG &dag, Bijection< std::string, NodeId > &names, std::vector< typename LayerGenerator::MyData > &l)
Size getDomainSize() const
Returns the domain size of generated types.
NameGenerator name_gen_
The name generator used by this class.

References _generateClassDag_(), _layers_, 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::Set< Key >::insert(), 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 generate().

Here is the call graph for this function:
Here is the caller 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 85 of file layerGenerator_tpl.h.

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

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

Referenced by generate().

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

◆ _generateSystem_()

template<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 233 of file layerGenerator_tpl.h.

235 {
236 factory.startSystem(this->name_gen_.nextName(PRMObject::prm_type::SYSTEM));
239 size_t idx = 0;
240
241 for (size_t lvl = 0; lvl < _layers_.size(); ++lvl) {
242 float density = _layers_[lvl].outter_density;
243
244 for (size_t count = 0; count < _layers_[lvl].o; ++count) {
246 factory.addInstance(l[lvl].c[randomValue(l[lvl].c.size())], name);
247 o[lvl].push_back(name);
248
249 if (lvl) {
251 chain << name << "." << l[lvl].r;
253
255 iter != o[lvl - 1].end();
256 ++iter)
257 if (randomProba() <= density) ref2add.push_back(*iter);
258
259 if (ref2add.empty())
260 factory.setReferenceSlot(chain.str(), o[lvl - 1][randomValue(o[lvl - 1].size())]);
261
262 while (ref2add.size() > getMaxParents()) {
263 idx = randomValue(ref2add.size());
264 ref2add[idx] = ref2add.back();
265 ref2add.pop_back();
266 }
267
269 ++iter)
270 factory.setReferenceSlot(chain.str(), *iter);
271 }
272 }
273 }
274
275 factory.endSystem();
276 }

References _layers_, gum::prm::PRMFactory< GUM_SCALAR >::addInstance(), gum::prm::PRMFactory< GUM_SCALAR >::endSystem(), getMaxParents(), gum::prm::PRMGenerator< GUM_SCALAR >::name_gen_, gum::prm::PRMObject::PRM_INTERFACE, 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::LayerGenerator< GUM_SCALAR >::_generateType_ ( PRMFactory< GUM_SCALAR > & f)
private

Definition at line 70 of file layerGenerator_tpl.h.

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

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

Referenced by generate().

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

◆ generate()

template<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 55 of file layerGenerator_tpl.h.

55 {
56 if (_layers_.size() == 0) {
57 GUM_ERROR(OperationNotAllowed, "cannot generate a layered PRM<GUM_SCALAR> without layers")
58 }
59
66 return factory.prm();
67 }
void _generateInterfaces_(PRMFactory< GUM_SCALAR > &f, const std::string &type, std::vector< MyData > &l)
std::string _generateType_(PRMFactory< GUM_SCALAR > &f)
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:72

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

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 307 of file layerGenerator_tpl.h.

307 {
308 return _domain_size_;
309 }

References _domain_size_.

Referenced by _generateClasses_().

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::LayerGenerator< GUM_SCALAR >::getLayer ( )

Returns the domain size of generated types.

Definition at line 334 of file layerGenerator_tpl.h.

334 {
335 return _layers_;
336 }

References _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 340 of file layerGenerator_tpl.h.

340 {
341 return _layers_;
342 }

References _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 317 of file layerGenerator_tpl.h.

317 {
318 return _max_parents_;
319 }

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 LayerGenerator< GUM_SCALAR > & gum::prm::LayerGenerator< GUM_SCALAR >::operator= ( const LayerGenerator< GUM_SCALAR > & source)

Copy operator.

Definition at line 299 of file layerGenerator_tpl.h.

299 {
303 return *this;
304 }

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

Here is the call 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 312 of file layerGenerator_tpl.h.

312 {
314 }

References _domain_size_.

◆ 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 327 of file layerGenerator_tpl.h.

328 {
329 _layers_ = v;
330 }

References _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 322 of file layerGenerator_tpl.h.

322 {
324 }

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

◆ _domain_size_

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

◆ _layers_

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

◆ _max_parents_

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

◆ name_gen_


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