aGrUM  0.17.2
a C++ library for (probabilistic) graphical models
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, and gum::prm::StructuredInference< GUM_SCALAR >::__trash.

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

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 736 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().

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

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

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

413  {
414  for (const auto mat: data.matches)
415  if (mat->atPos(attr.first)
416  ->hasRefAttr(mat->atPos(attr.first)->get(attr.second).id()))
417  return false;
418 
419  return true;
420  }
+ 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 350 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().

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

211  {
212  // Launch the pattern mining
213  plopTimer.reset();
214 
215  if (__mining) __gspan->discoverPatterns();
216 
218  // Reducing each used pattern
219  plopTimer.reset();
220  typedef std::vector< gspan::Pattern* >::const_iterator Iter;
221 
222  for (Iter p = __gspan->patterns().begin(); p != __gspan->patterns().end();
223  ++p)
224  if (__gspan->matches(**p).size()) __reducePattern(*p);
225 
227  // reducing instance not already reduced in a pattern
229  // Adding edges using the pools
231  // Placing the query where it belongs
232  NodeId id = data.var2node.second(&(__query.second->type().variable()));
233  data.outputs().erase(id);
234  data.queries().insert(id);
235  // Triangulating, then eliminating
236  PartialOrderedTriangulation t(
237  &(data.reducedGraph), &(data.mods), &(data.partial_order));
238  const std::vector< NodeId >& elim_order = t.eliminationOrder();
239 
240  for (size_t i = 0; i < data.outputs().size(); ++i)
241  eliminateNode(data.var2node.first(elim_order[i]), data.pool, __trash);
242  }
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 498 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().

502  {
503  Set< Potential< GUM_SCALAR >* >* my_pool =
504  __translatePotSet(data, pool, match);
505  std::pair< Idx, std::string > target;
506  size_t end = data.inners().size() + data.obs().size();
507 
508  for (size_t idx = data.inners().size(); idx < end; ++idx) {
509  target = data.map[data.vars.first(data.vars.second(elim_order[idx]))];
510  eliminateNode(&(match[target.first]->get(target.second).type().variable()),
511  *my_pool,
512  __trash);
513  }
514 
515  return my_pool;
516  }
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 476 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().

480  {
481  Set< Potential< GUM_SCALAR >* >* my_pool =
482  new Set< Potential< GUM_SCALAR >* >(pool);
483  std::pair< Idx, std::string > target;
484  size_t end = data.inners().size() + data.obs().size();
485 
486  for (size_t idx = data.inners().size(); idx < end; ++idx) {
487  target = data.map[data.vars.first(data.vars.second(elim_order[idx]))];
488  eliminateNode(&(match[target.first]->get(target.second).type().variable()),
489  *my_pool,
490  __trash);
491  }
492 
493  return my_pool;
494  }
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 313 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().

319  {
320  if ((*inst).hasRefAttr((*inst).get(v.second).id())) {
321  std::vector< std::pair< PRMInstance< GUM_SCALAR >*, std::string > >& refs =
322  inst->getRefAttr(inst->get(v.second).id());
323 
324  for (auto r = refs.begin(); r != refs.end(); ++r) {
325  if (!match.exists(r->first)) {
326  data.outputs().insert(id);
327  break;
328  }
329  }
330  }
331 
332  if (!(data.outputs().size() && (data.outputs().exists(id)))) {
333  for (const auto m: data.matches) {
334  if (this->hasEvidence(
335  std::make_pair((*m)[v.first], &((*m)[v.first]->get(v.second))))) {
336  GUM_ASSERT(inst->type().name() == (*m)[v.first]->type().name());
337  GUM_ASSERT(inst->get(v.second).safeName()
338  == (*m)[v.first]->get(v.second).safeName());
339  data.obs().insert(id);
340  break;
341  }
342  }
343 
344  if (!(data.obs().size() && (data.obs().exists(id))))
345  data.inners().insert(id);
346  }
347  }
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 614 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().

