aGrUM  0.16.0
gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy > Class Template Reference

Class used to perform Function Graph Operations in the FMDP Framework. More...

#include <agrum/multidim/patterns/regress.h>

+ Collaboration diagram for gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >:

Public Member Functions

Constructors / Destructors
 Regress (const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *vfunction, const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *probDist, const Set< const DiscreteVariable * > *primedVars, const DiscreteVariable *targetVar, const GUM_SCALAR neutral)
 Default constructor. More...
 
 ~Regress ()
 Default destructor. More...
 
Main Method
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * compute ()
 Computes and builds the Function Graph that is the result of the operation. More...
 

Detailed Description

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
class gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >

Class used to perform Function Graph Operations in the FMDP Framework.

Definition at line 54 of file regress.h.

Constructor & Destructor Documentation

◆ Regress()

template<typename GUM_SCALAR , template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy>
INLINE gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::Regress ( const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *  vfunction,
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *  probDist,
const Set< const DiscreteVariable * > *  primedVars,
const DiscreteVariable targetVar,
const GUM_SCALAR  neutral 
)

Default constructor.

Definition at line 48 of file regress_tpl.h.

References gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__default, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__nbVar, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__primedVars, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__rd, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__targetVar, and gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::~Regress().

52  :
53  __DG1(DG1),
54  __DG2(DG2), __neutral(neutral), __combine(), __project(),
55  __DG1InstantiationNeeded(DG1->realSize(), true, false),
56  __DG2InstantiationNeeded(DG2->realSize(), true, false) {
57  GUM_CONSTRUCTOR(Regress);
58  __rd =
59  MultiDimFunctionGraph< GUM_SCALAR,
60  TerminalNodePolicy >::getReducedAndOrderedInstance();
61  __nbVar = 0;
62  __default = nullptr;
63  __primedVars = primedVars;
64  __targetVar = targetVar;
65  }
const PROJECTOPERATOR< GUM_SCALAR > __project
Definition: regress.h:124
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __rd
The resulting function graph.
Definition: regress.h:108
HashTable< NodeId, short int *> __DG2InstantiationNeeded
Definition: regress.h:133
const DiscreteVariable * __targetVar
The variable we work on to eleminate.
Definition: regress.h:114
const GUM_SCALAR __neutral
The function to be performed on the leaves.
Definition: regress.h:117
const COMBINEOPERATOR< GUM_SCALAR > __combine
The functions to be performed on the leaves.
Definition: regress.h:123
HashTable< NodeId, short int *> __DG1InstantiationNeeded
Table uses to know if a given node of given function graph has retrograde variables.
Definition: regress.h:132
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __DG2
The other one.
Definition: regress.h:105
Regress(const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *vfunction, const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *probDist, const Set< const DiscreteVariable * > *primedVars, const DiscreteVariable *targetVar, const GUM_SCALAR neutral)
Default constructor.
Definition: regress_tpl.h:48
Idx __nbVar
The total number of variable implied in the operation.
Definition: regress.h:120
const Set< const DiscreteVariable *> * __primedVars
The set of variables we want to keep at the end.
Definition: regress.h:111
short int * __default
Just a computationnal trick.
Definition: regress.h:136
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __DG1
One of the two function graphs used for the operation.
Definition: regress.h:102
+ Here is the call graph for this function:

◆ ~Regress()

template<typename GUM_SCALAR , template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy>
INLINE gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::~Regress ( )

Default destructor.

Definition at line 76 of file regress_tpl.h.

References gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__default, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG1InstantiationNeeded, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG2InstantiationNeeded, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__nbVar, gum::HashTable< Key, Val, Alloc >::beginSafe(), gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::compute(), DEALLOCATE, and gum::HashTable< Key, Val, Alloc >::endSafe().

Referenced by gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::Regress().

