aGrUM  0.16.0
gum::BayesNetInference< GUM_SCALAR > Class Template Referenceabstract

<agrum/BN/inference/BayesNetInference.h> More...

#include <BayesNetInference.h>

+ Inheritance diagram for gum::BayesNetInference< GUM_SCALAR >:
+ Collaboration diagram for gum::BayesNetInference< GUM_SCALAR >:

Public Member Functions

Constructors / Destructors
 BayesNetInference (const IBayesNet< GUM_SCALAR > *bn)
 default constructor More...
 
 BayesNetInference ()
 default constructor with a null BN (useful for virtual inheritance) More...
 
virtual ~BayesNetInference ()
 destructor More...
 
Accessors / Modifiers
virtual void setBN (const IBayesNet< GUM_SCALAR > *bn)
 assigns a new BN to the inference engine More...
 
virtual const IBayesNet< GUM_SCALAR > & BN () const final
 Returns a constant reference over the IBayesNet referenced by this class. More...
 
virtual const NodeProperty< Size > & domainSizes () const final
 get the domain sizes of the random variables of the BN More...
 
virtual bool isInferenceReady () const noexcept final
 returns whether the inference object is in a ready state More...
 
virtual bool isInferenceOutdatedBNStructure () const noexcept final
 returns whether the inference object is in a OutdatedBNStructure state More...
 
virtual bool isInferenceOutdatedBNPotentials () const noexcept final
 returns whether the inference object is in a OutdatedBNPotential state More...
 
virtual bool isInferenceDone () const noexcept final
 returns whether the inference object is in a InferenceDone state More...
 
virtual bool isDone () const noexcept final
 returns whether the inference object is in a done state More...
 
virtual void prepareInference () final
 prepare the internal inference structures for the next inference More...
 
virtual void makeInference () final
 perform the heavy computations needed to compute the targets' posteriors More...
 
virtual void clear ()
 clears all the data structures allocated for the last inference More...
 
virtual StateOfInference state () const noexcept final
 returns the state of the inference engine More...
 
Evidence
virtual void addEvidence (NodeId id, const Idx val) final
 adds a new hard evidence on node id More...
 
virtual void addEvidence (const std::string &nodeName, const Idx val) final
 adds a new hard evidence on node named nodeName More...
 
virtual void addEvidence (NodeId id, const std::string &label) final
 adds a new hard evidence on node id More...
 
virtual void addEvidence (const std::string &nodeName, const std::string &label) final
 adds a new hard evidence on node named nodeName More...
 
virtual void addEvidence (NodeId id, const std::vector< GUM_SCALAR > &vals) final
 adds a new evidence on node id (might be soft or hard) More...
 
virtual void addEvidence (const std::string &nodeName, const std::vector< GUM_SCALAR > &vals) final
 adds a new evidence on node named nodeName (might be soft or hard) More...
 
virtual void addEvidence (const Potential< GUM_SCALAR > &pot) final
 adds a new evidence on node id (might be soft or hard) More...
 
virtual void addEvidence (Potential< GUM_SCALAR > &&pot) final
 adds a new evidence on node id (might be soft or hard) More...
 
virtual void addSetOfEvidence (const Set< const Potential< GUM_SCALAR > * > &potset) final
 adds a new set of evidence More...
 
virtual void addListOfEvidence (const List< const Potential< GUM_SCALAR > * > &potlist) final
 adds a new list of evidence More...
 
virtual void chgEvidence (NodeId id, const Idx val) final
 change the value of an already existing hard evidence More...
 
virtual void chgEvidence (const std::string &nodeName, const Idx val) final
 change the value of an already existing hard evidence More...
 
virtual void chgEvidence (NodeId id, const std::string &label) final
 change the value of an already existing hard evidence More...
 
virtual void chgEvidence (const std::string &nodeName, const std::string &label) final
 change the value of an already existing hard evidence More...
 
virtual void chgEvidence (NodeId id, const std::vector< GUM_SCALAR > &vals) final
 change the value of an already existing evidence (might be soft or hard) More...
 
virtual void chgEvidence (const std::string &nodeName, const std::vector< GUM_SCALAR > &vals) final
 change the value of an already existing evidence (might be soft or hard) More...
 
virtual void chgEvidence (const Potential< GUM_SCALAR > &pot) final
 change the value of an already existing evidence (might be soft or hard) More...
 
virtual void eraseAllEvidence () final
 removes all the evidence entered into the network More...
 
virtual void eraseEvidence (NodeId id) final
 removed the evidence, if any, corresponding to node id More...
 
virtual void eraseEvidence (const std::string &nodeName) final
 removed the evidence, if any, corresponding to node of name nodeName More...
 
virtual bool hasEvidence () const final
 indicates whether some node(s) have received evidence More...
 
virtual bool hasEvidence (NodeId id) const final
 indicates whether node id has received an evidence More...
 
virtual bool hasHardEvidence (NodeId id) const final
 indicates whether node id has received a hard evidence More...
 
virtual bool hasSoftEvidence (NodeId id) const final
 indicates whether node id has received a soft evidence More...
 
virtual bool hasEvidence (const std::string &nodeName) const final
 indicates whether node id has received an evidence More...
 
virtual bool hasHardEvidence (const std::string &nodeName) const final
 indicates whether node id has received a hard evidence More...
 
virtual bool hasSoftEvidence (const std::string &nodeName) const final
 indicates whether node id has received a soft evidence More...
 
virtual Size nbrEvidence () const final
 returns the number of evidence entered into the Bayesian network More...
 
virtual Size nbrHardEvidence () const final
 returns the number of hard evidence entered into the Bayesian network More...
 
virtual Size nbrSoftEvidence () const final
 returns the number of soft evidence entered into the Bayesian network More...
 
const NodeProperty< const Potential< GUM_SCALAR > *> & evidence () const
 returns the set of evidence More...
 
const NodeSetsoftEvidenceNodes () const
 returns the set of nodes with soft evidence More...
 
const NodeSethardEvidenceNodes () const
 returns the set of nodes with hard evidence More...
 
const NodeProperty< Idx > & hardEvidence () const
 indicate for each node with hard evidence which value it took More...
 

Public Types

enum  StateOfInference { StateOfInference::OutdatedBNStructure, StateOfInference::OutdatedBNPotentials, StateOfInference::ReadyForInference, StateOfInference::Done }
 current state of the inference More...
 

Protected Member Functions

virtual void _onStateChanged ()=0
 fired when the stage is changed More...
 
virtual void _onEvidenceAdded (const NodeId id, bool isHardEvidence)=0
 fired after a new evidence is inserted More...
 
virtual void _onEvidenceErased (const NodeId id, bool isHardEvidence)=0
 fired before an evidence is removed More...
 
virtual void _onAllEvidenceErased (bool contains_hard_evidence)=0
 fired before all the evidence are erased More...
 
virtual void _onEvidenceChanged (const NodeId id, bool hasChangedSoftHard)=0
 fired after an evidence is changed, in particular when its status (soft/hard) changes More...
 
virtual void _onBayesNetChanged (const IBayesNet< GUM_SCALAR > *bn)=0
 fired after a new Bayes net has been assigned to the engine More...
 
virtual void _updateOutdatedBNStructure ()=0
 prepares inference when the latter is in OutdatedBNStructure state More...
 
virtual void _updateOutdatedBNPotentials ()=0
 prepares inference when the latter is in OutdatedBNPotentials state More...
 
virtual void _makeInference ()=0
 called when the inference has to be performed effectively More...
 
void _setOutdatedBNStructureState ()
 put the inference into an outdated BN structure state More...
 
void _setOutdatedBNPotentialsState ()
 puts the inference into an OutdatedBNPotentials state if it is not already in an OutdatedBNStructure state More...
 

Detailed Description

template<typename GUM_SCALAR>
class gum::BayesNetInference< GUM_SCALAR >

<agrum/BN/inference/BayesNetInference.h>

A generic class for Bayes net inference: handles evidence and the current state of the (incremental) inference

The goal of the BayesNetInference class is twofold: i) handling the common resources of BN inference (bn, soft/hard evidence); ii) propose a general high-level scheme for all the inference methods.

A specialized inference just has to specify how to prepare inference, how to make inference and how to get the posteriors for nodes and set of nodes. The scheme for every inference derived from BayesNetInference will be the same:

1- ie=SpecificInference(bn); // state <- OutdatedBNStructure 2- set targets and evidence in ie 3- ie.prepareInference(); // state <- Ready4Inference 4.a- change values of evidence in ie // state <- OutdatedBNPotentials 4.b- change some hard evidence or targets // state <- OutdatedBNStructure 5- ie.makeInference(); // state <- Done 6- get posteriors 7- goto 2 or 4

BayesNetInference can be in one of 4 different states:

  • OutdatedBNStructure: in this state, the inference is fully unprepared to be applied because some events changed the "logical" structure of the BN: for instance a node received a hard evidence, which implies that its outgoing arcs can be removed from the BN, hence involving a structural change in the BN. As a consequence, the (incremental) inference (probably) needs a significant amount of preparation to be ready for the next inference. In a Lazy propagation, for instance, this step amounts to compute a new join tree, hence a new structure in which inference will be applied. Note that classes that inherit from BayesNetInference may be smarter than BayesNetInference and may, in some situations, find out that their data structures are still ok for inference and, therefore, only resort to perform the actions related to the OutdatedBNPotentials state. As an example, consider a LazyPropagation inference in Bayes Net A->B->C->D->E in which C has received hard evidence e_C and E is the only target. In this case, A and B are not needed for inference, the only potentials that matter are P(D|e_C) and P(E|D). So the smallest join tree needed for inference contains only one clique DE. Now, adding new evidence e_A on A has no impact on E given hard evidence e_C. In this case, LazyPropagation can be smart and not update its join tree.
  • OutdatedBNPotentials: in this state, the structure of the BN remains unchanged, only some potentials stored in it have changed. Therefore, the inference probably just needs to invalidate some already computed potentials to be ready. Only a light amount of preparation is needed to be able to perform inference.
  • Ready4Inference: in this state, all the data structures are ready for inference. There just remains to perform the inference computations.
  • Done: the heavy computations of inference have been done. There might still remain a few light computations to perform to get the posterior potentials we need. Typically, in Lazy Propagation, all the messages in the join tree have been computed but, to get the potentials, we still need to perform the combinations of the potentials in the cliques with the messages sent to the cliques. In some inference algorithms, this step may even be empty.