615  {
616  StructuredInference< GUM_SCALAR >::CData* data = 0;
617  Potential< GUM_SCALAR >* pot = nullptr;
618  PRMInstance< GUM_SCALAR >* inst = nullptr;
619 
620  for (const auto& elt: *this->_sys) {
621  inst = elt.second;
622 
623  if (!__reducedInstances.exists(inst)) {
624  // Checking if its not an empty class
625  if (inst->size()) {
626  Set< Potential< GUM_SCALAR >* > pool;
627 
628  try {
629  data = __cdata_map[&(inst->type())];
630  } catch (NotFound&) {
631  data = new StructuredInference< GUM_SCALAR >::CData(inst->type());
632  __cdata_map.insert(&(inst->type()), data);
633  }
634 
635  data->instances.insert(inst);
636  // Filling up the partial ordering
637  List< NodeSet > partial_order;
638 
639  if (data->inners().size()) partial_order.push_back(data->inners());
640 
641  if (data->aggregators().size())
642  for (const auto agg: data->aggregators())
643  partial_order[0].insert(agg);
644 
645  if (data->outputs().size()) partial_order.push_back(data->outputs());
646 
647  if (__query.first == inst) {
648  // First case, the instance contains the query
649  partial_order[0].erase(__query.second->id());
650 
651  if (partial_order[0].empty()) partial_order.erase(0);
652 
653  if (partial_order.size() > 1) {
654  partial_order[1].erase(__query.second->id());
655 
656  if (partial_order[1].empty()) partial_order.erase(1);
657  }
658 
659  NodeSet query_set;
660  query_set.insert(__query.second->id());
661  partial_order.insert(query_set);
662 
663  // Adding the potentials
664  for (auto attr = inst->begin(); attr != inst->end(); ++attr)
665  pool.insert(&(
666  const_cast< Potential< GUM_SCALAR >& >((*(attr.val())).cpf())));
667 
668  // Adding evidences if any
669  if (this->hasEvidence(inst))
670  for (const auto& elt: this->evidence(inst))
671  pool.insert(const_cast< Potential< GUM_SCALAR >* >(elt.second));
672 
673  PartialOrderedTriangulation t(
674  &(data->moral_graph), &(data->mods), &(partial_order));
675  const std::vector< NodeId >& v = t.eliminationOrder();
676 
677  if (partial_order.size() > 1)
678  for (size_t idx = 0; idx < partial_order[0].size(); ++idx)
680  &(inst->get(v[idx]).type().variable()), pool, __trash);
681  } else if (this->hasEvidence(inst)) {
682  // Second case, the instance has evidences
683  // Adding the potentials
684  for (const auto elt: *inst)
685  pool.insert(
686  &const_cast< Potential< GUM_SCALAR >& >(elt.second->cpf()));
687 
688  // Adding evidences
689  for (const auto& elt: this->evidence(inst))
690  pool.insert(const_cast< Potential< GUM_SCALAR >* >(elt.second));
691 
692  PartialOrderedTriangulation t(
693  &(data->moral_graph), &(data->mods), &(partial_order));
694 
695  for (size_t idx = 0; idx < partial_order[0].size(); ++idx)
697  &(inst->get(t.eliminationOrder()[idx]).type().variable()),
698  pool,
699  __trash);
700  } else {
701  // Last cast, the instance neither contains evidences nor
702  // instances
703  // We translate the class level potentials into the instance ones
704  // and
705  // proceed with elimination
706  for (const auto srcPot: data->pool) {
707  pot = copyPotential(inst->bijection(), *srcPot);
708  pool.insert(pot);
709  __trash.insert(pot);
710  }
711 
712  for (const auto agg: data->c.aggregates())
713  pool.insert(&(const_cast< Potential< GUM_SCALAR >& >(
714  inst->get(agg->id()).cpf())));
715 
716  // We eliminate inner aggregators with their parents if necessary
717  // (see
718  // CData constructor)
719  Size size = data->inners().size() + data->aggregators().size();
720 
721  for (size_t idx = data->inners().size(); idx < size; ++idx)
723  &(inst->get(data->elim_order()[idx]).type().variable()),
724  pool,
725  __trash);
726  }
727 
728  for (const auto pot: pool)
729  rg_data.pool.insert(pot);
730  }
731  }
732  }
733  }
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:615
+ 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 245 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().

