WindowsXP-SP1/enduser/troubleshoot/bn/cliqset.h

204 lines
6.8 KiB
C++

//+-------------------------------------------------------------------------
//
// 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_