aGrUM  0.14.2
gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy > Class Template Reference

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

#include <agrum/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 52 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 41 of file multiDimFunctionGraphProjector_tpl.h.

References gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::__rd, gum::MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >::getReducedAndOrderedInstance(), and gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::~MultiDimFunctionGraphProjector().

44  :
45  __src(src),
46  __delVars(delVars), __function(), __neutral(neutral) {
47  GUM_CONSTRUCTOR(MultiDimFunctionGraphProjector);
49  }
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __rd
The resulting function graph.
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __src
One of the two function graphs used for the Projection.
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.
const Set< const DiscreteVariable *> & __delVars
The list of variables on which the projection is performed.
MultiDimFunctionGraphProjector(const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *src, const Set< const DiscreteVariable * > &delVars, const GUM_SCALAR neutral)
Default constructor.
static MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * getReducedAndOrderedInstance()
Returns a reduced and ordered instance.
+ Here is the call graph for this function:

◆ ~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 59 of file multiDimFunctionGraphProjector_tpl.h.

References gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::project().

Referenced by gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::MultiDimFunctionGraphProjector().

59  {
60  GUM_DESTRUCTOR(MultiDimFunctionGraphProjector);
61  }
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:
+ Here is the caller 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 73 of file multiDimFunctionGraphProjector_tpl.h.

References gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::__delVars, gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::__function, gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::__neutral, gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::__rd, gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::__src, gum::DiscreteVariable::domainSize(), gum::HashTable< Key, Val, Alloc >::empty(), gum::InternalNode::nodeVar(), and gum::InternalNode::son().

Referenced by gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::~MultiDimFunctionGraphProjector().

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

Referenced by gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::project().

◆ __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 97 of file multiDimFunctionGraphProjector.h.

Referenced by gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::project().

◆ __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 100 of file multiDimFunctionGraphProjector.h.

Referenced by gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::project().

◆ __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

◆ __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 88 of file multiDimFunctionGraphProjector.h.

Referenced by gum::MultiDimFunctionGraphProjector< GUM_SCALAR, FUNCTOR, TerminalNodePolicy >::project().


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