246  {
247  Set< Potential< GUM_SCALAR >* > pool;
248  typename StructuredInference< GUM_SCALAR >::PData data(*p,
249  __gspan->matches(*p));
250  __buildPatternGraph(data, pool, **(data.matches.begin()));
251  __removeBarrenNodes(data, pool);
252  PartialOrderedTriangulation t(
253  &(data.graph), &(data.mod), data.partial_order());
254  const std::vector< NodeId >& elim_order = t.eliminationOrder();
255 
256  for (size_t i = 0; i < data.inners().size(); ++i)
257  if (!data.barren.exists(elim_order[i]))
258  eliminateNode(data.vars.second(elim_order[i]), pool, __trash);
259 
260  typename GSpan< GUM_SCALAR >::MatchedInstances fake_patterns;
262  data.matches.begin();
263 
264  for (const auto elt: **iter)
265  __reducedInstances.insert(elt);
266 
267  if (data.obs().size())
268  __elim_map.insert(
269  *iter,
270  __eliminateObservedNodesInSource(data, pool, **iter, elim_order));
271  else
272  __elim_map.insert(*iter, new Set< Potential< GUM_SCALAR >* >(pool));
273 
274  ++iter;
275 
276  if (data.obs().size()) {
277  for (; iter != data.matches.end(); ++iter) {
278  try {
279  __elim_map.insert(
280  *iter, __eliminateObservedNodes(data, pool, **iter, elim_order));
281  } catch (OperationNotAllowed&) { fake_patterns.insert(*iter); }
282  }
283  } else {
284  for (; iter != data.matches.end(); ++iter) {
285  try {
286  __elim_map.insert(*iter, __translatePotSet(data, pool, **iter));
287  } catch (OperationNotAllowed&) { fake_patterns.insert(*iter); }
288  }
289  }
290 
291  for (const auto pat: fake_patterns) {
292  for (const auto elt: *pat)
293  __reducedInstances.erase(elt);
294 
295  data.matches.erase(pat);
296  }
297 
298  obs_time += plopTimer.step();
299 
300  if (data.queries().size())
301  for (const auto m: data.matches)
302  if (!(m->exists(
303  const_cast< PRMInstance< GUM_SCALAR >* >(__query.first))))
304  eliminateNode(&(m->atPos(__query_data.first)
305  ->get(__query_data.second)
306  .type()
307  .variable()),
308  *(__elim_map[m]),
309  __trash);
310  }
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 423 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().

425  {
426  Sequence< NodeId > candidates;
427 
428  for (const auto node: data.barren) {
429  for (const auto pot: pool)
430  if (pot->contains(*data.vars.second(node))) {
431  pool.erase(pot);
432  break;
433  }
434 
435  for (const auto nei: data.graph.neighbours(node))
436  if (data.inners().exists(nei)) {
437  try {
438  candidates.insert(nei);
439  } catch (DuplicateElement&) {}
440  }
441  }
442 
443  NodeId node;
444  Potential< GUM_SCALAR >* my_pot = nullptr;
445  short count = 0;
446 
447  while (candidates.size()) {
448  node = candidates.back();
449  candidates.erase(node);
450  count = 0;
451 
452  for (const auto pot: pool) {
453  if (pot->contains(*data.vars.second(node))) {
454  ++count;
455  my_pot = pot;
456  }
457  }
458 
459  if (count == 1) {
460  pool.erase(my_pot);
461  data.barren.insert(node);
462 
463  for (const auto nei: data.graph.neighbours(node)) {
464  if (data.inners().exists(nei)) {
465  try {
466  candidates.insert(nei);
467  } catch (DuplicateElement&) {}
468  }
469  }
470  }
471  }
472  }
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 1027 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.

1030  {
1031  data.graph.eraseNode(id);
1032  GUM_ASSERT(!data.graph.exists(id));
1033  data.mod.erase(id);
1034  GUM_ASSERT(!data.mod.exists(id));
1035  data.node2attr.eraseFirst(id);
1036  GUM_ASSERT(!data.node2attr.existsFirst(id));
1037  data.map.erase(id);
1038  GUM_ASSERT(!data.map.exists(id));
1039  data.vars.eraseFirst(id);
1040  GUM_ASSERT(!data.vars.existsFirst(id));
1041  data.inners().erase(id);
1042  GUM_ASSERT(!data.inners().exists(id));
1043  pool.erase(data.pots[id]);
1044  GUM_ASSERT(!pool.exists(data.pots[id]));
1045  data.pots.erase(id);
1046  GUM_ASSERT(!data.pots.exists(id));
1047  }
+ 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 980 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().

