aGrUM  0.20.2
a C++ library for (probabilistic) graphical models
gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy > Class Template Reference

Class used to perform Function Graph projections. More...

#include <agrum/tools/multidim/patterns/multiDimFunctionGraphProjector.h>

+ Collaboration diagram for gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >:

Public Member Functions

Constructors / Destructors
 MultiDimFunctionGraphProjector (const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *src, const Set< const DiscreteVariable * > &delVars, const GUM_SCALAR neutral)
 Default constructor. More...
 
 ~MultiDimFunctionGraphProjector ()
 Default destructor. More...
 
Main Method
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * project ()
 Computes and builds the Function Graph that is the result of the Projection. More...
 

Detailed Description

template<typename GUM_SCALAR, template< typename > class FUNCTOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
class gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >

Class used to perform Function Graph projections.

Definition at line 55 of file multiDimFunctionGraphProjector.h.

Constructor & Destructor Documentation

◆ MultiDimFunctionGraphProjector()

template<typename GUM_SCALAR , template< typename > class FUNCTOR, template< typename > class TerminalNodePolicy>
gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::MultiDimFunctionGraphProjector ( const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *  src,
const Set< const DiscreteVariable * > &  delVars,
const GUM_SCALAR  neutral 
)

Default constructor.

Definition at line 44 of file multiDimFunctionGraphProjector_tpl.h.

47  :
48  src__(src),
49  delVars__(delVars), function__(), neutral__(neutral) {
50  GUM_CONSTRUCTOR(MultiDimFunctionGraphProjector);
52  }
const FUNCTOR< GUM_SCALAR > function__
The function to be performed on the leaves.
const GUM_SCALAR neutral__
The function to be performed on the leaves.
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * rd__
The resulting function graph.
MultiDimFunctionGraphProjector(const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *src, const Set< const DiscreteVariable * > &delVars, const GUM_SCALAR neutral)
Default constructor.
const Set< const DiscreteVariable *> & delVars__
The list of variables on which the projection is performed.
static MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * getReducedAndOrderedInstance()
Returns a reduced and ordered instance.
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * src__
One of the two function graphs used for the Projection.

◆ ~MultiDimFunctionGraphProjector()

template<typename GUM_SCALAR , template< typename > class FUNCTOR, template< typename > class TerminalNodePolicy>
gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::~MultiDimFunctionGraphProjector ( )

Default destructor.

Definition at line 62 of file multiDimFunctionGraphProjector_tpl.h.

References gum::Set< Key, Alloc >::emplace().

62  {
63  GUM_DESTRUCTOR(MultiDimFunctionGraphProjector);
64  }
MultiDimFunctionGraphProjector(const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *src, const Set< const DiscreteVariable * > &delVars, const GUM_SCALAR neutral)
Default constructor.
+ Here is the call graph for this function:

Member Function Documentation

◆ project()

template<typename GUM_SCALAR , template< typename > class FUNCTOR, template< typename > class TerminalNodePolicy>
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::project ( )

Computes and builds the Function Graph that is the result of the Projection.

Definition at line 76 of file multiDimFunctionGraphProjector_tpl.h.

References gum::Set< Key, Alloc >::emplace().