76  {
77  GUM_DESTRUCTOR(Regress);
78 
79  for (auto instIter = __DG1InstantiationNeeded.beginSafe();
80  instIter != __DG1InstantiationNeeded.endSafe();
81  ++instIter)
82  DEALLOCATE(instIter.val(), sizeof(short int) * __nbVar);
83 
84  for (auto instIter = __DG2InstantiationNeeded.beginSafe();
85  instIter != __DG2InstantiationNeeded.endSafe();
86  ++instIter)
87  DEALLOCATE(instIter.val(), sizeof(short int) * __nbVar);
88 
89  if (__nbVar != 0) DEALLOCATE(__default, sizeof(short int) * __nbVar);
90  }
HashTable< NodeId, short int *> __DG2InstantiationNeeded
Definition: regress.h:133
const iterator_safe & endSafe() noexcept
Returns the safe iterator pointing to the end of the hashtable.
HashTable< NodeId, short int *> __DG1InstantiationNeeded
Table uses to know if a given node of given function graph has retrograde variables.
Definition: regress.h:132
Regress(const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *vfunction, const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *probDist, const Set< const DiscreteVariable * > *primedVars, const DiscreteVariable *targetVar, const GUM_SCALAR neutral)
Default constructor.
Definition: regress_tpl.h:48
#define DEALLOCATE(x, y)
Definition: regress_tpl.h:35
Idx __nbVar
The total number of variable implied in the operation.
Definition: regress.h:120
iterator_safe beginSafe()
Returns the safe iterator pointing to the beginning of the hashtable.
short int * __default
Just a computationnal trick.
Definition: regress.h:136
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Function Documentation

◆ __compute()

template<typename GUM_SCALAR , template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy>
INLINE NodeId gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__compute ( O4DGContext currentSituation,
Idx  lastInstVarPos 
)
private

The main recursion function.

Definition at line 328 of file regress_tpl.h.

References gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__combine, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__default, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG1, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG1InstantiationNeeded, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG2, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG2InstantiationNeeded, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__explorationTable, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__nbVar, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__neutral, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__project, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__rd, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__targetVar, ALLOCATE, gum::O4DGContext::chgVarModality(), DEALLOCATE, gum::O4DGContext::DG1Node(), gum::O4DGContext::DG2Node(), gum::DiscreteVariable::domainSize(), gum::HashTable< Key, Val, Alloc >::exists(), gum::HashTable< Key, Val, Alloc >::insert(), gum::O4DGContext::key(), gum::InternalNode::nodeVar(), gum::O4DGContext::setDG1Node(), gum::O4DGContext::setDG2Node(), gum::InternalNode::son(), and gum::O4DGContext::varModality().

Referenced by gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__findRetrogradeVariables(), and gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::compute().