982  {
983  return i->name() + __dot + a->safeName();
984  }
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 987 of file structuredInference_tpl.h.

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

989  {
990  return i->name() + __dot + a.safeName();
991  }
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 994 of file structuredInference_tpl.h.

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

996  {
997  return i->name() + __dot + a.lastElt().safeName();
998  }
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 520 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().

523  {
524 #ifdef DEBUG
525 
527  data.matches.begin();
528  iter != data.matches.end();
529  ++iter) {
530  GUM_ASSERT((**iter).size() == match.size());
531 
532  for (Size idx = 0; idx < match.size(); ++idx) {
533  GUM_ASSERT((**iter).atPos(idx)->type() == match.atPos(idx)->type());
534  }
535  }
536 
537 #endif
538  Set< Potential< GUM_SCALAR >* >* my_pool =
539  new Set< Potential< GUM_SCALAR >* >();
540  std::pair< Idx, std::string > target;
541  Bijection< const DiscreteVariable*, const DiscreteVariable* > bij;
542  const Sequence< PRMInstance< GUM_SCALAR >* >& source =
543  **(data.matches.begin());
544 
545  for (Size idx = 0; idx < match.size(); ++idx) {
546  __reducedInstances.insert(match[idx]);
547  const auto& chains = source[idx]->type().slotChains();
548 
549  for (const auto sc: chains) {
550 #ifdef DEBUG
551  GUM_ASSERT(!(sc->isMultiple()));
552 #endif
553 
554  try {
555  bij.insert(&(source[idx]
556  ->getInstance(sc->id())
557  .get(sc->lastElt().safeName())
558  .type()
559  .variable()),
560  &(match[idx]
561  ->getInstance(sc->id())
562  .get(sc->lastElt().safeName())
563  .type()
564  .variable()));
565  } catch (DuplicateElement&) {
566  try {
567  if (bij.first(&(match[idx]
568  ->getInstance(sc->id())
569  .get(sc->lastElt().safeName())
570  .type()
571  .variable()))
572  != &(source[idx]
573  ->getInstance(sc->id())
574  .get(sc->lastElt().safeName())
575  .type()
576  .variable())) {
577  delete my_pool;
578  GUM_ERROR(OperationNotAllowed, "fake pattern");
579  }
580  } catch (NotFound&) {
581  delete my_pool;
582  GUM_ERROR(OperationNotAllowed, "fake pattern");
583  }
584  }
585  }
586  }
587 
588  for (const auto p: pool) {
589  for (const auto v: p->variablesSequence()) {
590  try {
591  target = data.map[data.vars.first(v)];
592  bij.insert(
593  v, &(match[target.first]->get(target.second).type().variable()));
594  } catch (NotFound&) {
595  GUM_ASSERT(bij.existsFirst(v));
596  } catch (DuplicateElement&) {}
597  }
598 
599  try {
600  my_pool->insert(copyPotential(bij, *p));
601  } catch (Exception&) {
602  for (const auto pot: *my_pool)
603  delete pot;
604 
605  delete my_pool;
606  GUM_ERROR(OperationNotAllowed, "fake pattern");
607  }
608  }
609 
610  return my_pool;
611  }
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 96 of file structuredInference_tpl.h.

97  {}

◆ _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 100 of file structuredInference_tpl.h.

101  {}

◆ _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 177 of file structuredInference_tpl.h.

References GUM_ERROR.

179  {
180  GUM_ERROR(FatalError, "not implemented");
181  }
#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 104 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().

