aGrUM 2.3.2
a C++ library for (probabilistic) graphical models
gum::MultiDimFunctionGraphGenerator Class Reference

Class implementing a function graph generator with template type double. More...

#include <multiDimFunctionGraphGenerator.h>

Collaboration diagram for gum::MultiDimFunctionGraphGenerator:

Public Member Functions

MultiDimFunctionGraph< double > * generate ()
 Generates a MultiDimFunctionGraph.
Constructors / Destructors
 MultiDimFunctionGraphGenerator (Idx maxVar, Idx minVar, const Sequence< const DiscreteVariable * > &varSeq)
 Default constructor.
 ~MultiDimFunctionGraphGenerator ()
 Class destructor.

Private Member Functions

bool _createLeaf_ (NodeId currentNodeId, HashTable< NodeId, Idx > &node2MinVar)
 Creates a leaf.
Idx _generateVarPos_ (Idx offset, Idx span)
 Generate a variable position.

Private Attributes

const Sequence< const DiscreteVariable * > _varSeq_
 The variables.
Idx _nbTotalVar_
 The total number of variables.

Static Private Attributes

static Idx _genSeed_
 The seed for random numbers.

Detailed Description

Class implementing a function graph generator with template type double.

Warning
Doxygen does not like spanning command on multiple line, so we could not configure it with the correct include directive. Use the following code snippet to include this file.
#include
<agrum/base/multidim/implementations/multiDimFunctionGraphGenerator.h>

Definition at line 75 of file multiDimFunctionGraphGenerator.h.

Constructor & Destructor Documentation

◆ MultiDimFunctionGraphGenerator()

gum::MultiDimFunctionGraphGenerator::MultiDimFunctionGraphGenerator ( Idx maxVar,
Idx minVar,
const Sequence< const DiscreteVariable * > & varSeq )

Default constructor.

Definition at line 61 of file multiDimFunctionGraphGenerator.cpp.

64 : _varSeq_(varSeq) {
65 GUM_CONSTRUCTOR(MultiDimFunctionGraphGenerator);
66
67 _nbTotalVar_ = _varSeq_.size();
68 }
MultiDimFunctionGraphGenerator(Idx maxVar, Idx minVar, const Sequence< const DiscreteVariable * > &varSeq)
Default constructor.
Idx _nbTotalVar_
The total number of variables.
const Sequence< const DiscreteVariable * > _varSeq_
The variables.

References MultiDimFunctionGraphGenerator(), _nbTotalVar_, and _varSeq_.

Referenced by MultiDimFunctionGraphGenerator(), and ~MultiDimFunctionGraphGenerator().

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

◆ ~MultiDimFunctionGraphGenerator()

gum::MultiDimFunctionGraphGenerator::~MultiDimFunctionGraphGenerator ( )

Class destructor.

Definition at line 71 of file multiDimFunctionGraphGenerator.cpp.

71 {
72 GUM_DESTRUCTOR(MultiDimFunctionGraphGenerator);
73 }

References MultiDimFunctionGraphGenerator().

Here is the call graph for this function:

Member Function Documentation

◆ _createLeaf_()

bool gum::MultiDimFunctionGraphGenerator::_createLeaf_ ( NodeId currentNodeId,
HashTable< NodeId, Idx > & node2MinVar )
private

Creates a leaf.

Definition at line 152 of file multiDimFunctionGraphGenerator.cpp.