Definition at line 142 of file BayesNetInference.h.

Member Enumeration Documentation

◆ StateOfInference

template<typename GUM_SCALAR >
enum gum::BayesNetInference::StateOfInference
strong

current state of the inference

BayesNetInference can be in one of 4 different states:

  • OutdatedBNStructure: in this state, the inference is fully unprepared to be applied because some events changed the "logical" structure of the BN: for instance a node received a hard evidence, which implies that its outgoing arcs can be removed from the BN, hence involving a structural change in the BN. As a consequence, the (incremental) inference (probably) needs a significant amount of preparation to be ready for the next inference. In a Lazy propagation, for instance, this step amounts to compute a new join tree, hence a new structure in which inference will be applied. Note that classes that inherit from BayesNetInference may be smarter than BayesNetInference and may, in some situations, find out that their data structures are still ok for inference and, therefore, only resort to perform the actions related to the OutdatedBNPotentials state. As an example, consider a LazyPropagation inference in Bayes Net A->B->C->D->E in which C has received hard evidence e_C and E is the only target. In this case, A and B are not needed for inference, the only potentials that matter are P(D|e_C) and P(E|D). So the smallest join tree needed for inference contains only one clique DE. Now, adding new evidence e_A on A has no impact on E given hard evidence e_C. In this case, LazyPropagation can be smart and not update its join tree.
  • OutdatedBNPotentials: in this state, the structure of the BN remains unchanged, only some potentials stored in it have changed. Therefore, the inference probably just needs to invalidate some already computed potentials to be ready. Only a light amount of preparation is needed to be able to perform inference.
  • Ready4Inference: in this state, all the data structures are ready for inference. There just remains to perform the inference computations.
  • Done: the heavy computations of inference have been done. There might still remain a few light computations to perform to get the posterior potentials we need. Typically, in Lazy Propagation, all the messages in the join tree have been computed but, to get the potentials, we still need to perform the combinations of the potentials in the cliques with the messages sent to the cliques. In some inference algorithms, this step may even be empty.
Enumerator
OutdatedBNStructure 
OutdatedBNPotentials 
ReadyForInference 
Done 

Definition at line 183 of file BayesNetInference.h.

183  {
184  OutdatedBNStructure,
185  OutdatedBNPotentials,
186  ReadyForInference,
187  Done
188  };

Constructor & Destructor Documentation

◆ BayesNetInference() [1/2]

template<typename GUM_SCALAR >
gum::BayesNetInference< GUM_SCALAR >::BayesNetInference ( const IBayesNet< GUM_SCALAR > *  bn)
explicit

default constructor

Warning
note that, by aGrUM's rule, the BN is not copied but only referenced by the inference algorithm.

Definition at line 36 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__computeDomainSizes().

37  :
38  __bn(bn) {
40 
41  GUM_CONSTRUCTOR(BayesNetInference);
42  }
BayesNetInference()
default constructor with a null BN (useful for virtual inheritance)
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
void __computeDomainSizes()
computes the domain sizes of the random variables
+ Here is the call graph for this function:

◆ BayesNetInference() [2/2]

template<typename GUM_SCALAR >
gum::BayesNetInference< GUM_SCALAR >::BayesNetInference ( )

default constructor with a null BN (useful for virtual inheritance)

Warning
BayesNetInference is virtually inherited by MarginalTargetedInference. As a result, the lowest descendant of BayesNetInference will create the latter. To avoid requiring developpers to add in the constructors of their inference algorithms a call to BayesNetInference( bn ), we added constructor BayesNetInference(), which will be called automatically by the lowest descendant. Then, MarginalTargetedInference and JointTargetedInference will take care of setting the appropriate bn into BayesNetInference.

Definition at line 47 of file BayesNetInference_tpl.h.

47  {
48  GUM_CONSTRUCTOR(BayesNetInference);
49  }
BayesNetInference()
default constructor with a null BN (useful for virtual inheritance)

◆ ~BayesNetInference()

template<typename GUM_SCALAR >
gum::BayesNetInference< GUM_SCALAR >::~BayesNetInference ( )
virtual

destructor

Definition at line 54 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__evidence.

54  {
55  // clear all evidence.
56  // Warning: Do not use method eraseAllEvidence () because it contains a call
57  // to pure virtual method _onAllEvidenceErased which belongs to an inherited
58  // instance and, therefore, does not exist anymore when ~BayesNetInference ()
59  // is called
60  for (const auto& pair : __evidence) {
61  if (pair.second != nullptr) { delete (pair.second); }
62  }
63 
64  GUM_DESTRUCTOR(BayesNetInference);
65  }
NodeProperty< const Potential< GUM_SCALAR > *> __evidence
the set of evidence entered into the network
BayesNetInference()
default constructor with a null BN (useful for virtual inheritance)

Member Function Documentation

◆ __computeDomainSizes()

template<typename GUM_SCALAR >
void gum::BayesNetInference< GUM_SCALAR >::__computeDomainSizes ( )
private

computes the domain sizes of the random variables

Definition at line 161 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__bn, and gum::BayesNetInference< GUM_SCALAR >::__domain_sizes.

Referenced by gum::BayesNetInference< GUM_SCALAR >::__setBayesNetDuringConstruction(), gum::BayesNetInference< GUM_SCALAR >::BayesNetInference(), and gum::BayesNetInference< GUM_SCALAR >::setBN().

161  {
162  __domain_sizes.clear();
163  if (__bn != nullptr) {
164  for (const auto node : __bn->dag()) {
165  __domain_sizes.insert(node, __bn->variable(node).domainSize());
166  }
167  }
168  }
NodeProperty< Size > __domain_sizes
the domain sizes of the random variables
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
+ Here is the caller graph for this function:

◆ __createHardEvidence()

template<typename GUM_SCALAR >
Potential< GUM_SCALAR > gum::BayesNetInference< GUM_SCALAR >::__createHardEvidence ( NodeId  id,
Idx  val 
) const
private

create the internal structure for a hard evidence

Definition at line 186 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__bn, gum::MultiDimDecorator< GUM_SCALAR >::beginMultipleChanges(), gum::Instantiation::chgVal(), and GUM_ERROR.

Referenced by gum::BayesNetInference< GUM_SCALAR >::addEvidence(), and gum::BayesNetInference< GUM_SCALAR >::chgEvidence().

187  {
188  // check that it is possible to create the evidence
189  if (__bn == nullptr)
190  GUM_ERROR(NullElement,
191  "No Bayes net has been assigned to the "
192  "inference algorithm");
193 
194  if (!__bn->dag().exists(id)) {
195  GUM_ERROR(UndefinedElement, id << " is not a NodeId in the bn");
196  }
197 
198  if (__bn->variable(id).domainSize() <= val) {
199  GUM_ERROR(InvalidArgument,
200  "node " << __bn->variable(id) << " has fewer possible values than "
201  << val);
202  }
203 
204  // create the deterministic potential
205  Potential< GUM_SCALAR > pot;
206  pot.beginMultipleChanges();
207  pot << __bn->variable(id);
208  pot.endMultipleChanges(0.0);
209 
210  Instantiation I(pot);
211  I.chgVal(__bn->variable(id), val);
212  pot.set(I, 1.0);
213 
214  return pot;
215  }
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
#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:

◆ __isHardEvidence()

template<typename GUM_SCALAR >
bool gum::BayesNetInference< GUM_SCALAR >::__isHardEvidence ( const Potential< GUM_SCALAR > &  pot,
Idx val 
) const
private

checks whether a potential corresponds to a hard evidence or not

Definition at line 220 of file BayesNetInference_tpl.h.

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

Referenced by gum::BayesNetInference< GUM_SCALAR >::addEvidence(), and gum::BayesNetInference< GUM_SCALAR >::chgEvidence().

221  {
222  // checking if pot is determininstic
223  bool notZero = false;
224  Instantiation I(pot);
225 
226  for (I.setFirst(); !I.end(); I.inc()) {
227  if (pot[I] != 0.0) {
228  if (notZero) { // we already met a non-zero value
229  return false;
230  } else {
231  val = I.val(0);
232  notZero = true; // this is the first met non-zero value
233  }
234  }
235  }
236 
237  if (!notZero) { // we met no non-zero value
238  GUM_ERROR(FatalError, "Evidence of impossibility (vector of 0s)");
239  }
240 
241  return true; // pot is deterministic
242  }
#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:

◆ __setBayesNetDuringConstruction()

template<typename GUM_SCALAR >
void gum::BayesNetInference< GUM_SCALAR >::__setBayesNetDuringConstruction ( const IBayesNet< GUM_SCALAR > *  bn)
private

assigns a BN during the inference engine construction

Definition at line 143 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__bn, gum::BayesNetInference< GUM_SCALAR >::__computeDomainSizes(), gum::BayesNetInference< GUM_SCALAR >::__setState(), and gum::BayesNetInference< GUM_SCALAR >::OutdatedBNStructure.

Referenced by gum::EvidenceInference< GUM_SCALAR >::EvidenceInference(), gum::JointTargetedInference< GUM_SCALAR >::JointTargetedInference(), and gum::MarginalTargetedInference< GUM_SCALAR >::MarginalTargetedInference().

144  {
145  __bn = bn;
148  }
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
void __computeDomainSizes()
computes the domain sizes of the random variables
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __setState()

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::__setState ( const StateOfInference  state)
finalprivatevirtual

