#ifndef BP_LIFTED_FG_H #define BP_LIFTED_FG_H #include #include "FactorGraph.h" #include "FgVarNode.h" #include "Factor.h" #include "Shared.h" class VarCluster; class FactorCluster; class Distribution; typedef long Color; typedef vector Signature; typedef vector VarClusterSet; typedef vector FactorClusterSet; typedef map VarSignMap; typedef map FactorSignMap; typedef map > VarColorMap; typedef map DistColorMap; typedef map Vid2VarCluster; class VarCluster { public: VarCluster (CFgVarSet vs) { for (unsigned i = 0; i < vs.size(); i++) { groundVars_.push_back (vs[i]); } } void addFactorCluster (FactorCluster* fc) { factorClusters_.push_back (fc); } const FactorClusterSet& getFactorClusters (void) const { return factorClusters_; } FgVarNode* getRepresentativeVariable (void) const { return representVar_; } void setRepresentativeVariable (FgVarNode* v) { representVar_ = v; } CFgVarSet getGroundFgVarNodes (void) const { return groundVars_; } private: FgVarSet groundVars_; FactorClusterSet factorClusters_; FgVarNode* representVar_; }; class FactorCluster { public: FactorCluster (CFactorSet groundFactors, const VarClusterSet& vcs) { groundFactors_ = groundFactors; varClusters_ = vcs; for (unsigned i = 0; i < varClusters_.size(); i++) { varClusters_[i]->addFactorCluster (this); } } const VarClusterSet& getVarClusters (void) const { return varClusters_; } bool containsGround (const Factor* f) { for (unsigned i = 0; i < groundFactors_.size(); i++) { if (groundFactors_[i] == f) { return true; } } return false; } Factor* getRepresentativeFactor (void) const { return representFactor_; } void setRepresentativeFactor (Factor* f) { representFactor_ = f; } CFactorSet getGroundFactors (void) const { return groundFactors_; } private: FactorSet groundFactors_; VarClusterSet varClusters_; Factor* representFactor_; }; class LiftedFG { public: LiftedFG (const FactorGraph&); ~LiftedFG (void); FactorGraph* getCompressedFactorGraph (void); unsigned getGroundEdgeCount (FactorCluster*, VarCluster*) const; void printGroups (const VarSignMap& varGroups, const FactorSignMap& factorGroups) const; FgVarNode* getEquivalentVariable (Vid vid) { VarCluster* vc = vid2VarCluster_.find (vid)->second; return vc->getRepresentativeVariable(); } const VarClusterSet& getVariableClusters (void) { return varClusters_; } const FactorClusterSet& getFactorClusters (void) { return factorClusters_; } private: string getSignatureId (FgVarNode*) const; string getSignatureId (Factor*) const; Color getFreeColor (void) { return ++freeColor_ -1; } Color getColor (FgVarNode* v) const { return varColors_[v->getIndex()]; } Color getColor (Factor* f) const { return factorColors_[f->getIndex()]; } void setColor (FgVarNode* v, Color c) { varColors_[v->getIndex()] = c; } void setColor (Factor* f, Color c) { factorColors_[f->getIndex()] = c; } VarCluster* getVariableCluster (Vid vid) const { return vid2VarCluster_.find (vid)->second; } Color freeColor_; vector varColors_; vector factorColors_; VarClusterSet varClusters_; FactorClusterSet factorClusters_; Vid2VarCluster vid2VarCluster_; const FactorGraph* groundFg_; }; #endif // BP_LIFTED_FG_H