aGrUM  0.16.0
gum::prm::StructuredInference< GUM_SCALAR > Class Template Referenceabstract

<agrum/PRM/structuredInference.h> More...

#include <structuredInference.h>

+ Inheritance diagram for gum::prm::StructuredInference< GUM_SCALAR >:
+ Collaboration diagram for gum::prm::StructuredInference< GUM_SCALAR >:

Public Attributes

Timer timer
 
Timer plopTimer
 
double triang_time
 
double mining_time
 
double pattern_time
 
double inner_time
 
double obs_time
 
double full_time
 

Public Member Functions

std::string info () const
 
Constructor & destructor.
 StructuredInference (const PRM< GUM_SCALAR > &prm, const PRMSystem< GUM_SCALAR > &system, gspan::SearchStrategy< GUM_SCALAR > *strategy=0)
 Default constructor. More...
 
 StructuredInference (const StructuredInference &source)
 Copy constructor. More...
 
virtual ~StructuredInference ()
 Destructor. More...
 
StructuredInferenceoperator= (const StructuredInference &source)
 Copy operator. More...
 
Getters and setters.
void setPatternMining (bool b)
 Tells this algorithm to use pattern mining or not. More...
 
virtual std::string name () const
 Tells this algorithm to use pattern mining or not. More...
 
GSpan< GUM_SCALAR > & gspan ()
 Returns the instance of gspan used to search patterns. More...
 
const GSpan< GUM_SCALAR > & gspan () const
 Returns the instance of gspan used to search patterns. More...
 
void searchPatterns ()
 Search for patterns without doing any computations. More...
 
Query methods.
void marginal (const Chain &chain, Potential< GUM_SCALAR > &m)
 Compute the marginal of the formal attribute pointed by chain and stores it in m. More...
 
void joint (const std::vector< Chain > &chains, Potential< GUM_SCALAR > &j)
 Compute the joint probability of the formals attributes pointed by chains and stores it in m. More...
 
Evidence handling.
EMapevidence (const PRMInstance< GUM_SCALAR > &i)
 Returns EMap of evidences over i. More...
 
EMapevidence (const PRMInstance< GUM_SCALAR > *i)
 Returns EMap of evidences over i. More...
 
const EMapevidence (const PRMInstance< GUM_SCALAR > &i) const
 Returns EMap of evidences over i. More...
 
const EMapevidence (const PRMInstance< GUM_SCALAR > *i) const
 Returns EMap of evidences over i. More...
 
bool hasEvidence (const PRMInstance< GUM_SCALAR > &i) const
 Returns true if i has evidence. More...
 
bool hasEvidence (const PRMInstance< GUM_SCALAR > *i) const
 Returns EMap of evidences over i. More...
 
bool hasEvidence (const Chain &chain) const
 Returns true if i has evidence on PRMAttribute<GUM_SCALAR> a. More...
 
bool hasEvidence () const
 Returns true if i has evidence on PRMAttribute<GUM_SCALAR> a. More...
 
void addEvidence (const Chain &chain, const Potential< GUM_SCALAR > &p)
 Add an evidence to the given instance's elt. More...
 
void removeEvidence (const Chain &chain)
 Remove evidence on the given instance's elt. More...
 
void clearEvidence ()
 Remove all evidences. More...
 

Public Types

typedef std::pair< const PRMInstance< GUM_SCALAR > *, const PRMAttribute< GUM_SCALAR > *> Chain
 Code alias. More...
 
typedef NodeProperty< const Potential< GUM_SCALAR > *> EMap
 Code alias. More...
 
typedef NodeProperty< const Potential< GUM_SCALAR > *>::iterator_safe EMapIterator
 Code alias. More...
 
typedef NodeProperty< const Potential< GUM_SCALAR > *>::const_iterator_safe EMapConstIterator
 Code alias. More...
 

Protected Member Functions

Protected members.
virtual void _evidenceAdded (const typename PRMInference< GUM_SCALAR >::Chain &chain)
 See PRMInference::_evidenceAdded(). More...
 
virtual void _evidenceRemoved (const typename PRMInference< GUM_SCALAR >::Chain &chain)
 See PRMInference::_evidenceRemoved(). More...
 
virtual void _marginal (const typename PRMInference< GUM_SCALAR >::Chain &chain, Potential< GUM_SCALAR > &m)
 See PRMInference::_marginal(). More...
 
virtual void _joint (const std::vector< typename PRMInference< GUM_SCALAR >::Chain > &queries, Potential< GUM_SCALAR > &j)
 See PRMInference::_joint(). More...
 

Classes

struct  CData
 Private structure to represent data about a Class<GUM_SCALAR>. More...
 
struct  PData
 Private structure to represent data about a pattern. More...
 
struct  RGData
 Private structure to represent data about a reduced graph. More...
 

Protected members.

virtual void _evidenceAdded (const Chain &chain)=0
 This method is called whenever an evidence is added, but AFTER any processing made by PRMInference. More...
 
virtual void _evidenceRemoved (const Chain &chain)=0
 This method is called whenever an evidence is removed, but BEFORE any processing made by PRMInference. More...
 
virtual void _marginal (const Chain &chain, Potential< GUM_SCALAR > &m)=0
 Generic method to compute the marginal of given element. More...
 
virtual void _joint (const std::vector< Chain > &queries, Potential< GUM_SCALAR > &j)=0
 Generic method to compute the marginal of given element. More...
 
PRM< GUM_SCALAR > const * _prm
 The PRM<GUM_SCALAR> on which inference is done. More...
 
PRMSystem< GUM_SCALAR > const * _sys
 The Model on which inference is done. More...
 

Detailed Description

template<typename GUM_SCALAR>
class gum::prm::StructuredInference< GUM_SCALAR >

<agrum/PRM/structuredInference.h>

This PRM<GUM_SCALAR> inference algorithm exploits the GSpan<GUM_SCALAR> algorithm to discover new patters and exploit them in a structured way.

Definition at line 64 of file structuredInference.h.

Member Typedef Documentation

◆ Chain

template<typename GUM_SCALAR>
typedef std::pair< const PRMInstance< GUM_SCALAR >*, const PRMAttribute< GUM_SCALAR >* > gum::prm::PRMInference< GUM_SCALAR >::Chain
inherited

Code alias.

Definition at line 57 of file PRMInference.h.

◆ EMap

template<typename GUM_SCALAR>
typedef NodeProperty< const Potential< GUM_SCALAR >* > gum::prm::PRMInference< GUM_SCALAR >::EMap
inherited

Code alias.

Definition at line 60 of file PRMInference.h.

◆ EMapConstIterator

template<typename GUM_SCALAR>
typedef NodeProperty< const Potential< GUM_SCALAR >* >::const_iterator_safe gum::prm::PRMInference< GUM_SCALAR >::EMapConstIterator
inherited

Code alias.

Definition at line 69 of file PRMInference.h.

◆ EMapIterator

template<typename GUM_SCALAR>
typedef NodeProperty< const Potential< GUM_SCALAR >* >::iterator_safe gum::prm::PRMInference< GUM_SCALAR >::EMapIterator
inherited

Code alias.

Definition at line 65 of file PRMInference.h.

Constructor & Destructor Documentation

◆ StructuredInference() [1/2]

template<typename GUM_SCALAR >
gum::prm::StructuredInference< GUM_SCALAR >::StructuredInference ( const PRM< GUM_SCALAR > &  prm,
const PRMSystem< GUM_SCALAR > &  system,
gspan::SearchStrategy< GUM_SCALAR > *  strategy = 0 
)

Default constructor.

Definition at line 36 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__gspan, gum::prm::StructuredInference< GUM_SCALAR >::full_time, gum::prm::StructuredInference< GUM_SCALAR >::inner_time, gum::prm::StructuredInference< GUM_SCALAR >::mining_time, gum::prm::StructuredInference< GUM_SCALAR >::obs_time, gum::prm::StructuredInference< GUM_SCALAR >::pattern_time, and gum::prm::StructuredInference< GUM_SCALAR >::triang_time.

39  :
40  PRMInference< GUM_SCALAR >(prm, system),
41  __gspan(0), __pdata(0), __mining(false), __dot(".") {
42  GUM_CONSTRUCTOR(StructuredInference);
43  __gspan = new GSpan< GUM_SCALAR >(prm, system, strategy);
44  triang_time = 0.0;
45  mining_time = 0.0;
46  pattern_time = 0.0;
47  inner_time = 0.0;
48  obs_time = 0.0;
49  full_time = 0.0;
50  }
GSpan< GUM_SCALAR > * __gspan
Pointer over th GSpan<GUM_SCALAR> instance used by this class.
PData * __pdata
The pattern data of the pattern which one of its matches contains the query.
bool __mining
Flag which tells to use pattern mining or not.
std::string __dot
Unreduce the match containing the query.
StructuredInference(const PRM< GUM_SCALAR > &prm, const PRMSystem< GUM_SCALAR > &system, gspan::SearchStrategy< GUM_SCALAR > *strategy=0)
Default constructor.

◆ StructuredInference() [2/2]

template<typename GUM_SCALAR >
gum::prm::StructuredInference< GUM_SCALAR >::StructuredInference ( const StructuredInference< GUM_SCALAR > &  source)

Copy constructor.

Definition at line 53 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__gspan, gum::prm::PRMInference< GUM_SCALAR >::_prm, and gum::prm::PRMInference< GUM_SCALAR >::_sys.

54  :
55  PRMInference< GUM_SCALAR >(source),
56  __gspan(0), __pdata(0), __mining(source.__mining), __found_query(false),
57  __dot(".") {
58  GUM_CONS_CPY(StructuredInference);
59  __gspan = new GSpan< GUM_SCALAR >(*(this->_prm), *(this->_sys));
60  }
GSpan< GUM_SCALAR > * __gspan
Pointer over th GSpan<GUM_SCALAR> instance used by this class.
PData * __pdata
The pattern data of the pattern which one of its matches contains the query.
bool __mining
Flag which tells to use pattern mining or not.
std::string __dot
Unreduce the match containing the query.
bool __found_query
Flag with an explicit name.
PRM< GUM_SCALAR > const * _prm
The PRM<GUM_SCALAR> on which inference is done.
Definition: PRMInference.h:213
StructuredInference(const PRM< GUM_SCALAR > &prm, const PRMSystem< GUM_SCALAR > &system, gspan::SearchStrategy< GUM_SCALAR > *strategy=0)
Default constructor.
PRMSystem< GUM_SCALAR > const * _sys
The Model on which inference is done.
Definition: PRMInference.h:216

◆ ~StructuredInference()

template<typename GUM_SCALAR >
gum::prm::StructuredInference< GUM_SCALAR >::~StructuredInference ( )
virtual

Destructor.

Definition at line 63 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__cdata_map, gum::prm::StructuredInference< GUM_SCALAR >::__elim_map, gum::prm::StructuredInference< GUM_SCALAR >::__gspan, gum::prm::StructuredInference< GUM_SCALAR >::__outputs, gum::prm::StructuredInference< GUM_SCALAR >::__pdata, gum::prm::StructuredInference< GUM_SCALAR >::__trash, and gum::prm::StructuredInference< GUM_SCALAR >::operator=().

