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:
public InfluenceDiagramInference< GUM_SCALAR > {
66 using PhiNodeProperty = NodeProperty< DecisionPotential< GUM_SCALAR > >;
67 using PsiArcProperty = ArcProperty< DecisionPotential< GUM_SCALAR > >;
68 using SetOfVars = Set<
const DiscreteVariable* >;
81 explicit ShaferShenoyLIMIDInference(
const InfluenceDiagram< GUM_SCALAR >* infDiag);
86 virtual ~ShaferShenoyLIMIDInference();
88 const JunctionTree* junctionTree()
const;
90 void clear() override;
94 void addNoForgettingAssumption(
const std::vector< NodeId >& ids);
95 void addNoForgettingAssumption(
const std::vector< std::string >& names);
96 bool hasNoForgettingAssumption()
const;
99 DAG reducedGraph()
const {
return reduced_; };
101 std::vector< NodeSet > reversePartialOrder()
const;
103 InfluenceDiagram< GUM_SCALAR > reducedLIMID()
const;
105 bool isSolvable()
const;
108 gum::Potential< GUM_SCALAR > optimalDecision(NodeId decisionId) final;
109 gum::Potential< GUM_SCALAR > optimalDecision(
const std::string& decisionName) final {
110 return optimalDecision(
this->influenceDiagram().idFromName(decisionName));
119 virtual const Potential< GUM_SCALAR >& posterior(NodeId node) final;
120 const Potential< GUM_SCALAR >& posterior(
const std::string& name) final {
121 return posterior(
this->influenceDiagram().idFromName(name));
130 virtual const Potential< GUM_SCALAR >& posteriorUtility(NodeId node) final;
131 virtual const Potential< GUM_SCALAR >& posteriorUtility(
const std::string& name) final {
132 return posteriorUtility(
this->influenceDiagram().idFromName(name));
141 virtual std::pair< GUM_SCALAR, GUM_SCALAR > meanVar(NodeId node) final;
142 std::pair< GUM_SCALAR, GUM_SCALAR > meanVar(
const std::string& name) final {
143 return meanVar(
this->influenceDiagram().idFromName(name));
151 std::pair< GUM_SCALAR, GUM_SCALAR > MEU() final;
154 void onStateChanged_() override;
155 void onEvidenceAdded_(NodeId id,
bool isHardEvidence) override;
156 void onEvidenceErased_(NodeId id,
bool isHardEvidence) override;
157 void onAllEvidenceErased_(
bool contains_hard_evidence) override;
158 void onEvidenceChanged_(NodeId id,
bool hasChangedSoftHard) override;
159 void onModelChanged_(
const GraphicalModel* model) override;
160 void updateOutdatedStructure_() override;
161 void updateOutdatedPotentials_() override;
162 void makeInference_() override;
165 NodeSet nonRequisiteNodes_(NodeId d)
const;
168 CliqueGraph reducedJunctionTree_;
169 NodeProperty< NodeId > node_to_clique_;
170 EdgeProperty< SetOfVars > varsSeparator_;
171 NodeProperty< Potential< GUM_SCALAR > > strategies_;
172 NodeProperty< DecisionPotential< GUM_SCALAR > > posteriors_;
173 NodeProperty< DecisionPotential< GUM_SCALAR > > unconditionalDecisions_;
175 void createReduced_();
176 std::vector< NodeSet > reversePartialOrder_;
177 std::vector< NodeId > solvabilityOrder_;
178 std::vector< NodeId > noForgettingOrder_;
181 void _completingNoForgettingAssumption_();
182 void _reducingLIMID_();
183 void _creatingPartialOrder_(
const NodeSet& utilities);
184 void _checkingSolvability_(
const NodeSet& utilities);
185 void _creatingJunctionTree_();
186 void _findingCliqueForEachNode_(DefaultTriangulation& triangulation);
188 void initializingInference_(PhiNodeProperty& phi, PsiArcProperty& psi);
189 void collectingMessage_(PhiNodeProperty& phi, PsiArcProperty& psi, NodeId rootClique);
190 void collectingToFollowingRoot_(PhiNodeProperty& phi,
194 void deciding_(PhiNodeProperty& phi, PsiArcProperty& psi, NodeId decisionNode);
195 void transmittingMessage_(PhiNodeProperty& phi,
199 void transmittingFinalMessage_(PhiNodeProperty& phi,
203 void distributingMessage_(PhiNodeProperty& phi, PsiArcProperty& psi, NodeId rootClique);
204 void computingPosteriors_(
const PhiNodeProperty& phi,
const PsiArcProperty& psi);
205 DecisionPotential<
double > integrating_(
const PhiNodeProperty& phi,
206 const PsiArcProperty& psi,
208 NodeId except)
const;
209 DecisionPotential<
double >
210 integrating_(
const PhiNodeProperty& phi,
const PsiArcProperty& psi, NodeId clique)
const;
211 void binarizingMax_(
const Potential< GUM_SCALAR >& decision,
212 const Potential< GUM_SCALAR >& proba)
const;
216 #include <agrum/ID/inference/ShaferShenoyLIMIDInference_tpl.h>