aGrUM 3.1.1
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 >:

Classes

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

Public Types

using Chain = std::pair< const PRMInstance< GUM_SCALAR >*, const PRMAttribute< GUM_SCALAR >* >
 Code alias.
using EMap = NodeProperty< const Tensor< GUM_SCALAR >* >
 Code alias.
using EMapIterator = typename NodeProperty< const Tensor< GUM_SCALAR >* >::iterator_safe
 Code alias.
using EMapConstIterator
 Code alias.

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

Public Attributes

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

Protected Member Functions

Protected members.
void evidenceAdded_ (const typename PRMInference< GUM_SCALAR >::Chain &chain) override
 See PRMInference::evidenceAdded_().
void evidenceRemoved_ (const typename PRMInference< GUM_SCALAR >::Chain &chain) override
 See PRMInference::evidenceRemoved_().
void posterior_ (const typename PRMInference< GUM_SCALAR >::Chain &chain, Tensor< GUM_SCALAR > &m) override
 See PRMInference::posterior_().
void joint_ (const std::vector< typename PRMInference< GUM_SCALAR >::Chain > &queries, Tensor< GUM_SCALAR > &j) override
 See PRMInference::joint_().

Private Member Functions

void _buildReduceGraph_ (RGData &data)
 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.
void _addEdgesInReducedGraph_ (RGData &data)
 Add the nodes in the reduced graph.
void _removeNode_ (typename StructuredInference::PData &data, NodeId id, Set< Tensor< GUM_SCALAR > * > &pool)
void _reduceAloneInstances_ (RGData &data)
 Add the reduced tensors of instances not in any used patterns.
void _reducePattern_ (const gspan::Pattern *p)
 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.