63  {
64  GUM_DESTRUCTOR(StructuredInference);
65  delete this->__gspan;
66 
67  for (const auto& elt : __elim_map)
68  delete elt.second;
69 
70  for (const auto& elt : __cdata_map)
71  delete elt.second;
72 
73  for (const auto elt : __trash)
74  delete (elt);
75 
76  for (const auto& elt : __outputs)
77  delete elt.second;
78 
79  if (__pdata) delete __pdata;
80  }
HashTable< const PRMClass< GUM_SCALAR > *, CData *> __cdata_map
Mapping between a Class<GUM_SCALAR> and data about instances reduced using only Class<GUM_SCALAR> lev...
Set< Potential< GUM_SCALAR > *> __trash
Keeping track of create potentials to delete them after inference.
GSpan< GUM_SCALAR > * __gspan
Pointer over th GSpan<GUM_SCALAR> instance used by this class.
PData * __pdata
The pattern data of the pattern which one of its matches contains the query.
HashTable< const Sequence< PRMInstance< GUM_SCALAR > *> *, Set< Potential< GUM_SCALAR > *> *> __elim_map
Mapping between a Pattern&#39;s match and its potential pool after inner variables were eliminated...
StructuredInference(const PRM< GUM_SCALAR > &prm, const PRMSystem< GUM_SCALAR > &system, gspan::SearchStrategy< GUM_SCALAR > *strategy=0)
Default constructor.
HashTable< const PRMClass< GUM_SCALAR > *, std::vector< NodeId > *> __outputs
+ Here is the call graph for this function:

Member Function Documentation

◆ __addEdgesInReducedGraph()

template<typename GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::__addEdgesInReducedGraph ( RGData data)
private

Add the nodes in the reduced graph.

Add edges in the reduced graph.

Definition at line 735 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__elim_map, gum::UndiGraph::addEdge(), gum::NodeGraphPart::addNode(), gum::SequenceImplementation< Key, Alloc, std::is_scalar< Key >::value >::atPos(), gum::Set< Key, Alloc >::insert(), gum::prm::StructuredInference< GUM_SCALAR >::RGData::mods, gum::prm::StructuredInference< GUM_SCALAR >::RGData::outputs(), gum::prm::StructuredInference< GUM_SCALAR >::RGData::pool, gum::prm::StructuredInference< GUM_SCALAR >::RGData::reducedGraph, gum::SequenceImplementation< Key, Alloc, std::is_scalar< Key >::value >::size(), and gum::prm::StructuredInference< GUM_SCALAR >::RGData::var2node.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__buildReduceGraph().

736  {
737  // We first add edges between variables already in pool (i.e. those of the
738  // reduced instances)
739  NodeId id_1, id_2;
740 
741  for (const auto pot : data.pool) {
742  const Sequence< const DiscreteVariable* >& vars = pot->variablesSequence();
743 
744  for (Size var_1 = 0; var_1 < vars.size(); ++var_1) {
745  if (data.var2node.existsFirst(vars.atPos(var_1))) {
746  id_1 = data.var2node.second(vars.atPos(var_1));
747  } else {
748  id_1 = data.reducedGraph.addNode();
749  data.var2node.insert(vars.atPos(var_1), id_1);
750  data.mods.insert(id_1, vars.atPos(var_1)->domainSize());
751  data.outputs().insert(id_1);
752  }
753 
754  for (Size var_2 = var_1 + 1; var_2 < vars.size(); ++var_2) {
755  if (data.var2node.existsFirst(vars.atPos(var_2))) {
756  id_2 = data.var2node.second(vars.atPos(var_2));
757  } else {
758  id_2 = data.reducedGraph.addNode();
759  data.var2node.insert(vars.atPos(var_2), id_2);
760  data.mods.insert(id_2, vars.atPos(var_2)->domainSize());
761  data.outputs().insert(id_2);
762  }
763 
764  try {
765  data.reducedGraph.addEdge(id_1, id_2);
766  } catch (DuplicateElement&) {}
767  }
768  }
769  }
770 
771  // Adding potentials obtained from reduced patterns
772  for (const auto& elt : __elim_map) {
773  // We add edges between variables in the same reduced patterns
774  for (const auto pot : *elt.second) {
775  data.pool.insert(pot);
776  const Sequence< const DiscreteVariable* >& vars =
777  pot->variablesSequence();
778 
779  for (Size var_1 = 0; var_1 < vars.size(); ++var_1) {
780  if (data.var2node.existsFirst(vars.atPos(var_1))) {
781  id_1 = data.var2node.second(vars.atPos(var_1));
782  } else {
783  id_1 = data.reducedGraph.addNode();
784  data.var2node.insert(vars.atPos(var_1), id_1);
785  data.mods.insert(id_1, vars.atPos(var_1)->domainSize());
786  data.outputs().insert(id_1);
787  }
788 
789  for (Size var_2 = var_1 + 1; var_2 < vars.size(); ++var_2) {
790  if (data.var2node.existsFirst(vars.atPos(var_2))) {
791  id_2 = data.var2node.second(vars.atPos(var_2));
792  } else {
793  id_2 = data.reducedGraph.addNode();
794  data.var2node.insert(vars.atPos(var_2), id_2);
795  data.mods.insert(id_2, vars.atPos(var_2)->domainSize());
796  data.outputs().insert(id_2);
797  }
798 
799  try {
800  data.reducedGraph.addEdge(id_1, id_2);
801  } catch (DuplicateElement&) {}
802  }
803  }
804  }
805  }
806  }
HashTable< const Sequence< PRMInstance< GUM_SCALAR > *> *, Set< Potential< GUM_SCALAR > *> *> __elim_map
Mapping between a Pattern&#39;s match and its potential pool after inner variables were eliminated...
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:

◆ __allInstanceNoRefAttr()

template<typename GUM_SCALAR>
bool gum::prm::StructuredInference< GUM_SCALAR >::__allInstanceNoRefAttr ( typename StructuredInference< GUM_SCALAR >::PData data,
std::pair< Idx, std::string >  attr 
)
private

Definition at line 410 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::PData::matches.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__buildPatternGraph().

412  {
413  for (const auto mat : data.matches)
414  if (mat->atPos(attr.first)
415  ->hasRefAttr(mat->atPos(attr.first)->get(attr.second).id()))
416  return false;
417 
418  return true;
419  }
+ Here is the caller graph for this function:

◆ __buildPatternGraph()

template<typename GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::__buildPatternGraph ( PData data,
Set< Potential< GUM_SCALAR > * > &  pool,
const Sequence< PRMInstance< GUM_SCALAR > * > &  match 
)
private

Build the DAG corresponding to Pattern data.pattern, initialize pool with all the Potentials of all variables in data.pattern. The first match of data.pattern (aka data.match) is used.

Definition at line 349 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__allInstanceNoRefAttr(), gum::prm::StructuredInference< GUM_SCALAR >::__found_query, gum::prm::StructuredInference< GUM_SCALAR >::__insertNodeInElimLists(), gum::prm::StructuredInference< GUM_SCALAR >::__query, gum::prm::StructuredInference< GUM_SCALAR >::__query_data, gum::prm::StructuredInference< GUM_SCALAR >::__str(), gum::UndiGraph::addEdge(), gum::NodeGraphPart::addNode(), gum::prm::StructuredInference< GUM_SCALAR >::PData::barren, gum::Set< Key, Alloc >::erase(), gum::Set< Key, Alloc >::exists(), gum::prm::StructuredInference< GUM_SCALAR >::PData::graph, gum::prm::StructuredInference< GUM_SCALAR >::PData::inners(), gum::Set< Key, Alloc >::insert(), gum::BijectionImplementation< T1, T2, Alloc, Gen >::insert(), gum::prm::StructuredInference< GUM_SCALAR >::PData::map, gum::prm::StructuredInference< GUM_SCALAR >::PData::matches, gum::prm::StructuredInference< GUM_SCALAR >::PData::mod, gum::prm::StructuredInference< GUM_SCALAR >::PData::node2attr, gum::prm::StructuredInference< GUM_SCALAR >::PData::obs(), gum::prm::StructuredInference< GUM_SCALAR >::PData::outputs(), gum::prm::StructuredInference< GUM_SCALAR >::PData::queries(), gum::MultiDimDecorator< GUM_SCALAR >::variablesSequence(), and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__reducePattern().

352  {
353  std::pair< Idx, std::string > v;
354  Potential< GUM_SCALAR >* pot = 0;
355 
356  for (const auto inst : match) {
357  for (const auto& elt : *inst) {
358  NodeId id = data.graph.addNode();
359  v = std::make_pair(match.pos(inst), elt.second->safeName());
360  data.map.insert(id, v);
361  data.node2attr.insert(id, __str(inst, elt.second));
362  data.mod.insert(id, elt.second->type()->domainSize());
363  data.vars.insert(id, &(elt.second->type().variable()));
364  pool.insert(
365  const_cast< Potential< GUM_SCALAR >* >(&(elt.second->cpf())));
366  pot =
367  &(const_cast< Potential< GUM_SCALAR >& >(inst->get(v.second).cpf()));
368 
369  for (const auto var : pot->variablesSequence()) {
370  try {
371  if (id != data.vars.first(var))
372  data.graph.addEdge(id, data.vars.first(var));
373  } catch (DuplicateElement&) {
374  } catch (NotFound&) {}
375  }
376 
377  __insertNodeInElimLists(data, match, inst, elt.second, id, v);
378 
379  if (data.inners().exists(id)
380  && (inst->type().containerDag().children(elt.second->id()).size()
381  == 0)
382  && __allInstanceNoRefAttr(data, v))
383  data.barren.insert(id);
384  }
385  }
386 
387  if (!__found_query) {
388  for (const auto mat : data.matches) {
389  if (mat->exists(
390  const_cast< PRMInstance< GUM_SCALAR >* >(__query.first))) {
391  Idx pos =
392  mat->pos(const_cast< PRMInstance< GUM_SCALAR >* >(__query.first));
393  DiscreteVariable& var =
394  match.atPos(pos)->get(__query.second->safeName()).type().variable();
395  NodeId id = data.vars.first(&var);
396  data.barren.erase(id);
397  data.inners().erase(id);
398  data.obs().erase(id);
399  data.outputs().erase(id);
400  data.queries().insert(id);
401  __found_query = true;
402  __query_data = std::make_pair(pos, __query.second->safeName());
403  break;
404  }
405  }
406  }
407  }
void __insertNodeInElimLists(typename StructuredInference::PData &data, const Sequence< PRMInstance< GUM_SCALAR > * > &match, PRMInstance< GUM_SCALAR > *inst, PRMAttribute< GUM_SCALAR > *attr, NodeId id, std::pair< Idx, std::string > &v)
bool __found_query
Flag with an explicit name.
PRMInference< GUM_SCALAR >::Chain __query
The query.
std::string __str(const PRMInstance< GUM_SCALAR > *i, const PRMAttribute< GUM_SCALAR > *a) const
bool __allInstanceNoRefAttr(typename StructuredInference::PData &data, std::pair< Idx, std::string > attr)
std::pair< Idx, std::string > __query_data
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:

