aGrUM 3.1.1
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, std::string_view type, std::vector< MyData > &l)
void _generateClasses_ (PRMFactory< GUM_SCALAR > &f, std::string_view 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<GUM_Numeric GUM_SCALAR>
class gum::prm::LayerGenerator< GUM_SCALAR >

<agrum/PRM/generator/layerGenerator.h>

This class generates PRMs with a layer structure.

Definition at line 75 of file layerGenerator.h.

Constructor & Destructor Documentation

◆ LayerGenerator() [1/2]

template<GUM_Numeric GUM_SCALAR>
gum::prm::LayerGenerator< GUM_SCALAR >::LayerGenerator ( )

Default constructor.

Definition at line 278 of file layerGenerator_tpl.h.

278 :
281 }
<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<GUM_Numeric GUM_SCALAR>
gum::prm::LayerGenerator< GUM_SCALAR >::LayerGenerator ( const LayerGenerator< GUM_SCALAR > & source)

Copy constructor.

Definition at line 284 of file layerGenerator_tpl.h.

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

Here is the call graph for this function:

◆ ~LayerGenerator()

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

Destructor.

Definition at line 291 of file layerGenerator_tpl.h.

291 {
293 }

References LayerGenerator().

Here is the call graph for this function:

Member Function Documentation

◆ _generateClassDag_()

template<GUM_Numeric 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<GUM_Numeric GUM_SCALAR>
void gum::prm::LayerGenerator< GUM_SCALAR >::_generateClasses_ ( PRMFactory< GUM_SCALAR > & f,
std::string_view type,
std::vector< typename LayerGenerator< GUM_SCALAR >::MyData > & l )
private

Definition at line 113 of file layerGenerator_tpl.h.

116 {
117 Size size = 0;
118 GUM_SCALAR sum = 0.0;
120
121 for (Size lvl = 0; lvl < _layers_.size(); ++lvl) {
122 i.insert(l[lvl].i);
123
124 for (Size c = 0; c < _layers_[lvl].c; ++c) {
125 l[lvl].c.push_back(this->name_gen_.nextName(PRMObject::prm_type::CLASS));
126 f.startClass(l[lvl].c.back(), "", &i);
127
128 if (lvl) f.addReferenceSlot(l[lvl - 1].i, l[lvl].r, true);
129
130 DAG dag;
133
134 // Adding aggregates
135 if (lvl) {
136 for (std::vector< std::string >::iterator g = l[lvl].g.begin(); g != l[lvl].g.end();
137 ++g) {
139 1,
140 std::format("{}.{}", l[lvl].r, l[lvl - 1].a[randomValue(l[lvl - 1].a.size())])),
141 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 }
Size getDomainSize() const
Returns the domain size of generated types.
void _generateClassDag_(Size lvl, DAG &dag, Bijection< std::string, NodeId > &names, std::vector< typename LayerGenerator::MyData > &l)
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<GUM_Numeric GUM_SCALAR>
void gum::prm::LayerGenerator< GUM_SCALAR >::_generateInterfaces_ ( PRMFactory< GUM_SCALAR > & f,
std::string_view type,
std::vector< MyData > & l )
private

Definition at line 84 of file layerGenerator_tpl.h.

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

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

Referenced by generate().

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

◆ _generateSystem_()

template<GUM_Numeric 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) {
250 std::string chain = std::format("{}.{}", name, l[lvl].r);
252
254 iter != o[lvl - 1].end();
255 ++iter)
256 if (randomProba() <= density) ref2add.push_back(*iter);
257
258 if (ref2add.empty())
259 factory.setReferenceSlot(chain, o[lvl - 1][randomValue(o[lvl - 1].size())]);
260
261 while (ref2add.size() > getMaxParents()) {
262 idx = randomValue(ref2add.size());
263 ref2add[idx] = ref2add.back();
264 ref2add.pop_back();
265 }
266
268 ++iter)
269 factory.setReferenceSlot(chain, *iter);
270 }
271 }
272 }
273
274 factory.endSystem();
275 }

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

Definition at line 71 of file layerGenerator_tpl.h.

71 {
73 factory.startDiscreteType(name);
74
75 for (Size i = 0; i < _domain_size_; ++i) {
76 factory.addLabel(std::format("{}", i));
77 }
78
79 factory.endDiscreteType();
80 return name;
81 }

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

Referenced by generate().

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

◆ generate()

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

56 {
57 if (_layers_.size() == 0) {
58 GUM_ERROR(OperationNotAllowed, "cannot generate a layered PRM<GUM_SCALAR> without layers")
59 }
60
67 return factory.prm();
68 }
std::string _generateType_(PRMFactory< GUM_SCALAR > &f)
void _generateClasses_(PRMFactory< GUM_SCALAR > &f, std::string_view type, std::vector< typename LayerGenerator::MyData > &l)
void _generateSystem_(PRMFactory< GUM_SCALAR > &factory, std::vector< typename LayerGenerator::MyData > &l)
void _generateInterfaces_(PRMFactory< GUM_SCALAR > &f, std::string_view type, std::vector< MyData > &l)
#define GUM_ERROR(type, msg)
Definition exceptions.h:76

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<GUM_Numeric GUM_SCALAR>
Size gum::prm::LayerGenerator< GUM_SCALAR >::getDomainSize ( ) const

Returns the domain size of generated types.

Definition at line 305 of file layerGenerator_tpl.h.

305 {
306 return _domain_size_;
307 }

References _domain_size_.

Referenced by _generateClasses_().

Here is the caller graph for this function:

◆ getLayer() [1/2]

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

Returns the domain size of generated types.

Definition at line 332 of file layerGenerator_tpl.h.

332 {
333 return _layers_;
334 }

References _layers_.

◆ getLayer() [2/2]

template<GUM_Numeric GUM_SCALAR>
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 338 of file layerGenerator_tpl.h.

338 {
339 return _layers_;
340 }

References _layers_.

◆ getMaxParents()

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

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

Definition at line 315 of file layerGenerator_tpl.h.

315 {
316 return _max_parents_;
317 }

References _max_parents_.

Referenced by _generateClassDag_(), and _generateSystem_().

Here is the caller graph for this function:

◆ getNameGenerator()

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

Returns the NameGenerator used by this generator.

Definition at line 77 of file PRMGenerator_tpl.h.

77 {
78 return name_gen_;
79 }

References name_gen_.

◆ operator=()

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

Copy operator.

Definition at line 297 of file layerGenerator_tpl.h.

297 {
301 return *this;
302 }

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

Here is the call graph for this function:

◆ setDomainSize()

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

Set the domain size of generated types.

Definition at line 310 of file layerGenerator_tpl.h.

310 {
312 }

References _domain_size_.

◆ setLayers()

template<GUM_Numeric GUM_SCALAR>
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 325 of file layerGenerator_tpl.h.

326 {
327 _layers_ = v;
328 }

References _layers_.

◆ setMaxParents()

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

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

Definition at line 320 of file layerGenerator_tpl.h.

320 {
322 }

References _max_parents_.

◆ setNameGenerator()

template<GUM_Numeric GUM_SCALAR>
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 72 of file PRMGenerator_tpl.h.

72 {
74 }
This class is the base class to all PRM generators.

References name_gen_.

Member Data Documentation

◆ _domain_size_

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

◆ _layers_

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

◆ _max_parents_

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

◆ name_gen_


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