1 #include "GraphPairwise.h" 23 DGM_ASSERT_MSG(node <
m_vNodes.size(),
"Node %zu is out of range %zu", node,
m_vNodes.size());
24 DGM_ASSERT_MSG((pot.cols == 1) && (pot.rows ==
getNumStates()),
"Potential size (%d x %d) does not match (%d x %d)", pot.cols, pot.rows, 1,
getNumStates());
33 DGM_ASSERT_MSG(node <
m_vNodes.size(),
"Node %zu is out of range %zu", node,
m_vNodes.size());
34 DGM_ASSERT_MSG(!
m_vNodes[node]->Pot.empty(),
"Specified node %zu is not set", node);
42 if (!vNodes.empty()) vNodes.clear();
50 if (!vNodes.empty()) vNodes.clear();
51 for (
size_t e:
m_vNodes[node]->from) { vNodes.push_back(
m_vEdges[e]->node1); }
58 DGM_ASSERT_MSG(srcNode <
m_vNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vNodes.size());
59 DGM_ASSERT_MSG(dstNode <
m_vNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vNodes.size());
63 for (
size_t &e :
m_vNodes[srcNode]->to) { DGM_ASSERT(
m_vEdges[e]->node2 != dstNode); }
65 for (
size_t &e :
m_vNodes[dstNode]->from) { DGM_ASSERT(
m_vEdges[e]->node1 != srcNode); }
71 m_vNodes[dstNode]->from.push_back(e);
77 DGM_ASSERT_MSG(srcNode <
m_vNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vNodes.size());
78 DGM_ASSERT_MSG(dstNode <
m_vNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vNodes.size());
80 vec_size_t::const_iterator e_t = std::find_if(
m_vNodes[srcNode]->to.cbegin(),
m_vNodes[srcNode]->to.cend(), [&](
size_t e) {
return (
m_vEdges[e]->node2 == dstNode); });
81 DGM_ASSERT_MSG(e_t !=
m_vNodes[srcNode]->to.end(),
"The edge (%zu)->(%zu) is not found", srcNode, dstNode);
90 size_t rangeSize = size / (concurrency::GetProcessorCount() * 10);
91 rangeSize = MAX(1, rangeSize);
93 concurrency::parallel_for(
size_t(0), size, rangeSize, [group, &pot, size, rangeSize,
this](
size_t i) {
94 for (
int j = 0; (j < rangeSize) && (i + j < size); j++) {
96 if (!group || pEdge->group_id == group.value())
97 pot.copyTo(pEdge->Pot);
102 if(!group || pEdge->group_id == group.value())
103 pot.copyTo(pEdge->Pot);
111 DGM_ASSERT_MSG(srcNode <
m_vNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vNodes.size());
112 DGM_ASSERT_MSG(dstNode <
m_vNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vNodes.size());
114 vec_size_t::const_iterator e_t = std::find_if(
m_vNodes[srcNode]->to.cbegin(),
m_vNodes[srcNode]->to.cend(), [&](
size_t e) {
return (
m_vEdges[e]->node2 == dstNode); });
115 DGM_ASSERT_MSG(e_t !=
m_vNodes[srcNode]->to.end(),
"The edge (%zu)->(%zu) is not found", srcNode, dstNode);
117 DGM_WARNING(
"Edge Potential is empty");
118 if (!pot.empty()) pot.release();
119 }
else m_vEdges[*e_t]->Pot.copyTo(pot);
124 DGM_ASSERT_MSG(srcNode <
m_vNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vNodes.size());
125 DGM_ASSERT_MSG(dstNode <
m_vNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vNodes.size());
127 vec_size_t::const_iterator e_t = std::find_if(
m_vNodes[srcNode]->to.cbegin(),
m_vNodes[srcNode]->to.cend(), [&](
size_t e) {
return (
m_vEdges[e]->node2 == dstNode); });
128 DGM_ASSERT_MSG(e_t !=
m_vNodes[srcNode]->to.end(),
"The edge (%zu)->(%zu) is not found", srcNode, dstNode);
134 DGM_ASSERT_MSG(srcNode <
m_vNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vNodes.size());
135 DGM_ASSERT_MSG(dstNode <
m_vNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vNodes.size());
137 vec_size_t::const_iterator e_t = std::find_if(
m_vNodes[srcNode]->to.cbegin(),
m_vNodes[srcNode]->to.cend(), [&](
size_t e) {
return (
m_vEdges[e]->node2 == dstNode); });
138 DGM_ASSERT_MSG(e_t !=
m_vNodes[srcNode]->to.end(),
"The edge (%zu)->(%zu) is not found", srcNode, dstNode);
145 DGM_ASSERT_MSG(srcNode <
m_vNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vNodes.size());
146 DGM_ASSERT_MSG(dstNode <
m_vNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vNodes.size());
148 vec_size_t::const_iterator e_t = std::find_if(
m_vNodes[srcNode]->to.cbegin(),
m_vNodes[srcNode]->to.cend(), [&](
size_t e) {
return (
m_vEdges[e]->node2 == dstNode); });
150 DGM_ASSERT_MSG(e_t !=
m_vNodes[srcNode]->to.end(),
"The edge (%zu)->(%zu) is not found", srcNode, dstNode);
157 DGM_ASSERT_MSG(srcNode <
m_vNodes.size(),
"The source node index %zu is out of range %zu", srcNode,
m_vNodes.size());
158 DGM_ASSERT_MSG(dstNode <
m_vNodes.size(),
"The destination node index %zu is out of range %zu", dstNode,
m_vNodes.size());
160 auto e_t = std::find_if(
m_vNodes[srcNode]->to.cbegin(),
m_vNodes[srcNode]->to.cend(), [&](
size_t e) {
return (
m_vEdges[e]->node2 == dstNode); });
162 if (e_t ==
m_vNodes[srcNode]->to.cend())
return false;
171 DGM_ASSERT_MSG(edge <
m_vEdges.size(),
"Edge %zu is out of range %zu", edge,
m_vEdges.size());
173 size_t srcNode =
m_vEdges[edge]->node1;
174 size_t dstNode =
m_vEdges[edge]->node2;
179 vec_size_t::const_iterator e_t = std::find(
m_vNodes[srcNode]->to.cbegin(),
m_vNodes[srcNode]->to.cend(), edge);
180 DGM_ASSERT(e_t !=
m_vNodes[srcNode]->to.cend());
183 vec_size_t::const_iterator e_f = std::find(
m_vNodes[dstNode]->from.cbegin(),
m_vNodes[dstNode]->from.cend(), edge);
184 DGM_ASSERT(e_f !=
m_vNodes[dstNode]->from.cend());
void setEdges(std::optional< byte > group, const Mat &pot) override
Sets the potential pot to all edges belonging to group group.
void removeEdge(size_t srcNode, size_t dstNode) override
Removes the specified edge.
void addEdge(size_t srcNode, size_t dstNode, byte group, const Mat &pot) override
Adds an additional directed edge with specified potentional.
byte getNumStates(void) const
Returns number of states (classes)
void setNode(size_t node, const Mat &pot) override
Sets or changes the potential of node.
byte getEdgeGroup(size_t srcNode, size_t dstNode) const override
Returns the group of the edge.
void setEdgeGroup(size_t srcNode, size_t dstNode, byte group) override
Assigns a directed edge (srcNode) –> (dstNode) to the group group.
void reset(void) override
Resets the graph.
bool isEdgeExists(size_t srcNode, size_t dstNode) const override
Checks whether the edge exists.
size_t getNumNodes(void) const override
Returns the number of nodes in the graph.
std::unique_ptr< Node > ptr_node_t
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 getParentNodes(size_t node, vec_size_t &vNodes) const override
Returns the set of IDs of the parent nodes of the argument node.
void getNode(size_t node, Mat &pot) const override
Returns the node potential.
void setEdge(size_t srcNode, size_t dstNode, const Mat &pot) override
Sets or changes the potentional of directed edge.
std::unique_ptr< Edge > ptr_edge_t
void getEdge(size_t srcNode, size_t dstNode, Mat &pot) const override
Returns the edge potential.
size_t addNode(const Mat &pot=EmptyMat) override
Adds an additional node (with specified potentional)