◆ __buildReduceGraph()

template<typename GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::__buildReduceGraph ( RGData data)
private

This calls __reducePattern() over each pattern and then build the reduced graph which is used for inference. The reduce graph is a triangulated instance graph.

Definition at line 209 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__addEdgesInReducedGraph(), gum::prm::StructuredInference< GUM_SCALAR >::__gspan, gum::prm::StructuredInference< GUM_SCALAR >::__mining, gum::prm::StructuredInference< GUM_SCALAR >::__query, gum::prm::StructuredInference< GUM_SCALAR >::__reduceAloneInstances(), gum::prm::StructuredInference< GUM_SCALAR >::__reducePattern(), gum::prm::StructuredInference< GUM_SCALAR >::__trash, gum::prm::eliminateNode(), gum::StaticTriangulation::eliminationOrder(), gum::Set< Key, Alloc >::erase(), gum::Set< Key, Alloc >::insert(), gum::prm::StructuredInference< GUM_SCALAR >::mining_time, gum::prm::StructuredInference< GUM_SCALAR >::RGData::mods, gum::prm::StructuredInference< GUM_SCALAR >::RGData::outputs(), gum::prm::StructuredInference< GUM_SCALAR >::RGData::partial_order, gum::prm::StructuredInference< GUM_SCALAR >::pattern_time, gum::prm::StructuredInference< GUM_SCALAR >::plopTimer, gum::prm::StructuredInference< GUM_SCALAR >::RGData::pool, gum::prm::StructuredInference< GUM_SCALAR >::RGData::queries(), gum::prm::StructuredInference< GUM_SCALAR >::RGData::reducedGraph, gum::Timer::reset(), gum::Set< Key, Alloc >::size(), gum::Timer::step(), and gum::prm::StructuredInference< GUM_SCALAR >::RGData::var2node.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::_marginal(), and gum::prm::StructuredInference< GUM_SCALAR >::searchPatterns().

210  {
211  // Launch the pattern mining
212  plopTimer.reset();
213 
214  if (__mining) __gspan->discoverPatterns();
215 
217  // Reducing each used pattern
218  plopTimer.reset();
219  typedef std::vector< gspan::Pattern* >::const_iterator Iter;
220 
221  for (Iter p = __gspan->patterns().begin(); p != __gspan->patterns().end();
222  ++p)
223  if (__gspan->matches(**p).size()) __reducePattern(*p);
224 
226  // reducing instance not already reduced in a pattern
228  // Adding edges using the pools
230  // Placing the query where it belongs
231  NodeId id = data.var2node.second(&(__query.second->type().variable()));
232  data.outputs().erase(id);
233  data.queries().insert(id);
234  // Triangulating, then eliminating
235  PartialOrderedTriangulation t(
236  &(data.reducedGraph), &(data.mods), &(data.partial_order));
237  const std::vector< NodeId >& elim_order = t.eliminationOrder();
238 
239  for (size_t i = 0; i < data.outputs().size(); ++i)
240  eliminateNode(data.var2node.first(elim_order[i]), data.pool, __trash);
241  }
void __reducePattern(const gspan::Pattern *p)
Proceed with the elimination of all inner variables (observed or not) of all usable matches of Patter...
double step() const
Returns the delta time between now and the last reset() call (or the constructor).
Definition: timer_inl.h:42
Set< Potential< GUM_SCALAR > *> __trash
Keeping track of create potentials to delete them after inference.
GSpan< GUM_SCALAR > * __gspan
Pointer over th GSpan<GUM_SCALAR> instance used by this class.
bool __mining
Flag which tells to use pattern mining or not.
void __reduceAloneInstances(RGData &data)
Add the reduced potentials of instances not in any used patterns.
void __addEdgesInReducedGraph(RGData &data)
Add the nodes in the reduced graph.
void reset()
Reset the timer.
Definition: timer_inl.h:32
PRMInference< GUM_SCALAR >::Chain __query
The query.
void eliminateNode(const DiscreteVariable *var, Set< Potential< GUM_SCALAR > * > &pool, Set< Potential< GUM_SCALAR > * > &trash)
Proceeds with the elimination of var in pool.
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:

◆ __eliminateObservedNodes()

template<typename GUM_SCALAR>
Set< Potential< GUM_SCALAR > *> * gum::prm::StructuredInference< GUM_SCALAR >::__eliminateObservedNodes ( typename StructuredInference< GUM_SCALAR >::PData data,
const Set< Potential< GUM_SCALAR > * > &  pool,
const Sequence< PRMInstance< GUM_SCALAR > * > &  match,
const std::vector< NodeId > &  elim_order 
)
private

Add in data.queries() any queried variable in one of data.pattern matches.

Proceeds with the elimination of observed variables in math and then call __translatePotSet().

Definition at line 497 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__translatePotSet(), gum::prm::StructuredInference< GUM_SCALAR >::__trash, gum::prm::eliminateNode(), gum::prm::StructuredInference< GUM_SCALAR >::PData::inners(), gum::prm::StructuredInference< GUM_SCALAR >::PData::map, gum::prm::StructuredInference< GUM_SCALAR >::PData::obs(), gum::Set< Key, Alloc >::size(), and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__reducePattern().

501  {
502  Set< Potential< GUM_SCALAR >* >* my_pool =
503  __translatePotSet(data, pool, match);
504  std::pair< Idx, std::string > target;
505  size_t end = data.inners().size() + data.obs().size();
506 
507  for (size_t idx = data.inners().size(); idx < end; ++idx) {
508  target = data.map[data.vars.first(data.vars.second(elim_order[idx]))];
509  eliminateNode(&(match[target.first]->get(target.second).type().variable()),
510  *my_pool,
511  __trash);
512  }
513 
514  return my_pool;
515  }
Set< Potential< GUM_SCALAR > *> __trash
Keeping track of create potentials to delete them after inference.
void eliminateNode(const DiscreteVariable *var, Set< Potential< GUM_SCALAR > * > &pool, Set< Potential< GUM_SCALAR > * > &trash)
Proceeds with the elimination of var in pool.
Set< Potential< GUM_SCALAR > *> * __translatePotSet(typename StructuredInference::PData &data, const Set< Potential< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match)
Translate a given Potential Set into one w.r.t. variables in match.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __eliminateObservedNodesInSource()

template<typename GUM_SCALAR>
Set< Potential< GUM_SCALAR > *> * gum::prm::StructuredInference< GUM_SCALAR >::__eliminateObservedNodesInSource ( typename StructuredInference< GUM_SCALAR >::PData data,
const Set< Potential< GUM_SCALAR > * > &  pool,
const Sequence< PRMInstance< GUM_SCALAR > * > &  match,
const std::vector< NodeId > &  elim_order 
)
private

Definition at line 475 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__trash, gum::prm::eliminateNode(), gum::prm::StructuredInference< GUM_SCALAR >::PData::inners(), gum::prm::StructuredInference< GUM_SCALAR >::PData::map, gum::prm::StructuredInference< GUM_SCALAR >::PData::obs(), gum::Set< Key, Alloc >::size(), and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__reducePattern().

479  {
480  Set< Potential< GUM_SCALAR >* >* my_pool =
481  new Set< Potential< GUM_SCALAR >* >(pool);
482  std::pair< Idx, std::string > target;
483  size_t end = data.inners().size() + data.obs().size();
484 
485  for (size_t idx = data.inners().size(); idx < end; ++idx) {
486  target = data.map[data.vars.first(data.vars.second(elim_order[idx]))];
487  eliminateNode(&(match[target.first]->get(target.second).type().variable()),
488  *my_pool,
489  __trash);
490  }
491 
492  return my_pool;
493  }
Set< Potential< GUM_SCALAR > *> __trash
Keeping track of create potentials to delete them after inference.
void eliminateNode(const DiscreteVariable *var, Set< Potential< GUM_SCALAR > * > &pool, Set< Potential< GUM_SCALAR > * > &trash)
Proceeds with the elimination of var in pool.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __insertNodeInElimLists()

template<typename GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::__insertNodeInElimLists ( typename StructuredInference< GUM_SCALAR >::PData data,
const Sequence< PRMInstance< GUM_SCALAR > * > &  match,
PRMInstance< GUM_SCALAR > *  inst,
PRMAttribute< GUM_SCALAR > *  attr,
NodeId  id,
std::pair< Idx, std::string > &  v 
)
private

Definition at line 312 of file structuredInference_tpl.h.

References gum::Set< Key, Alloc >::exists(), gum::prm::PRMInstance< GUM_SCALAR >::get(), gum::prm::PRMInstance< GUM_SCALAR >::getRefAttr(), gum::prm::PRMInference< GUM_SCALAR >::hasEvidence(), gum::prm::StructuredInference< GUM_SCALAR >::PData::inners(), gum::Set< Key, Alloc >::insert(), gum::prm::StructuredInference< GUM_SCALAR >::PData::matches, gum::prm::StructuredInference< GUM_SCALAR >::PData::obs(), gum::prm::StructuredInference< GUM_SCALAR >::PData::outputs(), gum::Set< Key, Alloc >::size(), and gum::prm::PRMInstance< GUM_SCALAR >::type().

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__buildPatternGraph().

318  {
319  if ((*inst).hasRefAttr((*inst).get(v.second).id())) {
320  std::vector< std::pair< PRMInstance< GUM_SCALAR >*, std::string > >& refs =
321  inst->getRefAttr(inst->get(v.second).id());
322 
323  for (auto r = refs.begin(); r != refs.end(); ++r) {
324  if (!match.exists(r->first)) {
325  data.outputs().insert(id);
326  break;
327  }
328  }
329  }
330 
331  if (!(data.outputs().size() && (data.outputs().exists(id)))) {
332  for (const auto m : data.matches) {
333  if (this->hasEvidence(
334  std::make_pair((*m)[v.first], &((*m)[v.first]->get(v.second))))) {
335  GUM_ASSERT(inst->type().name() == (*m)[v.first]->type().name());
336  GUM_ASSERT(inst->get(v.second).safeName()
337  == (*m)[v.first]->get(v.second).safeName());
338  data.obs().insert(id);
339  break;
340  }
341  }
342 
343  if (!(data.obs().size() && (data.obs().exists(id))))
344  data.inners().insert(id);
345  }
346  }
bool hasEvidence() const
Returns true if i has evidence on PRMAttribute<GUM_SCALAR> a.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __reduceAloneInstances()

template<typename GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::__reduceAloneInstances ( RGData data)
private

Add the reduced potentials of instances not in any used patterns.