153 {
154 return !(currentNodeId == 1
155 || (randomProba() < 0.9
156 + 0.01
157 * (float(_nbTotalVar_ - node2MinVar[currentNodeId])
158 / float(_nbTotalVar_))
159 && node2MinVar[currentNodeId] < _nbTotalVar_ - 1));
160 }
double randomProba()
Returns a random double between 0 and 1 included (i.e.

References _nbTotalVar_, and gum::randomProba().

Referenced by generate().

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

◆ _generateVarPos_()

Idx gum::MultiDimFunctionGraphGenerator::_generateVarPos_ ( Idx offset,
Idx span )
private

Generate a variable position.

Definition at line 162 of file multiDimFunctionGraphGenerator.cpp.

162 {
163 Idx randOut = 0;
164
165 if (span != 0) {
166 std::weibull_distribution< double > distribution(double(span), 1.0);
167 randOut = (Idx)(distribution(gum::randomGenerator()) * span / 2);
168 if (randOut > span) randOut = span;
169 }
170
171 return offset + randOut;
172 }
Size Idx
Type for indexes.
Definition types.h:79
std::mt19937 & randomGenerator()
define a random_engine with correct seed

References gum::randomGenerator().

Referenced by generate().

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

◆ generate()

MultiDimFunctionGraph< double > * gum::MultiDimFunctionGraphGenerator::generate ( )

Generates a MultiDimFunctionGraph.

Definition at line 75 of file multiDimFunctionGraphGenerator.cpp.

75 {
76 MultiDimFunctionGraph< double >* generatedFunctionGraph
78
79 for (SequenceIteratorSafe< const DiscreteVariable* > varIter = _varSeq_.beginSafe();
80 varIter != _varSeq_.endSafe();
81 ++varIter) {
82 generatedFunctionGraph->add(**varIter);
83 }
84
85 HashTable< NodeId, Idx > node2MinVar;
86
87 std::vector< NodeId > filo;
88
89 generatedFunctionGraph->manager()->setRootNode(
90 generatedFunctionGraph->manager()->addInternalNode(_varSeq_.atPos(0)));
91 node2MinVar.insert(generatedFunctionGraph->root(), 0);
92 filo.push_back(generatedFunctionGraph->root());
93
94 while (!filo.empty()) {
95 NodeId currentNodeId = filo.back();
96 filo.pop_back();
97 Idx cvp = node2MinVar[currentNodeId];
98 const InternalNode* currentNode = generatedFunctionGraph->node(currentNodeId);
99
100 LinkedList< NodeId > tensorSons;
101 Idx nbTensorSons = 0;
102 for (Idx varPos = 0; varPos < generatedFunctionGraph->variablesSequence().size(); varPos++) {
103 const DiscreteVariable* var = generatedFunctionGraph->variablesSequence().atPos(varPos);
104
105 Idx vsp = _varSeq_.pos(var);
106 if (vsp > cvp) {
107 const Link< NodeId >* nicleIter = generatedFunctionGraph->varNodeListe(var)->list();
108 while (nicleIter) {
109 nbTensorSons++;
110 tensorSons.addLink(nicleIter->element());
111 nicleIter = nicleIter->nextLink();
112 }
113 }
114 }
115
116 for (Idx modality = 0; modality < currentNode->nodeVar()->domainSize(); modality++) {
117 if (!tensorSons.list() || randomProba() > (1.0 / (1.0 + 3.0 / nbTensorSons))) {
118 if (_createLeaf_(currentNodeId, node2MinVar)) {
119 generatedFunctionGraph->manager()->setSon(
120 currentNodeId,
121 modality,
122 generatedFunctionGraph->manager()->addTerminalNode(100.0 * randomProba()));
123 } else {
124 Idx sonVarPos = _generateVarPos_(node2MinVar[currentNodeId] + 1,
125 _nbTotalVar_ - node2MinVar[currentNodeId] - 2);
126 generatedFunctionGraph->manager()->setSon(
127 currentNodeId,
128 modality,
129 generatedFunctionGraph->manager()->addInternalNode(_varSeq_.atPos(sonVarPos)));
130 filo.push_back(currentNode->son(modality));
131 node2MinVar.insert(currentNode->son(modality), sonVarPos);
132 }
133 } else {
134 Idx sonPos = randomValue(nbTensorSons);
135 sonPos = sonPos == nbTensorSons ? nbTensorSons - 1 : sonPos;
136 Link< NodeId >* nicleIter = tensorSons.list();
137 while (sonPos) {
138 nicleIter = nicleIter->nextLink();
139 sonPos--;
140 }
141 generatedFunctionGraph->manager()->setSon(currentNodeId, modality, nicleIter->element());
142 }
143 }
144 }
145
146 generatedFunctionGraph->manager()->reduce();
147 generatedFunctionGraph->manager()->clean();
148
149 return generatedFunctionGraph;
150 }
Idx _generateVarPos_(Idx offset, Idx span)
Generate a variable position.
bool _createLeaf_(NodeId currentNodeId, HashTable< NodeId, Idx > &node2MinVar)
Creates a leaf.
static MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * getReducedAndOrderedInstance()
Returns a reduced and ordered instance.
Size NodeId
Type for node ids.
Idx randomValue(const Size max=2)
Returns a random Idx between 0 and max-1 included.

References _createLeaf_(), _generateVarPos_(), _nbTotalVar_, _varSeq_, gum::MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >::add(), gum::MultiDimFunctionGraphManager< GUM_SCALAR, TerminalNodePolicy >::addInternalNode(), gum::LinkedList< T >::addLink(), gum::MultiDimFunctionGraphManager< GUM_SCALAR, TerminalNodePolicy >::addTerminalNode(), gum::MultiDimFunctionGraphManager< GUM_SCALAR, TerminalNodePolicy >::clean(), gum::Link< T >::element(), gum::MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >::getReducedAndOrderedInstance(), gum::HashTable< Key, Val >::insert(), gum::LinkedList< T >::list(), gum::MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >::manager(), gum::Link< T >::nextLink(), gum::MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >::node(), gum::InternalNode::nodeVar(), gum::randomProba(), gum::randomValue(), gum::MultiDimFunctionGraphManager< GUM_SCALAR, TerminalNodePolicy >::reduce(), gum::MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >::root(), gum::MultiDimFunctionGraphManager< GUM_SCALAR, TerminalNodePolicy >::setRootNode(), gum::MultiDimFunctionGraphManager< GUM_SCALAR, TerminalNodePolicy >::setSon(), gum::InternalNode::son(), gum::MultiDimImplementation< GUM_SCALAR >::variablesSequence(), and gum::MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >::varNodeListe().

Here is the call graph for this function:

Member Data Documentation

◆ _genSeed_

Idx gum::MultiDimFunctionGraphGenerator::_genSeed_
staticprivate

The seed for random numbers.

Definition at line 120 of file multiDimFunctionGraphGenerator.h.

◆ _nbTotalVar_

Idx gum::MultiDimFunctionGraphGenerator::_nbTotalVar_
private

The total number of variables.

Definition at line 117 of file multiDimFunctionGraphGenerator.h.

Referenced by MultiDimFunctionGraphGenerator(), _createLeaf_(), and generate().

◆ _varSeq_

const Sequence< const DiscreteVariable* > gum::MultiDimFunctionGraphGenerator::_varSeq_
private

The variables.

Definition at line 114 of file multiDimFunctionGraphGenerator.h.

Referenced by MultiDimFunctionGraphGenerator(), and generate().


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