aGrUM  0.16.0
lazyPropagation.h
Go to the documentation of this file.
1 
30 #ifndef GUM_LAZY_PROPAGATION_H
31 #define GUM_LAZY_PROPAGATION_H
32 
33 #include <utility>
34 
35 #include <agrum/core/math/math.h>
40 #include <agrum/agrum.h>
42 
43 namespace gum {
44 
45 
46  // the function used to combine two tables
47  template < typename GUM_SCALAR >
48  INLINE static Potential< GUM_SCALAR >*
50  const Potential< GUM_SCALAR >& t2) {
51  return new Potential< GUM_SCALAR >(t1 * t2);
52  }
53 
54  // the function used to combine two tables
55  template < typename GUM_SCALAR >
56  INLINE static Potential< GUM_SCALAR >*
58  const Set< const DiscreteVariable* >& del_vars) {
59  return new Potential< GUM_SCALAR >(t1.margSumOut(del_vars));
60  }
61 
62 
70  template < typename GUM_SCALAR >
72  : public JointTargetedInference< GUM_SCALAR >
73  , public EvidenceInference< GUM_SCALAR > {
74  public:
75  // ############################################################################
77  // ############################################################################
79 
81  explicit LazyPropagation(
86  bool use_binary_join_tree = true);
87 
90 
94 
96  ~LazyPropagation() final;
97 
99 
100 
101  // ############################################################################
103  // ############################################################################
105 
107  void setTriangulation(const Triangulation& new_triangulation);
108 
110 
119 
121 
127 
128 
130 
133  const JoinTree* joinTree();
134 
136 
140  const JunctionTree* junctionTree();
142  GUM_SCALAR evidenceProbability() final;
143 
145 
146 
147  protected:
149  void _onEvidenceAdded(const NodeId id, bool isHardEvidence) final;
150 
152  void _onEvidenceErased(const NodeId id, bool isHardEvidence) final;
153 
155  void _onAllEvidenceErased(bool has_hard_evidence) final;
156 
164  void _onEvidenceChanged(const NodeId id, bool hasChangedSoftHard) final;
165 
167 
168  void _onMarginalTargetAdded(const NodeId id) final;
169 
171 
172  void _onMarginalTargetErased(const NodeId id) final;
173 
175  virtual void _onBayesNetChanged(const IBayesNet< GUM_SCALAR >* bn) final;
176 
178 
179  void _onJointTargetAdded(const NodeSet& set) final;
180 
182 
183  void _onJointTargetErased(const NodeSet& set) final;
184 
186  void _onAllMarginalTargetsAdded() final;
187 
189  void _onAllMarginalTargetsErased() final;
190 
192  void _onAllJointTargetsErased() final;
193 
195  void _onAllTargetsErased() final;
196 
198  void _onStateChanged() final{};
199 
201 
204  void _updateOutdatedBNStructure() final;
205 
207 
210  void _updateOutdatedBNPotentials() final;
211 
213 
214  void _makeInference() final;
215 
216 
218 
219  const Potential< GUM_SCALAR >& _posterior(NodeId id) final;
220 
222 
224  const Potential< GUM_SCALAR >& _jointPosterior(const NodeSet& set) final;
225 
234  _jointPosterior(const NodeSet& wanted_target,
235  const NodeSet& declared_target) final;
236 
239 
242 
243 
244  private:
248 
249 
252 
257  Set< const DiscreteVariable* >& kept_vars);
258 
261 
263  Potential< GUM_SCALAR >* (*__projection_op)(
266 
268  Potential< GUM_SCALAR >* (*__combination_op)(const Potential< GUM_SCALAR >&,
269  const Potential< GUM_SCALAR >&){
271 
274 
278 
280 
286 
288  JoinTree* __JT{nullptr};
289 
292 
294 
297  bool __is_new_jt_needed{true};
298 
300 
307 
310 
313 
315 
321 
323 
326 
328 
334 
336 
338 
340 
342 
348 
351 
355 
357 
364 
366 
371 
374 
377 
381 
383  const GUM_SCALAR __1_minus_epsilon{GUM_SCALAR(1.0 - 1e-6)};
384 
385 
387  bool __isNewJTNeeded() const;
388 
390  void __createNewJT();
392  void __setProjectionFunction(Potential< GUM_SCALAR >* (*proj)(
393  const Potential< GUM_SCALAR >&, const Set< const DiscreteVariable* >&));
394 
396  void __setCombinationFunction(Potential< GUM_SCALAR >* (*comb)(
397  const Potential< GUM_SCALAR >&, const Potential< GUM_SCALAR >&));
398 
401  NodeId to_id,
402  NodeSet& invalidated_cliques);
403 
406 
408  void __computeJoinTreeRoots();
409 
414  __PotentialSet& pot_list, Set< const DiscreteVariable* >& kept_vars);
415 
420  __PotentialSet& pot_list, Set< const DiscreteVariable* >& kept_vars);
421 
426  __PotentialSet& pot_list, Set< const DiscreteVariable* >& kept_vars);
427 
431  void __findRelevantPotentialsGetAll(__PotentialSet& pot_list,
432  Set< const DiscreteVariable* >& kept_vars);
433 
437  void __findRelevantPotentialsXX(__PotentialSet& pot_list,
438  Set< const DiscreteVariable* >& kept_vars);
439 
440  // remove barren variables and return the newly created projected potentials
441  __PotentialSet
442  __removeBarrenVariables(__PotentialSet& pot_list,
444 
447  __PotentialSet __marginalizeOut(__PotentialSet pot_list,
449  Set< const DiscreteVariable* >& kept_vars);
450 
452  void __produceMessage(NodeId from_id, NodeId to_id);
453 
455  void __collectMessage(NodeId id, NodeId from);
456  };
457 
458 
459 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS
460  extern template class LazyPropagation< double >;
461 #endif
462 
463 
464 } /* namespace gum */
465 
467 
468 #endif /* GUM_LAZY_PROPAGATION_H */
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
~LazyPropagation() final
destructor
NodeProperty< const Potential< GUM_SCALAR > *> __node_to_soft_evidence
the soft evidence stored in the cliques per their assigned node in the BN
aGrUM&#39;s Potential is a multi-dimensional array with tensor operators.
Definition: potential.h:60
HashTable< NodeSet, const Potential< GUM_SCALAR > *> __joint_target_posteriors
the set of set target posteriors computed during the last inference
ArcProperty< bool > __messages_computed
indicates whether a message (from one clique to another) has been computed
void setFindBarrenNodesType(FindBarrenNodesType type)
sets how we determine barren nodes
NodeProperty< const Potential< GUM_SCALAR > *> __hard_ev_projected_CPTs
the CPTs that were projected due to hard evidence nodes
Set< const Potential< GUM_SCALAR > *> __PotentialSet
void _updateOutdatedBNStructure() final
prepares inference when the latter is in OutdatedBNStructure state
LazyPropagation< GUM_SCALAR > & operator=(const LazyPropagation< GUM_SCALAR > &)=delete
avoid copy operators
bool __isNewJTNeeded() const
check whether a new join tree is really needed for the next inference
void setRelevantPotentialsFinderType(RelevantPotentialsFinderType type)
sets how we determine the relevant potentials to combine
JunctionTree * __junctionTree
the junction tree to answer the last inference query
Triangulation * __triangulation
the triangulation class creating the junction tree used for inference
void _onAllEvidenceErased(bool has_hard_evidence) final
fired before all the evidence are erased
void __findRelevantPotentialsWithdSeparation3(__PotentialSet &pot_list, Set< const DiscreteVariable * > &kept_vars)
update a set of potentials: the remaining are those to be combined to produce a message on a separato...
bool __is_new_jt_needed
indicates whether a new join tree is needed for the next inference
Potential< GUM_SCALAR > * _unnormalizedJointPosterior(NodeId id) final
returns a fresh potential equal to P(argument,evidence)
Safe iterators for the Set classDevelopers may consider using Set<x>::iterator_safe instead of SetIte...
Definition: set.h:811
ArcProperty< __PotentialSet > __created_potentials
the set of potentials created for the last inference messages
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
void setTriangulation(const Triangulation &new_triangulation)
use a new triangulation algorithm
void __findRelevantPotentialsXX(__PotentialSet &pot_list, Set< const DiscreteVariable * > &kept_vars)
update a set of potentials: the remaining are those to be combined to produce a message on a separato...
void __findRelevantPotentialsWithdSeparation2(__PotentialSet &pot_list, Set< const DiscreteVariable * > &kept_vars)
update a set of potentials: the remaining are those to be combined to produce a message on a separato...
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
NodeSet __hard_ev_nodes
the hard evidence nodes which were projected in CPTs
Class representing the minimal interface for Bayesian Network.
Definition: IBayesNet.h:62
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Definition: agrum.h:25
GUM_SCALAR evidenceProbability() final
returns the probability of evidence
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
void _onJointTargetAdded(const NodeSet &set) final
fired after a new joint target is inserted
void _onAllJointTargetsErased() final
fired before a all the joint targets are removed
const Potential< GUM_SCALAR > & _jointPosterior(const NodeSet &set) final
returns the posterior of a declared target set
RelevantPotentialsFinderType
type of algorithm for determining the relevant potentials for combinations using some d-separation an...
static INLINE Potential< GUM_SCALAR > * LPNewmultiPotential(const Potential< GUM_SCALAR > &t1, const Potential< GUM_SCALAR > &t2)
FindBarrenNodesType __barren_nodes_type
the type of barren nodes computation we wish
EvidenceChangeType
the possible types of evidence changes
Representation of a setA Set is a structure that contains arbitrary elements.
Definition: set.h:165
NodeProperty< const Potential< GUM_SCALAR > *> __target_posteriors
the set of single posteriors computed during the last inference
const GUM_SCALAR __1_minus_epsilon
for comparisons with 1 - epsilon
void _onAllTargetsErased() final
fired before a all single and joint_targets are removed
NodeSet __roots
a clique node used as a root in each connected component of __JT
void _onMarginalTargetErased(const NodeId id) final
fired before a single target is removed
virtual void _onBayesNetChanged(const IBayesNet< GUM_SCALAR > *bn) final
fired after a new Bayes net has been assigned to the engine
void _onEvidenceChanged(const NodeId id, bool hasChangedSoftHard) final
fired after an evidence is changed, in particular when its status (soft/hard) changes ...
void _onStateChanged() final
fired when the stage is changed
FindBarrenNodesType
type of algorithm to determine barren nodes
const Potential< GUM_SCALAR > & _posterior(NodeId id) final
returns the posterior of a given variable
void __collectMessage(NodeId id, NodeId from)
actually perform the collect phase
ArcProperty< __PotentialSet > __separator_potentials
the list of all potentials stored in the separators after inferences
const JoinTree * joinTree()
returns the current join tree used
NodeProperty< GUM_SCALAR > __constants
the constants resulting from the projections of CPTs defined over only hard evidence nodes remove th...
JoinTree * __JT
the join (or junction) tree used to answer the last inference query
void _updateOutdatedBNPotentials() final
prepares inference when the latter is in OutdatedBNPotentials state
<agrum/BN/inference/jointTargetedInference.h>
void _onEvidenceAdded(const NodeId id, bool isHardEvidence) final
fired after a new evidence is inserted
void _makeInference() final
called when the inference has to be performed effectively
void __diffuseMessageInvalidations(NodeId from_id, NodeId to_id, NodeSet &invalidated_cliques)
invalidate all the messages sent from a given clique
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
void _onAllMarginalTargetsAdded() final
fired after all the nodes of the BN are added as single targets
void __setProjectionFunction(Potential< GUM_SCALAR > *(*proj)(const Potential< GUM_SCALAR > &, const Set< const DiscreteVariable * > &))
sets the operator for performing the projections
SetIteratorSafe< const Potential< GUM_SCALAR > *> __PotentialSetIterator
Basic graph of cliques.
Definition: cliqueGraph.h:58
Potential< GUM_SCALAR > margSumOut(const Set< const DiscreteVariable * > &del_vars) const
Projection using sum as operation (and implementation-optimized operations)
NodeProperty< __PotentialSet > __clique_potentials
the list of all potentials stored in the cliques
void __computeJoinTreeRoots()
compute a root for each connected component of __JT
HashTable< NodeSet, NodeId > __joint_target_to_clique
for each set target, assign a clique in the JT that contains it
__PotentialSet __removeBarrenVariables(__PotentialSet &pot_list, Set< const DiscreteVariable * > &del_vars)
void __createNewJT()
create a new junction tree as well as its related data structures
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
static INLINE Potential< GUM_SCALAR > * LPNewprojPotential(const Potential< GUM_SCALAR > &t1, const Set< const DiscreteVariable * > &del_vars)
bool __use_binary_join_tree
indicates whether we should transform junction trees into binary join trees
void __invalidateAllMessages()
invalidate all messages, posteriors and created potentials
__PotentialSet __marginalizeOut(__PotentialSet pot_list, Set< const DiscreteVariable * > &del_vars, Set< const DiscreteVariable * > &kept_vars)
removes variables del_vars from a list of potentials and returns the resulting list ...
LazyPropagation(const IBayesNet< GUM_SCALAR > *BN, RelevantPotentialsFinderType=RelevantPotentialsFinderType::DSEP_BAYESBALL_POTENTIALS, FindBarrenNodesType=FindBarrenNodesType::FIND_BARREN_NODES, bool use_binary_join_tree=true)
default constructor
const JunctionTree * junctionTree()
returns the current junction tree
void _onJointTargetErased(const NodeSet &set) final
fired before a joint target is removed
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
<agrum/BN/inference/lazyPropagation.h>
Base class for undirected graphs.
Definition: undiGraph.h:109
void _onAllMarginalTargetsErased() final
fired before a all the single targets are removed
HashTable< NodeId, NodeId > __node_to_clique
for each node of __graph (~ in the Bayes net), associate an ID in the JT
<agrum/BN/inference/evidenceInference.h>
void __produceMessage(NodeId from_id, NodeId to_id)
creates the message sent by clique from_id to clique to_id
RelevantPotentialsFinderType __find_relevant_potential_type
the type of relevant potential finding algorithm to be used
void(LazyPropagation< GUM_SCALAR >::* __findRelevantPotentials)(Set< const Potential< GUM_SCALAR > * > &pot_list, Set< const DiscreteVariable * > &kept_vars)
update a set of potentials: the remaining are those to be combined to produce a message on a separato...
Interface for all the triangulation methods.
Definition: triangulation.h:47
void __findRelevantPotentialsGetAll(__PotentialSet &pot_list, Set< const DiscreteVariable * > &kept_vars)
update a set of potentials: the remaining are those to be combined to produce a message on a separato...
void _onMarginalTargetAdded(const NodeId id) final
fired after a new single target is inserted
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
UndiGraph __graph
the undigraph extracted from the BN and used to construct the join tree
void __setCombinationFunction(Potential< GUM_SCALAR > *(*comb)(const Potential< GUM_SCALAR > &, const Potential< GUM_SCALAR > &))
sets the operator for performing the combinations
void _onEvidenceErased(const NodeId id, bool isHardEvidence) final
fired before an evidence is removed
NodeProperty< EvidenceChangeType > __evidence_changes
indicates which nodes of the BN have evidence that changed since the last inference ...
void __findRelevantPotentialsWithdSeparation(__PotentialSet &pot_list, Set< const DiscreteVariable * > &kept_vars)
update a set of potentials: the remaining are those to be combined to produce a message on a separato...