set the state of the inference engine and call the notification _onStateChanged when necessary (i.e. when the state has effectively changed).

Definition at line 111 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__state, gum::BayesNetInference< GUM_SCALAR >::_onStateChanged(), and gum::BayesNetInference< GUM_SCALAR >::state().

Referenced by gum::BayesNetInference< GUM_SCALAR >::__setBayesNetDuringConstruction(), gum::BayesNetInference< GUM_SCALAR >::_setOutdatedBNPotentialsState(), gum::BayesNetInference< GUM_SCALAR >::_setOutdatedBNStructureState(), gum::MarginalTargetedInference< GUM_SCALAR >::addAllTargets(), gum::BayesNetInference< GUM_SCALAR >::addEvidence(), gum::JointTargetedInference< GUM_SCALAR >::addJointTarget(), gum::MarginalTargetedInference< GUM_SCALAR >::addTarget(), gum::BayesNetInference< GUM_SCALAR >::chgEvidence(), gum::BayesNetInference< GUM_SCALAR >::clear(), gum::BayesNetInference< GUM_SCALAR >::eraseAllEvidence(), gum::JointTargetedInference< GUM_SCALAR >::eraseAllJointTargets(), gum::MarginalTargetedInference< GUM_SCALAR >::eraseAllTargets(), gum::BayesNetInference< GUM_SCALAR >::eraseEvidence(), gum::JointTargetedInference< GUM_SCALAR >::eraseJointTarget(), gum::MarginalTargetedInference< GUM_SCALAR >::eraseTarget(), gum::BayesNetInference< GUM_SCALAR >::makeInference(), gum::BayesNetInference< GUM_SCALAR >::prepareInference(), and gum::BayesNetInference< GUM_SCALAR >::setBN().

111  {
112  if (__state != state) {
113  __state = state;
114  _onStateChanged();
115  }
116  }
virtual void _onStateChanged()=0
fired when the stage is changed
StateOfInference __state
the current state of the inference (outdated/ready/done)
virtual StateOfInference state() const noexcept final
returns the state of the inference engine
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ _makeInference()

template<typename GUM_SCALAR >
virtual void gum::BayesNetInference< GUM_SCALAR >::_makeInference ( )
protectedpure virtual

called when the inference has to be performed effectively

Once the inference is done, _fillPosterior can be called.

Implemented in gum::LazyPropagation< GUM_SCALAR >, gum::SamplingInference< GUM_SCALAR >, gum::VariableElimination< GUM_SCALAR >, gum::ShaferShenoyInference< GUM_SCALAR >, and gum::LoopyBeliefPropagation< GUM_SCALAR >.

Referenced by gum::BayesNetInference< GUM_SCALAR >::makeInference().

+ Here is the caller graph for this function:

◆ _onAllEvidenceErased()

template<typename GUM_SCALAR >
virtual void gum::BayesNetInference< GUM_SCALAR >::_onAllEvidenceErased ( bool  contains_hard_evidence)
protectedpure virtual

fired before all the evidence are erased

Implemented in gum::SamplingInference< GUM_SCALAR >, gum::LazyPropagation< GUM_SCALAR >, gum::VariableElimination< GUM_SCALAR >, gum::ShaferShenoyInference< GUM_SCALAR >, and gum::LoopyBeliefPropagation< GUM_SCALAR >.

Referenced by gum::BayesNetInference< GUM_SCALAR >::eraseAllEvidence().

+ Here is the caller graph for this function:

◆ _onBayesNetChanged()

template<typename GUM_SCALAR >
virtual void gum::BayesNetInference< GUM_SCALAR >::_onBayesNetChanged ( const IBayesNet< GUM_SCALAR > *  bn)
protectedpure virtual

fired after a new Bayes net has been assigned to the engine

Implemented in gum::JointTargetedInference< GUM_SCALAR >, gum::SamplingInference< GUM_SCALAR >, gum::MarginalTargetedInference< GUM_SCALAR >, gum::LazyPropagation< GUM_SCALAR >, gum::VariableElimination< GUM_SCALAR >, gum::ShaferShenoyInference< GUM_SCALAR >, and gum::LoopyBeliefPropagation< GUM_SCALAR >.

Referenced by gum::BayesNetInference< GUM_SCALAR >::setBN().

+ Here is the caller graph for this function:

◆ _onEvidenceAdded()

template<typename GUM_SCALAR >
virtual void gum::BayesNetInference< GUM_SCALAR >::_onEvidenceAdded ( const NodeId  id,
bool  isHardEvidence 
)
protectedpure virtual

fired after a new evidence is inserted

Implemented in gum::SamplingInference< GUM_SCALAR >, gum::LazyPropagation< GUM_SCALAR >, gum::VariableElimination< GUM_SCALAR >, gum::ShaferShenoyInference< GUM_SCALAR >, and gum::LoopyBeliefPropagation< GUM_SCALAR >.

Referenced by gum::BayesNetInference< GUM_SCALAR >::addEvidence().

+ Here is the caller graph for this function:

◆ _onEvidenceChanged()

template<typename GUM_SCALAR >
virtual void gum::BayesNetInference< GUM_SCALAR >::_onEvidenceChanged ( const NodeId  id,
bool  hasChangedSoftHard 
)
protectedpure virtual

fired after an evidence is changed, in particular when its status (soft/hard) changes

Parameters
nodeIdthe node of the changed evidence
hasChangedSoftHardtrue if the evidence has changed from Soft to Hard or from Hard to Soft

Implemented in gum::SamplingInference< GUM_SCALAR >, gum::LazyPropagation< GUM_SCALAR >, gum::VariableElimination< GUM_SCALAR >, gum::ShaferShenoyInference< GUM_SCALAR >, and gum::LoopyBeliefPropagation< GUM_SCALAR >.

Referenced by gum::BayesNetInference< GUM_SCALAR >::chgEvidence().

+ Here is the caller graph for this function:

◆ _onEvidenceErased()

template<typename GUM_SCALAR >
virtual void gum::BayesNetInference< GUM_SCALAR >::_onEvidenceErased ( const NodeId  id,
bool  isHardEvidence 
)
protectedpure virtual

fired before an evidence is removed

Implemented in gum::SamplingInference< GUM_SCALAR >, gum::LazyPropagation< GUM_SCALAR >, gum::VariableElimination< GUM_SCALAR >, gum::ShaferShenoyInference< GUM_SCALAR >, and gum::LoopyBeliefPropagation< GUM_SCALAR >.

Referenced by gum::BayesNetInference< GUM_SCALAR >::eraseEvidence().

+ Here is the caller graph for this function:

◆ _onStateChanged()

template<typename GUM_SCALAR >
virtual void gum::BayesNetInference< GUM_SCALAR >::_onStateChanged ( )
protectedpure virtual

fired when the stage is changed

Implemented in gum::SamplingInference< GUM_SCALAR >, gum::LazyPropagation< GUM_SCALAR >, gum::VariableElimination< GUM_SCALAR >, gum::ShaferShenoyInference< GUM_SCALAR >, and gum::LoopyBeliefPropagation< GUM_SCALAR >.

Referenced by gum::BayesNetInference< GUM_SCALAR >::__setState().

+ Here is the caller graph for this function:

◆ _setOutdatedBNPotentialsState()

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::_setOutdatedBNPotentialsState ( )
protected

puts the inference into an OutdatedBNPotentials state if it is not already in an OutdatedBNStructure state

OutdatedBNPotentials: in this state, the structure of the BN remains unchanged, only some potentials stored in it have changed. Therefore, the inference probably just needs to invalidate some already computed potentials to be ready. Only a light amount of preparation is needed to be able to perform inference.

Definition at line 685 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__setState(), and gum::BayesNetInference< GUM_SCALAR >::OutdatedBNPotentials.

685  {
687  }
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
+ Here is the call graph for this function:

◆ _setOutdatedBNStructureState()

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::_setOutdatedBNStructureState ( )
protected

put the inference into an outdated BN structure state

OutdatedBNStructure: in this state, the inference is fully unprepared to be applied because some events changed the "logical" structure of the BN: for instance a node received a hard evidence, which implies that its outgoing arcs can be removed from the BN, hence involving a structural change in the BN. As a consequence, the (incremental) inference (probably) needs a significant amount of preparation to be ready for the next inference. In a Lazy propagation, for instance, this step amounts to compute a new join tree, hence a new structure in which inference will be applied. Note that classes that inherit from BayesNetInference may be smarter than BayesNetInference and may, in some situations, find out that their data structures are still ok for inference and, therefore, only resort to perform the actions related to the OutdatedBNPotentials state. As an example, consider a LazyPropagation inference in Bayes Net A->B->C->D->E in which C has received hard evidence e_C and E is the only target. In this case, A and B are not needed for inference, the only potentials that matter are P(D|e_C) and P(E|D). So the smallest join tree needed for inference contains only one clique DE. Now, adding new evidence e_A on A has no impact on E given hard evidence e_C. In this case, LazyPropagation can be smart and not update its join tree.

Definition at line 677 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__setState(), and gum::BayesNetInference< GUM_SCALAR >::OutdatedBNStructure.

677  {
679  }
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
+ Here is the call graph for this function:

◆ _updateOutdatedBNPotentials()

template<typename GUM_SCALAR >
virtual void gum::BayesNetInference< GUM_SCALAR >::_updateOutdatedBNPotentials ( )
protectedpure virtual

prepares inference when the latter is in OutdatedBNPotentials state

Note that the values of evidence are not necessarily known and can be changed between _updateOutdatedBNPotentials and _makeInference.

Implemented in gum::SamplingInference< GUM_SCALAR >, gum::LazyPropagation< GUM_SCALAR >, gum::VariableElimination< GUM_SCALAR >, gum::ShaferShenoyInference< GUM_SCALAR >, and gum::LoopyBeliefPropagation< GUM_SCALAR >.