Definition at line 613 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__cdata_map, gum::prm::StructuredInference< GUM_SCALAR >::__query, gum::prm::StructuredInference< GUM_SCALAR >::__reducedInstances, gum::prm::StructuredInference< GUM_SCALAR >::__trash, gum::prm::PRMInference< GUM_SCALAR >::_sys, gum::prm::StructuredInference< GUM_SCALAR >::CData::aggregators(), gum::prm::PRMInstance< GUM_SCALAR >::begin(), gum::prm::PRMInstance< GUM_SCALAR >::bijection(), gum::prm::StructuredInference< GUM_SCALAR >::CData::c, gum::prm::copyPotential(), gum::prm::StructuredInference< GUM_SCALAR >::CData::elim_order(), gum::prm::eliminateNode(), gum::StaticTriangulation::eliminationOrder(), gum::prm::PRMInstance< GUM_SCALAR >::end(), gum::List< Val, Alloc >::erase(), gum::prm::PRMInference< GUM_SCALAR >::evidence(), gum::prm::PRMInstance< GUM_SCALAR >::get(), gum::prm::PRMInference< GUM_SCALAR >::hasEvidence(), gum::prm::StructuredInference< GUM_SCALAR >::CData::inners(), gum::Set< Key, Alloc >::insert(), gum::List< Val, Alloc >::insert(), gum::prm::StructuredInference< GUM_SCALAR >::CData::instances, gum::prm::StructuredInference< GUM_SCALAR >::CData::mods, gum::prm::StructuredInference< GUM_SCALAR >::CData::moral_graph, gum::prm::StructuredInference< GUM_SCALAR >::CData::outputs(), gum::prm::StructuredInference< GUM_SCALAR >::RGData::pool, gum::prm::StructuredInference< GUM_SCALAR >::CData::pool, gum::List< Val, Alloc >::push_back(), gum::prm::PRMInstance< GUM_SCALAR >::size(), gum::Set< Key, Alloc >::size(), gum::List< Val, Alloc >::size(), and gum::prm::PRMInstance< GUM_SCALAR >::type().

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__buildReduceGraph().

614  {
615  StructuredInference< GUM_SCALAR >::CData* data = 0;
616  Potential< GUM_SCALAR >* pot = nullptr;
617  PRMInstance< GUM_SCALAR >* inst = nullptr;
618 
619  for (const auto& elt : *this->_sys) {
620  inst = elt.second;
621 
622  if (!__reducedInstances.exists(inst)) {
623  // Checking if its not an empty class
624  if (inst->size()) {
625  Set< Potential< GUM_SCALAR >* > pool;
626 
627  try {
628  data = __cdata_map[&(inst->type())];
629  } catch (NotFound&) {
630  data = new StructuredInference< GUM_SCALAR >::CData(inst->type());
631  __cdata_map.insert(&(inst->type()), data);
632  }
633 
634  data->instances.insert(inst);
635  // Filling up the partial ordering
636  List< NodeSet > partial_order;
637 
638  if (data->inners().size()) partial_order.push_back(data->inners());
639 
640  if (data->aggregators().size())
641  for (const auto agg : data->aggregators())
642  partial_order[0].insert(agg);
643 
644  if (data->outputs().size()) partial_order.push_back(data->outputs());
645 
646  if (__query.first == inst) {
647  // First case, the instance contains the query
648  partial_order[0].erase(__query.second->id());
649 
650  if (partial_order[0].empty()) partial_order.erase(0);
651 
652  if (partial_order.size() > 1) {
653  partial_order[1].erase(__query.second->id());
654 
655  if (partial_order[1].empty()) partial_order.erase(1);
656  }
657 
658  NodeSet query_set;
659  query_set.insert(__query.second->id());
660  partial_order.insert(query_set);
661 
662  // Adding the potentials
663  for (auto attr = inst->begin(); attr != inst->end(); ++attr)
664  pool.insert(&(
665  const_cast< Potential< GUM_SCALAR >& >((*(attr.val())).cpf())));
666 
667  // Adding evidences if any
668  if (this->hasEvidence(inst))
669  for (const auto& elt : this->evidence(inst))
670  pool.insert(const_cast< Potential< GUM_SCALAR >* >(elt.second));
671 
672  PartialOrderedTriangulation t(
673  &(data->moral_graph), &(data->mods), &(partial_order));
674  const std::vector< NodeId >& v = t.eliminationOrder();
675 
676  if (partial_order.size() > 1)
677  for (size_t idx = 0; idx < partial_order[0].size(); ++idx)
679  &(inst->get(v[idx]).type().variable()), pool, __trash);
680  } else if (this->hasEvidence(inst)) {
681  // Second case, the instance has evidences
682  // Adding the potentials
683  for (const auto elt : *inst)
684  pool.insert(
685  &const_cast< Potential< GUM_SCALAR >& >(elt.second->cpf()));
686 
687  // Adding evidences
688  for (const auto& elt : this->evidence(inst))
689  pool.insert(const_cast< Potential< GUM_SCALAR >* >(elt.second));
690 
691  PartialOrderedTriangulation t(
692  &(data->moral_graph), &(data->mods), &(partial_order));
693 
694  for (size_t idx = 0; idx < partial_order[0].size(); ++idx)
696  &(inst->get(t.eliminationOrder()[idx]).type().variable()),
697  pool,
698  __trash);
699  } else {
700  // Last cast, the instance neither contains evidences nor
701  // instances
702  // We translate the class level potentials into the instance ones
703  // and
704  // proceed with elimination
705  for (const auto srcPot : data->pool) {
706  pot = copyPotential(inst->bijection(), *srcPot);
707  pool.insert(pot);
708  __trash.insert(pot);
709  }
710 
711  for (const auto agg : data->c.aggregates())
712  pool.insert(&(const_cast< Potential< GUM_SCALAR >& >(
713  inst->get(agg->id()).cpf())));
714 
715  // We eliminate inner aggregators with their parents if necessary
716  // (see
717  // CData constructor)
718  Size size = data->inners().size() + data->aggregators().size();
719 
720  for (size_t idx = data->inners().size(); idx < size; ++idx)
722  &(inst->get(data->elim_order()[idx]).type().variable()),
723  pool,
724  __trash);
725  }
726 
727  for (const auto pot : pool)
728  rg_data.pool.insert(pot);
729  }
730  }
731  }
732  }
HashTable< const PRMClass< GUM_SCALAR > *, CData *> __cdata_map
Mapping between a Class<GUM_SCALAR> and data about instances reduced using only Class<GUM_SCALAR> lev...
Set< Potential< GUM_SCALAR > *> __trash
Keeping track of create potentials to delete them after inference.
Set< NodeId > NodeSet
Some typdefs and define for shortcuts ...
EMap & evidence(const PRMInstance< GUM_SCALAR > &i)
Returns EMap of evidences over i.
PRMInference< GUM_SCALAR >::Chain __query
The query.
Set< const PRMInstance< GUM_SCALAR > *> __reducedInstances
This keeps track of reduced instances.
Potential< GUM_SCALAR > * copyPotential(const Bijection< const DiscreteVariable *, const DiscreteVariable * > &bij, const Potential< GUM_SCALAR > &source)
Returns a copy of a Potential after applying a bijection over the variables in source.
Definition: utils_prm_tpl.h:29
void eliminateNode(const DiscreteVariable *var, Set< Potential< GUM_SCALAR > * > &pool, Set< Potential< GUM_SCALAR > * > &trash)
Proceeds with the elimination of var in pool.
bool hasEvidence() const
Returns true if i has evidence on PRMAttribute<GUM_SCALAR> a.
PRMSystem< GUM_SCALAR > const * _sys
The Model on which inference is done.
Definition: PRMInference.h:216
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:48
void insert(const Key &k)
Inserts a new element into the set.
Definition: set_tpl.h:613
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __reducePattern()

template<typename GUM_SCALAR >
void gum::prm::StructuredInference< GUM_SCALAR >::__reducePattern ( const gspan::Pattern p)
private

Proceed with the elimination of all inner variables (observed or not) of all usable matches of Pattern p. Inner variables which are part of the query are not eliminated.

Definition at line 244 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__buildPatternGraph(), gum::prm::StructuredInference< GUM_SCALAR >::__elim_map, gum::prm::StructuredInference< GUM_SCALAR >::__eliminateObservedNodes(), gum::prm::StructuredInference< GUM_SCALAR >::__eliminateObservedNodesInSource(), gum::prm::StructuredInference< GUM_SCALAR >::__gspan, gum::prm::StructuredInference< GUM_SCALAR >::__query, gum::prm::StructuredInference< GUM_SCALAR >::__query_data, gum::prm::StructuredInference< GUM_SCALAR >::__reducedInstances, gum::prm::StructuredInference< GUM_SCALAR >::__removeBarrenNodes(), gum::prm::StructuredInference< GUM_SCALAR >::__translatePotSet(), gum::prm::StructuredInference< GUM_SCALAR >::__trash, gum::prm::eliminateNode(), gum::StaticTriangulation::eliminationOrder(), gum::Set< Key, Alloc >::insert(), gum::prm::StructuredInference< GUM_SCALAR >::obs_time, gum::prm::StructuredInference< GUM_SCALAR >::plopTimer, and gum::Timer::step().

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__buildReduceGraph().

245  {
246  Set< Potential< GUM_SCALAR >* > pool;
247  typename StructuredInference< GUM_SCALAR >::PData data(*p,
248  __gspan->matches(*p));
249  __buildPatternGraph(data, pool, **(data.matches.begin()));
250  __removeBarrenNodes(data, pool);
251  PartialOrderedTriangulation t(
252  &(data.graph), &(data.mod), data.partial_order());
253  const std::vector< NodeId >& elim_order = t.eliminationOrder();
254 
255  for (size_t i = 0; i < data.inners().size(); ++i)
256  if (!data.barren.exists(elim_order[i]))
257  eliminateNode(data.vars.second(elim_order[i]), pool, __trash);
258 
259  typename GSpan< GUM_SCALAR >::MatchedInstances fake_patterns;
261  data.matches.begin();
262 
263  for (const auto elt : **iter)
264  __reducedInstances.insert(elt);
265 
266  if (data.obs().size())
267  __elim_map.insert(
268  *iter,
269  __eliminateObservedNodesInSource(data, pool, **iter, elim_order));
270  else
271  __elim_map.insert(*iter, new Set< Potential< GUM_SCALAR >* >(pool));
272 
273  ++iter;
274 
275  if (data.obs().size()) {
276  for (; iter != data.matches.end(); ++iter) {
277  try {
278  __elim_map.insert(
279  *iter, __eliminateObservedNodes(data, pool, **iter, elim_order));
280  } catch (OperationNotAllowed&) { fake_patterns.insert(*iter); }
281  }
282  } else {
283  for (; iter != data.matches.end(); ++iter) {
284  try {
285  __elim_map.insert(*iter, __translatePotSet(data, pool, **iter));
286  } catch (OperationNotAllowed&) { fake_patterns.insert(*iter); }
287  }
288  }
289 
290  for (const auto pat : fake_patterns) {
291  for (const auto elt : *pat)
292  __reducedInstances.erase(elt);
293 
294  data.matches.erase(pat);
295  }
296 
297  obs_time += plopTimer.step();
298 
299  if (data.queries().size())
300  for (const auto m : data.matches)
301  if (!(m->exists(
302  const_cast< PRMInstance< GUM_SCALAR >* >(__query.first))))
303  eliminateNode(&(m->atPos(__query_data.first)
304  ->get(__query_data.second)
305  .type()
306  .variable()),
307  *(__elim_map[m]),
308  __trash);
309  }
void __buildPatternGraph(PData &data, Set< Potential< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match)
Build the DAG corresponding to Pattern data.pattern, initialize pool with all the Potentials of all v...
double step() const
Returns the delta time between now and the last reset() call (or the constructor).
Definition: timer_inl.h:42
Set< Potential< GUM_SCALAR > *> __trash
Keeping track of create potentials to delete them after inference.
Set< Sequence< PRMInstance< GUM_SCALAR > *> *> MatchedInstances
Code alias.
Definition: gspan.h:170
GSpan< GUM_SCALAR > * __gspan
Pointer over th GSpan<GUM_SCALAR> instance used by this class.
Set< Potential< GUM_SCALAR > *> * __eliminateObservedNodesInSource(typename StructuredInference::PData &data, const Set< Potential< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match, const std::vector< NodeId > &elim_order)
void __removeBarrenNodes(typename StructuredInference::PData &data, Set< Potential< GUM_SCALAR > * > &pool)
HashTable< const Sequence< PRMInstance< GUM_SCALAR > *> *, Set< Potential< GUM_SCALAR > *> *> __elim_map
Mapping between a Pattern&#39;s match and its potential pool after inner variables were eliminated...
PRMInference< GUM_SCALAR >::Chain __query
The query.
Set< const PRMInstance< GUM_SCALAR > *> __reducedInstances
This keeps track of reduced instances.
void eliminateNode(const DiscreteVariable *var, Set< Potential< GUM_SCALAR > * > &pool, Set< Potential< GUM_SCALAR > * > &trash)
Proceeds with the elimination of var in pool.
Set< Potential< GUM_SCALAR > *> * __eliminateObservedNodes(typename StructuredInference::PData &data, const Set< Potential< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match, const std::vector< NodeId > &elim_order)
Add in data.queries() any queried variable in one of data.pattern matches.
Set< Potential< GUM_SCALAR > *> * __translatePotSet(typename StructuredInference::PData &data, const Set< Potential< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match)
Translate a given Potential Set into one w.r.t. variables in match.
std::pair< Idx, std::string > __query_data
SetIterator< Key > const_iterator
Types for STL compliance.
Definition: set.h:178
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __removeBarrenNodes()

template<typename GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::__removeBarrenNodes ( typename StructuredInference< GUM_SCALAR >::PData data,
Set< Potential< GUM_SCALAR > * > &  pool 
)
private

Definition at line 422 of file structuredInference_tpl.h.

References gum::SequenceImplementation< Key, Alloc, Gen >::back(), gum::prm::StructuredInference< GUM_SCALAR >::PData::barren, gum::MultiDimDecorator< GUM_SCALAR >::erase(), gum::SequenceImplementation< Key, Alloc, Gen >::erase(), gum::Set< Key, Alloc >::exists(), gum::prm::StructuredInference< GUM_SCALAR >::PData::graph, gum::prm::StructuredInference< GUM_SCALAR >::PData::inners(), gum::Set< Key, Alloc >::insert(), gum::SequenceImplementation< Key, Alloc, Gen >::insert(), gum::EdgeGraphPart::neighbours(), gum::SequenceImplementation< Key, Alloc, Gen >::size(), and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__reducePattern().

424  {
425  Sequence< NodeId > candidates;
426 
427  for (const auto node : data.barren) {
428  for (const auto pot : pool)
429  if (pot->contains(*data.vars.second(node))) {
430  pool.erase(pot);
431  break;
432  }
433 
434  for (const auto nei : data.graph.neighbours(node))
435  if (data.inners().exists(nei)) {
436  try {
437  candidates.insert(nei);
438  } catch (DuplicateElement&) {}
439  }
440  }
441 
442  NodeId node;
443  Potential< GUM_SCALAR >* my_pot = nullptr;
444  short count = 0;
445 
446  while (candidates.size()) {
447  node = candidates.back();
448  candidates.erase(node);
449  count = 0;
450 
451  for (const auto pot : pool) {
452  if (pot->contains(*data.vars.second(node))) {
453  ++count;
454  my_pot = pot;
455  }
456  }
457 
458  if (count == 1) {
459  pool.erase(my_pot);
460  data.barren.insert(node);
461 
462  for (const auto nei : data.graph.neighbours(node)) {
463  if (data.inners().exists(nei)) {
464  try {
465  candidates.insert(nei);
466  } catch (DuplicateElement&) {}
467  }
468  }
469  }
470  }
471  }
Size size() const noexcept
Returns the size of the sequence.
Definition: sequence_tpl.h:38
void erase(const Key &k)
Remove an element from the sequence.
Definition: sequence_tpl.h:453
Size NodeId
Type for node ids.
Definition: graphElements.h:98
const Key & back() const
Returns the last element of the sequence.
Definition: sequence_tpl.h:568
void insert(const Key &k)
Insert an element at the end of the sequence.
Definition: sequence_tpl.h:408
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __removeNode()

template<typename GUM_SCALAR>
INLINE void gum::prm::StructuredInference< GUM_SCALAR >::__removeNode ( typename StructuredInference< GUM_SCALAR >::PData data,
NodeId  id,
Set< Potential< GUM_SCALAR > * > &  pool 
)
private

Definition at line 1026 of file structuredInference_tpl.h.

References gum::Set< Key, Alloc >::erase(), gum::BijectionImplementation< T1, T2, Alloc, Gen >::eraseFirst(), gum::UndiGraph::eraseNode(), gum::NodeGraphPart::exists(), gum::Set< Key, Alloc >::exists(), gum::BijectionImplementation< T1, T2, Alloc, Gen >::existsFirst(), gum::prm::StructuredInference< GUM_SCALAR >::PData::graph, gum::prm::StructuredInference< GUM_SCALAR >::PData::inners(), gum::prm::StructuredInference< GUM_SCALAR >::PData::map, gum::prm::StructuredInference< GUM_SCALAR >::PData::mod, gum::prm::StructuredInference< GUM_SCALAR >::PData::node2attr, gum::prm::StructuredInference< GUM_SCALAR >::CData::pool, gum::prm::StructuredInference< GUM_SCALAR >::PData::pots, and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

1029  {
1030  data.graph.eraseNode(id);
1031  GUM_ASSERT(!data.graph.exists(id));
1032  data.mod.erase(id);
1033  GUM_ASSERT(!data.mod.exists(id));
1034  data.node2attr.eraseFirst(id);
1035  GUM_ASSERT(!data.node2attr.existsFirst(id));
1036  data.map.erase(id);
1037  GUM_ASSERT(!data.map.exists(id));
1038  data.vars.eraseFirst(id);
1039  GUM_ASSERT(!data.vars.existsFirst(id));
1040  data.inners().erase(id);
1041  GUM_ASSERT(!data.inners().exists(id));
1042  pool.erase(data.pots[id]);
1043  GUM_ASSERT(!pool.exists(data.pots[id]));
1044  data.pots.erase(id);
1045  GUM_ASSERT(!data.pots.exists(id));
1046  }
+ Here is the call graph for this function:

◆ __str() [1/3]

template<typename GUM_SCALAR >
INLINE std::string gum::prm::StructuredInference< GUM_SCALAR >::__str ( const PRMInstance< GUM_SCALAR > *  i,
const PRMAttribute< GUM_SCALAR > *  a 
) const
private

Definition at line 979 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__dot, gum::prm::PRMObject::name(), and gum::prm::PRMClassElement< GUM_SCALAR >::safeName().

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__buildPatternGraph().

981  {
982  return i->name() + __dot + a->safeName();
983  }
std::string __dot
Unreduce the match containing the query.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __str() [2/3]

template<typename GUM_SCALAR >
INLINE std::string gum::prm::StructuredInference< GUM_SCALAR >::__str ( const PRMInstance< GUM_SCALAR > *  i,
const PRMAttribute< GUM_SCALAR > &  a 
) const
private

Definition at line 986 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__dot, gum::prm::PRMObject::name(), and gum::prm::PRMClassElement< GUM_SCALAR >::safeName().

988  {
989  return i->name() + __dot + a.safeName();
990  }
std::string __dot
Unreduce the match containing the query.
+ Here is the call graph for this function:

◆ __str() [3/3]

template<typename GUM_SCALAR >
INLINE std::string gum::prm::StructuredInference< GUM_SCALAR >::__str ( const PRMInstance< GUM_SCALAR > *  i,
const PRMSlotChain< GUM_SCALAR > &  a 
) const
private

Definition at line 993 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__dot, gum::prm::PRMSlotChain< GUM_SCALAR >::lastElt(), and gum::prm::PRMObject::name().

995  {
996  return i->name() + __dot + a.lastElt().safeName();
997  }
std::string __dot
Unreduce the match containing the query.
+ Here is the call graph for this function:

◆ __translatePotSet()

template<typename GUM_SCALAR>
Set< Potential< GUM_SCALAR > *> * gum::prm::StructuredInference< GUM_SCALAR >::__translatePotSet ( typename StructuredInference< GUM_SCALAR >::PData data,
const Set< Potential< GUM_SCALAR > * > &  pool,
const Sequence< PRMInstance< GUM_SCALAR > * > &  match 
)
private

Translate a given Potential Set into one w.r.t. variables in match.

Definition at line 519 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__reducedInstances, gum::prm::copyPotential(), gum::BijectionImplementation< T1, T2, Alloc, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::existsFirst(), gum::BijectionImplementation< T1, T2, Alloc, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::first(), GUM_ERROR, gum::BijectionImplementation< T1, T2, Alloc, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::insert(), gum::prm::StructuredInference< GUM_SCALAR >::PData::map, gum::prm::StructuredInference< GUM_SCALAR >::PData::matches, and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__eliminateObservedNodes(), and gum::prm::StructuredInference< GUM_SCALAR >::__reducePattern().