328  {
329  NodeId newNode = 0;
330 
331  // If both current nodes are terminal,
332  // we only have to compute the resulting value
333  if (__DG1->isTerminalNode(currentSituation.DG1Node())
334  && __DG2->isTerminalNode(currentSituation.DG2Node())) {
335  // We have to compute new valueand we insert a new node in diagram with
336  // this value, ...
337  GUM_SCALAR newVal = __neutral;
338  GUM_SCALAR tempVal = __combine(__DG1->nodeValue(currentSituation.DG1Node()),
339  __DG2->nodeValue(currentSituation.DG2Node()));
340  for (Idx targetModa = 0; targetModa < __targetVar->domainSize();
341  ++targetModa)
342  newVal = __project(newVal, tempVal);
343  return __rd->manager()->addTerminalNode(newVal);
344  }
345 
346  // If not,
347  // we'll have to do some exploration
348 
349  // First we ensure that we hadn't already visit this pair of node under hte
350  // same circumstances
351  short int* dg1NeededVar =
352  __DG1InstantiationNeeded.exists(currentSituation.DG1Node())
353  ? __DG1InstantiationNeeded[currentSituation.DG1Node()]
354  : __default;
355  Idx dg1CurrentVarPos =
356  __DG1->isTerminalNode(currentSituation.DG1Node())
357  ? __nbVar
358  : __rd->variablesSequence().pos(
359  __DG1->node(currentSituation.DG1Node())->nodeVar());
360  short int* dg2NeededVar =
361  __DG2InstantiationNeeded.exists(currentSituation.DG2Node())
362  ? __DG2InstantiationNeeded[currentSituation.DG2Node()]
363  : __default;
364  Idx dg2CurrentVarPos =
365  __DG2->isTerminalNode(currentSituation.DG2Node())
366  ? __nbVar
367  : __rd->variablesSequence().pos(
368  __DG2->node(currentSituation.DG2Node())->nodeVar());
369 
370  short int* instNeeded =
371  static_cast< short int* >(ALLOCATE(sizeof(short int) * __nbVar));
372 
373  for (Idx i = 0; i < __nbVar; i++) {
374  instNeeded[i] = dg1NeededVar[i] + dg2NeededVar[i];
375  }
376 
377  double curSitKey = currentSituation.key(instNeeded);
378 
379  if (__explorationTable.exists(curSitKey)) {
380  DEALLOCATE(instNeeded, sizeof(short int) * __nbVar);
381 
382  return __explorationTable[curSitKey];
383  }
384 
385  // ====================================================
386 
387  NodeId origDG1 = currentSituation.DG1Node(),
388  origDG2 = currentSituation.DG2Node();
389 
390  const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >* leaddg =
391  nullptr;
392  NodeId leadNodeId = 0;
393  Idx leadVarPos = __rd->variablesSequence().size();
394  typedef void (O4DGContext::*SetNodeFunction)(const NodeId&);
395  SetNodeFunction leadFunction = nullptr;
396 
397  bool sameVar = false;
398 
399  if (!__DG1->isTerminalNode(currentSituation.DG1Node())) {
400  if (currentSituation.varModality(dg1CurrentVarPos) != 0) {
401  // If var associated to current node has already been instanciated, we
402  // have to jump it
403  currentSituation.setDG1Node(
404  __DG1->node(currentSituation.DG1Node())
405  ->son(currentSituation.varModality(dg1CurrentVarPos) - 1));
406 
407  newNode = __compute(currentSituation, lastInstVarPos);
408  __explorationTable.insert(curSitKey, newNode);
409  currentSituation.setDG1Node(origDG1);
410  currentSituation.setDG2Node(origDG2);
411 
412  DEALLOCATE(instNeeded, sizeof(short int) * __nbVar);
413 
414  return newNode;
415  }
416 
417  leaddg = __DG1;
418  leadNodeId = currentSituation.DG1Node();
419  leadVarPos = dg1CurrentVarPos;
420  leadFunction = &O4DGContext::setDG1Node;
421  }
422 
423  if (!__DG2->isTerminalNode(currentSituation.DG2Node())) {
424  if (currentSituation.varModality(dg2CurrentVarPos) != 0) {
425  // If var associated to current node has already been instanciated, we
426  // have to jump it
427  currentSituation.setDG2Node(
428  __DG2->node(currentSituation.DG2Node())
429  ->son(currentSituation.varModality(dg2CurrentVarPos) - 1));
430 
431  newNode = __compute(currentSituation, lastInstVarPos);
432  __explorationTable.insert(curSitKey, newNode);
433  currentSituation.setDG1Node(origDG1);
434  currentSituation.setDG2Node(origDG2);
435 
436  DEALLOCATE(instNeeded, sizeof(short int) * __nbVar);
437 
438  return newNode;
439  }
440 
441  if (leadVarPos == dg2CurrentVarPos) { sameVar = true; }
442 
443  if (leadVarPos > dg2CurrentVarPos) {
444  leaddg = __DG2;
445  leadNodeId = currentSituation.DG2Node();
446  leadVarPos = dg2CurrentVarPos;
447  leadFunction = &O4DGContext::setDG2Node;
448  }
449  }
450 
451  // ====================================================
452  // Anticipated Exploration
453 
454  // Before exploring nodes, we have to ensure that every anticipated
455  // exploration is done
456  for (Idx varPos = lastInstVarPos + 1; varPos < leadVarPos; ++varPos) {
457  if (instNeeded[varPos]) {
458  const DiscreteVariable* curVar = __rd->variablesSequence().atPos(varPos);
459  NodeId* sonsIds =
460  static_cast< NodeId* >(ALLOCATE(sizeof(NodeId) * curVar->domainSize()));
461 
462  for (Idx modality = 0; modality < curVar->domainSize(); modality++) {
463  currentSituation.chgVarModality(varPos, modality + 1);
464 
465  sonsIds[modality] = __compute(currentSituation, varPos);
466  }
467 
468  newNode = __rd->manager()->addInternalNode(curVar, sonsIds);
469 
470  __explorationTable.insert(curSitKey, newNode);
471  currentSituation.chgVarModality(varPos, 0);
472  currentSituation.setDG1Node(origDG1);
473  currentSituation.setDG2Node(origDG2);
474 
475  DEALLOCATE(instNeeded, sizeof(short int) * __nbVar);
476 
477  return newNode;
478  }
479  }
480 
481  // ====================================================
482  // Terminal Exploration
483  if (sameVar && __DG1->node(origDG1)->nodeVar() == __targetVar) {
484  GUM_SCALAR newVal = __neutral;
485  for (Idx targetModa = 0; targetModa < __targetVar->domainSize();
486  ++targetModa)
487  newVal = __project(
488  newVal,
489  __combine(__DG1->nodeValue(__DG1->node(origDG1)->son(targetModa)),
490  __DG2->nodeValue(__DG2->node(origDG2)->son(targetModa))));
491  newNode = __rd->manager()->addTerminalNode(newVal);
492  __explorationTable.insert(curSitKey, newNode);
493  DEALLOCATE(instNeeded, sizeof(short int) * __nbVar);
494  return newNode;
495  }
496  if (__DG1->isTerminalNode(origDG1)) {
497  if (__DG2->node(origDG2)->nodeVar() == __targetVar) {
498  GUM_SCALAR newVal = __neutral;
499  for (Idx targetModa = 0; targetModa < __targetVar->domainSize();
500  ++targetModa)
501  newVal = __project(
502  newVal,
503  __combine(__DG1->nodeValue(origDG1),
504  __DG2->nodeValue(__DG2->node(origDG2)->son(targetModa))));
505  newNode = __rd->manager()->addTerminalNode(newVal);
506  __explorationTable.insert(curSitKey, newNode);
507  DEALLOCATE(instNeeded, sizeof(short int) * __nbVar);
508  return newNode;
509  }
510  } else {
511  if (__DG1->node(origDG1)->nodeVar() == __targetVar
512  && __DG2->isTerminalNode(origDG2)) {
513  GUM_SCALAR newVal = __neutral;
514  for (Idx targetModa = 0; targetModa < __targetVar->domainSize();
515  ++targetModa)
516  newVal = __project(
517  newVal,
518  __combine(__DG1->nodeValue(__DG1->node(origDG1)->son(targetModa)),
519  __DG2->nodeValue(origDG2)));
520  newNode = __rd->manager()->addTerminalNode(newVal);
521  __explorationTable.insert(curSitKey, newNode);
522  DEALLOCATE(instNeeded, sizeof(short int) * __nbVar);
523  return newNode;
524  }
525  }
526 
527  // ====================================================
528  // Normal Exploration
529 
530  // If only one of the current node is terminal,
531  // we have to pursue deeper on the other diagram
532  if (sameVar) {
533  // If so - meaning it's the same variable - we have to go
534  // down on both
535  const InternalNode* dg1Node = __DG1->node(origDG1);
536  const InternalNode* dg2Node = __DG2->node(origDG2);
537 
538  const DiscreteVariable* curVar = dg1Node->nodeVar();
539  Idx varPos = __rd->variablesSequence().pos(curVar);
540  NodeId* sonsIds =
541  static_cast< NodeId* >(ALLOCATE(sizeof(NodeId) * curVar->domainSize()));
542 
543  for (Idx modality = 0; modality < curVar->domainSize(); modality++) {
544  currentSituation.chgVarModality(varPos, modality + 1);
545  currentSituation.setDG1Node(dg1Node->son(modality));
546  currentSituation.setDG2Node(dg2Node->son(modality));
547 
548  sonsIds[modality] = __compute(currentSituation, varPos);
549  }
550 
551  newNode = __rd->manager()->addInternalNode(curVar, sonsIds);
552 
553  __explorationTable.insert(curSitKey, newNode);
554  currentSituation.chgVarModality(varPos, 0);
555  currentSituation.setDG1Node(origDG1);
556  currentSituation.setDG2Node(origDG2);
557 
558  DEALLOCATE(instNeeded, sizeof(short int) * __nbVar);
559 
560  return newNode;
561  }
562  // ====================================================
563  else {
564  const InternalNode* leaddgNode = leaddg->node(leadNodeId);
565 
566  const DiscreteVariable* curVar = leaddgNode->nodeVar();
567  NodeId* sonsIds =
568  static_cast< NodeId* >(ALLOCATE(sizeof(NodeId) * curVar->domainSize()));
569 
570  for (Idx modality = 0; modality < curVar->domainSize(); modality++) {
571  currentSituation.chgVarModality(leadVarPos, modality + 1);
572  (currentSituation.*leadFunction)(leaddgNode->son(modality));
573 
574  sonsIds[modality] = __compute(currentSituation, leadVarPos);
575  }
576 
577  newNode = __rd->manager()->addInternalNode(curVar, sonsIds);
578 
579  __explorationTable.insert(curSitKey, newNode);
580  currentSituation.chgVarModality(leadVarPos, 0);
581  currentSituation.setDG1Node(origDG1);
582  currentSituation.setDG2Node(origDG2);
583 
584  DEALLOCATE(instNeeded, sizeof(short int) * __nbVar);
585 
586  return newNode;
587  }
588  }
const PROJECTOPERATOR< GUM_SCALAR > __project
Definition: regress.h:124
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __rd
The resulting function graph.
Definition: regress.h:108
HashTable< NodeId, short int *> __DG2InstantiationNeeded
Definition: regress.h:133
const DiscreteVariable * __targetVar
The variable we work on to eleminate.
Definition: regress.h:114
const GUM_SCALAR __neutral
The function to be performed on the leaves.
Definition: regress.h:117
bool exists(const Key &key) const
Checks whether there exists an element with a given key in the hashtable.
const COMBINEOPERATOR< GUM_SCALAR > __combine
The functions to be performed on the leaves.
Definition: regress.h:123
HashTable< NodeId, short int *> __DG1InstantiationNeeded
Table uses to know if a given node of given function graph has retrograde variables.
Definition: regress.h:132
#define ALLOCATE(x)
Definition: regress_tpl.h:34
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __DG2
The other one.
Definition: regress.h:105
virtual Size domainSize() const =0
#define DEALLOCATE(x, y)
Definition: regress_tpl.h:35
void setDG1Node(const NodeId &)
Set DG1 diagram current explored Node.
NodeId __compute(O4DGContext &currentSituation, Idx lastInstVarPos)
The main recursion function.
Definition: regress_tpl.h:328
Idx __nbVar
The total number of variable implied in the operation.
Definition: regress.h:120
void setDG2Node(const NodeId &)
Set DG2 diagram current explored Node.
HashTable< double, NodeId > __explorationTable
The hashtable used to know if two pair of nodes have already been visited.
Definition: regress.h:128
short int * __default
Just a computationnal trick.
Definition: regress.h:136
value_type & insert(const Key &key, const Val &val)
Adds a new element (actually a copy of this element) into the hash table.
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __DG1
One of the two function graphs used for the operation.
Definition: regress.h:102
Size NodeId
Type for node ids.
Definition: graphElements.h:98
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __establishVarOrder()