Referenced by gum::BayesNetInference< GUM_SCALAR >::prepareInference().

+ Here is the caller graph for this function:

◆ _updateOutdatedBNStructure()

template<typename GUM_SCALAR >
virtual void gum::BayesNetInference< GUM_SCALAR >::_updateOutdatedBNStructure ( )
protectedpure virtual

prepares inference when the latter is in OutdatedBNStructure state

Note that the values of evidence are not necessarily known and can be changed between _updateOutdatedBNStructure and _makeInference.

Implemented in gum::SamplingInference< GUM_SCALAR >, gum::LazyPropagation< GUM_SCALAR >, gum::VariableElimination< GUM_SCALAR >, gum::ShaferShenoyInference< GUM_SCALAR >, and gum::LoopyBeliefPropagation< GUM_SCALAR >.

Referenced by gum::BayesNetInference< GUM_SCALAR >::prepareInference().

+ Here is the caller graph for this function:

◆ addEvidence() [1/8]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::addEvidence ( NodeId  id,
const Idx  val 
)
finalvirtual

adds a new hard evidence on node id

Exceptions
UndefinedElementif id does not belong to the Bayesian network
InvalidArgumentif val is not a value for id
InvalidArgumentif id already has an evidence

Definition at line 247 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__createHardEvidence().

Referenced by gum::LoopySamplingInference< GUM_SCALAR, APPROX >::_makeInference(), gum::BayesNetInference< GUM_SCALAR >::addEvidence(), gum::BayesNetInference< GUM_SCALAR >::addListOfEvidence(), gum::BayesNetInference< GUM_SCALAR >::addSetOfEvidence(), gum::MarginalTargetedInference< GUM_SCALAR >::evidenceImpact(), and gum::JointTargetedInference< GUM_SCALAR >::evidenceJointImpact().

248  {
250  }
virtual void addEvidence(NodeId id, const Idx val) final
adds a new hard evidence on node id
Potential< GUM_SCALAR > __createHardEvidence(NodeId id, Idx val) const
create the internal structure for a hard evidence
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addEvidence() [2/8]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::addEvidence ( const std::string &  nodeName,
const Idx  val 
)
finalvirtual

adds a new hard evidence on node named nodeName

Exceptions
UndefinedElementif nodeName does not belong to the Bayesian network
InvalidArgumentif val is not a value for id
InvalidArgumentif nodeName already has an evidence

Definition at line 255 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::addEvidence(), and gum::BayesNetInference< GUM_SCALAR >::BN().

256  {
257  addEvidence(this->BN().idFromName(nodeName), val);
258  }
virtual void addEvidence(NodeId id, const Idx val) final
adds a new hard evidence on node id
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
+ Here is the call graph for this function:

◆ addEvidence() [3/8]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::addEvidence ( NodeId  id,
const std::string &  label 
)
finalvirtual

adds a new hard evidence on node id

Exceptions
UndefinedElementif id does not belong to the Bayesian network
InvalidArgumentif val is not a value for id
InvalidArgumentif id already has an evidence

Definition at line 263 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::addEvidence(), and gum::BayesNetInference< GUM_SCALAR >::BN().

264  {
265  addEvidence(id, this->BN().variable(id)[label]);
266  }
virtual void addEvidence(NodeId id, const Idx val) final
adds a new hard evidence on node id
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
+ Here is the call graph for this function:

◆ addEvidence() [4/8]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::addEvidence ( const std::string &  nodeName,
const std::string &  label 
)
finalvirtual

adds a new hard evidence on node named nodeName

Exceptions
UndefinedElementif nodeName does not belong to the Bayesian network
InvalidArgumentif val is not a value for id
InvalidArgumentif nodeName already has an evidence

Definition at line 271 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::addEvidence(), and gum::BayesNetInference< GUM_SCALAR >::BN().

272  {
273  NodeId id = this->BN().idFromName(nodeName);
274  addEvidence(id, this->BN().variable(id)[label]);
275  }
virtual void addEvidence(NodeId id, const Idx val) final
adds a new hard evidence on node id
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
Size NodeId
Type for node ids.
Definition: graphElements.h:98
+ Here is the call graph for this function:

◆ addEvidence() [5/8]

template<typename GUM_SCALAR >
void gum::BayesNetInference< GUM_SCALAR >::addEvidence ( NodeId  id,
const std::vector< GUM_SCALAR > &  vals 
)
finalvirtual

adds a new evidence on node id (might be soft or hard)

Exceptions
UndefinedElementif id does not belong to the Bayesian network
InvalidArgumentif id already has an evidence
FatalErrorif vals=[0,0,...,0]
InvalidArgumentif the size of vals is different from the domain size of node id

Definition at line 279 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__bn, gum::MultiDimDecorator< GUM_SCALAR >::add(), gum::BayesNetInference< GUM_SCALAR >::addEvidence(), and GUM_ERROR.

280  {
281  // checks that the evidence is meaningful
282  if (__bn == nullptr)
283  GUM_ERROR(NullElement,
284  "No Bayes net has been assigned to the "
285  "inference algorithm");
286 
287  if (!__bn->dag().exists(id)) {
288  GUM_ERROR(UndefinedElement, id << " is not a NodeId in the bn");
289  }
290 
291  if (__bn->variable(id).domainSize() != vals.size()) {
292  GUM_ERROR(InvalidArgument,
293  "node " << __bn->variable(id)
294  << " and its evidence vector have different sizes.");
295  }
296 
297  Potential< GUM_SCALAR > pot;
298  pot.add(__bn->variable(id));
299  pot.fillWith(vals);
300  addEvidence(std::move(pot));
301  }
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
virtual void addEvidence(NodeId id, const Idx val) final
adds a new hard evidence on node id
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
+ Here is the call graph for this function:

◆ addEvidence() [6/8]

template<typename GUM_SCALAR >
void gum::BayesNetInference< GUM_SCALAR >::addEvidence ( const std::string &  nodeName,
const std::vector< GUM_SCALAR > &  vals 
)
finalvirtual

adds a new evidence on node named nodeName (might be soft or hard)

Exceptions
UndefinedElementif id does not belong to the Bayesian network
InvalidArgumentif nodeName already has an evidence
FatalErrorif vals=[0,0,...,0]
InvalidArgumentif the size of vals is different from the domain size of node nodeName

Definition at line 305 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::addEvidence(), and gum::BayesNetInference< GUM_SCALAR >::BN().

306  {
307  addEvidence(this->BN().idFromName(nodeName), vals);
308  }
virtual void addEvidence(NodeId id, const Idx val) final
adds a new hard evidence on node id
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
+ Here is the call graph for this function:

◆ addEvidence() [7/8]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::addEvidence ( const Potential< GUM_SCALAR > &  pot)
finalvirtual

adds a new evidence on node id (might be soft or hard)

Exceptions
UndefinedElementif the potential is defined over several nodes
UndefinedElementif the node on which the potential is defined does not belong to the Bayesian network
InvalidArgumentif the node of the potential already has an evidence
FatalErrorif pot=[0,0,...,0]

Definition at line 354 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::addEvidence().

355  {
356  Potential< GUM_SCALAR > new_pot(pot);
357  addEvidence(std::move(new_pot));
358  }
virtual void addEvidence(NodeId id, const Idx val) final
adds a new hard evidence on node id
+ Here is the call graph for this function:

◆ addEvidence() [8/8]

template<typename GUM_SCALAR >
void gum::BayesNetInference< GUM_SCALAR >::addEvidence ( Potential< GUM_SCALAR > &&  pot)
finalvirtual

adds a new evidence on node id (might be soft or hard)

Exceptions
UndefinedElementif the potential is defined over several nodes
UndefinedElementif the node on which the potential is defined does not belong to the Bayesian network
InvalidArgumentif the node of the potential already has an evidence
FatalErrorif pot=[0,0,...,0]

Definition at line 313 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__bn, gum::BayesNetInference< GUM_SCALAR >::__evidence, gum::BayesNetInference< GUM_SCALAR >::__hard_evidence, gum::BayesNetInference< GUM_SCALAR >::__hard_evidence_nodes, gum::BayesNetInference< GUM_SCALAR >::__isHardEvidence(), gum::BayesNetInference< GUM_SCALAR >::__setState(), gum::BayesNetInference< GUM_SCALAR >::__soft_evidence_nodes, gum::BayesNetInference< GUM_SCALAR >::_onEvidenceAdded(), GUM_ERROR, gum::BayesNetInference< GUM_SCALAR >::hasEvidence(), gum::Set< Key, Alloc >::insert(), and gum::BayesNetInference< GUM_SCALAR >::OutdatedBNStructure.

313  {
314  // check if the potential corresponds to an evidence
315  if (pot.nbrDim() != 1) {
316  GUM_ERROR(InvalidArgument, pot << " is not mono-dimensional.");
317  }
318  if (__bn == nullptr)
319  GUM_ERROR(NullElement,
320  "No Bayes net has been assigned to the "
321  "inference algorithm");
322 
323  NodeId id = __bn->nodeId(pot.variable(0));
324 
325  if (hasEvidence(id)) {
326  GUM_ERROR(InvalidArgument,
327  " node " << id
328  << " already has an evidence. Please use chgEvidence().");
329  }
330 
331  // check whether we have a hard evidence (and also check whether the
332  // potential only contains 0 (in this case, this will automatically raise
333  // an exception) )
334  Idx val;
335  bool is_hard_evidence = __isHardEvidence(pot, val);
336 
337  // insert the evidence
338  __evidence.insert(
339  id,
340  new Potential< GUM_SCALAR >(std::forward< Potential< GUM_SCALAR > >(pot)));
341  if (is_hard_evidence) { // pot is deterministic
342  __hard_evidence.insert(id, val);
344  } else {
346  }
348  _onEvidenceAdded(id, is_hard_evidence);
349  }
NodeProperty< const Potential< GUM_SCALAR > *> __evidence
the set of evidence entered into the network
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
NodeProperty< Idx > __hard_evidence
assign to each node with a hard evidence the index of its observed value
virtual void _onEvidenceAdded(const NodeId id, bool isHardEvidence)=0
fired after a new evidence is inserted
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
bool __isHardEvidence(const Potential< GUM_SCALAR > &pot, Idx &val) const
checks whether a potential corresponds to a hard evidence or not
NodeSet __soft_evidence_nodes
the set of nodes that received soft evidence
virtual bool hasEvidence() const final
indicates whether some node(s) have received evidence
NodeSet __hard_evidence_nodes
the set of nodes that received hard evidence
Size NodeId
Type for node ids.
Definition: graphElements.h:98
void insert(const Key &k)
Inserts a new element into the set.
Definition: set_tpl.h:613
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
+ Here is the call graph for this function:

◆ addListOfEvidence()

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::addListOfEvidence ( const List< const Potential< GUM_SCALAR > * > &  potlist)
finalvirtual

adds a new list of evidence

Exceptions
UndefinedElementif some potential is defined over several nodes
UndefinedElementif the node on which some potential is defined does not belong to the Bayesian network
InvalidArgumentif the node of some potential already has an evidence
FatalErrorif pot=[0,0,...,0]

Definition at line 363 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::addEvidence().

364  {
365  for (const auto pot : potlist)
366  addEvidence(*pot);
367  }
virtual void addEvidence(NodeId id, const Idx val) final
adds a new hard evidence on node id
+ Here is the call graph for this function:

◆ addSetOfEvidence()

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::addSetOfEvidence ( const Set< const Potential< GUM_SCALAR > * > &  potset)
finalvirtual

adds a new set of evidence

Exceptions
UndefinedElementif some potential is defined over several nodes
UndefinedElementif the node on which some potential is defined does not belong to the Bayesian network
InvalidArgumentif the node of some potential already has an evidence
FatalErrorif pot=[0,0,...,0]

Definition at line 372 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::addEvidence().

373  {
374  for (const auto pot : potset)
375  addEvidence(*pot);
376  }
virtual void addEvidence(NodeId id, const Idx val) final
adds a new hard evidence on node id
+ Here is the call graph for this function:

◆ BN()

template<typename GUM_SCALAR >
INLINE const IBayesNet< GUM_SCALAR > & gum::BayesNetInference< GUM_SCALAR >::BN ( ) const
finalvirtual

Returns a constant reference over the IBayesNet referenced by this class.

Exceptions
UndefinedElementis raised if no Bayes net has been assigned to the inference.

Definition at line 121 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__bn, and GUM_ERROR.

Referenced by gum::WeightedSampling< GUM_SCALAR >::_draw(), gum::MonteCarloSampling< GUM_SCALAR >::_draw(), gum::ImportanceSampling< GUM_SCALAR >::_draw(), gum::SamplingInference< GUM_SCALAR >::_posterior(), gum::BayesNetInference< GUM_SCALAR >::addEvidence(), gum::BayesNetInference< GUM_SCALAR >::chgEvidence(), gum::SamplingInference< GUM_SCALAR >::contextualize(), gum::SamplingInference< GUM_SCALAR >::currentPosterior(), gum::BayesNetInference< GUM_SCALAR >::eraseEvidence(), gum::MarginalTargetedInference< GUM_SCALAR >::evidenceImpact(), gum::JointTargetedInference< GUM_SCALAR >::evidenceJointImpact(), gum::MarginalTargetedInference< GUM_SCALAR >::H(), gum::BayesNetInference< GUM_SCALAR >::hasEvidence(), gum::BayesNetInference< GUM_SCALAR >::hasHardEvidence(), gum::BayesNetInference< GUM_SCALAR >::hasSoftEvidence(), gum::JointTargetedInference< GUM_SCALAR >::I(), gum::JointTargetedInference< GUM_SCALAR >::jointMutualInformation(), gum::MarginalTargetedInference< GUM_SCALAR >::posterior(), gum::JointTargetedInference< GUM_SCALAR >::posterior(), gum::SamplingInference< GUM_SCALAR >::samplingBN(), and gum::Estimator< GUM_SCALAR >::setFromLBP().

121  {
122  if (__bn == nullptr)
123  GUM_ERROR(UndefinedElement,
124  "No Bayes net has been assigned to "
125  "the inference algorithm.");
126  return *__bn;
127  }
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
+ Here is the caller graph for this function:

◆ chgEvidence() [1/7]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::chgEvidence ( NodeId  id,
const Idx  val 
)
finalvirtual

change the value of an already existing hard evidence

Exceptions
UndefinedElementif id does not belong to the Bayesian network
InvalidArgumentif val is not a value for id
InvalidArgumentif id does not already have an evidence

Definition at line 432 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__createHardEvidence().

Referenced by gum::BayesNetInference< GUM_SCALAR >::chgEvidence(), gum::MarginalTargetedInference< GUM_SCALAR >::evidenceImpact(), and gum::JointTargetedInference< GUM_SCALAR >::evidenceJointImpact().

433  {
435  }
virtual void chgEvidence(NodeId id, const Idx val) final
change the value of an already existing hard evidence
Potential< GUM_SCALAR > __createHardEvidence(NodeId id, Idx val) const
create the internal structure for a hard evidence
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ chgEvidence() [2/7]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::chgEvidence ( const std::string &  nodeName,
const Idx  val 
)
finalvirtual

change the value of an already existing hard evidence

Exceptions
UndefinedElementif nodeName does not belong to the Bayesian network
InvalidArgumentif val is not a value for id
InvalidArgumentif id does not already have an evidence

Definition at line 440 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::BN(), and gum::BayesNetInference< GUM_SCALAR >::chgEvidence().

441  {
442  chgEvidence(this->BN().idFromName(nodeName), val);
443  }
virtual void chgEvidence(NodeId id, const Idx val) final
change the value of an already existing hard evidence
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
+ Here is the call graph for this function:

◆ chgEvidence() [3/7]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::chgEvidence ( NodeId  id,
const std::string &  label 
)
finalvirtual

change the value of an already existing hard evidence

Exceptions
UndefinedElementif id does not belong to the Bayesian network
InvalidArgumentif val is not a value for id
InvalidArgumentif id does not already have an evidence

Definition at line 448 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::BN(), and gum::BayesNetInference< GUM_SCALAR >::chgEvidence().

449  {
450  chgEvidence(id, this->BN().variable(id)[label]);
451  }
virtual void chgEvidence(NodeId id, const Idx val) final
change the value of an already existing hard evidence
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
+ Here is the call graph for this function:

◆ chgEvidence() [4/7]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::chgEvidence ( const std::string &  nodeName,
const std::string &  label 
)
finalvirtual

change the value of an already existing hard evidence

Exceptions
UndefinedElementif nodeName does not belong to the Bayesian network
InvalidArgumentif val is not a value for id
InvalidArgumentif id does not already have an evidence

Definition at line 456 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::BN(), and gum::BayesNetInference< GUM_SCALAR >::chgEvidence().

457  {
458  NodeId id = this->BN().idFromName(nodeName);
459  chgEvidence(id, this->BN().variable(id)[label]);
460  }
virtual void chgEvidence(NodeId id, const Idx val) final
change the value of an already existing hard evidence
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
Size NodeId
Type for node ids.
Definition: graphElements.h:98
+ Here is the call graph for this function:

◆ chgEvidence() [5/7]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::chgEvidence ( NodeId  id,
const std::vector< GUM_SCALAR > &  vals 
)
finalvirtual

change the value of an already existing evidence (might be soft or hard)

Exceptions
UndefinedElementif id does not belong to the Bayesian network
InvalidArgumentif the node does not already have an evidence
FatalErrorif vals=[0,0,...,0]
InvalidArgumentif the size of vals is different from the domain size of node id

Definition at line 464 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__bn, gum::MultiDimDecorator< GUM_SCALAR >::add(), gum::BayesNetInference< GUM_SCALAR >::chgEvidence(), and GUM_ERROR.

465  {
466  // check whether this corresponds to an evidence
467  if (__bn == nullptr)
468  GUM_ERROR(NullElement,
469  "No Bayes net has been assigned to the "
470  "inference algorithm");
471 
472  if (!__bn->dag().exists(id)) {
473  GUM_ERROR(UndefinedElement, id << " is not a NodeId in the bn");
474  }
475 
476  if (__bn->variable(id).domainSize() != vals.size()) {
477  GUM_ERROR(InvalidArgument,
478  "node " << __bn->variable(id)
479  << " and its evidence have different sizes.");
480  }
481 
482  // create the potential corresponding to vals
483  Potential< GUM_SCALAR > pot;
484  pot.add(__bn->variable(id));
485  pot.fillWith(vals);
486  chgEvidence(pot);
487  }
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
virtual void chgEvidence(NodeId id, const Idx val) final
change the value of an already existing hard evidence
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
+ Here is the call graph for this function:

◆ chgEvidence() [6/7]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::chgEvidence ( const std::string &  nodeName,
const std::vector< GUM_SCALAR > &  vals 
)
finalvirtual

change the value of an already existing evidence (might be soft or hard)

Exceptions
UndefinedElementif nodeName does not belong to the Bayesian network
InvalidArgumentif the node does not already have an evidence
FatalErrorif vals=[0,0,...,0]
InvalidArgumentif the size of vals is different from the domain size of node id

Definition at line 491 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::BN(), and gum::BayesNetInference< GUM_SCALAR >::chgEvidence().

492  {
493  chgEvidence(this->BN().idFromName(nodeName), vals);
494  }
virtual void chgEvidence(NodeId id, const Idx val) final
change the value of an already existing hard evidence
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
+ Here is the call graph for this function:

◆ chgEvidence() [7/7]

template<typename GUM_SCALAR >
void gum::BayesNetInference< GUM_SCALAR >::chgEvidence ( const Potential< GUM_SCALAR > &  pot)
finalvirtual

