aGrUM  0.14.2
ShaferShenoyInference.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2005 by Christophe GONZALES et Pierre-Henri WUILLEMIN *
3  * {prenom.nom}_at_lip6.fr *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the *
17  * Free Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ***************************************************************************/
25 #ifndef GUM_SHAFER_SHENOY_INFERENCE_H
26 #define GUM_SHAFER_SHENOY_INFERENCE_H
27 
28 #include <utility>
29 
30 #include <agrum/core/math/math.h>
34 #include <agrum/agrum.h>
36 
37 namespace gum {
38 
39 
40  // the function used to combine two tables
41  template < typename GUM_SCALAR >
42  INLINE static Potential< GUM_SCALAR >*
44  const Potential< GUM_SCALAR >& t2) {
45  return new Potential< GUM_SCALAR >(t1 * t2);
46  }
47 
48  // the function used to combine two tables
49  template < typename GUM_SCALAR >
50  INLINE static Potential< GUM_SCALAR >*
52  const Set< const DiscreteVariable* >& del_vars) {
53  return new Potential< GUM_SCALAR >(t1.margSumOut(del_vars));
54  }
55 
56 
64  template < typename GUM_SCALAR >
66  : public JointTargetedInference< GUM_SCALAR >
67  , public EvidenceInference< GUM_SCALAR > {
68  public:
69  // ############################################################################
71  // ############################################################################
73 
75  explicit ShaferShenoyInference(
78  bool use_binary_join_tree = true);
79 
81  ~ShaferShenoyInference() final;
82 
84 
85 
86  // ############################################################################
88  // ############################################################################
90 
92  void setTriangulation(const Triangulation& new_triangulation);
93 
95 
101 
103 
106  const JoinTree* joinTree();
107 
109 
113  const JunctionTree* junctionTree();
114 
116  GUM_SCALAR evidenceProbability();
117 
119 
120 
121  protected:
123  void _onStateChanged() final{};
124 
126  void _onEvidenceAdded(const NodeId id, bool isHardEvidence) final;
127 
129  void _onEvidenceErased(const NodeId id, bool isHardEvidence) final;
130 
132  void _onAllEvidenceErased(bool contains_hard_evidence) final;
133 
141  void _onEvidenceChanged(const NodeId id, bool hasChangedSoftHard) final;
142 
144 
145  void _onMarginalTargetAdded(const NodeId id) final;
146 
148 
149  void _onMarginalTargetErased(const NodeId id) final;
150 
152  virtual void _onBayesNetChanged(const IBayesNet< GUM_SCALAR >* bn) final;
153 
155 
156  void _onJointTargetAdded(const NodeSet& set) final;
157 
159 
160  void _onJointTargetErased(const NodeSet& set) final;
161 
163  void _onAllMarginalTargetsAdded() final;
164 
166  void _onAllMarginalTargetsErased() final;
167 
169  void _onAllJointTargetsErased() final;
170 
172  void _onAllTargetsErased() final;
173 
175 
178  void _updateOutdatedBNStructure() final;
179 
181 
184  void _updateOutdatedBNPotentials() final;
185 
187 
188  void _makeInference() final;
189 
190 
192 
193  const Potential< GUM_SCALAR >& _posterior(NodeId id) final;
194 
196 
198  const Potential< GUM_SCALAR >& _jointPosterior(const NodeSet& set) final;
199 
208  _jointPosterior(const NodeSet& wanted_target,
209  const NodeSet& declared_target) final;
210 
213 
216 
217 
218  private:
222 
223 
226 
228  Potential< GUM_SCALAR >* (*__projection_op)(
231 
233  Potential< GUM_SCALAR >* (*__combination_op)(const Potential< GUM_SCALAR >&,
234  const Potential< GUM_SCALAR >&){
236 
239 
243 
245 
251 
253  JoinTree* __JT{nullptr};
254 
257 
259 
262  bool __is_new_jt_needed{true};
263 
265 
272 
275 
278 
280 
288 
290 
295 
297 
300 
302 
308 
310 
312 
314 
316 
322 
325 
329 
331 
338 
340 
345 
348 
351 
355 
357  const GUM_SCALAR __1_minus_epsilon{GUM_SCALAR(1.0 - 1e-6)};
358 
359 
361  bool __isNewJTNeeded() const;
362 
364  void __createNewJT();
366  void __setProjectionFunction(Potential< GUM_SCALAR >* (*proj)(
367  const Potential< GUM_SCALAR >&, const Set< const DiscreteVariable* >&));
368 
370  void __setCombinationFunction(Potential< GUM_SCALAR >* (*comb)(
371  const Potential< GUM_SCALAR >&, const Potential< GUM_SCALAR >&));
372 
375  NodeId to,
376  NodeSet& cliques_invalidated);
377 
380 
382  void __computeJoinTreeRoots();
383 
384  // remove barren variables and return the newly created projected potentials
385  __PotentialSet
386  __removeBarrenVariables(__PotentialSet& pot_list,
388 
391  __PotentialSet __marginalizeOut(__PotentialSet pot_list,
393  Set< const DiscreteVariable* >& kept_vars);
394 
396  void __produceMessage(NodeId from_id, NodeId to_id);
397 
399  void __collectMessage(NodeId id, NodeId from);
400 
403 
407  };
408 
409 
410 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS
411  extern template class ShaferShenoyInference< double >;
412 #endif
413 
414 
415 } /* namespace gum */
416 
418 
419 #endif /* SHAFER_SHENOY_INFERENCE_H */
Useful macros for maths.
NodeProperty< const Potential< GUM_SCALAR > *> __clique_ss_potential
the potentials stored into the cliques by Shafer-Shenoy
aGrUM&#39;s Potential is a multi-dimensional array with tensor operators.
Definition: potential.h:57
void _onAllJointTargetsErased() final
fired before a all the joint targets are removed
void _onEvidenceChanged(const NodeId id, bool hasChangedSoftHard) final
fired after an evidence is changed, in particular when its status (soft/hard) changes ...
FindBarrenNodesType __barren_nodes_type
the type of barren nodes computation we wish
void __setProjectionFunction(Potential< GUM_SCALAR > *(*proj)(const Potential< GUM_SCALAR > &, const Set< const DiscreteVariable * > &))
sets the operator for performing the projections
NodeProperty< GUM_SCALAR > __constants
the constants resulting from the projections of CPTs defined over only hard evidence nodes remove th...
JunctionTree * __junctionTree
the junction tree to answer the last inference query
void __collectMessage(NodeId id, NodeId from)
actually perform the collect phase
void _onEvidenceErased(const NodeId id, bool isHardEvidence) final
fired before an evidence is removed
static INLINE Potential< GUM_SCALAR > * SSNewmultiPotential(const Potential< GUM_SCALAR > &t1, const Potential< GUM_SCALAR > &t2)
__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 ...
void _onMarginalTargetErased(const NodeId id) final
fired before a single target is removed
Safe iterators for the Set classDevelopers may consider using Set<x>::iterator_safe instead of SetIte...
Definition: set.h:808
void _onMarginalTargetAdded(const NodeId id) final
fired after a new single target is inserted
This file contains the abstract inference class definition for computing (incrementally) joint poster...
ArcProperty< bool > __messages_computed
indicates whether a message (from one clique to another) has been computed
Set< const Potential< GUM_SCALAR > *> __PotentialSet
void __setCombinationFunction(Potential< GUM_SCALAR > *(*comb)(const Potential< GUM_SCALAR > &, const Potential< GUM_SCALAR > &))
sets the operator for performing the combinations
const GUM_SCALAR __1_minus_epsilon
for comparisons with 1 - epsilon
Potential< GUM_SCALAR > * _unnormalizedJointPosterior(NodeId id) final
returns a fresh potential equal to P(argument,evidence)
void _onAllMarginalTargetsAdded() final
fired after all the nodes of the BN are added as single targets
NodeSet __roots
a clique node used as a root in each connected component of __JT
GUM_SCALAR evidenceProbability()
returns the probability of evidence
Class representing the minimal interface for Bayesian Network.
Definition: IBayesNet.h:59
void _makeInference() final
called when the inference has to be performed effectively
gum is the global namespace for all aGrUM entities
Definition: agrum.h:25
This file contains the abstract class definition for computing the probability of evidence entered in...
HashTable< NodeSet, const Potential< GUM_SCALAR > *> __joint_target_posteriors
the set of set target posteriors computed during the last inference
void _updateOutdatedBNPotentials() final
prepares inference when the latter is in OutdatedBNPotentials state
UndiGraph __graph
the undigraph extracted from the BN and used to construct the join tree
void _onStateChanged() final
fired when the stage is changed
Representation of a setA Set is a structure that contains arbitrary elements.
Definition: set.h:162
ShaferShenoyInference(const IBayesNet< GUM_SCALAR > *BN, FindBarrenNodesType barren_type=FindBarrenNodesType::FIND_BARREN_NODES, bool use_binary_join_tree=true)
default constructor
NodeProperty< EvidenceChangeType > __evidence_changes
indicates which nodes of the BN have evidence that changed since the last inference ...
FindBarrenNodesType
type of algorithm to determine barren nodes
NodeProperty< const Potential< GUM_SCALAR > *> __node_to_soft_evidence
the soft evidence stored in the cliques per their assigned node in the BN
HashTable< NodeId, NodeId > __node_to_clique
for each node of __graph (~ in the Bayes net), associate an ID in the JT
NodeProperty< const Potential< GUM_SCALAR > *> __target_posteriors
the set of single posteriors computed during the last inference
NodeProperty< const Potential< GUM_SCALAR > *> __hard_ev_projected_CPTs
the CPTs that were projected due to hard evidence nodes
void _onJointTargetAdded(const NodeSet &set) final
fired after a new joint target is inserted
bool __isNewJTNeeded() const
check whether a new join tree is really needed for the next inference
void _updateOutdatedBNStructure() final
prepares inference when the latter is in OutdatedBNStructure state
void setTriangulation(const Triangulation &new_triangulation)
use a new triangulation algorithm
const Potential< GUM_SCALAR > & _jointPosterior(const NodeSet &set) final
returns the posterior of a declared target set
<agrum/BN/inference/jointTargetedInference.h>
void _onAllTargetsErased() final
fired before a all single and joint_targets are removed
virtual void _onBayesNetChanged(const IBayesNet< GUM_SCALAR > *bn) final
fired after a new Bayes net has been assigned to the engine
ShaferShenoyInference< GUM_SCALAR > & operator=(const ShaferShenoyInference< GUM_SCALAR > &)
avoid copy operators
bool __is_new_jt_needed
indicates whether a new join tree is needed for the next inference
static INLINE Potential< GUM_SCALAR > * SSNewprojPotential(const Potential< GUM_SCALAR > &t1, const Set< const DiscreteVariable * > &del_vars)
SetIteratorSafe< const Potential< GUM_SCALAR > *> __PotentialSetIterator
void setFindBarrenNodesType(FindBarrenNodesType type)
sets how we determine barren nodes
void _onJointTargetErased(const NodeSet &set) final
fired before a joint target is removed
HashTable< NodeSet, NodeId > __joint_target_to_clique
for each set target, assign a clique in the JT that contains it
~ShaferShenoyInference() final
destructor
ArcProperty< __PotentialSet > __created_potentials
the set of potentials created for the last inference messages
Triangulation * __triangulation
the triangulation class creating the junction tree used for inference
Basic graph of cliques.
Definition: cliqueGraph.h:55
Potential< GUM_SCALAR > margSumOut(const Set< const DiscreteVariable * > &del_vars) const
Projection using sum as operation (and implementation-optimized operations)
void __createNewJT()
create a new junction tree as well as its related data structures
Detect barren nodes for inference in Bayesian networks.
<agrum/BN/inference/ShaferShenoyInference.h>
void __diffuseMessageInvalidations(NodeId from, NodeId to, NodeSet &cliques_invalidated)
invalidate all the messages sent from a given clique
__PotentialSet __removeBarrenVariables(__PotentialSet &pot_list, Set< const DiscreteVariable * > &del_vars)
JoinTree * __JT
the join (or junction) tree used to answer the last inference query
Class for computing default triangulations of graphs.
Base class for undirected graphs.
Definition: undiGraph.h:106
void __computeJoinTreeRoots()
compute a root for each connected component of __JT
void _onEvidenceAdded(const NodeId id, bool isHardEvidence) final
fired after a new evidence is inserted
<agrum/BN/inference/evidenceInference.h>
NodeSet __hard_ev_nodes
the hard evidence nodes which were projected in CPTs
bool __use_binary_join_tree
indicates whether we should transform junction trees into binary join trees
Implementation of Shafer-Shenoy&#39;s propagation for inference in Bayesian Networks. ...
NodeProperty< __PotentialSet > __clique_potentials
the list of all potentials stored in the cliques
const Potential< GUM_SCALAR > & _posterior(NodeId id) final
returns the posterior of a given variable
Interface for all the triangulation methods.
Definition: triangulation.h:44
const JoinTree * joinTree()
returns the current join tree used
EvidenceChangeType
the possible types of evidence changes
void _onAllEvidenceErased(bool contains_hard_evidence) final
fired before all the evidence are erased
void __invalidateAllMessages()
invalidate all messages, posteriors and created potentials
virtual const IBayesNet< GUM_SCALAR > & BN() const final
Returns a constant reference over the IBayesNet referenced by this class.
void _onAllMarginalTargetsErased() final
fired before a all the single targets are removed
Size NodeId
Type for node ids.
Definition: graphElements.h:97
void __produceMessage(NodeId from_id, NodeId to_id)
creates the message sent by clique from_id to clique to_id
ArcProperty< __PotentialSet > __separator_potentials
the list of all potentials stored in the separators after inferences
const JunctionTree * junctionTree()
returns the current junction tree