//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1997 // // File: cliqset.h // //-------------------------------------------------------------------------- // // cliqset.h: Definitions for the clique set object. // #ifndef _CLIQSET_H_ #define _CLIQSET_H_ #include "gmobj.h" #include "infer.h" class GEDGEMBN_CLIQ; // Counters maintained in the inference engine struct CLIQSETSTAT { long _cReload; // Number of times clique tree was reloaded long _cCollect; // Number of collect operations long _cEnterEv; // Number of calls to EnterEvidence long _cGetBel; // Number of calls to GetBelief long _cProbNorm; // Number of calls to ProbNorm CLIQSETSTAT () { Clear(); } void Clear () { _cReload = 0; _cCollect = 0; _cEnterEv = 0; _cGetBel = 0; _cProbNorm = 0; } }; //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // // GOBJMBN_CLIQSET: // // Since any model may decompose into a set of clique trees // (assemblages with no interconnections whatever), a CLIQSET // is defined as the join point or grouping for the clique // tree "forest". // //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// class GOBJMBN_CLIQSET: public GOBJMBN_INFER_ENGINE { friend class CLIQSETWORK; public: GOBJMBN_CLIQSET ( MBNET & model, REAL rMaxEstimatedSize = -1.0, int iInferEngID = 0 ); virtual ~ GOBJMBN_CLIQSET (); virtual INT EType () const { return EBNO_CLIQUE_SET; } virtual void Create (); virtual void Destroy (); virtual void Reload (); virtual void EnterEvidence ( GNODEMBN * pgnd, const CLAMP & clamp ); virtual void GetEvidence ( GNODEMBN * pgnd, CLAMP & clamp ); virtual void Infer (); virtual void GetBelief ( GNODEMBN * pgnd, MDVCPD & mdvBel ); virtual PROB ProbNorm (); virtual void Dump (); // Return true if the state of information is impossible bool BImpossible (); enum ESTATE // State of the junction tree { CTOR, // Just constructed UNDIR, // Undirected graph created MORAL, // Moralized CLIQUED, // Cliques constructed BUILT, // Fully constructed CONSISTENT, // Fully propagated EVIDENCE // Unpropagated evidence present }; ESTATE EState () const { return _eState; } MBNET & Model () { return _model; } INT IInferEngID () const { return _iInferEngID; } // Force reloading of the clique tree and full inference void SetReset ( bool bReset = true ) { _bReset = bReset ; } // Force full collect/distribute cycle void SetCollect ( bool bCollect = true ) { _bCollect = bCollect; } // Provide access to inference statistics CLIQSETSTAT & CqsetStat () { return _cqsetStat; } protected: ESTATE _eState; // State of junction tree // Tallies int _cCliques; // Number of cliques int _cCliqueMemberArcs; // Number of clique member arcs int _cSepsetArcs; // Number of sepsest (arcs) int _cUndirArcs; // Undirected arcs in moral graph // Inference control bool _bCollect; // Is "collect/distribute" pass necessary? bool _bReset; // Does tree need resetting? REAL _probNorm; // Residual prob of tree CLIQSETSTAT _cqsetStat; // Statistics protected: bool BCollect() const { return _bCollect; } // Cliquing helper functions int CNeighborUnlinked ( GNODEMBN * pgndmbn, bool bLinkNeighbors = false ); void Eliminate ( GNODEMBN * pgndmbn, CLIQSETWORK & clqsetWork ) ; void GenerateCliques ( CLIQSETWORK & clqsetWork ); void CreateUndirectedGraph( bool bMarryParents = true ); void DestroyDirectedGraph (); // Inference and tree maintenance void Reset (); void CollectEvidence (); void DistributeEvidence (); // Create (but don't init/load) all the clique and sepset marginals void CreateMarginals(); // Load probabilities into cliques; initialize all the sepsets void LoadMarginals (); // Return the "family" or "self" clique for a node GOBJMBN_CLIQUE * PCliqueFromNode ( GNODEMBN * pgnd, bool bFamily, GEDGEMBN_CLIQ * * ppgedgeClique = NULL ); // Typedefs for pointer-to-member-functions; used by Walk(). If bDownwards, // then object is being enumerated on the way down the tree. typedef bool (GOBJMBN_CLIQSET::*PFNC_JTREE) ( GOBJMBN_CLIQUE & clique, bool bDownwards /*= true*/ ); typedef bool (GOBJMBN_CLIQSET::*PFNC_SEPSET) ( GEDGEMBN_SEPSET & sepset, bool bDownwards /*= true*/ ); // Apply the given member function(s) to all cliques and/or sepsets, // depth first. int WalkTree ( bool bDepthFirst, PFNC_JTREE pfJtree = NULL, PFNC_SEPSET pfSepset = NULL ); // Apply the given member function to cliques and sepsets, depth first int WalkDepthFirst ( GOBJMBN_CLIQUE * pClique, PFNC_JTREE pfJtree = NULL, PFNC_SEPSET pfSepset = NULL ); int WalkBreadthFirst ( GOBJMBN_CLIQUE * pClique, PFNC_JTREE pfJtree = NULL, PFNC_SEPSET pfSepset = NULL ); // Add an undirected arc iff there isn't one already. bool BAddUndirArc ( GNODEMBN * pgndbnSource, GNODEMBN * pgndbnSink ); // Clique and sepset helper functions used during WalkTree(). bool BCreateClique ( GOBJMBN_CLIQUE & clique, bool bDownwards ); bool BLoadClique ( GOBJMBN_CLIQUE & clique, bool bDownwards ); bool BCreateSepset ( GEDGEMBN_SEPSET & sepset, bool bDownwards ); bool BLoadSepset ( GEDGEMBN_SEPSET & sepset, bool bDownwards ); bool BCollectEvidenceAtSepset ( GEDGEMBN_SEPSET & sepset, bool bDownwards ); bool BDistributeEvidenceAtSepset ( GEDGEMBN_SEPSET & sepset, bool bDownwards ); bool BCollectEvidenceAtRoot ( GOBJMBN_CLIQUE & clique, bool bDownwards ); bool BDistributeEvidenceAtRoot ( GOBJMBN_CLIQUE & clique, bool bDownwards ); bool BCollectInitEvidenceAtSepset ( GEDGEMBN_SEPSET & sepset, bool bDownwards ); bool BDistributeInitEvidenceAtSepset ( GEDGEMBN_SEPSET & sepset, bool bDownwards ); bool BCollectInitEvidenceAtRoot ( GOBJMBN_CLIQUE & clique, bool bDownwards ); bool BDistributeInitEvidenceAtRoot ( GOBJMBN_CLIQUE & clique, bool bDownwards ); // Perform initial inference collect/distribute cycle void InferInit (); void CollectEvidenceInit (); void DistributeEvidenceInit (); bool BDumpSepset ( GEDGEMBN_SEPSET & sepset, bool bDownwards ); bool BDumpClique ( GOBJMBN_CLIQUE & clique, bool bDownwards ); void CheckConsistency (); bool BConsistentSepset ( GEDGEMBN_SEPSET & sepset, bool bDownwards ); private: void Clear (); }; #endif // _CLIQSET_H_