template<typename GUM_SCALAR , template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy>
INLINE void gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__establishVarOrder ( )
private

Computes an order for the final Decision graph that will minimize the number of re exploration.

Definition at line 142 of file regress_tpl.h.

References gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__default, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG1, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG2, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__findRetrogradeVariables(), gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__nbVar, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__primedVars, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__rd, and ALLOCATE.

Referenced by gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::compute().

142  {
143  SequenceIteratorSafe< const DiscreteVariable* > fite =
144  __DG1->variablesSequence().beginSafe();
145  SequenceIteratorSafe< const DiscreteVariable* > site =
146  __DG2->variablesSequence().beginSafe();
147 
148  while (fite != __DG1->variablesSequence().endSafe()
149  && site != __DG2->variablesSequence().endSafe()) {
150  // Test : if var from first order is already in final order
151  // we move onto the next one
152  if (__rd->variablesSequence().exists(*fite)) {
153  ++fite;
154  continue;
155  }
156 
157  // Test : if var from second order is already in final order
158  // we move onto the next one
159  if (__rd->variablesSequence().exists(*site)) {
160  ++site;
161  continue;
162  }
163 
164  // Test : is current var of the first order present in the second order.
165  // if not we add it to final order
166  if (!__DG2->variablesSequence().exists(*fite)
167  && !__primedVars->exists(*fite)) {
168  __rd->add(**fite);
169  ++fite;
170  continue;
171  }
172 
173  // Test : is current var of the second order present in the first order.
174  // if not we add it to final order
175  if (!__DG1->variablesSequence().exists(*site)
176  && !__primedVars->exists(*site)) {
177  __rd->add(**site);
178  ++site;
179  continue;
180  }
181 
182  // Test : is current var of the second order present in the first order.
183  // if not we add it to final order
184  if (*fite == *site) {
185  __rd->add(**fite);
186  ++fite;
187  ++site;
188  continue;
189  }
190 
191  // Test : if chosing first order var cost less in terms or re exploration,
192  // we chose it
193  __rd->add(**fite);
194  ++fite;
195  }
196 
197  // Whenever an iterator has finished its sequence,
198  // the other may still be in the middle of its one.
199  // Hence, this part ensures that any variables remaining
200  // will be added to the final sequence if needed.
201  if (fite == __DG1->variablesSequence().endSafe()) {
202  for (; site != __DG2->variablesSequence().endSafe(); ++site)
203  if (!__rd->variablesSequence().exists(*site)) __rd->add(**site);
204  } else {
205  for (; fite != __DG1->variablesSequence().endSafe(); ++fite)
206  if (!__rd->variablesSequence().exists(*fite)) __rd->add(**fite);
207  }
208 
209  // Various initialization needed now that we have a bigger picture
210  __nbVar = __rd->variablesSequence().size();
211 
212  if (__nbVar != 0) {
213  __default = static_cast< short int* >(ALLOCATE(sizeof(short int) * __nbVar));
214  for (Idx i = 0; i < __nbVar; i++)
215  __default[i] = (short int)0;
216  }
217  }
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __rd
The resulting function graph.
Definition: regress.h:108
#define ALLOCATE(x)
Definition: regress_tpl.h:34
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __DG2
The other one.
Definition: regress.h:105
Idx __nbVar
The total number of variable implied in the operation.
Definition: regress.h:120
const Set< const DiscreteVariable *> * __primedVars
The set of variables we want to keep at the end.
Definition: regress.h:111
short int * __default
Just a computationnal trick.
Definition: regress.h:136
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __DG1
One of the two function graphs used for the operation.
Definition: regress.h:102
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __findRetrogradeVariables()