change the value of an already existing evidence (might be soft or hard)

Exceptions
UndefinedElementif the potential is defined over several nodes
UndefinedElementif the node on which the potential is defined does not belong to the Bayesian network
InvalidArgumentif the node of the potential does not already have an evidence
FatalErrorif pot=[0,0,...,0]

Definition at line 499 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__bn, gum::BayesNetInference< GUM_SCALAR >::__evidence, gum::BayesNetInference< GUM_SCALAR >::__hard_evidence, gum::BayesNetInference< GUM_SCALAR >::__hard_evidence_nodes, gum::BayesNetInference< GUM_SCALAR >::__isHardEvidence(), gum::BayesNetInference< GUM_SCALAR >::__setState(), gum::BayesNetInference< GUM_SCALAR >::__soft_evidence_nodes, gum::BayesNetInference< GUM_SCALAR >::_onEvidenceChanged(), gum::Instantiation::end(), gum::Set< Key, Alloc >::erase(), GUM_ERROR, gum::BayesNetInference< GUM_SCALAR >::hasEvidence(), gum::BayesNetInference< GUM_SCALAR >::hasHardEvidence(), gum::Instantiation::inc(), gum::Set< Key, Alloc >::insert(), gum::BayesNetInference< GUM_SCALAR >::isInferenceOutdatedBNStructure(), gum::MultiDimDecorator< GUM_SCALAR >::nbrDim(), gum::BayesNetInference< GUM_SCALAR >::OutdatedBNPotentials, gum::BayesNetInference< GUM_SCALAR >::OutdatedBNStructure, gum::MultiDimDecorator< GUM_SCALAR >::set(), gum::Instantiation::setFirst(), and gum::MultiDimDecorator< GUM_SCALAR >::variable().

500  {
501  // check if the potential corresponds to an evidence
502  if (pot.nbrDim() != 1) {
503  GUM_ERROR(InvalidArgument, pot << " is not a mono-dimensional potential.");
504  }
505  if (__bn == nullptr)
506  GUM_ERROR(NullElement,
507  "No Bayes net has been assigned to the "
508  "inference algorithm");
509 
510  NodeId id = __bn->nodeId(pot.variable(0));
511 
512  if (!hasEvidence(id)) {
513  GUM_ERROR(InvalidArgument,
514  id << " has no evidence. Please use addEvidence().");
515  }
516 
517  // check whether we have a hard evidence (and also check whether the
518  // potential only contains 0 (in this case, this will automatically raise
519  // an exception) )
520  Idx val;
521  bool is_hard_evidence = __isHardEvidence(pot, val);
522 
523  // modify the evidence already stored
524  const Potential< GUM_SCALAR >* localPot = __evidence[id];
525  Instantiation I(pot);
526  for (I.setFirst(); !I.end(); I.inc()) {
527  localPot->set(I, pot[I]);
528  }
529 
530  // the inference state will be different
531  // whether evidence change from Hard to Soft or not.
532  bool hasChangedSoftHard = false;
533 
534  if (is_hard_evidence) {
535  if (!hasHardEvidence(id)) {
536  hasChangedSoftHard = true;
537  __hard_evidence.insert(id, val);
540  } else {
541  __hard_evidence[id] = val;
542  }
543  } else {
544  if (hasHardEvidence(id)) { // evidence was hard
545  __hard_evidence.erase(id);
548  hasChangedSoftHard = true;
549  }
550  }
551 
552  if (hasChangedSoftHard) {
554  } else {
557  }
558  }
559 
560  _onEvidenceChanged(id, hasChangedSoftHard);
561  }
NodeProperty< const Potential< GUM_SCALAR > *> __evidence
the set of evidence entered into the network
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
NodeProperty< Idx > __hard_evidence
assign to each node with a hard evidence the index of its observed value
virtual bool hasHardEvidence(NodeId id) const final
indicates whether node id has received a hard evidence
virtual void _onEvidenceChanged(const NodeId id, bool hasChangedSoftHard)=0
fired after an evidence is changed, in particular when its status (soft/hard) changes ...
virtual bool isInferenceOutdatedBNStructure() const noexcept final
returns whether the inference object is in a OutdatedBNStructure state
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
void erase(const Key &k)
Erases an element from the set.
Definition: set_tpl.h:656
bool __isHardEvidence(const Potential< GUM_SCALAR > &pot, Idx &val) const
checks whether a potential corresponds to a hard evidence or not
NodeSet __soft_evidence_nodes
the set of nodes that received soft evidence
virtual bool hasEvidence() const final
indicates whether some node(s) have received evidence
NodeSet __hard_evidence_nodes
the set of nodes that received hard evidence
Size NodeId
Type for node ids.
Definition: graphElements.h:98
void insert(const Key &k)
Inserts a new element into the set.
Definition: set_tpl.h:613
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
+ Here is the call graph for this function:

◆ clear()

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::clear ( )
virtual

clears all the data structures allocated for the last inference

Definition at line 153 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__setState(), gum::BayesNetInference< GUM_SCALAR >::eraseAllEvidence(), and gum::BayesNetInference< GUM_SCALAR >::OutdatedBNStructure.

Referenced by gum::BayesNetInference< GUM_SCALAR >::setBN().

153  {
156  }
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
virtual void eraseAllEvidence() final
removes all the evidence entered into the network
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ domainSizes()

template<typename GUM_SCALAR >
INLINE const NodeProperty< Size > & gum::BayesNetInference< GUM_SCALAR >::domainSizes ( ) const
finalvirtual

get the domain sizes of the random variables of the BN

Definition at line 174 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__domain_sizes.

174  {
175  return __domain_sizes;
176  }
NodeProperty< Size > __domain_sizes
the domain sizes of the random variables

◆ eraseAllEvidence()

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::eraseAllEvidence ( )
finalvirtual

removes all the evidence entered into the network

Definition at line 595 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__evidence, gum::BayesNetInference< GUM_SCALAR >::__hard_evidence, gum::BayesNetInference< GUM_SCALAR >::__hard_evidence_nodes, gum::BayesNetInference< GUM_SCALAR >::__setState(), gum::BayesNetInference< GUM_SCALAR >::__soft_evidence_nodes, gum::BayesNetInference< GUM_SCALAR >::_onAllEvidenceErased(), gum::Set< Key, Alloc >::clear(), gum::BayesNetInference< GUM_SCALAR >::isInferenceOutdatedBNStructure(), gum::BayesNetInference< GUM_SCALAR >::OutdatedBNPotentials, and gum::BayesNetInference< GUM_SCALAR >::OutdatedBNStructure.

Referenced by gum::BayesNetInference< GUM_SCALAR >::clear(), gum::MarginalTargetedInference< GUM_SCALAR >::evidenceImpact(), gum::JointTargetedInference< GUM_SCALAR >::evidenceJointImpact(), and gum::JointTargetedInference< GUM_SCALAR >::jointMutualInformation().

595  {
596  bool has_hard_evidence = !__hard_evidence.empty();
597  this->_onAllEvidenceErased(has_hard_evidence);
598 
599  for (const auto& pair : __evidence) {
600  if (pair.second != nullptr) { delete (pair.second); }
601  }
602 
603  __evidence.clear();
604  __hard_evidence.clear();
607 
608  if (has_hard_evidence) {
610  } else {
613  }
614  }
615  }
NodeProperty< const Potential< GUM_SCALAR > *> __evidence
the set of evidence entered into the network
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
NodeProperty< Idx > __hard_evidence
assign to each node with a hard evidence the index of its observed value
virtual void _onAllEvidenceErased(bool contains_hard_evidence)=0
fired before all the evidence are erased
virtual bool isInferenceOutdatedBNStructure() const noexcept final
returns whether the inference object is in a OutdatedBNStructure state
NodeSet __soft_evidence_nodes
the set of nodes that received soft evidence
NodeSet __hard_evidence_nodes
the set of nodes that received hard evidence
void clear()
Removes all the elements, if any, from the set.
Definition: set_tpl.h:375
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ eraseEvidence() [1/2]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::eraseEvidence ( NodeId  id)
finalvirtual

removed the evidence, if any, corresponding to node id

Definition at line 566 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__evidence, gum::BayesNetInference< GUM_SCALAR >::__hard_evidence, gum::BayesNetInference< GUM_SCALAR >::__hard_evidence_nodes, gum::BayesNetInference< GUM_SCALAR >::__setState(), gum::BayesNetInference< GUM_SCALAR >::__soft_evidence_nodes, gum::BayesNetInference< GUM_SCALAR >::_onEvidenceErased(), gum::Set< Key, Alloc >::erase(), gum::BayesNetInference< GUM_SCALAR >::hasEvidence(), gum::BayesNetInference< GUM_SCALAR >::hasHardEvidence(), gum::BayesNetInference< GUM_SCALAR >::isInferenceOutdatedBNStructure(), gum::BayesNetInference< GUM_SCALAR >::OutdatedBNPotentials, and gum::BayesNetInference< GUM_SCALAR >::OutdatedBNStructure.

Referenced by gum::BayesNetInference< GUM_SCALAR >::eraseEvidence().

566  {
567  if (hasEvidence(id)) {
568  if (hasHardEvidence(id)) {
569  _onEvidenceErased(id, true);
570  __hard_evidence.erase(id);
573  } else {
574  _onEvidenceErased(id, false);
578  }
579  }
580 
581  delete (__evidence[id]);
582  __evidence.erase(id);
583  }
584  }
NodeProperty< const Potential< GUM_SCALAR > *> __evidence
the set of evidence entered into the network
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
NodeProperty< Idx > __hard_evidence
assign to each node with a hard evidence the index of its observed value
virtual bool hasHardEvidence(NodeId id) const final
indicates whether node id has received a hard evidence
virtual bool isInferenceOutdatedBNStructure() const noexcept final
returns whether the inference object is in a OutdatedBNStructure state
void erase(const Key &k)
Erases an element from the set.
Definition: set_tpl.h:656
NodeSet __soft_evidence_nodes
the set of nodes that received soft evidence
virtual bool hasEvidence() const final
indicates whether some node(s) have received evidence
NodeSet __hard_evidence_nodes
the set of nodes that received hard evidence
virtual void _onEvidenceErased(const NodeId id, bool isHardEvidence)=0
fired before an evidence is removed
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ eraseEvidence() [2/2]

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::eraseEvidence ( const std::string &  nodeName)
finalvirtual