106  {
107  timer.reset();
108  __found_query = false;
109  __query = chain;
110  typename StructuredInference< GUM_SCALAR >::RGData data;
111 
112  if (!this->hasEvidence() && (chain.second->cpf().nbrDim() == 1)) {
113  Instantiation i(m);
114 
115  for (i.setFirst(); !i.end(); i.inc())
116  m.set(i, chain.second->cpf().get(i));
117 
118  return;
119  } else if (this->hasEvidence(chain)) {
120  Instantiation i(m);
121  const Potential< GUM_SCALAR >* e =
122  this->evidence(__query.first)[__query.second->id()];
123 
124  for (i.setFirst(); !i.end(); i.inc())
125  m.set(i, e->get(i));
126 
127  return;
128  }
129 
130  __buildReduceGraph(data);
131  Set< const Potential< GUM_SCALAR >* > pots;
132 
133  if (data.pool.size() > 1) {
134  for (const auto pot: data.pool)
135  if (pot->contains(__query.second->type().variable())) pots.insert(pot);
136 
137  if (pots.size() == 1) {
138  Potential< GUM_SCALAR >* pot =
139  const_cast< Potential< GUM_SCALAR >* >(*(pots.begin()));
140  GUM_ASSERT(pot->contains(__query.second->type().variable()));
141  GUM_ASSERT(pot->variablesSequence().size() == 1);
142  Instantiation i(*pot), j(m);
143 
144  for (i.setFirst(), j.setFirst(); !i.end(); i.inc(), j.inc())
145  m.set(j, pot->get(i));
146  } else {
147  MultiDimCombinationDefault< GUM_SCALAR, Potential > Comb(multPotential);
148  Potential< GUM_SCALAR >* tmp = Comb.combine(pots);
149  Instantiation i(m), j(*tmp);
150 
151  for (i.setFirst(), j.setFirst(); !i.end(); i.inc(), j.inc())
152  m.set(i, tmp->get(j));
153 
154  delete tmp;
155  }
156  } else {
157  Potential< GUM_SCALAR >* pot = *(data.pool.begin());
158  GUM_ASSERT(pot->contains(__query.second->type().variable()));
159  GUM_ASSERT(pot->variablesSequence().size() == 1);
160  Instantiation i(*pot), j(m);
161 
162  for (i.setFirst(), j.setFirst(); !i.end(); i.inc(), j.inc())
163  m.set(j, pot->get(i));
164  }
165 
166  m.normalize();
167 
168  if (__pdata) {
169  delete __pdata;
170  __pdata = 0;
171  }
172 
173  full_time = timer.step();
174  }
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 1016 of file structuredInference_tpl.h.

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

1016  {
1017  return *__gspan;
1018  }
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 1022 of file structuredInference_tpl.h.

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

1022  {
1023  return *__gspan;
1024  }
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 184 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.

184  {
185  std::stringstream s;
186  s << "Triangulation time: " << triang_time << std::endl;
187  s << "Pattern mining time: " << mining_time << std::endl;
188  s << "Pattern elimination time: " << pattern_time << std::endl;
189  s << "Inner node elimination time: " << inner_time << std::endl;
190  s << "Observed node elimination time: " << obs_time << std::endl;
191  s << "Full inference time: " << full_time << std::endl;
192  s << "#patterns: " << __gspan->patterns().size() << std::endl;
193  Size count = 0;
194  typedef std::vector< gspan::Pattern* >::const_iterator Iter;
195 
196  for (Iter p = __gspan->patterns().begin(); p != __gspan->patterns().end();
197  ++p) {
198  if (__gspan->matches(**p).size()) {
199  s << "Pattern n°" << count++
200  << " match count: " << __gspan->matches(**p).size() << std::endl;
201  s << "Pattern n°" << count++ << " instance count: " << (**p).size()
202  << std::endl;
203  }
204  }
205 
206  return s.str();
207  }
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 1011 of file structuredInference_tpl.h.

1011  {
1012  return "StructuredInference";
1013  }

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

85  {
86  this->_prm = source._prm;
87  this->_sys = source._sys;
88 
89  if (this->__gspan) delete this->__gspan;
90 
91  this->__gspan = new GSpan< GUM_SCALAR >(*(this->_prm), *(this->_sys));
92  return *this;
93  }
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

◆ 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 966 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().

966  {
967  const PRMInstance< GUM_SCALAR >* i = (this->_sys->begin()).val();
968  __query = std::make_pair(i, i->begin().val());
969  __found_query = false;
970  typename StructuredInference< GUM_SCALAR >::RGData data;
971  __buildReduceGraph(data);
972  }
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 975 of file structuredInference_tpl.h.

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

975  {
976  __mining = b;
977  }
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: