aGrUM  0.20.3
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 54 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 MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * _src_
One of the two function graphs used for the Projection.
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * _rd_
The resulting function graph.
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.

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

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

75  {
76  _rd_->copy(*_src_);
77 
78  for (SetIteratorSafe< const DiscreteVariable* > varIter = _delVars_.beginSafe();
79  varIter != _delVars_.endSafe();
80  ++varIter) {
81  const DiscreteVariable* curVar = *varIter;
82 
83  // Tout d'abord, on déplace la variable à projeter en fin de séquence afin
84  // de simplifier la projection
85  if (_rd_->variablesSequence().exists(curVar))
86  _rd_->manager()->moveTo(curVar, _rd_->variablesSequence().size() - 1);
87 
88  // 1er cas spécial : le diagramme est un un simple noeud terminal
89  if (_rd_->isTerminalNode(_rd_->root())) {
90  GUM_SCALAR newVal = _neutral_, oldVal = _rd_->nodeValue(_rd_->root());
91  for (Idx curVarModality = 0; curVarModality < curVar->domainSize(); ++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(); ++curVarModality)
107  newVal = _function_(newVal, _rd_->nodeValue(curVarNode->son(curVarModality)));
108 
109  NodeId newSonId = _rd_->manager()->addTerminalNode(newVal);
110 
111  _rd_->manager()->eraseNode(_rd_->root(), newSonId, false);
112 
113  if (_rd_->variablesSequence().exists(curVar)) _rd_->erase(*curVar);
114  continue;
115  }
116 
117  // Cas général
118  HashTable< NodeId, NodeId > visitedNode(2 * _rd_->realSize(), true, false);
119  std::vector< NodeId > filo;
120  filo.push_back(_rd_->root());
121 
122  while (!filo.empty()) {
123  NodeId curNodeId = filo.back();
124  filo.pop_back();
125 
126  const InternalNode* curNode = _rd_->node(curNodeId);
127 
128  for (Idx modality = 0; modality < curNode->nodeVar()->domainSize(); ++modality) {
129  NodeId oldSonId = curNode->son(modality);
130 
131  if (!visitedNode.exists(oldSonId)) {
132  NodeId newSonId = oldSonId;
133 
134  if (!_rd_->isTerminalNode(oldSonId)) {
135  if (_rd_->node(oldSonId)->nodeVar() != curVar) {
136  filo.push_back(oldSonId);
137  } else {
138  const InternalNode* curVarNode = _rd_->node(oldSonId);
139  GUM_SCALAR newVal = _neutral_;
140  for (Idx curVarModality = 0; curVarModality < curVar->domainSize();
141  ++curVarModality)
142  newVal = _function_(newVal, _rd_->nodeValue(curVarNode->son(curVarModality)));
143 
144  newSonId = _rd_->manager()->addTerminalNode(newVal);
145 
146  _rd_->manager()->eraseNode(oldSonId, newSonId, false);
147  _rd_->manager()->setSon(curNodeId, modality, newSonId);
148  }
149 
150  } else {
151  GUM_SCALAR newVal = _neutral_, oldVal = _rd_->nodeValue(oldSonId);
152  for (Idx curVarModality = 0; curVarModality < curVar->domainSize(); ++curVarModality)
153  newVal = _function_(newVal, oldVal);
154 
155  newSonId = _rd_->manager()->addTerminalNode(newVal);
156  _rd_->manager()->setSon(curNodeId, modality, newSonId);
157  }
158 
159  visitedNode.insert(oldSonId, newSonId);
160 
161  } else {
162  if (_rd_->node(curNodeId)->son(modality) != visitedNode[oldSonId])
163  _rd_->manager()->setSon(curNodeId, modality, visitedNode[oldSonId]);
164  }
165  }
166  }
167 
168  if (_rd_->variablesSequence().exists(curVar)) _rd_->erase(*curVar);
169  }
170 
171  return _rd_;
172  }
const FUNCTOR< GUM_SCALAR > _function_
The function to be performed on the leaves.
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * _src_
One of the two function graphs used for the Projection.
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * _rd_
The resulting function graph.
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:

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 93 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 99 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 102 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 96 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 90 of file multiDimFunctionGraphProjector.h.


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