This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/CLPBN/horus/FactorGraph.h

186 lines
4.1 KiB
C
Raw Normal View History

2013-02-07 17:50:02 +00:00
#ifndef YAP_PACKAGES_CLPBN_HORUS_FACTORGRAPH_H_
#define YAP_PACKAGES_CLPBN_HORUS_FACTORGRAPH_H_
2012-05-23 14:56:01 +01:00
#include <vector>
2013-02-07 20:09:10 +00:00
#include <unordered_map>
#include <string>
#include <fstream>
2012-05-23 14:56:01 +01:00
#include "Factor.h"
2012-06-19 14:32:12 +01:00
#include "BayesBallGraph.h"
2012-05-23 14:56:01 +01:00
#include "Horus.h"
2013-02-07 23:53:13 +00:00
namespace Horus {
2013-02-07 23:53:13 +00:00
2012-05-23 14:56:01 +01:00
class FacNode;
2013-02-07 13:37:15 +00:00
class VarNode : public Var {
2012-05-23 14:56:01 +01:00
public:
2012-12-17 18:39:42 +00:00
VarNode (VarId varId, unsigned nrStates,
int evidence = Constants::unobserved)
2012-05-23 14:56:01 +01:00
: Var (varId, nrStates, evidence) { }
VarNode (const Var* v) : Var (v) { }
void addNeighbor (FacNode* fn) { neighs_.push_back (fn); }
const FacNodes& neighbors() const { return neighs_; }
2012-05-23 14:56:01 +01:00
private:
FacNodes neighs_;
2012-12-27 22:25:45 +00:00
DISALLOW_COPY_AND_ASSIGN (VarNode);
2012-05-23 14:56:01 +01:00
};
2012-05-28 17:00:46 +01:00
class FacNode {
2012-05-23 14:56:01 +01:00
public:
FacNode (const Factor& f) : factor_(f), index_(-1) { }
const Factor& factor() const { return factor_; }
2012-05-23 14:56:01 +01:00
Factor& factor() { return factor_; }
2012-05-23 14:56:01 +01:00
void addNeighbor (VarNode* vn) { neighs_.push_back (vn); }
const VarNodes& neighbors() const { return neighs_; }
2012-05-23 14:56:01 +01:00
size_t getIndex() const { return index_; }
2012-05-23 14:56:01 +01:00
2012-05-24 22:55:20 +01:00
void setIndex (size_t index) { index_ = index; }
2012-05-23 14:56:01 +01:00
std::string getLabel() { return factor_.getLabel(); }
2012-05-23 14:56:01 +01:00
private:
VarNodes neighs_;
Factor factor_;
2012-05-24 22:55:20 +01:00
size_t index_;
2012-12-27 22:25:45 +00:00
DISALLOW_COPY_AND_ASSIGN (FacNode);
2012-05-23 14:56:01 +01:00
};
class FactorGraph {
2012-05-23 14:56:01 +01:00
public:
FactorGraph() : bayesFactors_(false) { }
2012-05-23 14:56:01 +01:00
FactorGraph (const FactorGraph&);
~FactorGraph();
2012-05-23 14:56:01 +01:00
const VarNodes& varNodes() const { return varNodes_; }
2012-05-23 14:56:01 +01:00
const FacNodes& facNodes() const { return facNodes_; }
void setFactorsAsBayesian() { bayesFactors_ = true; }
2012-12-20 23:19:10 +00:00
bool bayesianFactors() const { return bayesFactors_; }
2012-05-23 14:56:01 +01:00
size_t nrVarNodes() const { return varNodes_.size(); }
2012-05-23 14:56:01 +01:00
size_t nrFacNodes() const { return facNodes_.size(); }
2012-05-23 14:56:01 +01:00
VarNode* getVarNode (VarId vid) const;
2012-05-23 14:56:01 +01:00
void addFactor (const Factor& factor);
void addVarNode (VarNode*);
void addFacNode (FacNode*);
void addEdge (VarNode*, FacNode*);
bool isTree() const;
2012-05-23 14:56:01 +01:00
BayesBallGraph& getStructure();
2012-05-23 14:56:01 +01:00
void print() const;
2012-05-23 14:56:01 +01:00
void exportToLibDai (const char*) const;
void exportToUai (const char*) const;
2012-05-23 14:56:01 +01:00
void exportToGraphViz (const char*) const;
FactorGraph& operator= (const FactorGraph&);
static FactorGraph readFromUaiFormat (const char*);
static FactorGraph readFromLibDaiFormat (const char*);
static bool exportToLibDai() { return exportLd_; }
static bool exportToUai() { return exportUai_; }
static bool exportGraphViz() { return exportGv_; }
static bool printFactorGraph() { return printFg_; }
static void enableExportToLibDai() { exportLd_ = true; }
static void disableExportToLibDai() { exportLd_ = false; }
2012-05-23 14:56:01 +01:00
static void enableExportToUai() { exportUai_ = true; }
static void disableExportToUai() { exportUai_ = false; }
static void enableExportToGraphViz() { exportGv_ = true; }
static void disableExportToGraphViz() { exportGv_ = false; }
static void enablePrintFactorGraph() { printFg_ = true; }
static void disablePrintFactorGraph() { printFg_ = false; }
2012-12-17 18:39:42 +00:00
2012-05-23 14:56:01 +01:00
private:
typedef std::unordered_map<unsigned, VarNode*> VarMap;
void clone (const FactorGraph& fg);
2012-05-23 14:56:01 +01:00
bool containsCycle() const;
2012-05-23 14:56:01 +01:00
bool containsCycle (const VarNode*, const FacNode*,
2013-02-07 13:37:15 +00:00
std::vector<bool>&, std::vector<bool>&) const;
2012-05-23 14:56:01 +01:00
bool containsCycle (const FacNode*, const VarNode*,
2013-02-07 13:37:15 +00:00
std::vector<bool>&, std::vector<bool>&) const;
2012-05-23 14:56:01 +01:00
static void ignoreLines (std::ifstream&);
VarNodes varNodes_;
FacNodes facNodes_;
VarMap varMap_;
2012-12-27 22:25:45 +00:00
BayesBallGraph structure_;
bool bayesFactors_;
2012-05-23 14:56:01 +01:00
static bool exportLd_;
static bool exportUai_;
static bool exportGv_;
static bool printFg_;
2012-05-23 14:56:01 +01:00
};
2012-05-28 17:00:46 +01:00
inline VarNode*
FactorGraph::getVarNode (VarId vid) const
{
VarMap::const_iterator it = varMap_.find (vid);
return it != varMap_.end() ? it->second : 0;
}
2013-02-08 01:11:18 +00:00
struct sortByVarId {
2012-12-17 18:39:42 +00:00
bool operator()(VarNode* vn1, VarNode* vn2) {
2012-05-28 17:00:46 +01:00
return vn1->varId() < vn2->varId();
2013-02-08 01:11:18 +00:00
}};
2012-05-28 17:00:46 +01:00
} // namespace Horus
2012-05-28 17:00:46 +01:00
2013-02-08 00:20:01 +00:00
#endif // YAP_PACKAGES_CLPBN_HORUS_FACTORGRAPH_H_
2012-05-23 14:56:01 +01:00