1 #include "GraphWeiss.h" 16 for (
size_t n = 0; n < nNodes; n++)
24 for (
size_t n = 0; n < nNodes; n++)
42 DGM_ASSERT_MSG(node <
m_vpNodes.size(),
"Node %zu is out of range %zu", node,
m_vpNodes.size());
52 DGM_ASSERT_MSG(node <
m_vpNodes.size(),
"Node %zu is out of range %zu", node,
m_vpNodes.size());
53 DGM_ASSERT_MSG(!
m_vpNodes.at(node)->Pot.empty(),
"Specified node %zu is not set", node);
62 DGM_ASSERT_MSG(node <
m_vpNodes.size(),
"Node %zu is out of range %zu", node,
m_vpNodes.size());
64 for (
size_t e_t = 0; e_t <
m_vpNodes.at(node)->to.size(); e_t++)
65 vNodes.push_back(
m_vpNodes.at(node)->to.at(e_t)->node2->id);
72 DGM_ASSERT_MSG(node <
m_vpNodes.size(),
"Node %zu is out of range %zu", node,
m_vpNodes.size());
74 for (
size_t e_f = 0; e_f <
m_vpNodes.at(node)->from.size(); e_f++)
75 vNodes.push_back(
m_vpNodes.at(node)->from.at(e_f)->node1->id);
90 DGM_ASSERT_MSG(srcNode <
m_vpNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vpNodes.size());
91 DGM_ASSERT_MSG(dstNode <
m_vpNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vpNodes.size());
94 for (
size_t e_t = 0; e_t <
m_vpNodes.at(srcNode)->to.size(); e_t++) {
102 m_vpNodes.at(dstNode)->from.push_back(e);
109 DGM_ASSERT_MSG(srcNode <
m_vpNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vpNodes.size());
110 DGM_ASSERT_MSG(dstNode <
m_vpNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vpNodes.size());
113 DGM_ASSERT_MSG(e,
"The edge (%zu)->(%zu) is not found", srcNode, dstNode);
121 for (
Edge* e : n->to)
122 if (!group || e->
group_id == group.value())
130 DGM_ASSERT_MSG(srcNode <
m_vpNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vpNodes.size());
131 DGM_ASSERT_MSG(dstNode <
m_vpNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vpNodes.size());
134 DGM_ASSERT_MSG(e,
"The edge (%zu)->(%zu) is not found", srcNode, dstNode);
142 DGM_ASSERT_MSG(srcNode <
m_vpNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vpNodes.size());
143 DGM_ASSERT_MSG(dstNode <
m_vpNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vpNodes.size());
146 DGM_ASSERT_MSG(e,
"The edge (%zu)->(%zu) is not found", srcNode, dstNode);
154 DGM_ASSERT_MSG(srcNode <
m_vpNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vpNodes.size());
155 DGM_ASSERT_MSG(dstNode <
m_vpNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vpNodes.size());
158 DGM_ASSERT_MSG(e,
"The edge (%zu)->(%zu) is not found", srcNode, dstNode);
166 DGM_ASSERT_MSG(srcNode <
m_vpNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vpNodes.size());
167 DGM_ASSERT_MSG(dstNode <
m_vpNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vpNodes.size());
171 DGM_WARNING(
"The edge (%zu)->(%zu) is not found", srcNode, dstNode);
187 DGM_ASSERT_MSG(srcNode <
m_vpNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vpNodes.size());
188 DGM_ASSERT_MSG(dstNode <
m_vpNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vpNodes.size());
190 return findEdge(srcNode, dstNode) ? true :
false;
196 if (edge_to->node2->id == dstNode)
size_t getNumEdges(void) const override
Returns the number of edges in the graph.
size_t addNode(const Mat &pot=EmptyMat) override
Adds an additional node (with specified potentional)
void getEdge(size_t srcNode, size_t dstNode, Mat &pot) const override
Returns the edge potential.
void getNode(size_t node, Mat &pot) const override
Returns the node potential.
void getChildNodes(size_t node, vec_size_t &vNodes) const override
Returns the set of IDs of the child nodes of the argument node.
void setNode(size_t node, const Mat &pot) override
Sets or changes the potential of node.
Mat Pot
The edge potentials: Mat(size: nStates x nStates; type: CV_32FC1)
Edge * findEdge(size_t srcNode, size_t dstNode) const
Finds and returns the Edge defined by two nodes.
byte group_id
ID of the group, to which the edge belongs.
void setEdgeGroup(size_t srcNode, size_t dstNode, byte group) override
Assigns a directed edge (srcNode) –> (dstNode) to the group group.
void addEdge(size_t srcNode, size_t dstNode, byte group, const Mat &pot) override
Adds an additional directed edge with specified potentional.
void reset(void) override
Resets the graph.
void removeEdge(size_t srcNode, size_t dstNode) override
Removes the specified edge.
void setEdge(size_t srcNode, size_t dstNode, const Mat &pot) override
Sets or changes the potentional of directed edge.
bool isEdgeExists(size_t srcNode, size_t dstNode) const override
Checks whether the edge exists.
void setEdges(std::optional< byte > group, const Mat &pot) override
Sets the potential pot to all edges belonging to group group.
virtual ~CGraphWeiss(void)
void getParentNodes(size_t node, vec_size_t &vNodes) const override
Returns the set of IDs of the parent nodes of the argument node.
Interface class for graphical models.
byte getEdgeGroup(size_t srcNode, size_t dstNode) const override
Returns the group of the edge.
Node * node2
Second node in edge.
CGraphWeiss(byte nStates)
Constructor.