76  {
77  rd__->copy(*src__);
78 
79  for (SetIteratorSafe< const DiscreteVariable* > varIter
80  = delVars__.beginSafe();
81  varIter != delVars__.endSafe();
82  ++varIter) {
83  const DiscreteVariable* curVar = *varIter;
84 
85  // Tout d'abord, on déplace la variable à projeter en fin de séquence afin
86  // de simplifier la projection
87  if (rd__->variablesSequence().exists(curVar))
88  rd__->manager()->moveTo(curVar, rd__->variablesSequence().size() - 1);
89 
90  // 1er cas spécial : le diagramme est un un simple noeud terminal
91  if (rd__->isTerminalNode(rd__->root())) {
92  GUM_SCALAR newVal = neutral__, oldVal = rd__->nodeValue(rd__->root());
93  for (Idx curVarModality = 0; curVarModality < curVar->domainSize();
94  ++curVarModality)
95  newVal = function__(newVal, oldVal);
96 
97  NodeId newSonId = rd__->manager()->addTerminalNode(newVal);
98  rd__->manager()->setRootNode(newSonId);
99 
100  if (rd__->variablesSequence().exists(curVar)) rd__->erase(*curVar);
101  continue;
102  }
103 
104  // 2ème cas spécial : la racine du diagramme est associée à la variable
105  // projetée
106  if (rd__->node(rd__->root())->nodeVar() == curVar) {
107  const InternalNode* curVarNode = rd__->node(rd__->root());
108  GUM_SCALAR newVal = neutral__;
109  for (Idx curVarModality = 0; curVarModality < curVar->domainSize();
110  ++curVarModality)
111  newVal = function__(newVal,
112  rd__->nodeValue(curVarNode->son(curVarModality)));
113 
114  NodeId newSonId = rd__->manager()->addTerminalNode(newVal);
115 
116  rd__->manager()->eraseNode(rd__->root(), newSonId, false);
117 
118  if (rd__->variablesSequence().exists(curVar)) rd__->erase(*curVar);
119  continue;
120  }
121 
122  // Cas général
123  HashTable< NodeId, NodeId > visitedNode(2 * rd__->realSize(), true, false);
124  std::vector< NodeId > filo;
125  filo.push_back(rd__->root());
126 
127  while (!filo.empty()) {
128  NodeId curNodeId = filo.back();
129  filo.pop_back();
130 
131  const InternalNode* curNode = rd__->node(curNodeId);
132 
133  for (Idx modality = 0; modality < curNode->nodeVar()->domainSize();
134  ++modality) {
135  NodeId oldSonId = curNode->son(modality);
136 
137  if (!visitedNode.exists(oldSonId)) {
138  NodeId newSonId = oldSonId;
139 
140  if (!rd__->isTerminalNode(oldSonId)) {
141  if (rd__->node(oldSonId)->nodeVar() != curVar) {
142  filo.push_back(oldSonId);
143  } else {
144  const InternalNode* curVarNode = rd__->node(oldSonId);
145  GUM_SCALAR newVal = neutral__;
146  for (Idx curVarModality = 0; curVarModality < curVar->domainSize();
147  ++curVarModality)
148  newVal = function__(
149  newVal,
150  rd__->nodeValue(curVarNode->son(curVarModality)));
151 
152  newSonId = rd__->manager()->addTerminalNode(newVal);
153 
154  rd__->manager()->eraseNode(oldSonId, newSonId, false);
155  rd__->manager()->setSon(curNodeId, modality, newSonId);
156  }
157 
158  } else {
159  GUM_SCALAR newVal = neutral__, oldVal = rd__->nodeValue(oldSonId);
160  for (Idx curVarModality = 0; curVarModality < curVar->domainSize();
161  ++curVarModality)
162  newVal = function__(newVal, oldVal);
163 
164  newSonId = rd__->manager()->addTerminalNode(newVal);
165  rd__->manager()->setSon(curNodeId, modality, newSonId);
166  }
167 
168  visitedNode.insert(oldSonId, newSonId);
169 
170  } else {
171  if (rd__->node(curNodeId)->son(modality) != visitedNode[oldSonId])
172  rd__->manager()->setSon(curNodeId, modality, visitedNode[oldSonId]);
173  }
174  }
175  }
176 
177  if (rd__->variablesSequence().exists(curVar)) rd__->erase(*curVar);
178  }
179 
180  return rd__;
181  }
const FUNCTOR< GUM_SCALAR > function__
The function to be performed on the leaves.
const GUM_SCALAR neutral__
The function to be performed on the leaves.
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * rd__
The resulting function graph.
Size NodeId
Type for node ids.
Definition: graphElements.h:97
const Set< const DiscreteVariable *> & delVars__
The list of variables on which the projection is performed.
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * src__
One of the two function graphs used for the Projection.
+ Here is the call graph for this function:

Member Data Documentation

◆ delVars__

template<typename GUM_SCALAR , template< typename > class FUNCTOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const Set< const DiscreteVariable* >& gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::delVars__
private

The list of variables on which the projection is performed.

Definition at line 94 of file multiDimFunctionGraphProjector.h.

◆ function__

template<typename GUM_SCALAR , template< typename > class FUNCTOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const FUNCTOR< GUM_SCALAR > gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::function__
private

The function to be performed on the leaves.

Definition at line 100 of file multiDimFunctionGraphProjector.h.

◆ neutral__

template<typename GUM_SCALAR , template< typename > class FUNCTOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const GUM_SCALAR gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::neutral__
private

The function to be performed on the leaves.

Definition at line 103 of file multiDimFunctionGraphProjector.h.

◆ rd__

template<typename GUM_SCALAR , template< typename > class FUNCTOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >* gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::rd__
private

The resulting function graph.

Definition at line 97 of file multiDimFunctionGraphProjector.h.

◆ src__

template<typename GUM_SCALAR , template< typename > class FUNCTOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >* gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::src__
private

One of the two function graphs used for the Projection.

Definition at line 91 of file multiDimFunctionGraphProjector.h.


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