removed the evidence, if any, corresponding to node of name nodeName

Definition at line 588 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::BN(), and gum::BayesNetInference< GUM_SCALAR >::eraseEvidence().

588  {
589  eraseEvidence(this->BN().idFromName(nodeName));
590  }
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
virtual void eraseEvidence(NodeId id) final
removed the evidence, if any, corresponding to node id
+ Here is the call graph for this function:

◆ evidence()

template<typename GUM_SCALAR >
INLINE const NodeProperty< const Potential< GUM_SCALAR > *> & gum::BayesNetInference< GUM_SCALAR >::evidence ( ) const

returns the set of evidence

Definition at line 650 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__evidence.

Referenced by gum::ImportanceSampling< GUM_SCALAR >::_onContextualize(), and gum::MarginalTargetedInference< GUM_SCALAR >::posterior().

650  {
651  return __evidence;
652  }
NodeProperty< const Potential< GUM_SCALAR > *> __evidence
the set of evidence entered into the network
+ Here is the caller graph for this function:

◆ hardEvidence()

template<typename GUM_SCALAR >
INLINE const NodeProperty< Idx > & gum::BayesNetInference< GUM_SCALAR >::hardEvidence ( ) const

indicate for each node with hard evidence which value it took

Definition at line 642 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__hard_evidence.

Referenced by gum::WeightedSampling< GUM_SCALAR >::_draw(), gum::MonteCarloSampling< GUM_SCALAR >::_draw(), gum::ImportanceSampling< GUM_SCALAR >::_draw(), and gum::SamplingInference< GUM_SCALAR >::contextualize().

642  {
643  return __hard_evidence;
644  }
NodeProperty< Idx > __hard_evidence
assign to each node with a hard evidence the index of its observed value
+ Here is the caller graph for this function:

◆ hardEvidenceNodes()

template<typename GUM_SCALAR >
INLINE const NodeSet & gum::BayesNetInference< GUM_SCALAR >::hardEvidenceNodes ( ) const

returns the set of nodes with hard evidence

the set of nodes that received hard evidence

Definition at line 666 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__hard_evidence_nodes.

Referenced by gum::WeightedSampling< GUM_SCALAR >::_draw(), gum::MonteCarloSampling< GUM_SCALAR >::_draw(), gum::ImportanceSampling< GUM_SCALAR >::_draw(), gum::ImportanceSampling< GUM_SCALAR >::_onContextualize(), gum::SamplingInference< GUM_SCALAR >::_setEstimatorFromBN(), gum::SamplingInference< GUM_SCALAR >::_setEstimatorFromLBP(), gum::SamplingInference< GUM_SCALAR >::contextualize(), and gum::MarginalTargetedInference< GUM_SCALAR >::posterior().

666  {
667  return __hard_evidence_nodes;
668  }
NodeSet __hard_evidence_nodes
the set of nodes that received hard evidence
+ Here is the caller graph for this function:

◆ hasEvidence() [1/3]

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::hasEvidence ( ) const
finalvirtual

indicates whether some node(s) have received evidence

Definition at line 381 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__evidence.

Referenced by gum::BayesNetInference< GUM_SCALAR >::addEvidence(), gum::BayesNetInference< GUM_SCALAR >::chgEvidence(), gum::BayesNetInference< GUM_SCALAR >::eraseEvidence(), and gum::BayesNetInference< GUM_SCALAR >::hasEvidence().

381  {
382  return !__evidence.empty();
383  }
NodeProperty< const Potential< GUM_SCALAR > *> __evidence
the set of evidence entered into the network
+ Here is the caller graph for this function:

◆ hasEvidence() [2/3]

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::hasEvidence ( NodeId  id) const
finalvirtual

indicates whether node id has received an evidence

Definition at line 388 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__evidence.

388  {
389  return __evidence.exists(id);
390  }
NodeProperty< const Potential< GUM_SCALAR > *> __evidence
the set of evidence entered into the network

◆ hasEvidence() [3/3]

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::hasEvidence ( const std::string &  nodeName) const
finalvirtual

indicates whether node id has received an evidence

Definition at line 409 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::BN(), and gum::BayesNetInference< GUM_SCALAR >::hasEvidence().

410  {
411  return hasEvidence(this->BN().idFromName(nodeName));
412  }
virtual bool hasEvidence() const final
indicates whether some node(s) have received evidence
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
+ Here is the call graph for this function:

◆ hasHardEvidence() [1/2]

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::hasHardEvidence ( NodeId  id) const
finalvirtual

indicates whether node id has received a hard evidence

Definition at line 395 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__hard_evidence_nodes, and gum::Set< Key, Alloc >::exists().

Referenced by gum::ImportanceSampling< GUM_SCALAR >::_draw(), gum::BayesNetInference< GUM_SCALAR >::chgEvidence(), gum::BayesNetInference< GUM_SCALAR >::eraseEvidence(), and gum::BayesNetInference< GUM_SCALAR >::hasHardEvidence().

395  {
396  return __hard_evidence_nodes.exists(id);
397  }
bool exists(const Key &k) const
Indicates whether a given elements belong to the set.
Definition: set_tpl.h:607
NodeSet __hard_evidence_nodes
the set of nodes that received hard evidence
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ hasHardEvidence() [2/2]

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::hasHardEvidence ( const std::string &  nodeName) const
finalvirtual

indicates whether node id has received a hard evidence

Definition at line 417 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::BN(), and gum::BayesNetInference< GUM_SCALAR >::hasHardEvidence().

418  {
419  return hasHardEvidence(this->BN().idFromName(nodeName));
420  }
virtual bool hasHardEvidence(NodeId id) const final
indicates whether node id has received a hard evidence
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
+ Here is the call graph for this function:

◆ hasSoftEvidence() [1/2]

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::hasSoftEvidence ( NodeId  id) const
finalvirtual

indicates whether node id has received a soft evidence

Definition at line 402 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__soft_evidence_nodes, and gum::Set< Key, Alloc >::exists().

Referenced by gum::BayesNetInference< GUM_SCALAR >::hasSoftEvidence().

402  {
403  return __soft_evidence_nodes.exists(id);
404  }
bool exists(const Key &k) const
Indicates whether a given elements belong to the set.
Definition: set_tpl.h:607
NodeSet __soft_evidence_nodes
the set of nodes that received soft evidence
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ hasSoftEvidence() [2/2]

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::hasSoftEvidence ( const std::string &  nodeName) const
finalvirtual

indicates whether node id has received a soft evidence

Definition at line 425 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::BN(), and gum::BayesNetInference< GUM_SCALAR >::hasSoftEvidence().

426  {
427  return hasSoftEvidence(this->BN().idFromName(nodeName));
428  }
virtual bool hasSoftEvidence(NodeId id) const final
indicates whether node id has received a soft evidence
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
+ Here is the call graph for this function:

◆ isDone()

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::isDone ( ) const
finalvirtualnoexcept

returns whether the inference object is in a done state

The inference object is in a done state when the posteriors can be retrieved without performing a new inference, i.e., all the heavy computations have already been performed. Typically, in a junction tree algorithm, this corresponds to a situation in which all the messages needed in the JT have been computed and sent.

Definition at line 96 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__state, and gum::BayesNetInference< GUM_SCALAR >::Done.

Referenced by gum::JointTargetedInference< GUM_SCALAR >::jointPosterior(), gum::BayesNetInference< GUM_SCALAR >::makeInference(), gum::MarginalTargetedInference< GUM_SCALAR >::posterior(), and gum::BayesNetInference< GUM_SCALAR >::prepareInference().

96  {
97  return (__state == StateOfInference::Done);
98  }
StateOfInference __state
the current state of the inference (outdated/ready/done)
+ Here is the caller graph for this function:

◆ isInferenceDone()

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::isInferenceDone ( ) const
finalvirtualnoexcept

returns whether the inference object is in a InferenceDone state

Definition at line 89 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__state, and gum::BayesNetInference< GUM_SCALAR >::Done.

89  {
90  return (__state == StateOfInference::Done);
91  }
StateOfInference __state
the current state of the inference (outdated/ready/done)

◆ isInferenceOutdatedBNPotentials()

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::isInferenceOutdatedBNPotentials ( ) const
finalvirtualnoexcept

returns whether the inference object is in a OutdatedBNPotential state

Definition at line 83 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__state, and gum::BayesNetInference< GUM_SCALAR >::OutdatedBNPotentials.

84  {
86  }
StateOfInference __state
the current state of the inference (outdated/ready/done)

◆ isInferenceOutdatedBNStructure()

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::isInferenceOutdatedBNStructure ( ) const
finalvirtualnoexcept

returns whether the inference object is in a OutdatedBNStructure state

Definition at line 76 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__state, and gum::BayesNetInference< GUM_SCALAR >::OutdatedBNStructure.

Referenced by gum::BayesNetInference< GUM_SCALAR >::chgEvidence(), gum::BayesNetInference< GUM_SCALAR >::eraseAllEvidence(), and gum::BayesNetInference< GUM_SCALAR >::eraseEvidence().

77  {
79  }
StateOfInference __state
the current state of the inference (outdated/ready/done)
+ Here is the caller graph for this function:

◆ isInferenceReady()

template<typename GUM_SCALAR >
INLINE bool gum::BayesNetInference< GUM_SCALAR >::isInferenceReady ( ) const
finalvirtualnoexcept