522  {
523 #ifdef DEBUG
524 
526  data.matches.begin();
527  iter != data.matches.end();
528  ++iter) {
529  GUM_ASSERT((**iter).size() == match.size());
530 
531  for (Size idx = 0; idx < match.size(); ++idx) {
532  GUM_ASSERT((**iter).atPos(idx)->type() == match.atPos(idx)->type());
533  }
534  }
535 
536 #endif
537  Set< Potential< GUM_SCALAR >* >* my_pool =
538  new Set< Potential< GUM_SCALAR >* >();
539  std::pair< Idx, std::string > target;
540  Bijection< const DiscreteVariable*, const DiscreteVariable* > bij;
541  const Sequence< PRMInstance< GUM_SCALAR >* >& source =
542  **(data.matches.begin());
543 
544  for (Size idx = 0; idx < match.size(); ++idx) {
545  __reducedInstances.insert(match[idx]);
546  const auto& chains = source[idx]->type().slotChains();
547 
548  for (const auto sc : chains) {
549 #ifdef DEBUG
550  GUM_ASSERT(!(sc->isMultiple()));
551 #endif
552 
553  try {
554  bij.insert(&(source[idx]
555  ->getInstance(sc->id())
556  .get(sc->lastElt().safeName())
557  .type()
558  .variable()),
559  &(match[idx]
560  ->getInstance(sc->id())
561  .get(sc->lastElt().safeName())
562  .type()
563  .variable()));
564  } catch (DuplicateElement&) {
565  try {
566  if (bij.first(&(match[idx]
567  ->getInstance(sc->id())
568  .get(sc->lastElt().safeName())
569  .type()
570  .variable()))
571  != &(source[idx]
572  ->getInstance(sc->id())
573  .get(sc->lastElt().safeName())
574  .type()
575  .variable())) {
576  delete my_pool;
577  GUM_ERROR(OperationNotAllowed, "fake pattern");
578  }
579  } catch (NotFound&) {
580  delete my_pool;
581  GUM_ERROR(OperationNotAllowed, "fake pattern");
582  }
583  }
584  }
585  }
586 
587  for (const auto p : pool) {
588  for (const auto v : p->variablesSequence()) {
589  try {
590  target = data.map[data.vars.first(v)];
591  bij.insert(
592  v, &(match[target.first]->get(target.second).type().variable()));
593  } catch (NotFound&) {
594  GUM_ASSERT(bij.existsFirst(v));
595  } catch (DuplicateElement&) {}
596  }
597 
598  try {
599  my_pool->insert(copyPotential(bij, *p));
600  } catch (Exception&) {
601  for (const auto pot : *my_pool)
602  delete pot;
603 
604  delete my_pool;
605  GUM_ERROR(OperationNotAllowed, "fake pattern");
606  }
607  }
608 
609  return my_pool;
610  }
Set< const PRMInstance< GUM_SCALAR > *> __reducedInstances
This keeps track of reduced instances.
Potential< GUM_SCALAR > * copyPotential(const Bijection< const DiscreteVariable *, const DiscreteVariable * > &bij, const Potential< GUM_SCALAR > &source)
Returns a copy of a Potential after applying a bijection over the variables in source.
Definition: utils_prm_tpl.h:29
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:48
SetIterator< Key > const_iterator
Types for STL compliance.
Definition: set.h:178
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ _evidenceAdded() [1/2]

template<typename GUM_SCALAR >
void gum::prm::StructuredInference< GUM_SCALAR >::_evidenceAdded ( const typename PRMInference< GUM_SCALAR >::Chain chain)
protectedvirtual

See PRMInference::_evidenceAdded().

Definition at line 95 of file structuredInference_tpl.h.

96  {}

◆ _evidenceAdded() [2/2]

template<typename GUM_SCALAR>
virtual void gum::prm::PRMInference< GUM_SCALAR >::_evidenceAdded ( const Chain chain)
protectedpure virtualinherited

This method is called whenever an evidence is added, but AFTER any processing made by PRMInference.

Implemented in gum::prm::SVE< GUM_SCALAR >, and gum::prm::SVED< GUM_SCALAR >.

◆ _evidenceRemoved() [1/2]

template<typename GUM_SCALAR >
void gum::prm::StructuredInference< GUM_SCALAR >::_evidenceRemoved ( const typename PRMInference< GUM_SCALAR >::Chain chain)
protectedvirtual

See PRMInference::_evidenceRemoved().

Definition at line 99 of file structuredInference_tpl.h.

100  {}

◆ _evidenceRemoved() [2/2]

template<typename GUM_SCALAR>
virtual void gum::prm::PRMInference< GUM_SCALAR >::_evidenceRemoved ( const Chain chain)
protectedpure virtualinherited

This method is called whenever an evidence is removed, but BEFORE any processing made by PRMInference.

Implemented in gum::prm::SVE< GUM_SCALAR >, and gum::prm::SVED< GUM_SCALAR >.

◆ _joint() [1/2]

template<typename GUM_SCALAR >
void gum::prm::StructuredInference< GUM_SCALAR >::_joint ( const std::vector< typename PRMInference< GUM_SCALAR >::Chain > &  queries,
Potential< GUM_SCALAR > &  j 
)
protectedvirtual

See PRMInference::_joint().

Definition at line 176 of file structuredInference_tpl.h.

References GUM_ERROR.

178  {
179  GUM_ERROR(FatalError, "not implemented");
180  }
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55

◆ _joint() [2/2]

template<typename GUM_SCALAR>
virtual void gum::prm::PRMInference< GUM_SCALAR >::_joint ( const std::vector< Chain > &  queries,
Potential< GUM_SCALAR > &  j 
)
protectedpure virtualinherited

Generic method to compute the marginal of given element.

Parameters
queriesSet of pairs of PRMInstance<GUM_SCALAR> and PRMAttribute<GUM_SCALAR>.
jCPF filled with the joint probability of queries. It is initialized properly.

Implemented in gum::prm::SVE< GUM_SCALAR >, and gum::prm::SVED< GUM_SCALAR >.

◆ _marginal() [1/2]

template<typename GUM_SCALAR >
void gum::prm::StructuredInference< GUM_SCALAR >::_marginal ( const typename PRMInference< GUM_SCALAR >::Chain chain,
Potential< GUM_SCALAR > &  m 
)
protectedvirtual

See PRMInference::_marginal().

Definition at line 103 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__buildReduceGraph(), gum::prm::StructuredInference< GUM_SCALAR >::__found_query, gum::prm::StructuredInference< GUM_SCALAR >::__pdata, gum::prm::StructuredInference< GUM_SCALAR >::__query, gum::Set< Key, Alloc >::begin(), gum::MultiDimCombinationDefault< GUM_SCALAR, TABLE >::combine(), gum::MultiDimDecorator< GUM_SCALAR >::contains(), gum::Instantiation::end(), gum::prm::PRMInference< GUM_SCALAR >::evidence(), gum::prm::StructuredInference< GUM_SCALAR >::full_time, gum::MultiDimDecorator< GUM_SCALAR >::get(), gum::prm::PRMInference< GUM_SCALAR >::hasEvidence(), gum::Instantiation::inc(), gum::Set< Key, Alloc >::insert(), gum::prm::multPotential(), gum::Potential< GUM_SCALAR >::normalize(), gum::prm::StructuredInference< GUM_SCALAR >::RGData::pool, gum::Timer::reset(), gum::MultiDimDecorator< GUM_SCALAR >::set(), gum::Instantiation::setFirst(), gum::Set< Key, Alloc >::size(), gum::Timer::step(), gum::prm::StructuredInference< GUM_SCALAR >::timer, and gum::MultiDimDecorator< GUM_SCALAR >::variablesSequence().

105  {
106  timer.reset();
107  __found_query = false;
108  __query = chain;
109  typename StructuredInference< GUM_SCALAR >::RGData data;
110 
111  if (!this->hasEvidence() && (chain.second->cpf().nbrDim() == 1)) {
112  Instantiation i(m);
113 
114  for (i.setFirst(); !i.end(); i.inc())
115  m.set(i, chain.second->cpf().get(i));
116 
117  return;
118  } else if (this->hasEvidence(chain)) {
119  Instantiation i(m);
120  const Potential< GUM_SCALAR >* e =
121  this->evidence(__query.first)[__query.second->id()];
122 
123  for (i.setFirst(); !i.end(); i.inc())
124  m.set(i, e->get(i));
125 
126  return;
127  }
128 
129  __buildReduceGraph(data);
130  Set< const Potential< GUM_SCALAR >* > pots;
131 
132  if (data.pool.size() > 1) {
133  for (const auto pot : data.pool)
134  if (pot->contains(__query.second->type().variable())) pots.insert(pot);
135 
136  if (pots.size() == 1) {
137  Potential< GUM_SCALAR >* pot =
138  const_cast< Potential< GUM_SCALAR >* >(*(pots.begin()));
139  GUM_ASSERT(pot->contains(__query.second->type().variable()));
140  GUM_ASSERT(pot->variablesSequence().size() == 1);
141  Instantiation i(*pot), j(m);
142 
143  for (i.setFirst(), j.setFirst(); !i.end(); i.inc(), j.inc())
144  m.set(j, pot->get(i));
145  } else {
146  MultiDimCombinationDefault< GUM_SCALAR, Potential > Comb(multPotential);
147  Potential< GUM_SCALAR >* tmp = Comb.combine(pots);
148  Instantiation i(m), j(*tmp);
149 
150  for (i.setFirst(), j.setFirst(); !i.end(); i.inc(), j.inc())
151  m.set(i, tmp->get(j));
152 
153  delete tmp;
154  }
155  } else {
156  Potential< GUM_SCALAR >* pot = *(data.pool.begin());
157  GUM_ASSERT(pot->contains(__query.second->type().variable()));
158  GUM_ASSERT(pot->variablesSequence().size() == 1);
159  Instantiation i(*pot), j(m);
160 
161  for (i.setFirst(), j.setFirst(); !i.end(); i.inc(), j.inc())
162  m.set(j, pot->get(i));
163  }
164 
165  m.normalize();
166 
167  if (__pdata) {
168  delete __pdata;
169  __pdata = 0;
170  }
171 
172  full_time = timer.step();
173  }
double step() const
Returns the delta time between now and the last reset() call (or the constructor).
Definition: timer_inl.h:42
EMap & evidence(const PRMInstance< GUM_SCALAR > &i)
Returns EMap of evidences over i.
PData * __pdata
The pattern data of the pattern which one of its matches contains the query.
bool __found_query
Flag with an explicit name.
void __buildReduceGraph(RGData &data)
This calls __reducePattern() over each pattern and then build the reduced graph which is used for inf...
void reset()
Reset the timer.
Definition: timer_inl.h:32
PRMInference< GUM_SCALAR >::Chain __query
The query.
void set(const Key &key, const Val &default_value)
Add a new property or modify it if it already existed.
bool hasEvidence() const
Returns true if i has evidence on PRMAttribute<GUM_SCALAR> a.
Potential< GUM_SCALAR > * multPotential(const Potential< GUM_SCALAR > &t1, const Potential< GUM_SCALAR > &t2)
+ Here is the call graph for this function:

◆ _marginal() [2/2]

template<typename GUM_SCALAR>
virtual void gum::prm::PRMInference< GUM_SCALAR >::_marginal ( const Chain chain,
Potential< GUM_SCALAR > &  m 
)
protectedpure virtualinherited

Generic method to compute the marginal of given element.

Parameters
chain
mCPF filled with the marginal of elt. It is initialized properly.

Implemented in gum::prm::SVE< GUM_SCALAR >, and gum::prm::SVED< GUM_SCALAR >.

◆ addEvidence()

template<typename GUM_SCALAR>
void gum::prm::PRMInference< GUM_SCALAR >::addEvidence ( const Chain chain,
const Potential< GUM_SCALAR > &  p 
)
inherited

Add an evidence to the given instance's elt.

Parameters
chainThe variable being observed.
pThe Potential added (by copy) as evidence.
Exceptions
NotFoundRaised if elt does not belong to i.
OperationNotAllowedRaised if p is inconsistent with elt.

Definition at line 109 of file PRMInference_tpl.h.

Referenced by gum::prm::o3prmr::O3prmrInterpreter::observe().

