Direct Graphical Models  v.1.7.0
GraphWeiss.h
1 // (pairwise) Graph class interface;
2 // Written by Sergey G. Kosov in 2011 - 2014 for Project X (based on M. A. Weiss recommendations)
3 #pragma once
4 
5 #include "IGraphPairwise.h"
6 
7 
8 namespace DirectGraphicalModels
9 {
10  // ================================ Graph Class ================================
18  class CGraphWeiss : public IGraphPairwise
19  {
20  public:
21  struct Node;
22 
23  // =============================== Edge Structure ==============================
28  struct Edge {
29  Node * node1;
30  Node * node2;
31  Mat Pot;
32  float * msg;
33  float * msg_temp;
34  byte group_id;
35 
36  Edge(void) = delete;
37  Edge(Node* n1, Node* n2, byte group = 0, const Mat &p = EmptyMat) : node1(n1), node2(n2), Pot(p.empty() ? Mat() : p.clone()), msg(NULL), msg_temp(NULL), group_id(group) {}
38 
39  ~Edge(void) {
40  if (msg) delete[] msg; msg = NULL;
41  if (msg_temp) delete[] msg_temp; msg_temp = NULL;
42  }
43 
44  void msg_swap(void) {
45  float *tmp = msg;
46  msg = msg_temp;
47  msg_temp = tmp;
48  }
49  };
50 
52  using vec_pEdge_t = std::vector<Edge *>;
53 
54  // =============================== Node Structure ==============================
59  struct Node {
60  size_t id;
61  Mat Pot;
64 
65  Node(void) = delete;
66  Node(size_t _id, const Mat& p = EmptyMat) : id(_id), Pot(p.empty() ? Mat() : p.clone()) {}
67  ~Node() {
68  for (Edge* e : to)
69  delete e;
70  }
71  };
72 
74  using vec_pNode_t = std::vector<Node *>;
75 
76 
77  public:
82  DllExport CGraphWeiss(byte nStates);
83  DllExport virtual ~CGraphWeiss(void);
84 
85 
86  DllExport void reset(void) override;
87  DllExport size_t addNode(const Mat &pot = EmptyMat) override;
88  DllExport void setNode(size_t node, const Mat &pot) override;
89  DllExport void getNode(size_t node, Mat &pot) const override;
90  DllExport void getChildNodes(size_t node, vec_size_t &vNodes) const override;
91  DllExport void getParentNodes(size_t node, vec_size_t &vNodes) const override;
92  DllExport size_t getNumNodes(void) const override { return m_vpNodes.size(); }
93  DllExport size_t getNumEdges(void) const override;
94 
95  DllExport void addEdge (size_t srcNode, size_t dstNode, byte group, const Mat &pot) override;
96  DllExport void setEdge (size_t srcNode, size_t dstNode, const Mat &pot) override;
97  DllExport void setEdges (std::optional<byte> group, const Mat& pot) override;
98  DllExport void getEdge (size_t srcNode, size_t dstNode, Mat &pot) const override;
99  DllExport void setEdgeGroup(size_t srcNode, size_t dstNode, byte group) override;
100  DllExport byte getEdgeGroup(size_t srcNode, size_t dstNode) const override;
101  DllExport void removeEdge (size_t srcNode, size_t dstNode) override;
102  DllExport bool isEdgeExists(size_t srcNode, size_t dstNode) const override;
103 
104 
105  protected:
112  DllExport Edge* findEdge(size_t srcNode, size_t dstNode) const;
113 
114  private:
115  size_t m_IDx; // = 0; Primary Key
116  vec_pNode_t m_vpNodes; // Nodes container
117  };
118 }
119 
float * msg
Message (for the loopyBP algorithm: class CDecodeLPB): Mat(size: nStates x 1; type: CV_32FC1) ...
Definition: GraphWeiss.h:32
Edge(Node *n1, Node *n2, byte group=0, const Mat &p=EmptyMat)
Definition: GraphWeiss.h:37
size_t getNumEdges(void) const override
Returns the number of edges in the graph.
Definition: GraphWeiss.cpp:78
size_t addNode(const Mat &pot=EmptyMat) override
Adds an additional node (with specified potentional)
Definition: GraphWeiss.cpp:31
void getEdge(size_t srcNode, size_t dstNode, Mat &pot) const override
Returns the edge potential.
Definition: GraphWeiss.cpp:127
void getNode(size_t node, Mat &pot) const override
Returns the node potential.
Definition: GraphWeiss.cpp:49
Mat Pot
Node potentials: Mat(size: nStates x 1; type: CV_32FC1)
Definition: GraphWeiss.h:61
void getChildNodes(size_t node, vec_size_t &vNodes) const override
Returns the set of IDs of the child nodes of the argument node.
Definition: GraphWeiss.cpp:59
vec_pEdge_t to
Child vertices (and potentials)
Definition: GraphWeiss.h:62
void setNode(size_t node, const Mat &pot) override
Sets or changes the potential of node.
Definition: GraphWeiss.cpp:39
float * msg_temp
Temp Message (for the loopyBP algorithm: class CDecodeLPB): Mat(size: nStates x 1; type: CV_32FC1) ...
Definition: GraphWeiss.h:33
Mat Pot
The edge potentials: Mat(size: nStates x nStates; type: CV_32FC1)
Definition: GraphWeiss.h:31
vec_pEdge_t from
Parent vertices (and potentials)
Definition: GraphWeiss.h:63
Edge * findEdge(size_t srcNode, size_t dstNode) const
Finds and returns the Edge defined by two nodes.
Definition: GraphWeiss.cpp:193
byte group_id
ID of the group, to which the edge belongs.
Definition: GraphWeiss.h:34
void setEdgeGroup(size_t srcNode, size_t dstNode, byte group) override
Assigns a directed edge (srcNode) –> (dstNode) to the group group.
Definition: GraphWeiss.cpp:139
void addEdge(size_t srcNode, size_t dstNode, byte group, const Mat &pot) override
Adds an additional directed edge with specified potentional.
Definition: GraphWeiss.cpp:87
Pairwise graph class.
Definition: GraphWeiss.h:18
std::vector< Node * > vec_pNode_t
Definition: GraphWeiss.h:74
void reset(void) override
Resets the graph.
Definition: GraphWeiss.cpp:21
void removeEdge(size_t srcNode, size_t dstNode) override
Removes the specified edge.
Definition: GraphWeiss.cpp:163
std::vector< Edge * > vec_pEdge_t
Definition: GraphWeiss.h:52
void setEdge(size_t srcNode, size_t dstNode, const Mat &pot) override
Sets or changes the potentional of directed edge.
Definition: GraphWeiss.cpp:106
bool isEdgeExists(size_t srcNode, size_t dstNode) const override
Checks whether the edge exists.
Definition: GraphWeiss.cpp:184
void setEdges(std::optional< byte > group, const Mat &pot) override
Sets the potential pot to all edges belonging to group group.
Definition: GraphWeiss.cpp:118
void getParentNodes(size_t node, vec_size_t &vNodes) const override
Returns the set of IDs of the parent nodes of the argument node.
Definition: GraphWeiss.cpp:69
Node * node1
First node in edge.
Definition: GraphWeiss.h:29
Interface class for graphical models.
byte getEdgeGroup(size_t srcNode, size_t dstNode) const override
Returns the group of the edge.
Definition: GraphWeiss.cpp:151
Node * node2
Second node in edge.
Definition: GraphWeiss.h:30
size_t getNumNodes(void) const override
Returns the number of nodes in the graph.
Definition: GraphWeiss.h:92
CGraphWeiss(byte nStates)
Constructor.
Definition: GraphWeiss.cpp:7
Node(size_t _id, const Mat &p=EmptyMat)
Definition: GraphWeiss.h:66