template<typename GUM_SCALAR , template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy>
INLINE void gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__findRetrogradeVariables ( const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *  dg,
HashTable< NodeId, short int * > &  dgInstNeed 
)
private

Establish for each node in both function graph if it has retrograde variables beneath it.

Definition at line 230 of file regress_tpl.h.

References gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__compute(), gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__nbVar, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__rd, ALLOCATE, gum::HashTable< Key, Val, Alloc >::begin(), gum::HashTable< Key, Val, Alloc >::clear(), DEALLOCATE, gum::Link< T >::element(), gum::HashTable< Key, Val, Alloc >::end(), gum::HashTable< Key, Val, Alloc >::insert(), and gum::Link< T >::nextLink().

Referenced by gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__establishVarOrder(), and gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::compute().

232  {
233  HashTable< NodeId, short int* > nodesVarDescendant;
234  Size tableSize = Size(__nbVar * sizeof(short int));
235 
236  for (auto varIter = dg->variablesSequence().rbeginSafe();
237  varIter != dg->variablesSequence().rendSafe();
238  --varIter) {
239  Idx varPos = __rd->variablesSequence().pos(*varIter);
240 
241  const Link< NodeId >* nodeIter = dg->varNodeListe(*varIter)->list();
242  while (nodeIter != nullptr) {
243  short int* instantiationNeeded =
244  static_cast< short int* >(ALLOCATE(tableSize));
245  dgInstNeed.insert(nodeIter->element(), instantiationNeeded);
246  short int* varDescendant = static_cast< short int* >(ALLOCATE(tableSize));
247  nodesVarDescendant.insert(nodeIter->element(), varDescendant);
248  for (Idx j = 0; j < __nbVar; j++) {
249  instantiationNeeded[j] = (short int)0;
250  varDescendant[j] = (short int)0;
251  }
252 
253 
254  varDescendant[varPos] = (short int)1;
255  for (Idx modality = 0; modality < dg->node(nodeIter->element())->nbSons();
256  ++modality) {
257  if (!dg->isTerminalNode(dg->node(nodeIter->element())->son(modality))) {
258  short int* sonVarDescendant =
259  nodesVarDescendant[dg->node(nodeIter->element())->son(modality)];
260  for (Idx varIdx = 0; varIdx < __nbVar; varIdx++) {
261  varDescendant[varIdx] += sonVarDescendant[varIdx];
262  if (varDescendant[varIdx] && varIdx < varPos)
263  instantiationNeeded[varIdx] = (short int)1;
264  }
265  }
266  }
267  nodeIter = nodeIter->nextLink();
268  }
269  }
270 
271  for (auto varIter = dg->variablesSequence().beginSafe();
272  varIter != dg->variablesSequence().endSafe();
273  ++varIter) {
274  const Link< NodeId >* nodeIter = dg->varNodeListe(*varIter)->list();
275  while (nodeIter != nullptr) {
276  for (Idx modality = 0; modality < dg->node(nodeIter->element())->nbSons();
277  ++modality) {
278  NodeId sonId = dg->node(nodeIter->element())->son(modality);
279  if (!dg->isTerminalNode(sonId)) {
280  for (Idx varIdx = 0; varIdx < __nbVar; ++varIdx) {
281  if (dgInstNeed[nodeIter->element()][varIdx]
282  && nodesVarDescendant[sonId][varIdx]) {
283  dgInstNeed[sonId][varIdx] = (short int)1;
284  }
285  }
286  }
287  }
288  nodeIter = nodeIter->nextLink();
289  }
290  }
291 
292  for (HashTableIterator< NodeId, short int* > it = nodesVarDescendant.begin();
293  it != nodesVarDescendant.end();
294  ++it) {
295  DEALLOCATE(it.val(), tableSize);
296  }
297 
298  nodesVarDescendant.clear();
299  }
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __rd
The resulting function graph.
Definition: regress.h:108
#define ALLOCATE(x)
Definition: regress_tpl.h:34
#define DEALLOCATE(x, y)
Definition: regress_tpl.h:35
Idx __nbVar
The total number of variable implied in the operation.
Definition: regress.h:120
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:48
Size NodeId
Type for node ids.
Definition: graphElements.h:98
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ compute()