110  {
111  if (chain.first->exists(chain.second->id())) {
112  if ((p.nbrDim() != 1) || (!p.contains(chain.second->type().variable())))
113  GUM_ERROR(OperationNotAllowed,
114  "illegal evidence for the given PRMAttribute.");
115 
116  Potential< GUM_SCALAR >* e = new Potential< GUM_SCALAR >();
117  e->add(chain.second->type().variable());
118  Instantiation i(*e);
119 
120  for (i.setFirst(); !i.end(); i.inc())
121  e->set(i, p.get(i));
122 
123  PRMInference< GUM_SCALAR >::EMap& emap = __EMap(chain.first);
124 
125  if (emap.exists(chain.second->id())) {
126  delete emap[chain.second->id()];
127  emap[chain.second->id()] = e;
128  } else {
129  emap.insert(chain.second->id(), e);
130  }
131 
132  _evidenceAdded(chain);
133  } else {
134  GUM_ERROR(NotFound,
135  "the given PRMAttribute does not belong to this "
136  "Instance<GUM_SCALAR>.");
137  }
138  }
virtual void _evidenceAdded(const Chain &chain)=0
This method is called whenever an evidence is added, but AFTER any processing made by PRMInference...
EMap & __EMap(const PRMInstance< GUM_SCALAR > *i)
Private getter over __evidences, if necessary creates an EMap for i.
NodeProperty< const Potential< GUM_SCALAR > *> EMap
Code alias.
Definition: PRMInference.h:60
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
+ Here is the caller graph for this function:

◆ clearEvidence()

template<typename GUM_SCALAR >
void gum::prm::PRMInference< GUM_SCALAR >::clearEvidence ( )
inherited

Remove all evidences.

Definition at line 36 of file PRMInference_tpl.h.

36  {
37  for (const auto& elt : __evidences) {
38  for (const auto& elt2 : *elt.second)
39  delete elt2.second;
40 
41  delete elt.second;
42  }
43 
44  __evidences.clear();
45  }
HashTable< const PRMInstance< GUM_SCALAR > *, EMap *> __evidences
Mapping of evidence over PRMInstance<GUM_SCALAR>&#39;s nodes.
Definition: PRMInference.h:235

◆ evidence() [1/4]

template<typename GUM_SCALAR>
INLINE PRMInference< GUM_SCALAR >::EMap & gum::prm::PRMInference< GUM_SCALAR >::evidence ( const PRMInstance< GUM_SCALAR > &  i)
inherited

Returns EMap of evidences over i.

Exceptions
NotFoundif i has no evidence.

Definition at line 156 of file PRMInference_tpl.h.

Referenced by gum::prm::SVED< GUM_SCALAR >::__insertEvidence(), gum::prm::SVE< GUM_SCALAR >::__insertEvidence(), gum::prm::StructuredInference< GUM_SCALAR >::__reduceAloneInstances(), and gum::prm::StructuredInference< GUM_SCALAR >::_marginal().

156  {
157  try {
158  return *(__evidences[&i]);
159  } catch (NotFound&) {
160  GUM_ERROR(NotFound, "this instance has no evidence.");
161  }
162  }
HashTable< const PRMInstance< GUM_SCALAR > *, EMap *> __evidences
Mapping of evidence over PRMInstance<GUM_SCALAR>&#39;s nodes.
Definition: PRMInference.h:235
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
+ Here is the caller graph for this function:

◆ evidence() [2/4]

template<typename GUM_SCALAR>
INLINE PRMInference< GUM_SCALAR >::EMap & gum::prm::PRMInference< GUM_SCALAR >::evidence ( const PRMInstance< GUM_SCALAR > *  i)
inherited

Returns EMap of evidences over i.

Exceptions
NotFoundif i has no evidence.

Definition at line 177 of file PRMInference_tpl.h.

177  {
178  try {
179  return *(__evidences[i]);
180  } catch (NotFound&) {
181  GUM_ERROR(NotFound, "this instance has no evidence.");
182  }
183  }
HashTable< const PRMInstance< GUM_SCALAR > *, EMap *> __evidences
Mapping of evidence over PRMInstance<GUM_SCALAR>&#39;s nodes.
Definition: PRMInference.h:235
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55

◆ evidence() [3/4]

template<typename GUM_SCALAR>
INLINE const PRMInference< GUM_SCALAR >::EMap & gum::prm::PRMInference< GUM_SCALAR >::evidence ( const PRMInstance< GUM_SCALAR > &  i) const
inherited

Returns EMap of evidences over i.

Exceptions
NotFoundif i has no evidence.

Definition at line 166 of file PRMInference_tpl.h.

167  {
168  try {
169  return *(__evidences[&i]);
170  } catch (NotFound&) {
171  GUM_ERROR(NotFound, "this instance has no evidence.");
172  }
173  }
HashTable< const PRMInstance< GUM_SCALAR > *, EMap *> __evidences
Mapping of evidence over PRMInstance<GUM_SCALAR>&#39;s nodes.
Definition: PRMInference.h:235
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55

◆ evidence() [4/4]

template<typename GUM_SCALAR>
INLINE const PRMInference< GUM_SCALAR >::EMap & gum::prm::PRMInference< GUM_SCALAR >::evidence ( const PRMInstance< GUM_SCALAR > *  i) const
inherited

Returns EMap of evidences over i.

Exceptions
NotFoundif i has no evidence.

Definition at line 187 of file PRMInference_tpl.h.

188  {
189  try {
190  return *(__evidences[i]);
191  } catch (NotFound&) {
192  GUM_ERROR(NotFound, "this instance has no evidence.");
193  }
194  }
HashTable< const PRMInstance< GUM_SCALAR > *, EMap *> __evidences
Mapping of evidence over PRMInstance<GUM_SCALAR>&#39;s nodes.
Definition: PRMInference.h:235
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55

◆ gspan() [1/2]

template<typename GUM_SCALAR >
INLINE GSpan< GUM_SCALAR > & gum::prm::StructuredInference< GUM_SCALAR >::gspan ( )

Returns the instance of gspan used to search patterns.

Definition at line 1015 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__gspan.

1015  {
1016  return *__gspan;
1017  }
GSpan< GUM_SCALAR > * __gspan
Pointer over th GSpan<GUM_SCALAR> instance used by this class.

◆ gspan() [2/2]

template<typename GUM_SCALAR >
INLINE const GSpan< GUM_SCALAR > & gum::prm::StructuredInference< GUM_SCALAR >::gspan ( ) const

Returns the instance of gspan used to search patterns.

Definition at line 1021 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__gspan.

1021  {
1022  return *__gspan;
1023  }
GSpan< GUM_SCALAR > * __gspan
Pointer over th GSpan<GUM_SCALAR> instance used by this class.

◆ hasEvidence() [1/4]

template<typename GUM_SCALAR>
INLINE bool gum::prm::PRMInference< GUM_SCALAR >::hasEvidence ( const PRMInstance< GUM_SCALAR > &  i) const
inherited

Returns true if i has evidence.

Definition at line 197 of file PRMInference_tpl.h.

Referenced by gum::prm::o3prmr::O3prmrInterpreter::observe(), and gum::prm::o3prmr::O3prmrInterpreter::unobserve().

198  {
199  return __evidences.exists(&i);
200  }
HashTable< const PRMInstance< GUM_SCALAR > *, EMap *> __evidences
Mapping of evidence over PRMInstance<GUM_SCALAR>&#39;s nodes.
Definition: PRMInference.h:235
+ Here is the caller graph for this function:

◆ hasEvidence() [2/4]

template<typename GUM_SCALAR>
INLINE bool gum::prm::PRMInference< GUM_SCALAR >::hasEvidence ( const PRMInstance< GUM_SCALAR > *  i) const
inherited

Returns EMap of evidences over i.

Definition at line 203 of file PRMInference_tpl.h.

204  {
205  return __evidences.exists(i);
206  }
HashTable< const PRMInstance< GUM_SCALAR > *, EMap *> __evidences
Mapping of evidence over PRMInstance<GUM_SCALAR>&#39;s nodes.
Definition: PRMInference.h:235

◆ hasEvidence() [3/4]

template<typename GUM_SCALAR>
INLINE bool gum::prm::PRMInference< GUM_SCALAR >::hasEvidence ( const Chain chain) const
inherited

Returns true if i has evidence on PRMAttribute<GUM_SCALAR> a.

Definition at line 209 of file PRMInference_tpl.h.

209  {
210  return (hasEvidence(chain.first))
211  ? evidence(chain.first).exists(chain.second->id())
212  : false;
213  }
EMap & evidence(const PRMInstance< GUM_SCALAR > &i)
Returns EMap of evidences over i.
bool exists(const Key &key) const
Checks whether there exists an element with a given key in the hashtable.
bool hasEvidence() const
Returns true if i has evidence on PRMAttribute<GUM_SCALAR> a.

◆ hasEvidence() [4/4]

template<typename GUM_SCALAR>
INLINE bool gum::prm::PRMInference< GUM_SCALAR >::hasEvidence ( ) const
inherited

Returns true if i has evidence on PRMAttribute<GUM_SCALAR> a.

Definition at line 216 of file PRMInference_tpl.h.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__insertNodeInElimLists(), gum::prm::StructuredInference< GUM_SCALAR >::__reduceAloneInstances(), and gum::prm::StructuredInference< GUM_SCALAR >::_marginal().

216  {
217  return (__evidences.size() != (Size)0);
218  }
HashTable< const PRMInstance< GUM_SCALAR > *, EMap *> __evidences
Mapping of evidence over PRMInstance<GUM_SCALAR>&#39;s nodes.
Definition: PRMInference.h:235
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:48
+ Here is the caller graph for this function:

◆ info()

template<typename GUM_SCALAR >
std::string gum::prm::StructuredInference< GUM_SCALAR >::info ( ) const

Definition at line 183 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__gspan, gum::prm::StructuredInference< GUM_SCALAR >::full_time, gum::prm::StructuredInference< GUM_SCALAR >::inner_time, gum::prm::StructuredInference< GUM_SCALAR >::mining_time, gum::prm::StructuredInference< GUM_SCALAR >::obs_time, gum::prm::StructuredInference< GUM_SCALAR >::pattern_time, and gum::prm::StructuredInference< GUM_SCALAR >::triang_time.

183  {
184  std::stringstream s;
185  s << "Triangulation time: " << triang_time << std::endl;
186  s << "Pattern mining time: " << mining_time << std::endl;
187  s << "Pattern elimination time: " << pattern_time << std::endl;
188  s << "Inner node elimination time: " << inner_time << std::endl;
189  s << "Observed node elimination time: " << obs_time << std::endl;
190  s << "Full inference time: " << full_time << std::endl;
191  s << "#patterns: " << __gspan->patterns().size() << std::endl;
192  Size count = 0;
193  typedef std::vector< gspan::Pattern* >::const_iterator Iter;
194 
195  for (Iter p = __gspan->patterns().begin(); p != __gspan->patterns().end();
196  ++p) {
197  if (__gspan->matches(**p).size()) {
198  s << "Pattern n°" << count++
199  << " match count: " << __gspan->matches(**p).size() << std::endl;
200  s << "Pattern n°" << count++ << " instance count: " << (**p).size()
201  << std::endl;
202  }
203  }
204 
205  return s.str();
206  }
GSpan< GUM_SCALAR > * __gspan
Pointer over th GSpan<GUM_SCALAR> instance used by this class.
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:48