void _buildPatternGraph_ (PData &data, Set< Tensor< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match)
 Build the DAG corresponding to Pattern data.pattern, initialize pool with all the Tensors of all variables in data.pattern. The first match of data.pattern (aka data.match) is used.
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 _allInstanceNoRefAttr_ (typename StructuredInference::PData &data, std::pair< Idx, std::string > attr)
void _removeBarrenNodes_ (typename StructuredInference::PData &data, Set< Tensor< GUM_SCALAR > * > &pool)
Set< Tensor< GUM_SCALAR > * > * _eliminateObservedNodes_ (typename StructuredInference::PData &data, const Set< Tensor< 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< Tensor< GUM_SCALAR > * > * _eliminateObservedNodesInSource_ (typename StructuredInference::PData &data, const Set< Tensor< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match, const std::vector< NodeId > &elim_order)
Set< Tensor< GUM_SCALAR > * > * _translatePotSet_ (typename StructuredInference::PData &data, const Set< Tensor< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match)
 Translate a given Tensor Set into one w.r.t. variables in match.
std::string _str_ (const PRMInstance< GUM_SCALAR > *i, const PRMAttribute< GUM_SCALAR > *a) const
std::string _str_ (const PRMInstance< GUM_SCALAR > *i, const PRMAttribute< GUM_SCALAR > &a) const
std::string _str_ (const PRMInstance< GUM_SCALAR > *i, const PRMSlotChain< GUM_SCALAR > &a) const

Private Attributes

GSpan< GUM_SCALAR > * _gspan_
 Pointer over th GSpan<GUM_SCALAR> instance used by this class.
HashTable< const Sequence< PRMInstance< GUM_SCALAR > * > *, Set< Tensor< GUM_SCALAR > * > * > _elim_map_
 Mapping between a Pattern's match and its tensor pool after inner variables were eliminated.
HashTable< const PRMClass< GUM_SCALAR > *, CData * > _cdata_map_
 Mapping between a Class<GUM_SCALAR> and data about instances reduced using only Class<GUM_SCALAR> level information.
Set< Tensor< GUM_SCALAR > * > _trash_
 Keeping track of create tensors to delete them after inference.
HashTable< const PRMClass< GUM_SCALAR > *, std::vector< NodeId > * > _outputs_
Set< const PRMInstance< GUM_SCALAR > * > _reducedInstances_
 This keeps track of reduced instances.
PRMInference< GUM_SCALAR >::Chain _query_
 The query.
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.
bool _found_query_
 Flag with an explicit name.
std::pair< Idx, std::string > _query_data_
std::string _dot_
 Unreduce the match containing the query.

Private evidence handling methods and members.

HashTable< const PRMInstance< GUM_SCALAR > *, EMap * > _evidences_
 Mapping of evidence over PRMInstance<GUM_SCALAR>'s nodes.
EMap_EMap_ (const PRMInstance< GUM_SCALAR > *i)
 Private getter over evidences, if necessary creates an EMap for i.
using EvidenceIterator
 Code alias.
using EvidenceConstIterator
 Code alias.

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.
virtual void evidenceRemoved_ (const Chain &chain)=0
 This method is called whenever an evidence is removed, but BEFORE any processing made by PRMInference.
virtual void posterior_ (const Chain &chain, Tensor< GUM_SCALAR > &m)=0
 Generic method to compute the posterior of given element.
virtual void joint_ (const std::vector< Chain > &queries, Tensor< GUM_SCALAR > &j)=0
 Generic method to compute the posterior of given element.
PRM< GUM_SCALAR > const * prm_
 The PRM<GUM_SCALAR> on which inference is done.
PRMSystem< GUM_SCALAR > const * sys_
 The Model on which inference is done.

Detailed Description

template<GUM_Numeric 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 69 of file structuredInference.h.

Member Typedef Documentation

◆ Chain

template<GUM_Numeric GUM_SCALAR>
using gum::prm::PRMInference< GUM_SCALAR >::Chain = std::pair< const PRMInstance< GUM_SCALAR >*, const PRMAttribute< GUM_SCALAR >* >
inherited

Code alias.

Definition at line 71 of file PRMInference.h.

◆ EMap

template<GUM_Numeric GUM_SCALAR>
using gum::prm::PRMInference< GUM_SCALAR >::EMap = NodeProperty< const Tensor< GUM_SCALAR >* >
inherited

Code alias.

Definition at line 74 of file PRMInference.h.

◆ EMapConstIterator

template<GUM_Numeric GUM_SCALAR>
using gum::prm::PRMInference< GUM_SCALAR >::EMapConstIterator
inherited
Initial value:
typename NodeProperty< const Tensor< GUM_SCALAR >* >::const_iterator_safe
HashTable< NodeId, VAL > NodeProperty
Property on graph elements.

Code alias.

Definition at line 80 of file PRMInference.h.

◆ EMapIterator

template<GUM_Numeric GUM_SCALAR>
using gum::prm::PRMInference< GUM_SCALAR >::EMapIterator = typename NodeProperty< const Tensor< GUM_SCALAR >* >::iterator_safe
inherited

Code alias.

Definition at line 77 of file PRMInference.h.

◆ EvidenceConstIterator

template<GUM_Numeric GUM_SCALAR>
using gum::prm::PRMInference< GUM_SCALAR >::EvidenceConstIterator
privateinherited
Initial value:
typename HashTable< const PRMInstance< GUM_SCALAR >*, EMap* >::const_iterator_safe
The class for generic Hash Tables.
Definition hashTable.h:640
NodeProperty< const Tensor< GUM_SCALAR > * > EMap
Code alias.

Code alias.

Definition at line 241 of file PRMInference.h.

◆ EvidenceIterator

template<GUM_Numeric GUM_SCALAR>
using gum::prm::PRMInference< GUM_SCALAR >::EvidenceIterator
privateinherited
Initial value:

Code alias.

Definition at line 238 of file PRMInference.h.

Constructor & Destructor Documentation

◆ StructuredInference() [1/2]

template<GUM_Numeric 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 57 of file structuredInference_tpl.h.

60 :
62 _dot_(".") {
65 triang_time = 0.0;
66 mining_time = 0.0;
67 pattern_time = 0.0;
68 inner_time = 0.0;
69 obs_time = 0.0;
70 full_time = 0.0;
71 }
PRMInference(const PRM< GUM_SCALAR > &prm, const PRMSystem< GUM_SCALAR > &system)
Default constructor.
<agrum/PRM/structuredInference.h>
std::string _dot_
Unreduce the match containing the query.
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.
GSpan< GUM_SCALAR > * _gspan_
Pointer over th GSpan<GUM_SCALAR> instance used by this class.
StructuredInference(const PRM< GUM_SCALAR > &prm, const PRMSystem< GUM_SCALAR > &system, gspan::SearchStrategy< GUM_SCALAR > *strategy=0)
Default constructor.

References gum::prm::PRMInference< GUM_SCALAR >::PRMInference(), StructuredInference(), _dot_, _gspan_, _mining_, _pdata_, full_time, inner_time, mining_time, obs_time, pattern_time, and triang_time.

Referenced by StructuredInference(), StructuredInference(), ~StructuredInference(), and operator=().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ StructuredInference() [2/2]

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

Copy constructor.

Definition at line 74 of file structuredInference_tpl.h.

75 :
77 _found_query_(false), _dot_(".") {
79 _gspan_ = new GSpan< GUM_SCALAR >(*(this->prm_), *(this->sys_));
80 }
PRMSystem< GUM_SCALAR > const * sys_
The Model on which inference is done.
PRM< GUM_SCALAR > const * prm_
The PRM<GUM_SCALAR> on which inference is done.
bool _found_query_
Flag with an explicit name.

References gum::prm::PRMInference< GUM_SCALAR >::PRMInference(), StructuredInference(), _dot_, _found_query_, _gspan_, _mining_, _pdata_, gum::prm::PRMInference< GUM_SCALAR >::prm_, and gum::prm::PRMInference< GUM_SCALAR >::sys_.

Here is the call graph for this function:

◆ ~StructuredInference()

template<GUM_Numeric GUM_SCALAR>
gum::prm::StructuredInference< GUM_SCALAR >::~StructuredInference ( )
override

Destructor.

Definition at line 83 of file structuredInference_tpl.h.

83 {
85 delete this->_gspan_;
86
87 for (const auto& elt: _elim_map_)
88 delete elt.second;
89
90 for (const auto& elt: _cdata_map_)
91 delete elt.second;
92
93 for (const auto elt: _trash_)
94 delete (elt);
95
96 for (const auto& elt: _outputs_)
97 delete elt.second;
98
99 if (_pdata_) delete _pdata_;
100 }
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...
HashTable< const Sequence< PRMInstance< GUM_SCALAR > * > *, Set< Tensor< GUM_SCALAR > * > * > _elim_map_
Mapping between a Pattern's match and its tensor pool after inner variables were eliminated.
HashTable< const PRMClass< GUM_SCALAR > *, std::vector< NodeId > * > _outputs_
Set< Tensor< GUM_SCALAR > * > _trash_
Keeping track of create tensors to delete them after inference.

References StructuredInference(), _cdata_map_, _elim_map_, _gspan_, _outputs_, _pdata_, and _trash_.

Here is the call graph for this function:

Member Function Documentation

◆ _addEdgesInReducedGraph_()

template<GUM_Numeric 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 713 of file structuredInference_tpl.h.

714 {
715 // We first add edges between variables already in pool (i.e. those of the
716 // reduced instances)
718
719 for (const auto pot: data.pool) {
720 const Sequence< const DiscreteVariable* >& vars = pot->variablesSequence();
721
722 for (Size var_1 = 0; var_1 < vars.size(); ++var_1) {
723 if (data.var2node.existsFirst(vars.atPos(var_1))) {
724 id_1 = data.var2node.second(vars.atPos(var_1));
725 } else {
726 id_1 = data.reducedGraph.addNode();
727 data.var2node.insert(vars.atPos(var_1), id_1);
728 data.mods.insert(id_1, vars.atPos(var_1)->domainSize());
729 data.outputs().insert(id_1);
730 }
731
732 for (Size var_2 = var_1 + 1; var_2 < vars.size(); ++var_2) {
733 if (data.var2node.existsFirst(vars.atPos(var_2))) {
734 id_2 = data.var2node.second(vars.atPos(var_2));
735 } else {
736 id_2 = data.reducedGraph.addNode();
737 data.var2node.insert(vars.atPos(var_2), id_2);
738 data.mods.insert(id_2, vars.atPos(var_2)->domainSize());
739 data.outputs().insert(id_2);
740 }
741
742 try {
743 data.reducedGraph.addEdge(id_1, id_2);
744 } catch (DuplicateElement const&) {}
745 }
746 }
747 }
748
749 // Adding tensors obtained from reduced patterns
750 for (const auto& elt: _elim_map_) {
751 // We add edges between variables in the same reduced patterns
752 for (const auto pot: *elt.second) {
753 data.pool.insert(pot);
754 const Sequence< const DiscreteVariable* >& vars = pot->variablesSequence();
755
756 for (Size var_1 = 0; var_1 < vars.size(); ++var_1) {
757 if (data.var2node.existsFirst(vars.atPos(var_1))) {
758 id_1 = data.var2node.second(vars.atPos(var_1));
759 } else {
760 id_1 = data.reducedGraph.addNode();
761 data.var2node.insert(vars.atPos(var_1), id_1);
762 data.mods.insert(id_1, vars.atPos(var_1)->domainSize());
763 data.outputs().insert(id_1);
764 }
765
766 for (Size var_2 = var_1 + 1; var_2 < vars.size(); ++var_2) {
767 if (data.var2node.existsFirst(vars.atPos(var_2))) {
768 id_2 = data.var2node.second(vars.atPos(var_2));
769 } else {
770 id_2 = data.reducedGraph.addNode();
771 data.var2node.insert(vars.atPos(var_2), id_2);
772 data.mods.insert(id_2, vars.atPos(var_2)->domainSize());
773 data.outputs().insert(id_2);
774 }
775
776 try {
777 data.reducedGraph.addEdge(id_1, id_2);
778 } catch (DuplicateElement const&) {}
779 }
780 }
781 }
782 }
783 }

References _elim_map_, gum::UndiGraph::addEdge(), gum::NodeGraphPart::addNode(), gum::SequenceImplementation< Key, Gen >::atPos(), gum::Set< Key >::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, Gen >::size(), and gum::prm::StructuredInference< GUM_SCALAR >::RGData::var2node.

Referenced by _buildReduceGraph_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _allInstanceNoRefAttr_()

template<GUM_Numeric 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 404 of file structuredInference_tpl.h.

406 {
407 for (const auto mat: data.matches)
408 if (mat->atPos(attr.first)->hasRefAttr(mat->atPos(attr.first)->get(attr.second).id()))
409 return false;
410
411 return true;
412 }

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

Referenced by _buildPatternGraph_().

Here is the caller graph for this function:

◆ _buildPatternGraph_()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::_buildPatternGraph_ ( PData & data,
Set< Tensor< GUM_SCALAR > * > & pool,
const Sequence< PRMInstance< GUM_SCALAR > * > & match )
private

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

Definition at line 348 of file structuredInference_tpl.h.

351 {
354
355 for (const auto inst: match) {
356 for (const auto& elt: *inst) {
357 NodeId id = data.graph.addNode();
358 v = std::make_pair(match.pos(inst), elt.second->safeName());
359 data.map.insert(id, v);
360 data.node2attr.insert(id, _str_(inst, elt.second));
361 data.mod.insert(id, elt.second->type()->domainSize());
362 data.vars.insert(id, &(elt.second->type().variable()));
363 pool.insert(const_cast< Tensor< GUM_SCALAR >* >(&(elt.second->cpf())));
364 pot = &(const_cast< Tensor< GUM_SCALAR >& >(inst->get(v.second).cpf()));
365
366 for (const auto var: pot->variablesSequence()) {
367 if (data.vars.existsSecond(var)) {
368 try {
369 if (id != data.vars.first(var)) data.graph.addEdge(id, data.vars.first(var));
370 } catch (DuplicateElement const&) {}
371 }
372 }
373
374 _insertNodeInElimLists_(data, match, inst, elt.second, id, v);
375
376 if (data.inners().exists(id)
377 && (inst->type().containerDag().children(elt.second->id()).size() == 0)
379 data.barren.insert(id);
380 }
381 }
382
383 if (!_found_query_) {
384 for (const auto mat: data.matches) {
385 if (mat->exists(const_cast< PRMInstance< GUM_SCALAR >* >(_query_.first))) {
386 Idx pos = mat->pos(const_cast< PRMInstance< GUM_SCALAR >* >(_query_.first));
388 = match.atPos(pos)->get(_query_.second->safeName()).type().variable();
389 NodeId id = data.vars.first(&var);
390 data.barren.erase(id);
391 data.inners().erase(id);
392 data.obs().erase(id);
393 data.outputs().erase(id);
394 data.queries().insert(id);
395 _found_query_ = true;
396 _query_data_ = std::make_pair(pos, _query_.second->safeName());
397 break;
398 }
399 }
400 }
401 }
std::string _str_(const PRMInstance< GUM_SCALAR > *i, const PRMAttribute< GUM_SCALAR > *a) const
PRMInference< GUM_SCALAR >::Chain _query_
The query.
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 _allInstanceNoRefAttr_(typename StructuredInference::PData &data, std::pair< Idx, std::string > attr)
std::pair< Idx, std::string > _query_data_

References _allInstanceNoRefAttr_(), _found_query_, _insertNodeInElimLists_(), _query_, _query_data_, _str_(), gum::UndiGraph::addEdge(), gum::NodeGraphPart::addNode(), gum::prm::StructuredInference< GUM_SCALAR >::PData::barren, gum::Set< Key >::erase(), gum::Set< Key >::exists(), gum::prm::StructuredInference< GUM_SCALAR >::PData::graph, gum::prm::StructuredInference< GUM_SCALAR >::PData::inners(), gum::BijectionImplementation< T1, T2, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::insert(), gum::Set< Key >::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(), and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

Referenced by _reducePattern_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _buildReduceGraph_()

template<GUM_Numeric 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 224 of file structuredInference_tpl.h.

225 {
226 // Launch the pattern mining
227 plopTimer.reset();
228
229 if (_mining_) _gspan_->discoverPatterns();
230
231 mining_time = plopTimer.step();
232 // Reducing each used pattern
233 plopTimer.reset();
235
236 for (Iter p = _gspan_->patterns().begin(); p != _gspan_->patterns().end(); ++p)
237 if (_gspan_->matches(**p).size()) _reducePattern_(*p);
238
239 pattern_time = plopTimer.step();
240 // reducing instance not already reduced in a pattern
242 // Adding edges using the pools
244 // Placing the query where it belongs
245 NodeId id = data.var2node.second(&(_query_.second->type().variable()));
246 data.outputs().erase(id);
247 data.queries().insert(id);
248 // Triangulating, then eliminating
249 PartialOrderedTriangulation t(&(data.reducedGraph), &(data.mods), &(data.partial_order));
250 const std::vector< NodeId >& elim_order = t.eliminationOrder();
251
252 for (size_t i = 0; i < data.outputs().size(); ++i)
253 eliminateNode(data.var2node.first(elim_order[i]), data.pool, _trash_);
254 }
void _reducePattern_(const gspan::Pattern *p)
Proceed with the elimination of all inner variables (observed or not) of all usable matches of Patter...
void _addEdgesInReducedGraph_(RGData &data)
Add the nodes in the reduced graph.
void _reduceAloneInstances_(RGData &data)
Add the reduced tensors of instances not in any used patterns.
void eliminateNode(const DiscreteVariable *var, Set< Tensor< GUM_SCALAR > * > &pool, Set< Tensor< GUM_SCALAR > * > &trash)
Proceeds with the elimination of var in pool.

References _addEdgesInReducedGraph_(), _gspan_, _mining_, _query_, _reduceAloneInstances_(), _reducePattern_(), _trash_, gum::prm::eliminateNode(), gum::StaticTriangulation::eliminationOrder(), gum::Set< Key >::erase(), gum::Set< Key >::insert(), mining_time, gum::prm::StructuredInference< GUM_SCALAR >::RGData::mods, gum::prm::StructuredInference< GUM_SCALAR >::RGData::outputs(), gum::prm::StructuredInference< GUM_SCALAR >::RGData::partial_order, pattern_time, plopTimer, gum::prm::StructuredInference< GUM_SCALAR >::RGData::pool, gum::prm::StructuredInference< GUM_SCALAR >::RGData::queries(), gum::prm::StructuredInference< GUM_SCALAR >::RGData::reducedGraph, and gum::prm::StructuredInference< GUM_SCALAR >::RGData::var2node.

Referenced by posterior_(), and searchPatterns().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _eliminateObservedNodes_()

template<GUM_Numeric GUM_SCALAR>
Set< Tensor< GUM_SCALAR > * > * gum::prm::StructuredInference< GUM_SCALAR >::_eliminateObservedNodes_ ( typename StructuredInference< GUM_SCALAR >::PData & data,
const Set< Tensor< 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 488 of file structuredInference_tpl.h.

492 {
495 size_t end = data.inners().size() + data.obs().size();
496
497 for (size_t idx = data.inners().size(); idx < end; ++idx) {
498 target = data.map[data.vars.first(data.vars.second(elim_order[idx]))];
499 eliminateNode(&(match[target.first]->get(target.second).type().variable()),
500 *my_pool,
501 _trash_);
502 }
503
504 return my_pool;
505 }
Set< Tensor< GUM_SCALAR > * > * _translatePotSet_(typename StructuredInference::PData &data, const Set< Tensor< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match)
Translate a given Tensor Set into one w.r.t. variables in match.

References _translatePotSet_(), _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 >::size(), and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

Referenced by _reducePattern_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _eliminateObservedNodesInSource_()

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

Definition at line 468 of file structuredInference_tpl.h.

472 {
475 size_t end = data.inners().size() + data.obs().size();
476
477 for (size_t idx = data.inners().size(); idx < end; ++idx) {
478 target = data.map[data.vars.first(data.vars.second(elim_order[idx]))];
479 eliminateNode(&(match[target.first]->get(target.second).type().variable()),
480 *my_pool,
481 _trash_);
482 }
483
484 return my_pool;
485 }

References _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 >::size(), and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

Referenced by _reducePattern_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _EMap_()

template<GUM_Numeric GUM_SCALAR>
PRMInference< GUM_SCALAR >::EMap & gum::prm::PRMInference< GUM_SCALAR >::_EMap_ ( const PRMInstance< GUM_SCALAR > * i)
privateinherited

Private getter over evidences, if necessary creates an EMap for i.

Definition at line 117 of file PRMInference_tpl.h.

117 {
118 if (auto p = _evidences_.tryGet(i)) {
119 return **p;
120 } else {
122 _evidences_.insert(i, emap);
123 return *emap;
124 }
125 }
This abstract class is used as base class for all inference class on PRM<GUM_SCALAR>.
HashTable< const PRMInstance< GUM_SCALAR > *, EMap * > _evidences_
Mapping of evidence over PRMInstance<GUM_SCALAR>'s nodes.

References _evidences_.

Referenced by removeEvidence().

Here is the caller graph for this function:

◆ _insertNodeInElimLists_()

template<GUM_Numeric 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 314 of file structuredInference_tpl.h.

320 {
321 if ((*inst).hasRefAttr((*inst).get(v.second).id())) {
323 = inst->getRefAttr(inst->get(v.second).id());
324
325 for (auto r = refs.begin(); r != refs.end(); ++r) {
326 if (!match.exists(r->first)) {
327 data.outputs().insert(id);
328 break;
329 }
330 }
331 }
332
333 if (!(data.outputs().size() && (data.outputs().exists(id)))) {
334 for (const auto m: data.matches) {
335 if (this->hasEvidence(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() == (*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)))) data.inners().insert(id);
344 }
345 }
bool hasEvidence() const
Returns true if i has evidence on PRMAttribute<GUM_SCALAR> a.
std::string name() const override
Tells this algorithm to use pattern mining or not.

References gum::Set< Key >::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 >::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 >::size(), and gum::prm::PRMInstance< GUM_SCALAR >::type().

Referenced by _buildPatternGraph_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _reduceAloneInstances_()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::_reduceAloneInstances_ ( RGData & data)
private

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

Definition at line 599 of file structuredInference_tpl.h.

600 {
602 Tensor< GUM_SCALAR >* pot = nullptr;
604
605 for (const auto& elt: *this->sys_) {
606 inst = elt.second;
607
608 if (!_reducedInstances_.exists(inst)) {
609 // Checking if its not an empty class
610 if (inst->size()) {
612
613 if (auto p_cdata = _cdata_map_.tryGet(&(inst->type()))) {
614 data = *p_cdata;
615 } else {
617 _cdata_map_.insert(&(inst->type()), data);
618 }
619
620 data->instances.insert(inst);
621 // Filling up the partial ordering
623
624 if (data->inners().size()) partial_order.push_back(data->inners());
625
626 if (data->aggregators().size())
627 for (const auto agg: data->aggregators())
628 partial_order[0].insert(agg);
629
630 if (data->outputs().size()) partial_order.push_back(data->outputs());
631
632 if (_query_.first == inst) {
633 // First case, the instance contains the query
634 partial_order[0].erase(_query_.second->id());
635
636 if (partial_order[0].empty()) partial_order.erase(0);
637
638 if (partial_order.size() > 1) {
639 partial_order[1].erase(_query_.second->id());
640
641 if (partial_order[1].empty()) partial_order.erase(1);
642 }
643
645 query_set.insert(_query_.second->id());
646 partial_order.insert(query_set);
647
648 // Adding the tensors
649 for (auto attr = inst->begin(); attr != inst->end(); ++attr)
650 pool.insert(&(const_cast< Tensor< GUM_SCALAR >& >((*(attr.val())).cpf())));
651
652 // Adding evidences if any
653 if (this->hasEvidence(inst))
654 for (const auto& elt: this->evidence(inst))
655 pool.insert(const_cast< Tensor< GUM_SCALAR >* >(elt.second));
656
657 PartialOrderedTriangulation t(&(data->moral_graph), &(data->mods), &(partial_order));
658 const std::vector< NodeId >& v = t.eliminationOrder();
659
660 if (partial_order.size() > 1)
661 for (size_t idx = 0; idx < partial_order[0].size(); ++idx)
662 eliminateNode(&(inst->get(v[idx]).type().variable()), pool, _trash_);
663 } else if (this->hasEvidence(inst)) {
664 // Second case, the instance has evidences
665 // Adding the tensors
666 for (const auto& elt: *inst)
667 pool.insert(&const_cast< Tensor< GUM_SCALAR >& >(elt.second->cpf()));
668
669 // Adding evidences
670 for (const auto& elt: this->evidence(inst))
671 pool.insert(const_cast< Tensor< GUM_SCALAR >* >(elt.second));
672
673 PartialOrderedTriangulation t(&(data->moral_graph), &(data->mods), &(partial_order));
674
675 for (size_t idx = 0; idx < partial_order[0].size(); ++idx)
676 eliminateNode(&(inst->get(t.eliminationOrder()[idx]).type().variable()),
677 pool,
678 _trash_);
679 } else {
680 // Last cast, the instance neither contains evidences nor
681 // instances
682 // We translate the class level tensors into the instance ones
683 // and
684 // proceed with elimination
685 for (const auto srcPot: data->pool) {
686 pot = copyTensor(inst->bijection(), *srcPot);
687 pool.insert(pot);
688 _trash_.insert(pot);
689 }
690
691 for (const auto agg: data->c.aggregates())
692 pool.insert(&(const_cast< Tensor< GUM_SCALAR >& >(inst->get(agg->id()).cpf())));
693
694 // We eliminate inner aggregators with their parents if necessary
695 // (see
696 // CData constructor)
697 Size size = data->inners().size() + data->aggregators().size();
698
699 for (size_t idx = data->inners().size(); idx < size; ++idx)
700 eliminateNode(&(inst->get(data->elim_order()[idx]).type().variable()),
701 pool,
702 _trash_);
703 }
704
705 for (const auto pot: pool)
706 rg_data.pool.insert(pot);
707 }
708 }
709 }
710 }
EMap & evidence(const PRMInstance< GUM_SCALAR > &i)
Returns EMap of evidences over i.
Set< const PRMInstance< GUM_SCALAR > * > _reducedInstances_
This keeps track of reduced instances.
Tensor< GUM_SCALAR > * copyTensor(const Bijection< const DiscreteVariable *, const DiscreteVariable * > &bij, const Tensor< GUM_SCALAR > &source)
Returns a copy of a Tensor after applying a bijection over the variables in source.

References _cdata_map_, _query_, _reducedInstances_, _trash_, 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::copyTensor(), gum::prm::StructuredInference< GUM_SCALAR >::CData::elim_order(), gum::prm::eliminateNode(), gum::StaticTriangulation::eliminationOrder(), gum::prm::PRMInstance< GUM_SCALAR >::end(), gum::List< Val >::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::List< Val >::insert(), gum::Set< Key >::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 >::CData::pool, gum::prm::StructuredInference< GUM_SCALAR >::RGData::pool, gum::List< Val >::push_back(), gum::List< Val >::size(), gum::prm::PRMInstance< GUM_SCALAR >::size(), gum::Set< Key >::size(), gum::prm::PRMInference< GUM_SCALAR >::sys_, and gum::prm::PRMInstance< GUM_SCALAR >::type().

Referenced by _buildReduceGraph_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _reducePattern_()

template<GUM_Numeric 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 257 of file structuredInference_tpl.h.

257 {
260 _buildPatternGraph_(data, pool, **(data.matches.begin()));
262 PartialOrderedTriangulation t(&(data.graph), &(data.mod), data.partial_order());
263 const std::vector< NodeId >& elim_order = t.eliminationOrder();
264
265 for (size_t i = 0; i < data.inners().size(); ++i)
266 if (!data.barren.exists(elim_order[i]))
267 eliminateNode(data.vars.second(elim_order[i]), pool, _trash_);
268
271
272 for (const auto elt: **iter)
273 _reducedInstances_.insert(elt);
274
275 if (data.obs().size())
277 else _elim_map_.insert(*iter, new Set< Tensor< GUM_SCALAR >* >(pool));
278
279 ++iter;
280
281 if (data.obs().size()) {
282 for (; iter != data.matches.end(); ++iter) {
283 try {
285 } catch (OperationNotAllowed const&) { fake_patterns.insert(*iter); }
286 }
287 } else {
288 for (; iter != data.matches.end(); ++iter) {
289 try {
291 } catch (OperationNotAllowed const&) { fake_patterns.insert(*iter); }
292 }
293 }
294
295 for (const auto pat: fake_patterns) {
296 for (const auto elt: *pat)
297 _reducedInstances_.erase(elt);
298
299 data.matches.erase(pat);
300 }
301
302 obs_time += plopTimer.step();
303
304 if (data.queries().size())
305 for (const auto m: data.matches)
306 if (!(m->exists(const_cast< PRMInstance< GUM_SCALAR >* >(_query_.first))))
308 &(m->atPos(_query_data_.first)->get(_query_data_.second).type().variable()),
309 *(_elim_map_[m]),
310 _trash_);
311 }
Set< Tensor< GUM_SCALAR > * > * _eliminateObservedNodes_(typename StructuredInference::PData &data, const Set< Tensor< 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.
void _removeBarrenNodes_(typename StructuredInference::PData &data, Set< Tensor< GUM_SCALAR > * > &pool)
void _buildPatternGraph_(PData &data, Set< Tensor< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match)
Build the DAG corresponding to Pattern data.pattern, initialize pool with all the Tensors of all vari...
Set< Tensor< GUM_SCALAR > * > * _eliminateObservedNodesInSource_(typename StructuredInference::PData &data, const Set< Tensor< GUM_SCALAR > * > &pool, const Sequence< PRMInstance< GUM_SCALAR > * > &match, const std::vector< NodeId > &elim_order)

References _buildPatternGraph_(), _elim_map_, _eliminateObservedNodes_(), _eliminateObservedNodesInSource_(), _gspan_, _query_, _query_data_, _reducedInstances_, _removeBarrenNodes_(), _translatePotSet_(), _trash_, gum::prm::StructuredInference< GUM_SCALAR >::PData::barren, gum::prm::eliminateNode(), gum::StaticTriangulation::eliminationOrder(), gum::Set< Key >::exists(), gum::prm::StructuredInference< GUM_SCALAR >::PData::graph, gum::prm::StructuredInference< GUM_SCALAR >::PData::inners(), gum::Set< Key >::insert(), gum::prm::StructuredInference< GUM_SCALAR >::PData::matches, gum::prm::StructuredInference< GUM_SCALAR >::PData::mod, gum::prm::StructuredInference< GUM_SCALAR >::PData::obs(), obs_time, gum::prm::StructuredInference< GUM_SCALAR >::PData::partial_order(), plopTimer, gum::prm::StructuredInference< GUM_SCALAR >::PData::queries(), gum::Set< Key >::size(), and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

Referenced by _buildReduceGraph_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _removeBarrenNodes_()

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

Definition at line 415 of file structuredInference_tpl.h.

417 {
419
420 for (const auto node: data.barren) {
421 for (const auto pot: pool)
422 if (pot->contains(*data.vars.second(node))) {
423 pool.erase(pot);
424 break;
425 }
426
427 for (const auto nei: data.graph.neighbours(node))
428 if (data.inners().exists(nei)) {
429 try {
430 candidates.insert(nei);
431 } catch (DuplicateElement const&) {}
432 }
433 }
434
435 NodeId node;
436 Tensor< GUM_SCALAR >* my_pot = nullptr;
437 short count = 0;
438
439 while (candidates.size()) {
440 node = candidates.back();
441 candidates.erase(node);
442 count = 0;
443
444 for (const auto pot: pool) {
445 if (pot->contains(*data.vars.second(node))) {
446 ++count;
447 my_pot = pot;
448 }
449 }
450
451 if (count == 1) {
452 pool.erase(my_pot);
453 data.barren.insert(node);
454
455 for (const auto nei: data.graph.neighbours(node)) {
456 if (data.inners().exists(nei)) {
457 try {
458 candidates.insert(nei);
459 } catch (DuplicateElement const&) {}
460 }
461 }
462 }
463 }
464 }

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

Referenced by _reducePattern_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _removeNode_()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::_removeNode_ ( typename StructuredInference< GUM_SCALAR >::PData & data,
NodeId id,
Set< Tensor< GUM_SCALAR > * > & pool )
private

Definition at line 991 of file structuredInference_tpl.h.

994 {
995 data.graph.eraseNode(id);
996 GUM_ASSERT(!data.graph.exists(id));
997 data.mod.erase(id);
998 GUM_ASSERT(!data.mod.exists(id));
999 data.node2attr.eraseFirst(id);
1000 GUM_ASSERT(!data.node2attr.existsFirst(id));
1001 data.map.erase(id);
1002 GUM_ASSERT(!data.map.exists(id));
1003 data.vars.eraseFirst(id);
1004 GUM_ASSERT(!data.vars.existsFirst(id));
1005 data.inners().erase(id);
1006 GUM_ASSERT(!data.inners().exists(id));
1007 pool.erase(data.pots[id]);
1008 GUM_ASSERT(!pool.exists(data.pots[id]));
1009 data.pots.erase(id);
1010 GUM_ASSERT(!data.pots.exists(id));
1011 }

References gum::Set< Key >::erase(), gum::BijectionImplementation< T1, T2, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::eraseFirst(), gum::UndiGraph::eraseNode(), gum::NodeGraphPart::exists(), gum::Set< Key >::exists(), gum::BijectionImplementation< T1, T2, std::is_scalar< T1 >::value &&std::is_scalar< T2 >::value >::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 >::PData::pots, and gum::prm::StructuredInference< GUM_SCALAR >::PData::vars.

Here is the call graph for this function:

◆ _str_() [1/3]

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

Definition at line 953 of file structuredInference_tpl.h.

954 {
955 return i->name() + _dot_ + a.safeName();
956 }

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

Here is the call graph for this function:

◆ _str_() [2/3]

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

Definition at line 946 of file structuredInference_tpl.h.

947 {
948 return i->name() + _dot_ + a->safeName();
949 }

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

Referenced by _buildPatternGraph_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _str_() [3/3]

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

Definition at line 960 of file structuredInference_tpl.h.

961 {
962 return i->name() + _dot_ + a.lastElt().safeName();
963 }

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

Here is the call graph for this function:

◆ _translatePotSet_()

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

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

Definition at line 508 of file structuredInference_tpl.h.

511 {
512#ifdef DEBUG
513
514 for (const auto iter = data.matches.begin(); iter != data.matches.end(); ++iter) {
515 GUM_ASSERT((**iter).size() == match.size());
516
517 for (Size idx = 0; idx < match.size(); ++idx) {
518 GUM_ASSERT((**iter).atPos(idx)->type() == match.atPos(idx)->type());
519 }
520 }
521
522#endif
526 const Sequence< PRMInstance< GUM_SCALAR >* >& source = **(data.matches.begin());
527
528 for (Size idx = 0; idx < match.size(); ++idx) {
530 const auto& chains = source[idx]->type().slotChains();
531
532 for (const auto sc: chains) {
533#ifdef DEBUG
534 GUM_ASSERT(!(sc->isMultiple()));
535#endif
536
537 try {
538 bij.insert(&(source[idx]
539 ->getInstance(sc->id())
540 .get(sc->lastElt().safeName())
541 .type()
542 .variable()),
543 &(match[idx]
544 ->getInstance(sc->id())
545 .get(sc->lastElt().safeName())
546 .type()
547 .variable()));
548 } catch (DuplicateElement const&) {
549 try {
550 if (bij.first(&(match[idx]
551 ->getInstance(sc->id())
552 .get(sc->lastElt().safeName())
553 .type()
554 .variable()))
555 != &(source[idx]
556 ->getInstance(sc->id())
557 .get(sc->lastElt().safeName())
558 .type()
559 .variable())) {
560 delete my_pool;
561 GUM_ERROR(OperationNotAllowed, "fake pattern")
562 }
563 } catch (NotFound const&) { // bijection lookup failed
564 delete my_pool;
565 GUM_ERROR(OperationNotAllowed, "fake pattern")
566 }
567 }
568 }
569 }
570
571 for (const auto p: pool) {
572 for (const auto v: p->variablesSequence()) {
573 if (data.vars.existsSecond(v)) {
574 auto varId = data.vars.first(v);
575 if (auto p_map = data.map.tryGet(varId)) {
576 target = *p_map;
577 try {
578 bij.insert(v, &(match[target.first]->get(target.second).type().variable()));
579 } catch (DuplicateElement const&) {}
580 }
581 }
582 }
583
584 try {
585 my_pool->insert(copyTensor(bij, *p));
586 } catch (Exception const&) {
587 for (const auto pot: *my_pool)
588 delete pot;
589
590 delete my_pool;
591 GUM_ERROR(OperationNotAllowed, "fake pattern")
592 }
593 }
594
595 return my_pool;
596 }
#define GUM_ERROR(type, msg)
Definition exceptions.h:76

References _reducedInstances_, gum::prm::copyTensor(), gum::BijectionImplementation< T1, T2, Gen >::first(), GUM_ERROR, gum::BijectionImplementation< T1, T2, Gen >::insert(), gum::Set< Key >::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 _eliminateObservedNodes_(), and _reducePattern_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ addEvidence()

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

Add an evidence to the given instance's elt.

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

Definition at line 128 of file PRMInference_tpl.h.

129 {
130 if (chain.first->exists(chain.second->id())) {
131 if ((p.nbrDim() != 1) || (!p.contains(chain.second->type().variable())))
132 GUM_ERROR(OperationNotAllowed, "illegal evidence for the given PRMAttribute.")
133
135 e->add(chain.second->type().variable());
136 Instantiation i(*e);
137
138 for (i.setFirst(); !i.end(); i.inc())
139 e->set(i, p.get(i));
140
142
143 if (emap.exists(chain.second->id())) {
144 delete emap[chain.second->id()];
145 emap[chain.second->id()] = e;
146 } else {
147 emap.insert(chain.second->id(), e);
148 }
149
151 } else {
153 "the given PRMAttribute does not belong to this "
154 "Instance<GUM_SCALAR>.");
155 }
156 }
EMap & _EMap_(const PRMInstance< GUM_SCALAR > *i)
Private getter over evidences, if necessary creates an EMap for i.
virtual void evidenceAdded_(const Chain &chain)=0
This method is called whenever an evidence is added, but AFTER any processing made by PRMInference.

References gum::Instantiation::end(), GUM_ERROR, gum::Instantiation::inc(), and gum::Instantiation::setFirst().

Here is the call graph for this function:

◆ clearEvidence()

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

Remove all evidences.

Definition at line 57 of file PRMInference_tpl.h.

57 {
58 for (const auto& elt: _evidences_) {
59 for (const auto& elt2: *elt.second)
60 delete elt2.second;
61
62 delete elt.second;
63 }
64
65 _evidences_.clear();
66 }

References _evidences_.

Referenced by ~PRMInference(), and operator=().

Here is the caller graph for this function:

◆ evidence() [1/4]

template<GUM_Numeric GUM_SCALAR>
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 173 of file PRMInference_tpl.h.

173 {
174 if (!_evidences_.exists(&i)) GUM_ERROR(NotFound, "this instance has no evidence.")
175 return *(_evidences_[&i]);
176 }

References _evidences_, and GUM_ERROR.

Referenced by gum::prm::SVE< GUM_SCALAR >::_eliminateNodesWithEvidence_(), gum::prm::SVED< GUM_SCALAR >::_eliminateNodesWithEvidence_(), gum::prm::SVE< GUM_SCALAR >::_insertEvidence_(), gum::prm::SVED< GUM_SCALAR >::_insertEvidence_(), gum::prm::StructuredInference< GUM_SCALAR >::_reduceAloneInstances_(), evidence(), gum::prm::GroundedInference< GUM_SCALAR >::evidenceAdded_(), hasEvidence(), posterior(), and gum::prm::StructuredInference< GUM_SCALAR >::posterior_().

Here is the caller graph for this function:

◆ evidence() [2/4]

template<GUM_Numeric GUM_SCALAR>
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 180 of file PRMInference_tpl.h.

180 {
181 if (!_evidences_.exists(&i)) GUM_ERROR(NotFound, "this instance has no evidence.")
182 return *(_evidences_[&i]);
183 }

References _evidences_, and GUM_ERROR.

◆ evidence() [3/4]

template<GUM_Numeric GUM_SCALAR>
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 187 of file PRMInference_tpl.h.

187 {
188 if (!_evidences_.exists(i)) GUM_ERROR(NotFound, "this instance has no evidence.")
189 return *(_evidences_[i]);
190 }

References PRMInference(), _evidences_, evidence(), and GUM_ERROR.

Here is the call graph for this function:

◆ evidence() [4/4]

template<GUM_Numeric GUM_SCALAR>
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 194 of file PRMInference_tpl.h.

194 {
195 if (!_evidences_.exists(i)) GUM_ERROR(NotFound, "this instance has no evidence.")
196 return *(_evidences_[i]);
197 }

References _evidences_, and GUM_ERROR.

◆ evidenceAdded_() [1/2]

template<GUM_Numeric 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 >.

◆ evidenceAdded_() [2/2]

template<GUM_Numeric GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::evidenceAdded_ ( const typename PRMInference< GUM_SCALAR >::Chain & chain)
overrideprotected

See PRMInference::evidenceAdded_().

Definition at line 115 of file structuredInference_tpl.h.

116 {}

◆ evidenceRemoved_() [1/2]

template<GUM_Numeric 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 >.

Referenced by removeEvidence().

Here is the caller graph for this function:

◆ evidenceRemoved_() [2/2]

template<GUM_Numeric GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::evidenceRemoved_ ( const typename PRMInference< GUM_SCALAR >::Chain & chain)
overrideprotected

See PRMInference::evidenceRemoved_().

Definition at line 119 of file structuredInference_tpl.h.

120 {}

◆ gspan() [1/2]

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

Returns the instance of gspan used to search patterns.

Definition at line 981 of file structuredInference_tpl.h.

981 {
982 return *_gspan_;
983 }

References _gspan_.

◆ gspan() [2/2]

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

Returns the instance of gspan used to search patterns.

Definition at line 986 of file structuredInference_tpl.h.

986 {
987 return *_gspan_;
988 }

References _gspan_.

◆ hasEvidence() [1/4]

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

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

Definition at line 215 of file PRMInference_tpl.h.

215 {
216 return (_evidences_.size() != (Size)0);
217 }

References _evidences_.

◆ hasEvidence() [2/4]

template<GUM_Numeric GUM_SCALAR>
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 210 of file PRMInference_tpl.h.

210 {
211 return (hasEvidence(chain.first)) ? evidence(chain.first).exists(chain.second->id()) : false;
212 }
bool exists(const Key &key) const
Checks whether there exists an element with a given key in the hashtable.

References evidence(), and hasEvidence().

Here is the call graph for this function:

◆ hasEvidence() [3/4]

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

◆ hasEvidence() [4/4]

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

Returns EMap of evidences over i.

Definition at line 205 of file PRMInference_tpl.h.

205 {
206 return _evidences_.exists(i);
207 }

References _evidences_.

◆ info()

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

Definition at line 201 of file structuredInference_tpl.h.

201 {
203 s << std::format("Triangulation time: {}\n", triang_time);
204 s << std::format("Pattern mining time: {}\n", mining_time);
205 s << std::format("Pattern elimination time: {}\n", pattern_time);
206 s << std::format("Inner node elimination time: {}\n", inner_time);
207 s << std::format("Observed node elimination time: {}\n", obs_time);
208 s << std::format("Full inference time: {}\n", full_time);
209 s << std::format("#patterns: {}\n", _gspan_->patterns().size());
210 Size count = 0;
212
213 for (Iter p = _gspan_->patterns().begin(); p != _gspan_->patterns().end(); ++p) {
214 if (_gspan_->matches(**p).size()) {
215 s << std::format("Pattern n°{} match count: {}\n", count++, _gspan_->matches(**p).size());
216 s << std::format("Pattern n°{} instance count: {}\n", count++, (**p).size());
217 }
218 }
219
220 return s.str();
221 }

References _gspan_, full_time, inner_time, mining_time, obs_time, pattern_time, and triang_time.

◆ joint()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::PRMInference< GUM_SCALAR >::joint ( const std::vector< Chain > & chains,
Tensor< 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 257 of file PRMInference_tpl.h.

259 {
260 if (j.nbrDim() > 0) { GUM_ERROR(OperationNotAllowed, "the given Tensor is not empty.") }
261
262 for (auto chain = chains.begin(); chain != chains.end(); ++chain) {
263 j.add(chain->second->type().variable());
264 }
265
266 joint_(chains, j);
267 }
virtual void joint_(const std::vector< Chain > &queries, Tensor< GUM_SCALAR > &j)=0
Generic method to compute the posterior of given element.

References GUM_ERROR, and joint_().

Here is the call graph for this function:

◆ joint_() [1/2]

template<GUM_Numeric GUM_SCALAR>
virtual void gum::prm::PRMInference< GUM_SCALAR >::joint_ ( const std::vector< Chain > & queries,
Tensor< GUM_SCALAR > & j )
protectedpure virtualinherited

Generic method to compute the posterior 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 >.

Referenced by joint().

Here is the caller graph for this function:

◆ joint_() [2/2]

template<GUM_Numeric GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::joint_ ( const std::vector< typename PRMInference< GUM_SCALAR >::Chain > & queries,
Tensor< GUM_SCALAR > & j )
overrideprotected

See PRMInference::joint_().

Definition at line 194 of file structuredInference_tpl.h.

196 {
197 GUM_ERROR(FatalError, "not implemented")
198 }

References GUM_ERROR.

◆ name()

template<GUM_Numeric GUM_SCALAR>
std::string gum::prm::StructuredInference< GUM_SCALAR >::name ( ) const
overridevirtual

Tells this algorithm to use pattern mining or not.

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

Definition at line 976 of file structuredInference_tpl.h.

976 {
977 return "StructuredInference";
978 }

◆ operator=()

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

Copy operator.

Definition at line 103 of file structuredInference_tpl.h.

104 {
105 this->prm_ = source.prm_;
106 this->sys_ = source.sys_;
107
108 if (this->_gspan_) delete this->_gspan_;
109
110 this->_gspan_ = new GSpan< GUM_SCALAR >(*(this->prm_), *(this->sys_));
111 return *this;
112 }

References StructuredInference(), _gspan_, gum::prm::PRMInference< GUM_SCALAR >::prm_, and gum::prm::PRMInference< GUM_SCALAR >::sys_.

Here is the call graph for this function:

◆ posterior()

template<GUM_Numeric GUM_SCALAR>
void gum::prm::PRMInference< GUM_SCALAR >::posterior ( const Chain & chain,
Tensor< GUM_SCALAR > & m )
inherited

Compute the posterior 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 posterior of chain.
Exceptions
NotFoundRaised if chain is invalid.
TypeErrorRaised if chain does not point to an PRMAttribute<GUM_SCALAR>.
OperationNotAllowedRaise if m is not empty.

Definition at line 231 of file PRMInference_tpl.h.

233 {
234 if (m.nbrDim() > 0) { GUM_ERROR(OperationNotAllowed, "the given Tensor is not empty.") }
235
236 if (hasEvidence(chain)) {
237 m.add(chain.second->type().variable());
238 const Tensor< GUM_SCALAR >& e = *(evidence(chain.first)[chain.second->id()]);
239 Instantiation i(m), j(e);
240
241 for (i.setFirst(), j.setFirst(); !i.end(); i.inc(), j.inc())
242 m.set(i, e.get(j));
243 } else {
244 if (chain.second != &(chain.first->get(chain.second->safeName()))) {
246 = std::make_pair(chain.first, &(chain.first->get(chain.second->safeName())));
247 m.add(good_chain.second->type().variable());
249 } else {
250 m.add(chain.second->type().variable());
252 }
253 }
254 }
virtual void posterior_(const Chain &chain, Tensor< GUM_SCALAR > &m)=0
Generic method to compute the posterior of given element.

References gum::prm::PRMInstance< GUM_SCALAR >::end(), evidence(), GUM_ERROR, hasEvidence(), gum::Instantiation::inc(), and gum::Instantiation::setFirst().

Here is the call graph for this function:

◆ posterior_() [1/2]

template<GUM_Numeric GUM_SCALAR>
virtual void gum::prm::PRMInference< GUM_SCALAR >::posterior_ ( const Chain & chain,
Tensor< GUM_SCALAR > & m )
protectedpure virtualinherited

Generic method to compute the posterior of given element.

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

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

◆ posterior_() [2/2]

template<GUM_Numeric GUM_SCALAR>
void gum::prm::StructuredInference< GUM_SCALAR >::posterior_ ( const typename PRMInference< GUM_SCALAR >::Chain & chain,
Tensor< GUM_SCALAR > & m )
overrideprotected

See PRMInference::posterior_().

Definition at line 123 of file structuredInference_tpl.h.

125 {
126 timer.reset();
127 _found_query_ = false;
128 _query_ = chain;
130
131 if (!this->hasEvidence() && (chain.second->cpf().nbrDim() == 1)) {
133
134 for (i.setFirst(); !i.end(); i.inc())
135 m.set(i, chain.second->cpf().get(i));
136
137 return;
138 } else if (this->hasEvidence(chain)) {
140 const Tensor< GUM_SCALAR >* e = this->evidence(_query_.first)[_query_.second->id()];
141
142 for (i.setFirst(); !i.end(); i.inc())
143 m.set(i, e->get(i));
144
145 return;
146 }
147
150
151 if (data.pool.size() > 1) {
152 for (const auto pot: data.pool)
153 if (pot->contains(_query_.second->type().variable())) pots.insert(pot);
154
155 if (pots.size() == 1) {
156 Tensor< GUM_SCALAR >* pot = const_cast< Tensor< GUM_SCALAR >* >(*(pots.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 } else {
165 Tensor< GUM_SCALAR >* tmp = Comb.execute(pots);
166 Instantiation i(m), j(*tmp);
167
168 for (i.setFirst(), j.setFirst(); !i.end(); i.inc(), j.inc())
169 m.set(i, tmp->get(j));
170
171 delete tmp;
172 }
173 } else {
174 Tensor< GUM_SCALAR >* pot = *(data.pool.begin());
175 GUM_ASSERT(pot->contains(_query_.second->type().variable()));
176 GUM_ASSERT(pot->variablesSequence().size() == 1);
177 Instantiation i(*pot), j(m);
178
179 for (i.setFirst(), j.setFirst(); !i.end(); i.inc(), j.inc())
180 m.set(j, pot->get(i));
181 }
182
183 m.normalize();
184
185 if (_pdata_) {
186 delete _pdata_;
187 _pdata_ = 0;
188 }
189
190 full_time = timer.step();
191 }
void _buildReduceGraph_(RGData &data)
This calls reducePattern() over each pattern and then build the reduced graph which is used for infer...

References _buildReduceGraph_(), _found_query_, _pdata_, _query_, gum::Set< Key >::begin(), gum::Instantiation::end(), gum::prm::PRMInference< GUM_SCALAR >::evidence(), gum::MultiDimCombinationDefault< TABLE >::execute(), full_time, gum::prm::PRMInference< GUM_SCALAR >::hasEvidence(), gum::Instantiation::inc(), gum::Set< Key >::insert(), gum::prm::multTensor(), gum::prm::StructuredInference< GUM_SCALAR >::RGData::pool, gum::Instantiation::setFirst(), gum::Set< Key >::size(), and timer.

Here is the call graph for this function:

◆ removeEvidence()

template<GUM_Numeric GUM_SCALAR>
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.
TypeErrorRaised if the elt is not an PRMAttribute<GUM_SCALAR>.

Definition at line 220 of file PRMInference_tpl.h.

220 {
221 if (hasEvidence(chain.first)) {
222 if (_EMap_(chain.first).exists(chain.second->id())) {
224 delete _EMap_(chain.first)[chain.second->id()];
225 _EMap_(chain.first).erase(chain.second->id());
226 }
227 }
228 }
void erase(const Key &key)
Removes a given element from the hash table.
virtual void evidenceRemoved_(const Chain &chain)=0
This method is called whenever an evidence is removed, but BEFORE any processing made by PRMInference...

References _EMap_(), evidenceRemoved_(), and hasEvidence().

Here is the call graph for this function:

◆ searchPatterns()

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

Search for patterns without doing any computations.

Definition at line 931 of file structuredInference_tpl.h.

931 {
932 const PRMInstance< GUM_SCALAR >* i = (this->sys_->begin()).val();
933 _query_ = std::make_pair(i, i->begin().val());
934 _found_query_ = false;
937 }

References _buildReduceGraph_(), _found_query_, _query_, gum::prm::PRMInstance< GUM_SCALAR >::begin(), and gum::prm::PRMInference< GUM_SCALAR >::sys_.

Here is the call graph for this function:

◆ setPatternMining()

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

Tells this algorithm to use pattern mining or not.

Definition at line 940 of file structuredInference_tpl.h.

940 {
941 _mining_ = b;
942 }

References _mining_.

Member Data Documentation

◆ _cdata_map_

template<GUM_Numeric 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 275 of file structuredInference.h.

Referenced by ~StructuredInference(), and _reduceAloneInstances_().

◆ _dot_

template<GUM_Numeric GUM_SCALAR>
std::string gum::prm::StructuredInference< GUM_SCALAR >::_dot_
private

Unreduce the match containing the query.

Used to create strings

Definition at line 378 of file structuredInference.h.

Referenced by StructuredInference(), StructuredInference(), _str_(), _str_(), and _str_().

◆ _elim_map_

template<GUM_Numeric GUM_SCALAR>
HashTable< const Sequence< PRMInstance< GUM_SCALAR >* >*, Set< Tensor< GUM_SCALAR >* >* > gum::prm::StructuredInference< GUM_SCALAR >::_elim_map_
private

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

Definition at line 269 of file structuredInference.h.

Referenced by ~StructuredInference(), _addEdgesInReducedGraph_(), and _reducePattern_().

◆ _evidences_

template<GUM_Numeric GUM_SCALAR>
HashTable< const PRMInstance< GUM_SCALAR >*, EMap* > gum::prm::PRMInference< GUM_SCALAR >::_evidences_
privateinherited

Mapping of evidence over PRMInstance<GUM_SCALAR>'s nodes.

Definition at line 245 of file PRMInference.h.

Referenced by PRMInference(), _EMap_(), clearEvidence(), evidence(), evidence(), evidence(), evidence(), hasEvidence(), hasEvidence(), and hasEvidence().

◆ _found_query_

template<GUM_Numeric GUM_SCALAR>
bool gum::prm::StructuredInference< GUM_SCALAR >::_found_query_
private

Flag with an explicit name.

Definition at line 296 of file structuredInference.h.

Referenced by StructuredInference(), _buildPatternGraph_(), posterior_(), and searchPatterns().

◆ _gspan_

template<GUM_Numeric GUM_SCALAR>
GSpan< GUM_SCALAR >* gum::prm::StructuredInference< GUM_SCALAR >::_gspan_
private

◆ _mining_

template<GUM_Numeric GUM_SCALAR>
bool gum::prm::StructuredInference< GUM_SCALAR >::_mining_
private

Flag which tells to use pattern mining or not.

Definition at line 293 of file structuredInference.h.

Referenced by StructuredInference(), StructuredInference(), _buildReduceGraph_(), and setPatternMining().

◆ _outputs_

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

Definition at line 280 of file structuredInference.h.

Referenced by ~StructuredInference().

◆ _pdata_

template<GUM_Numeric 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 290 of file structuredInference.h.

Referenced by StructuredInference(), StructuredInference(), ~StructuredInference(), and posterior_().

◆ _query_

template<GUM_Numeric GUM_SCALAR>
PRMInference<GUM_SCALAR>::Chain gum::prm::StructuredInference< GUM_SCALAR >::_query_
private

◆ _query_data_

template<GUM_Numeric GUM_SCALAR>
std::pair< Idx, std::string > gum::prm::StructuredInference< GUM_SCALAR >::_query_data_
private

Definition at line 297 of file structuredInference.h.

Referenced by _buildPatternGraph_(), and _reducePattern_().

◆ _reducedInstances_

template<GUM_Numeric GUM_SCALAR>
Set< const PRMInstance< GUM_SCALAR >* > gum::prm::StructuredInference< GUM_SCALAR >::_reducedInstances_
private

This keeps track of reduced instances.

Definition at line 283 of file structuredInference.h.

Referenced by _reduceAloneInstances_(), _reducePattern_(), and _translatePotSet_().

◆ _trash_

template<GUM_Numeric GUM_SCALAR>
Set< Tensor< GUM_SCALAR >* > gum::prm::StructuredInference< GUM_SCALAR >::_trash_
private

Keeping track of create tensors to delete them after inference.

Definition at line 278 of file structuredInference.h.

Referenced by ~StructuredInference(), _buildReduceGraph_(), _eliminateObservedNodes_(), _eliminateObservedNodesInSource_(), _reduceAloneInstances_(), and _reducePattern_().

◆ full_time

template<GUM_Numeric GUM_SCALAR>
double gum::prm::StructuredInference< GUM_SCALAR >::full_time

Definition at line 395 of file structuredInference.h.

Referenced by StructuredInference(), info(), and posterior_().

◆ inner_time

template<GUM_Numeric GUM_SCALAR>
double gum::prm::StructuredInference< GUM_SCALAR >::inner_time

Definition at line 393 of file structuredInference.h.

Referenced by StructuredInference(), and info().

◆ mining_time

template<GUM_Numeric GUM_SCALAR>
double gum::prm::StructuredInference< GUM_SCALAR >::mining_time

Definition at line 391 of file structuredInference.h.

Referenced by StructuredInference(), _buildReduceGraph_(), and info().

◆ obs_time

template<GUM_Numeric GUM_SCALAR>
double gum::prm::StructuredInference< GUM_SCALAR >::obs_time

Definition at line 394 of file structuredInference.h.

Referenced by StructuredInference(), _reducePattern_(), and info().

◆ pattern_time

template<GUM_Numeric GUM_SCALAR>
double gum::prm::StructuredInference< GUM_SCALAR >::pattern_time

Definition at line 392 of file structuredInference.h.

Referenced by StructuredInference(), _buildReduceGraph_(), and info().

◆ plopTimer

template<GUM_Numeric GUM_SCALAR>
Timer gum::prm::StructuredInference< GUM_SCALAR >::plopTimer

Definition at line 389 of file structuredInference.h.

Referenced by _buildReduceGraph_(), and _reducePattern_().

◆ prm_

◆ sys_

◆ timer

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

Definition at line 388 of file structuredInference.h.

Referenced by posterior_().

◆ triang_time

template<GUM_Numeric GUM_SCALAR>
double gum::prm::StructuredInference< GUM_SCALAR >::triang_time

Definition at line 390 of file structuredInference.h.

Referenced by StructuredInference(), and info().


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