template<typename GUM_SCALAR , template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy>
INLINE MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::compute ( )

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

Definition at line 104 of file regress_tpl.h.

References gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__compute(), gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG1, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG1InstantiationNeeded, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG2, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG2InstantiationNeeded, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__establishVarOrder(), gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__findRetrogradeVariables(), gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__nbVar, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__rd, gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__targetVar, ALLOCATE, DEALLOCATE, gum::O4DGContext::setDG1Node(), and gum::O4DGContext::setDG2Node().

Referenced by gum::MDDOperatorStrategy< GUM_SCALAR >::regress(), and gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::~Regress().

104  {
108 
109  Idx* varInst = nullptr;
110  if (__nbVar != 0) {
111  varInst = static_cast< Idx* >(ALLOCATE(sizeof(Idx) * __nbVar));
112  for (Idx i = 0; i < __nbVar; i++)
113  varInst[i] = (Idx)0;
114  }
115 
116  O4DGContext conti(varInst, __nbVar);
117  conti.setDG1Node(__DG1->root());
118  conti.setDG2Node(__DG2->root());
119 
120  NodeId root = __compute(conti, (Idx)0 - 1);
121  __rd->manager()->setRootNode(root);
122 
123  if (__nbVar != 0) DEALLOCATE(varInst, sizeof(Idx) * __nbVar);
124 
125  __rd->erase(*__targetVar);
126 
127  return __rd;
128  }
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __rd
The resulting function graph.
Definition: regress.h:108
HashTable< NodeId, short int *> __DG2InstantiationNeeded
Definition: regress.h:133
const DiscreteVariable * __targetVar
The variable we work on to eleminate.
Definition: regress.h:114
HashTable< NodeId, short int *> __DG1InstantiationNeeded
Table uses to know if a given node of given function graph has retrograde variables.
Definition: regress.h:132
#define ALLOCATE(x)
Definition: regress_tpl.h:34
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __DG2
The other one.
Definition: regress.h:105
#define DEALLOCATE(x, y)
Definition: regress_tpl.h:35
void __establishVarOrder()
Computes an order for the final Decision graph that will minimize the number of re exploration...
Definition: regress_tpl.h:142
void __findRetrogradeVariables(const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > *dg, HashTable< NodeId, short int * > &dgInstNeed)
Establish for each node in both function graph if it has retrograde variables beneath it...
Definition: regress_tpl.h:230
NodeId __compute(O4DGContext &currentSituation, Idx lastInstVarPos)
The main recursion function.
Definition: regress_tpl.h:328
Idx __nbVar
The total number of variable implied in the operation.
Definition: regress.h:120
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy > * __DG1
One of the two function graphs used for the operation.
Definition: regress.h:102
Size NodeId
Type for node ids.
Definition: graphElements.h:98
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Data Documentation