returns whether the inference object is in a ready state

Definition at line 70 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__state, and gum::BayesNetInference< GUM_SCALAR >::ReadyForInference.

Referenced by gum::SamplingInference< GUM_SCALAR >::_onStateChanged(), gum::BayesNetInference< GUM_SCALAR >::makeInference(), and gum::BayesNetInference< GUM_SCALAR >::prepareInference().

70  {
72  }
StateOfInference __state
the current state of the inference (outdated/ready/done)
+ Here is the caller graph for this function:

◆ makeInference()

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::makeInference ( )
finalvirtual

perform the heavy computations needed to compute the targets' posteriors

In a Junction tree propagation scheme, for instance, the heavy computations are those of the messages sent in the JT. This is precisely what makeInference should compute. Later, the computations of the posteriors can be done "lightly" by multiplying and projecting those messages.

Definition at line 711 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__setState(), gum::BayesNetInference< GUM_SCALAR >::_makeInference(), gum::BayesNetInference< GUM_SCALAR >::Done, gum::BayesNetInference< GUM_SCALAR >::isDone(), gum::BayesNetInference< GUM_SCALAR >::isInferenceReady(), and gum::BayesNetInference< GUM_SCALAR >::prepareInference().

Referenced by gum::LoopySamplingInference< GUM_SCALAR, APPROX >::_makeInference(), gum::MCBayesNetGenerator< GUM_SCALAR, ICPTGenerator, ICPTDisturber >::disturbBN(), gum::MarginalTargetedInference< GUM_SCALAR >::evidenceImpact(), gum::JointTargetedInference< GUM_SCALAR >::evidenceJointImpact(), gum::JointTargetedInference< GUM_SCALAR >::jointMutualInformation(), gum::JointTargetedInference< GUM_SCALAR >::jointPosterior(), and gum::MarginalTargetedInference< GUM_SCALAR >::posterior().

711  {
712  if (isDone()) { return; }
713 
714  if (!isInferenceReady()) { prepareInference(); }
715 
716  _makeInference();
717 
719  }
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
virtual void _makeInference()=0
called when the inference has to be performed effectively
virtual void prepareInference() final
prepare the internal inference structures for the next inference
virtual bool isDone() const noexcept final
returns whether the inference object is in a done state
virtual bool isInferenceReady() const noexcept final
returns whether the inference object is in a ready state
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nbrEvidence()

template<typename GUM_SCALAR >
INLINE Size gum::BayesNetInference< GUM_SCALAR >::nbrEvidence ( ) const
finalvirtual

returns the number of evidence entered into the Bayesian network

Definition at line 620 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__evidence.

620  {
621  return __evidence.size();
622  }
NodeProperty< const Potential< GUM_SCALAR > *> __evidence
the set of evidence entered into the network

◆ nbrHardEvidence()

template<typename GUM_SCALAR >
INLINE Size gum::BayesNetInference< GUM_SCALAR >::nbrHardEvidence ( ) const
finalvirtual

returns the number of hard evidence entered into the Bayesian network

Definition at line 627 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__hard_evidence_nodes, and gum::Set< Key, Alloc >::size().

627  {
628  return __hard_evidence_nodes.size();
629  }
NodeSet __hard_evidence_nodes
the set of nodes that received hard evidence
Size size() const noexcept
Returns the number of elements in the set.
Definition: set_tpl.h:701
+ Here is the call graph for this function:

◆ nbrSoftEvidence()

template<typename GUM_SCALAR >
INLINE Size gum::BayesNetInference< GUM_SCALAR >::nbrSoftEvidence ( ) const
finalvirtual

returns the number of soft evidence entered into the Bayesian network

Definition at line 634 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__soft_evidence_nodes, and gum::Set< Key, Alloc >::size().

634  {
635  return __soft_evidence_nodes.size();
636  }
NodeSet __soft_evidence_nodes
the set of nodes that received soft evidence
Size size() const noexcept
Returns the number of elements in the set.
Definition: set_tpl.h:701
+ Here is the call graph for this function:

◆ prepareInference()

template<typename GUM_SCALAR >
INLINE void gum::BayesNetInference< GUM_SCALAR >::prepareInference ( )
finalvirtual

prepare the internal inference structures for the next inference

Definition at line 692 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__bn, gum::BayesNetInference< GUM_SCALAR >::__setState(), gum::BayesNetInference< GUM_SCALAR >::__state, gum::BayesNetInference< GUM_SCALAR >::_updateOutdatedBNPotentials(), gum::BayesNetInference< GUM_SCALAR >::_updateOutdatedBNStructure(), GUM_ERROR, gum::BayesNetInference< GUM_SCALAR >::isDone(), gum::BayesNetInference< GUM_SCALAR >::isInferenceReady(), gum::BayesNetInference< GUM_SCALAR >::OutdatedBNStructure, and gum::BayesNetInference< GUM_SCALAR >::ReadyForInference.

Referenced by gum::BayesNetInference< GUM_SCALAR >::makeInference(), and gum::SamplingInference< GUM_SCALAR >::samplingBN().

692  {
693  if (isInferenceReady() || isDone()) { return; }
694 
695  if (__bn == nullptr)
696  GUM_ERROR(NullElement,
697  "No Bayes net has been assigned to the "
698  "inference algorithm");
699 
702  else
704 
706  }
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
StateOfInference __state
the current state of the inference (outdated/ready/done)
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
virtual void _updateOutdatedBNPotentials()=0
prepares inference when the latter is in OutdatedBNPotentials state
virtual bool isDone() const noexcept final
returns whether the inference object is in a done state
virtual void _updateOutdatedBNStructure()=0
prepares inference when the latter is in OutdatedBNStructure state
virtual bool isInferenceReady() const noexcept final
returns whether the inference object is in a ready state
#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:

◆ setBN()

template<typename GUM_SCALAR >
void gum::BayesNetInference< GUM_SCALAR >::setBN ( const IBayesNet< GUM_SCALAR > *  bn)
virtual

assigns a new BN to the inference engine

Assigns a new BN to the BayesNetInference engine and sends messages to the descendants of BayesNetInference to inform them that the BN has changed.

Warning
By default, all the nodes of the Bayes net are targets.
note that, by aGrUM's rule, the bn is not copied into the inference engine but only referenced.

Definition at line 132 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__bn, gum::BayesNetInference< GUM_SCALAR >::__computeDomainSizes(), gum::BayesNetInference< GUM_SCALAR >::__setState(), gum::BayesNetInference< GUM_SCALAR >::_onBayesNetChanged(), gum::BayesNetInference< GUM_SCALAR >::clear(), and gum::BayesNetInference< GUM_SCALAR >::OutdatedBNStructure.

132  {
133  clear();
134  __bn = bn;
136  _onBayesNetChanged(bn);
138  }
virtual void __setState(const StateOfInference state) final
set the state of the inference engine and call the notification _onStateChanged when necessary (i...
virtual void _onBayesNetChanged(const IBayesNet< GUM_SCALAR > *bn)=0
fired after a new Bayes net has been assigned to the engine
const IBayesNet< GUM_SCALAR > * __bn
the Bayes net on which we perform inferences
virtual void clear()
clears all the data structures allocated for the last inference
void __computeDomainSizes()
computes the domain sizes of the random variables
+ Here is the call graph for this function:

◆ softEvidenceNodes()

template<typename GUM_SCALAR >
INLINE const NodeSet & gum::BayesNetInference< GUM_SCALAR >::softEvidenceNodes ( ) const

returns the set of nodes with soft evidence

the set of nodes that received soft evidence

Definition at line 658 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__soft_evidence_nodes.

Referenced by gum::SamplingInference< GUM_SCALAR >::contextualize().

658  {
659  return __soft_evidence_nodes;
660  }
NodeSet __soft_evidence_nodes
the set of nodes that received soft evidence
+ Here is the caller graph for this function:

◆ state()

template<typename GUM_SCALAR >
INLINE BayesNetInference< GUM_SCALAR >::StateOfInference gum::BayesNetInference< GUM_SCALAR >::state ( ) const
finalvirtualnoexcept

returns the state of the inference engine

Definition at line 104 of file BayesNetInference_tpl.h.

References gum::BayesNetInference< GUM_SCALAR >::__state.

Referenced by gum::BayesNetInference< GUM_SCALAR >::__setState().

104  {
105  return __state;
106  }
StateOfInference __state
the current state of the inference (outdated/ready/done)
+ Here is the caller graph for this function:

Member Data Documentation

◆ __bn

◆ __domain_sizes

template<typename GUM_SCALAR >
NodeProperty< Size > gum::BayesNetInference< GUM_SCALAR >::__domain_sizes
private

the domain sizes of the random variables

Definition at line 586 of file BayesNetInference.h.

Referenced by gum::BayesNetInference< GUM_SCALAR >::__computeDomainSizes(), and gum::BayesNetInference< GUM_SCALAR >::domainSizes().

◆ __evidence

◆ __hard_evidence

◆ __hard_evidence_nodes

◆ __soft_evidence_nodes

◆ __state

◆ EvidenceInference< GUM_SCALAR >

template<typename GUM_SCALAR >
friend gum::BayesNetInference< GUM_SCALAR >::EvidenceInference< GUM_SCALAR >
private

Definition at line 621 of file BayesNetInference.h.

◆ JointTargetedInference< GUM_SCALAR >

template<typename GUM_SCALAR >
friend gum::BayesNetInference< GUM_SCALAR >::JointTargetedInference< GUM_SCALAR >
private

Definition at line 620 of file BayesNetInference.h.

◆ MarginalTargetedInference< GUM_SCALAR >

template<typename GUM_SCALAR >
friend gum::BayesNetInference< GUM_SCALAR >::MarginalTargetedInference< GUM_SCALAR >
private

allow JointInference to access the single targets and inference states

Definition at line 619 of file BayesNetInference.h.


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