57 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
70 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
82 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
91 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
103# pragma GCC diagnostic push
104# pragma GCC diagnostic ignored "-Warray-bounds"
106 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
115# pragma GCC diagnostic pop
118 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
123 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
126 const GUM_ELEMENT&
value)
const {
128 "Function Graph can't be edited so "
129 "easily.\nMultiDimFunctionGraphManager "
130 "provides the framework to edit a "
134 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
137 "Function Graph can't be edited so "
138 "easily.\nMultiDimFunctionGraphManager "
139 "provides the framework to edit a "
143 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
145 const std::vector< GUM_ELEMENT >& v)
const {
147 "Function Graph can't be edited so "
148 "easily.\nMultiDimFunctionGraphManager "
149 "provides the framework to editaa "
153 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
155 std::initializer_list< GUM_ELEMENT > l)
const {
157 "Function Graph can't be edited so "
158 "easily.\nMultiDimFunctionGraphManager "
159 "provides the framework to edit a "
163 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
170 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
183 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
188 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
195 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
199 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
203 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
207 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
211 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
215 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
218 std::stringstream sBuff;
219 sBuff << (*i) <<
" = " << this->
get(*i);
223 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
228 "You cannot copy another type of multiDim "
229 "into a MultiDimFunctionGraph.");
232 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
236 "You cannot copy another type of multiDim "
237 "into a MultiDimFunctionGraph.");
240 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
243 if (this->
_isReduced_ != src.isReducedAndOrdered())
245 "Cannot copy a Reduced and Ordered "
246 "function graph into Tree function graph "
256 this->
add(**varIter);
265 this->
manager()->addInternalNode(src.node(src.root())->nodeVar()));
266 src2dest.insert(src.root(), this->root());
267 lifo.push_back(src.root());
271 while (!lifo.empty()) {
272 NodeId currentSrcNodeId = lifo.back();
275 const InternalNode* currentSrcNode = src.node(currentSrcNodeId);
277 for (
Idx index = 0; index < currentSrcNode->
nbSons(); ++index) {
278 if (!src2dest.existsFirst(currentSrcNode->
son(index))) {
279 NodeId srcSonNodeId = currentSrcNode->
son(index), destSonNodeId = 0;
280 if (src.isTerminalNode(srcSonNodeId)) {
281 destSonNodeId = this->
manager()->addTerminalNode(src.nodeValue(srcSonNodeId));
283 destSonNodeId = this->
manager()->addInternalNode(src.node(srcSonNodeId)->nodeVar());
284 lifo.push_back(srcSonNodeId);
286 src2dest.insert(srcSonNodeId, destSonNodeId);
288 this->
manager()->setSon(src2dest.second(currentSrcNodeId),
290 src2dest.second(currentSrcNode->
son(index)));
298 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
302 if (this->
_isReduced_ != src.isReducedAndOrdered())
304 "Cannot copy a Reduced and Ordered "
305 "function graph into Tree function graph "
315 if ((*varIter)->domainSize() != reassign.
second(*varIter)->domainSize())
317 "Var " << (*varIter)->name() <<
" and var " << reassign.
second(*varIter)->name()
318 <<
" have different domain sizes (" << (*varIter)->domainSize()
319 <<
"!=" << reassign.
second(*varIter)->domainSize() <<
")")
320 this->add(*(reassign.
second(*varIter)));
323 std::vector< NodeId > lifo;
326 if (src.isTerminalNode(src.root())) {
327 this->manager()->setRootNode(this->manager()->addTerminalNode(src.nodeValue(src.root())));
329 this->manager()->setRootNode(
330 this->manager()->addInternalNode(reassign.second(src.node(src.root())->nodeVar())));
331 src2dest.insert(src.root(), this->root());
332 lifo.push_back(src.root());
336 while (!lifo.empty()) {
337 NodeId currentSrcNodeId = lifo.back();
340 const InternalNode* currentSrcNode = src.node(currentSrcNodeId);
342 for (Idx index = 0; index < currentSrcNode->nbSons(); ++index) {
343 if (!src2dest.existsFirst(currentSrcNode->son(index))) {
344 NodeId srcSonNodeId = currentSrcNode->son(index), destSonNodeId = 0;
345 if (src.isTerminalNode(srcSonNodeId)) {
346 destSonNodeId = this->manager()->addTerminalNode(src.nodeValue(srcSonNodeId));
348 destSonNodeId = this->manager()->addInternalNode(
349 reassign.second(src.node(srcSonNodeId)->nodeVar()));
350 lifo.push_back(srcSonNodeId);
352 src2dest.insert(srcSonNodeId, destSonNodeId);
354 this->manager()->setSon(src2dest.second(currentSrcNodeId),
356 src2dest.second(currentSrcNode->son(index)));
364 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
368 if (this->
_isReduced_ != src.isReducedAndOrdered())
370 "Cannot copy a Reduced and Ordered "
371 "function graph into Tree function graph "
381 this->
add(**varIter);
391 this->
manager()->addInternalNode(src.node(src.root())->nodeVar()));
392 src2dest.insert(src.root(), this->root());
393 lifo.push_back(src.root());
397 while (!lifo.empty()) {
398 NodeId currentSrcNodeId = lifo.back();
401 const InternalNode* currentSrcNode = src.node(currentSrcNodeId);
403 for (
Idx index = 0; index < currentSrcNode->
nbSons(); ++index) {
404 if (!src2dest.exists(currentSrcNode->
son(index))) {
405 NodeId srcSonNodeId = currentSrcNode->
son(index), destSonNodeId = 0;
406 if (src.isTerminalNode(srcSonNodeId)) {
407 destSonNodeId = this->manager()->addTerminalNode(gamma * src.nodeValue(srcSonNodeId));
409 destSonNodeId = this->manager()->addInternalNode(src.node(srcSonNodeId)->nodeVar());
410 lifo.push_back(srcSonNodeId);
412 src2dest.
insert(srcSonNodeId, destSonNodeId);
414 this->manager()->setSon(src2dest[currentSrcNodeId],
416 src2dest[currentSrcNode->
son(index)]);
424 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
436 delete nodeIter.val();
445 delete varIter.val();
453 this->
erase(**varIter);
457 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
460 std::stringstream output;
461 std::stringstream terminalStream;
462 std::stringstream nonTerminalStream;
463 std::stringstream arcstream;
465 output <<
'\n' <<
"digraph \" " <<
_tableName_ <<
"\" {" <<
'\n';
467 terminalStream <<
"node [shape = box];" <<
'\n';
468 nonTerminalStream <<
"node [shape = ellipse];" <<
'\n';
469 std::string tab =
" ";
473 if (*nodeIter != 0) {
475 terminalStream << tab << *nodeIter <<
";" << tab << *nodeIter <<
" [label=\"" << *nodeIter
481 nonTerminalStream << tab << *nodeIter <<
";" << tab << *nodeIter <<
" [label=\""
482 << *nodeIter <<
" - " << currentNode->
nodeVar()->
name() <<
"\"]"
487 for (
Idx sonIter = 0; sonIter < currentNode->
nbSons(); ++sonIter) {
488 if (!sonMap.
exists(currentNode->
son(sonIter)))
490 sonMap[currentNode->
son(sonIter)]->addLink(sonIter);
493 for (
auto sonIter = sonMap.
beginSafe(); sonIter != sonMap.
endSafe(); ++sonIter) {
494 arcstream << tab << *nodeIter <<
" -> " << sonIter.key() <<
" [label=\" ";
500 arcstream <<
"\",color=\"#0000ff\"]"
502 delete sonIter.val();
507 while (parentIter !=
nullptr) {
508 arcstream << tab << *nodeIter <<
" -> " << parentIter->
element().parentId
509 <<
" [label=\"" << parentIter->
element().modality <<
"\",color=\"#ff0000\"]"
511 parentIter = parentIter->
nextLink();
517 output << terminalStream.str() <<
'\n'
518 << nonTerminalStream.str() <<
'\n'
519 << arcstream.str() <<
'\n'
526 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
532 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
545 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
551 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
558 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
565 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
574 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
583 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
589 "Var " << var->
name() <<
" has not been inserted in the function graph")
594 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
600 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
602 std::string_view
name) {
607 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
613 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
620 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
627 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
634 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
641 template <
typename GUM_ELEMENT,
template <
class >
class TerminalNodePolicy >
648 currentNodeId = currentNode->
son(inst.
val(*(currentNode->
nodeVar())));
Unsafe Iterators for hashtables.
const T2 & second(const T1 &first) const
Returns the second value of a pair given its first value.
void insert(const T1 &first, const T2 &second)
Inserts a new association in the gum::Bijection.
Set of pairs of elements with fast search for both elements.
Base class for discrete random variable.
virtual std::string label(Idx i) const =0
get the indice-th label. This method is pure virtual.
bool existsTerminalNodeWithId(const NodeId &n) const override
Returns true if a terminal node matching this id exists.
const GUM_ELEMENT & terminalNodeValue(const NodeId &n) const override
Returns the value of the terminal node that has the given id.
void addTerminalNode(const NodeId &n, const double &v) override
void clearAllTerminalNodes() override
Erase all terminal nodes.
const GUM_ELEMENT & value() const override
Returns the value of the current terminal nodes pointed by the constant safe iterator.
The class for generic Hash Tables.
iterator_safe beginSafe()
Returns the safe iterator pointing to the beginning of the hashtable.
value_type & insert(const Key &key, const Val &val)
Adds a new element (actually a copy of this element) into the hash table.
const iterator_safe & endSafe() noexcept
Returns the safe iterator pointing to the end of the hashtable.
bool exists(const Key &key) const
Checks whether there exists an element with a given key in the hashtable.
Class for assigning/browsing values to tuples of discrete variables.
Idx val(Idx i) const
Returns the current value of the variable at position i.
Structure used to represent a node internal structure.
const DiscreteVariable * nodeVar() const
Returns the node variable.
Idx nbSons() const
Returns the number of sons.
NodeId son(Idx modality) const
Returns the son at a given index.
Link< Parent > * parents()
Returns the list of parents.
Exception: at least one argument passed to a function is not what was expected.
Link of a chain list allocated using the SmallObjectAllocator.
const T & element() const
Returns the element stored in this link.
const Link< T > * nextLink() const
Returns next link.
Abstract base class for all multi dimensionnal containers.
virtual std::string toString() const
Returns a representation of this MultiDimContainer.
Class implementingting a function graph manager.
NodeGraphPart _model_
Indicates available nodeIds.
NodeId _root_
The root node of the function graph.
Size realSize() const override
Returns the real number of parameters used for this table.
HashTable< NodeId, InternalNode * > _internalNodeMap_
Associates each non-terminal node to a variable.
~MultiDimFunctionGraph() override
Class destructor.
void clear()
Clears the function graph.
std::string toDot(bool withBackArcs=false) const
Returns a const reference to the manager of this diagram.
static MultiDimFunctionGraph< GUM_ELEMENT, TerminalNodePolicy > * getTreeInstance()
Returns an arborescent instance.
HashTable< const DiscreteVariable *, LinkedList< NodeId > * > _var2NodeIdMap_
Mapping between var and node.
void copyFrom(const MultiDimContainer< GUM_ELEMENT > &src, Instantiation *p_i=(Instantiation *) 0) const override
void setFirstNotification(const Instantiation &i) override
Listen to setFirst in a given Instantiation.
void setChangeNotification(const Instantiation &i) override
Listen to an assignment of a value in a Instantiation.
MultiDimFunctionGraph(bool isReduced=true)
Default constructor.
void add(const DiscreteVariable &v) override
Adds a new var to the variables of the multidimensional matrix.
void replace_(const DiscreteVariable *x, const DiscreteVariable *y) override
void setTableName(std::string_view name)
Sets the name of the table represented by this structure.
void copy(const MultiDimContainer< GUM_ELEMENT > &src) override
MultiDimContainer< GUM_ELEMENT > * newFactory() const override
Creates an empty clone of this MultiDimContainer.
MultiDimFunctionGraph< GUM_ELEMENT, TerminalNodePolicy > & operator=(const MultiDimFunctionGraph< GUM_ELEMENT, TerminalNodePolicy > &from)
Copy Operator.
bool isInternalNode(const NodeId &node) const
Indicates if given node is terminal or not.
const LinkedList< NodeId > * varNodeListe(const DiscreteVariable *var) const
Returns the list of node associated to given variable.
MultiDimFunctionGraphManager< GUM_ELEMENT, TerminalNodePolicy > * _manager_
A reference to the manager that edits this function graph.
const NodeId & root() const
void copyAndMultiplyByScalar(const MultiDimFunctionGraph< GUM_ELEMENT, TerminalNodePolicy > &src, GUM_ELEMENT gamma)
Copies src diagrams and multiply every value by the given scalar.
void set(const Instantiation &i, const GUM_ELEMENT &value) const override
void setDecNotification(const Instantiation &i) override
Listen to increment in each recorded Instantiation.
void setLastNotification(const Instantiation &i) override
Listen to setLast in a given Instantiation.
void changeNotification(const Instantiation &i, const DiscreteVariable *const var, Idx oldval, Idx newval) override
Listen to changes in a given Instantiation.
const std::string & tableName() const
Returns the name of the table represented by this structure.
const std::string & name() const override
Returns the real name of the multiDim implementation.
bool isReducedAndOrdered() const
Returns true if this MultiDimFunctionGraph is reduced and Ordered.
std::string _name_
The name of the data structure.
bool isTerminalNode(const NodeId &node) const
GUM_ELEMENT & get_(const Instantiation &inst) const override
void copyAndReassign(const MultiDimFunctionGraph< GUM_ELEMENT, TerminalNodePolicy > &src, const Bijection< const DiscreteVariable *, const DiscreteVariable * > &reassign)
Copies src diagrams structure into this diagrams.
bool _isReduced_
Wheter the MultiDimFunctionGraphManager is reduced or not.
const double & nodeValue(NodeId n) const
void fill(const GUM_ELEMENT &d) const override
void erase(const DiscreteVariable &v) override
Removes a var from the variables of the multidimensional matrix.
const NodeGraphPart & model() const
Returns a const reference to the manager of this diagram.
void populate(const std::vector< GUM_ELEMENT > &v) const override
void setIncNotification(const Instantiation &i) override
Listen to increment in a given Instantiation.
std::string _tableName_
The name of the data structure.
GUM_ELEMENT get(const Instantiation &i) const override
Returns the value pointed by i.
const InternalNode * node(NodeId n) const
Returns internalNode structure associated to that nodeId.
MultiDimFunctionGraphManager< GUM_ELEMENT, TerminalNodePolicy > * manager()
Returns a const reference to the manager of this diagram.
static MultiDimFunctionGraph< GUM_ELEMENT, TerminalNodePolicy > * getReducedAndOrderedInstance()
Returns a reduced and ordered instance.
void erase(const DiscreteVariable &v) override
Removes a var from the variables of the multidimensional matrix.
const Sequence< const DiscreteVariable * > & variablesSequence() const override
Returns a const ref to the sequence of DiscreteVariable*.
void add(const DiscreteVariable &v) override
Adds a new var to the variables of the multidimensional matrix.
MultiDimImplementation()
Default constructor.
Class for node sets in graph.
NodeGraphPartIterator NodeIterator
Exception : operation not allowed.
Safe iterators for Sequence.
const std::string & name() const
returns the name of the variable
#define GUM_ERROR(type, msg)
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Size Idx
Type for indexes.
Size NodeId
Type for node ids.
Headers of MultiDimFunctionGraph.
gum is the global namespace for all aGrUM entities