153 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef BP_LIFTED_FG_H
 | 
						|
#define BP_LIFTED_FG_H
 | 
						|
 | 
						|
#include <unordered_map>
 | 
						|
 | 
						|
#include "FactorGraph.h"
 | 
						|
#include "FgVarNode.h"
 | 
						|
#include "Factor.h"
 | 
						|
#include "Shared.h"
 | 
						|
 | 
						|
class VarCluster;
 | 
						|
class FactorCluster;
 | 
						|
class Distribution;
 | 
						|
 | 
						|
typedef long                     Color;
 | 
						|
typedef vector<Color>            Signature;
 | 
						|
typedef vector<VarCluster*>      VarClusterSet;
 | 
						|
typedef vector<FactorCluster*>   FactorClusterSet;
 | 
						|
 | 
						|
typedef map<string, FgVarSet>  VarSignMap;
 | 
						|
typedef map<string, FactorSet> FactorSignMap;
 | 
						|
 | 
						|
typedef map<unsigned, vector<Color> > VarColorMap;
 | 
						|
typedef map<Distribution*, Color> DistColorMap;
 | 
						|
 | 
						|
typedef map<Vid, VarCluster*> 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<Color>       varColors_;
 | 
						|
    vector<Color>       factorColors_;
 | 
						|
    VarClusterSet       varClusters_;
 | 
						|
    FactorClusterSet    factorClusters_;
 | 
						|
    Vid2VarCluster      vid2VarCluster_;
 | 
						|
    const FactorGraph*  groundFg_;
 | 
						|
};
 | 
						|
 | 
						|
#endif // BP_LIFTED_FG_H
 | 
						|
 |