◆ joint()

template<typename GUM_SCALAR>
INLINE void gum::prm::PRMInference< GUM_SCALAR >::joint ( const std::vector< Chain > &  chains,
Potential< GUM_SCALAR > &  j 
)
inherited

Compute the joint probability of the formals attributes pointed by chains and stores it in m.

Parameters
chainsA Set of strings of the form instance.attribute.
jAn empty CPF which will be filed by the joint probability over chains.
Exceptions
NotFoundRaised if some chain in chains does not point to a formal attribute.
OperationNotAllowedRaise if m is not empty.

Definition at line 263 of file PRMInference_tpl.h.

265  {
266  if (j.nbrDim() > 0) {
267  GUM_ERROR(OperationNotAllowed, "the given Potential is not empty.");
268  }
269 
270  for (auto chain = chains.begin(); chain != chains.end(); ++chain) {
271  j.add(chain->second->type().variable());
272  }
273 
274  _joint(chains, j);
275  }
virtual void _joint(const std::vector< Chain > &queries, Potential< GUM_SCALAR > &j)=0
Generic method to compute the marginal of given element.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55

◆ marginal()

template<typename GUM_SCALAR>
INLINE void gum::prm::PRMInference< GUM_SCALAR >::marginal ( const Chain chain,
Potential< GUM_SCALAR > &  m 
)
inherited

Compute the marginal of the formal attribute pointed by chain and stores it in m.

Parameters
chainA string of the form instance.attribute.
mAn empty CPF which will be filed by the marginal of chain.
Exceptions
NotFoundRaised if chain is invalid.
WrongTypeRaised if chain does not point to an PRMAttribute<GUM_SCALAR>.
OperationNotAllowedRaise if m is not empty.

Definition at line 234 of file PRMInference_tpl.h.

Referenced by gum::prm::o3prmr::O3prmrInterpreter::query().

236  {
237  if (m.nbrDim() > 0) {
238  GUM_ERROR(OperationNotAllowed, "the given Potential is not empty.");
239  }
240 
241  if (hasEvidence(chain)) {
242  m.add(chain.second->type().variable());
243  const Potential< GUM_SCALAR >& e =
244  *(evidence(chain.first)[chain.second->id()]);
245  Instantiation i(m), j(e);
246 
247  for (i.setFirst(), j.setFirst(); !i.end(); i.inc(), j.inc())
248  m.set(i, e.get(j));
249  } else {
250  if (chain.second != &(chain.first->get(chain.second->safeName()))) {
251  typename PRMInference< GUM_SCALAR >::Chain good_chain = std::make_pair(
252  chain.first, &(chain.first->get(chain.second->safeName())));
253  m.add(good_chain.second->type().variable());
254  _marginal(good_chain, m);
255  } else {
256  m.add(chain.second->type().variable());
257  _marginal(chain, m);
258  }
259  }
260  }
EMap & evidence(const PRMInstance< GUM_SCALAR > &i)
Returns EMap of evidences over i.
virtual void _marginal(const Chain &chain, Potential< GUM_SCALAR > &m)=0
Generic method to compute the marginal of given element.
bool hasEvidence() const
Returns true if i has evidence on PRMAttribute<GUM_SCALAR> a.
std::pair< const PRMInstance< GUM_SCALAR > *, const PRMAttribute< GUM_SCALAR > *> Chain
Code alias.
Definition: PRMInference.h:57
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
+ Here is the caller graph for this function:

◆ name()

template<typename GUM_SCALAR >
INLINE std::string gum::prm::StructuredInference< GUM_SCALAR >::name ( ) const
virtual

Tells this algorithm to use pattern mining or not.

Implements gum::prm::PRMInference< GUM_SCALAR >.

Definition at line 1010 of file structuredInference_tpl.h.

1010  {
1011  return "StructuredInference";
1012  }

◆ operator=()

template<typename GUM_SCALAR >
StructuredInference< GUM_SCALAR > & gum::prm::StructuredInference< GUM_SCALAR >::operator= ( const StructuredInference< GUM_SCALAR > &  source)

Copy operator.

Definition at line 84 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__gspan, gum::prm::PRMInference< GUM_SCALAR >::_prm, and gum::prm::PRMInference< GUM_SCALAR >::_sys.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::~StructuredInference().

84  {
85  this->_prm = source._prm;
86  this->_sys = source._sys;
87 
88  if (this->__gspan) delete this->__gspan;
89 
90  this->__gspan = new GSpan< GUM_SCALAR >(*(this->_prm), *(this->_sys));
91  return *this;
92  }
GSpan< GUM_SCALAR > * __gspan
Pointer over th GSpan<GUM_SCALAR> instance used by this class.
PRM< GUM_SCALAR > const * _prm
The PRM<GUM_SCALAR> on which inference is done.
Definition: PRMInference.h:213
PRMSystem< GUM_SCALAR > const * _sys
The Model on which inference is done.
Definition: PRMInference.h:216
+ Here is the caller graph for this function:

◆ removeEvidence()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMInference< GUM_SCALAR >::removeEvidence ( const Chain chain)
inherited

Remove evidence on the given instance's elt.

Parameters
chainThe variable being observed.
Exceptions
NotFoundRaised if the given names are not found.
WrongTypeRaised if the elt is not an PRMAttribute<GUM_SCALAR>.

Definition at line 221 of file PRMInference_tpl.h.

Referenced by gum::prm::o3prmr::O3prmrInterpreter::unobserve().

221  {
222  try {
223  if (__EMap(chain.first).exists(chain.second->id())) {
224  _evidenceRemoved(chain);
225  delete __EMap(chain.first)[chain.second->id()];
226  __EMap(chain.first).erase(chain.second->id());
227  }
228  } catch (NotFound&) {
229  // Ok, we are only removing
230  }
231  }
void erase(const Key &key)
Removes a given element from the hash table.
bool exists(const Key &key) const
Checks whether there exists an element with a given key in the hashtable.
virtual void _evidenceRemoved(const Chain &chain)=0
This method is called whenever an evidence is removed, but BEFORE any processing made by PRMInference...
EMap & __EMap(const PRMInstance< GUM_SCALAR > *i)
Private getter over __evidences, if necessary creates an EMap for i.
+ Here is the caller graph for this function:

◆ searchPatterns()

template<typename GUM_SCALAR >
void gum::prm::StructuredInference< GUM_SCALAR >::searchPatterns ( )

Search for patterns without doing any computations.

Definition at line 965 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__buildReduceGraph(), gum::prm::StructuredInference< GUM_SCALAR >::__found_query, gum::prm::StructuredInference< GUM_SCALAR >::__query, gum::prm::PRMInference< GUM_SCALAR >::_sys, and gum::prm::PRMInstance< GUM_SCALAR >::begin().

965  {
966  const PRMInstance< GUM_SCALAR >* i = (this->_sys->begin()).val();
967  __query = std::make_pair(i, i->begin().val());
968  __found_query = false;
969  typename StructuredInference< GUM_SCALAR >::RGData data;
970  __buildReduceGraph(data);
971  }
bool __found_query
Flag with an explicit name.
void __buildReduceGraph(RGData &data)
This calls __reducePattern() over each pattern and then build the reduced graph which is used for inf...
PRMInference< GUM_SCALAR >::Chain __query
The query.
PRMSystem< GUM_SCALAR > const * _sys
The Model on which inference is done.
Definition: PRMInference.h:216
+ Here is the call graph for this function:

◆ setPatternMining()

template<typename GUM_SCALAR >
INLINE void gum::prm::StructuredInference< GUM_SCALAR >::setPatternMining ( bool  b)

Tells this algorithm to use pattern mining or not.

Definition at line 974 of file structuredInference_tpl.h.

References gum::prm::StructuredInference< GUM_SCALAR >::__mining.

974  {
975  __mining = b;
976  }
bool __mining
Flag which tells to use pattern mining or not.

Member Data Documentation

◆ __cdata_map

template<typename GUM_SCALAR>
HashTable< const PRMClass< GUM_SCALAR >*, CData* > gum::prm::StructuredInference< GUM_SCALAR >::__cdata_map
private

Mapping between a Class<GUM_SCALAR> and data about instances reduced using only Class<GUM_SCALAR> level information.

Definition at line 263 of file structuredInference.h.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__reduceAloneInstances(), and gum::prm::StructuredInference< GUM_SCALAR >::~StructuredInference().

◆ __dot

template<typename GUM_SCALAR>
std::string gum::prm::StructuredInference< GUM_SCALAR >::__dot
private

Unreduce the match containing the query.

Used to create strings

Definition at line 368 of file structuredInference.h.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__str().

◆ __elim_map

template<typename GUM_SCALAR>
HashTable< const Sequence< PRMInstance< GUM_SCALAR >* >*, Set< Potential< GUM_SCALAR >* >* > gum::prm::StructuredInference< GUM_SCALAR >::__elim_map
private

Mapping between a Pattern's match and its potential pool after inner variables were eliminated.

Definition at line 257 of file structuredInference.h.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::__addEdgesInReducedGraph(), gum::prm::StructuredInference< GUM_SCALAR >::__reducePattern(), and gum::prm::StructuredInference< GUM_SCALAR >::~StructuredInference().

◆ __found_query

◆ __gspan

◆ __mining

template<typename GUM_SCALAR>
bool gum::prm::StructuredInference< GUM_SCALAR >::__mining
private

◆ __outputs

template<typename GUM_SCALAR>
HashTable< const PRMClass< GUM_SCALAR >*, std::vector< NodeId >* > gum::prm::StructuredInference< GUM_SCALAR >::__outputs
private

◆ __pdata

template<typename GUM_SCALAR>
PData* gum::prm::StructuredInference< GUM_SCALAR >::__pdata
private

The pattern data of the pattern which one of its matches contains the query.

Definition at line 278 of file structuredInference.h.

Referenced by gum::prm::StructuredInference< GUM_SCALAR >::_marginal(), and gum::prm::StructuredInference< GUM_SCALAR >::~StructuredInference().

◆ __query

◆ __query_data

template<typename GUM_SCALAR>
std::pair< Idx, std::string > gum::prm::StructuredInference< GUM_SCALAR >::__query_data
private

◆ __reducedInstances

template<typename GUM_SCALAR>
Set< const PRMInstance< GUM_SCALAR >* > gum::prm::StructuredInference< GUM_SCALAR >::__reducedInstances
private

◆ __trash

◆ _prm

template<typename GUM_SCALAR>
PRM< GUM_SCALAR > const* gum::prm::PRMInference< GUM_SCALAR >::_prm
protectedinherited

◆ _sys

◆ full_time

◆ inner_time

◆ mining_time

◆ obs_time

◆ pattern_time

◆ plopTimer

◆ timer

template<typename GUM_SCALAR>
Timer gum::prm::StructuredInference< GUM_SCALAR >::timer

◆ triang_time


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