28 #ifndef GUM_SHAFERSHENOY_LIMIDS_H 29 #define GUM_SHAFERSHENOY_LIMIDS_H 36 #include <agrum/agrum.h> 38 #include <agrum/tools/core/exceptions.h> 39 #include <agrum/tools/core/list.h> 41 #include <agrum/tools/graphs/DAG.h> 42 #include <agrum/tools/graphs/algorithms/triangulations/partialOrderedTriangulation.h> 44 #include <agrum/tools/multidim/implementations/multiDimBucket.h> 45 #include <agrum/tools/multidim/implementations/multiDimSparse.h> 46 #include <agrum/ID/inference/tools/decisionPotential.h> 48 #include <agrum/ID/inference/tools/influenceDiagramInference.h> 49 #include <agrum/tools/graphs/algorithms/triangulations/defaultTriangulation.h> 64 template <
typename GUM_SCALAR >
65 class ShaferShenoyLIMIDInference:
66 public InfluenceDiagramInference< GUM_SCALAR > {
67 using PhiNodeProperty = NodeProperty< DecisionPotential< GUM_SCALAR > >;
68 using PsiArcProperty = ArcProperty< DecisionPotential< GUM_SCALAR > >;
69 using SetOfVars = Set<
const DiscreteVariable* >;
82 explicit ShaferShenoyLIMIDInference(
83 const InfluenceDiagram< GUM_SCALAR >* infDiag);
88 virtual ~ShaferShenoyLIMIDInference();
90 const JunctionTree* junctionTree()
const;
92 void clear() override;
96 void addNoForgettingAssumption(
const std::vector< NodeId >& ids);
97 void addNoForgettingAssumption(
const std::vector< std::string >& names);
98 bool hasNoForgettingAssumption()
const;
101 DAG reducedGraph()
const {
return reduced_; };
103 std::vector< NodeSet > reversePartialOrder()
const;
105 InfluenceDiagram< GUM_SCALAR > reducedLIMID()
const;
107 bool isSolvable()
const;
110 gum::Potential< GUM_SCALAR > optimalDecision(NodeId decisionId) final;
111 gum::Potential< GUM_SCALAR >
112 optimalDecision(
const std::string& decisionName) final {
113 return optimalDecision(
this->influenceDiagram().idFromName(decisionName));
122 virtual const Potential< GUM_SCALAR >& posterior(NodeId node) final;
123 const Potential< GUM_SCALAR >& posterior(
const std::string& name) final {
124 return posterior(
this->influenceDiagram().idFromName(name));
133 virtual const Potential< GUM_SCALAR >& posteriorUtility(NodeId node) final;
134 virtual const Potential< GUM_SCALAR >&
135 posteriorUtility(
const std::string& name) final {
136 return posteriorUtility(
this->influenceDiagram().idFromName(name));
145 virtual std::pair< GUM_SCALAR, GUM_SCALAR > meanVar(NodeId node) final;
146 std::pair< GUM_SCALAR, GUM_SCALAR > meanVar(
const std::string& name) final {
147 return meanVar(
this->influenceDiagram().idFromName(name));
155 std::pair< GUM_SCALAR, GUM_SCALAR > MEU() final;
158 void onStateChanged_() override;
159 void onEvidenceAdded_(NodeId id,
bool isHardEvidence) override;
160 void onEvidenceErased_(NodeId id,
bool isHardEvidence) override;
161 void onAllEvidenceErased_(
bool contains_hard_evidence) override;
162 void onEvidenceChanged_(NodeId id,
bool hasChangedSoftHard) override;
163 void onModelChanged_(
const GraphicalModel* model) override;
164 void updateOutdatedStructure_() override;
165 void updateOutdatedPotentials_() override;
166 void makeInference_() override;
169 NodeSet nonRequisiteNodes_(NodeId d)
const;
172 CliqueGraph reducedJunctionTree_;
173 NodeProperty< NodeId > node_to_clique_;
174 EdgeProperty< SetOfVars > varsSeparator_;
175 NodeProperty< Potential< GUM_SCALAR > > strategies_;
176 NodeProperty< DecisionPotential< GUM_SCALAR > > posteriors_;
177 NodeProperty< DecisionPotential< GUM_SCALAR > > unconditionalDecisions_;
179 void createReduced_();
180 std::vector< NodeSet > reversePartialOrder_;
181 std::vector< NodeId > solvabilityOrder_;
182 std::vector< NodeId > noForgettingOrder_;
185 void completingNoForgettingAssumption__();
186 void reducingLIMID__();
187 void creatingPartialOrder__(
const NodeSet& utilities);
188 void checkingSolvability__(
const NodeSet& utilities);
189 void creatingJunctionTree__();
190 void findingCliqueForEachNode__(DefaultTriangulation& triangulation);
192 void initializingInference_(PhiNodeProperty& phi, PsiArcProperty& psi);
193 void collectingMessage_(PhiNodeProperty& phi,
196 void collectingToFollowingRoot_(PhiNodeProperty& phi,
200 void deciding_(PhiNodeProperty& phi, PsiArcProperty& psi, NodeId decisionNode);
201 void transmittingMessage_(PhiNodeProperty& phi,
205 void transmittingFinalMessage_(PhiNodeProperty& phi,
209 void distributingMessage_(PhiNodeProperty& phi,
212 void computingPosteriors_(
const PhiNodeProperty& phi,
213 const PsiArcProperty& psi);
214 DecisionPotential<
double > integrating_(
const PhiNodeProperty& phi,
215 const PsiArcProperty& psi,
217 NodeId except)
const;
218 DecisionPotential<
double > integrating_(
const PhiNodeProperty& phi,
219 const PsiArcProperty& psi,
220 NodeId clique)
const;
221 void binarizingMax_(
const Potential< GUM_SCALAR >& decision,
222 const Potential< GUM_SCALAR >& proba)
const;
226 #include <agrum/ID/inference/ShaferShenoyLIMIDInference_tpl.h>