◆ __combine

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const COMBINEOPERATOR< GUM_SCALAR > gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__combine
private

The functions to be performed on the leaves.

Definition at line 123 of file regress.h.

Referenced by gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__compute().

◆ __default

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
short int* gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__default
private

◆ __DG1

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >* gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG1
private

◆ __DG1InstantiationNeeded

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
HashTable< NodeId, short int* > gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG1InstantiationNeeded
private

◆ __DG2

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >* gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG2
private

◆ __DG2InstantiationNeeded

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
HashTable< NodeId, short int* > gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__DG2InstantiationNeeded
private

◆ __explorationTable

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
HashTable< double, NodeId > gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__explorationTable
private

The hashtable used to know if two pair of nodes have already been visited.

Definition at line 128 of file regress.h.

Referenced by gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__compute().

◆ __nbVar

◆ __neutral

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const GUM_SCALAR gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__neutral
private

The function to be performed on the leaves.

Definition at line 117 of file regress.h.

Referenced by gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__compute().

◆ __primedVars

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const Set< const DiscreteVariable* >* gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__primedVars
private

◆ __project

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const PROJECTOPERATOR< GUM_SCALAR > gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__project
private

◆ __rd

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
MultiDimFunctionGraph< GUM_SCALAR, TerminalNodePolicy >* gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__rd
private

◆ __targetVar

template<typename GUM_SCALAR, template< typename > class COMBINEOPERATOR, template< typename > class PROJECTOPERATOR, template< typename > class TerminalNodePolicy = ExactTerminalNodePolicy>
const DiscreteVariable* gum::Regress< GUM_SCALAR, COMBINEOPERATOR, PROJECTOPERATOR, TerminalNodePolicy >::__targetVar
private

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