add function to add a node into DynamicGraph
This commit is contained in:
parent
ce684cf9d4
commit
a64f2de9e1
@ -63,27 +63,27 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Constructs an empty graph with a given number of nodes.
|
// Constructs an empty graph with a given number of nodes.
|
||||||
explicit DynamicGraph(int32_t nodes) : m_numNodes(nodes), m_numEdges(0)
|
explicit DynamicGraph(int32_t nodes) : number_of_nodes(nodes), number_of_edges(0)
|
||||||
{
|
{
|
||||||
m_nodes.reserve(m_numNodes);
|
m_nodes.reserve(number_of_nodes);
|
||||||
m_nodes.resize(m_numNodes);
|
m_nodes.resize(number_of_nodes);
|
||||||
|
|
||||||
m_edges.reserve(m_numNodes * 1.1);
|
m_edges.reserve(number_of_nodes * 1.1);
|
||||||
m_edges.resize(m_numNodes);
|
m_edges.resize(number_of_nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class ContainerT> DynamicGraph(const int32_t nodes, const ContainerT &graph)
|
template <class ContainerT> DynamicGraph(const int32_t nodes, const ContainerT &graph)
|
||||||
{
|
{
|
||||||
m_numNodes = nodes;
|
number_of_nodes = nodes;
|
||||||
m_numEdges = (EdgeIterator)graph.size();
|
number_of_edges = (EdgeIterator)graph.size();
|
||||||
m_nodes.reserve(m_numNodes + 1);
|
m_nodes.reserve(number_of_nodes + 1);
|
||||||
m_nodes.resize(m_numNodes + 1);
|
m_nodes.resize(number_of_nodes + 1);
|
||||||
EdgeIterator edge = 0;
|
EdgeIterator edge = 0;
|
||||||
EdgeIterator position = 0;
|
EdgeIterator position = 0;
|
||||||
for (NodeIterator node = 0; node < m_numNodes; ++node)
|
for (NodeIterator node = 0; node < number_of_nodes; ++node)
|
||||||
{
|
{
|
||||||
EdgeIterator lastEdge = edge;
|
EdgeIterator lastEdge = edge;
|
||||||
while (edge < m_numEdges && graph[edge].source == node)
|
while (edge < number_of_edges && graph[edge].source == node)
|
||||||
{
|
{
|
||||||
++edge;
|
++edge;
|
||||||
}
|
}
|
||||||
@ -95,7 +95,7 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
m_edges.reserve(static_cast<std::size_t>(position * 1.1));
|
m_edges.reserve(static_cast<std::size_t>(position * 1.1));
|
||||||
m_edges.resize(position);
|
m_edges.resize(position);
|
||||||
edge = 0;
|
edge = 0;
|
||||||
for (NodeIterator node = 0; node < m_numNodes; ++node)
|
for (NodeIterator node = 0; node < number_of_nodes; ++node)
|
||||||
{
|
{
|
||||||
for (EdgeIterator i = m_nodes[node].firstEdge,
|
for (EdgeIterator i = m_nodes[node].firstEdge,
|
||||||
e = m_nodes[node].firstEdge + m_nodes[node].edges;
|
e = m_nodes[node].firstEdge + m_nodes[node].edges;
|
||||||
@ -112,9 +112,9 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
|
|
||||||
~DynamicGraph() {}
|
~DynamicGraph() {}
|
||||||
|
|
||||||
unsigned GetNumberOfNodes() const { return m_numNodes; }
|
unsigned GetNumberOfNodes() const { return number_of_nodes; }
|
||||||
|
|
||||||
unsigned GetNumberOfEdges() const { return m_numEdges; }
|
unsigned GetNumberOfEdges() const { return number_of_edges; }
|
||||||
|
|
||||||
unsigned GetOutDegree(const NodeIterator n) const { return m_nodes[n].edges; }
|
unsigned GetOutDegree(const NodeIterator n) const { return m_nodes[n].edges; }
|
||||||
|
|
||||||
@ -154,6 +154,14 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
return boost::irange(BeginEdges(node), EndEdges(node));
|
return boost::irange(BeginEdges(node), EndEdges(node));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NodeIterator InsertNode()
|
||||||
|
{
|
||||||
|
m_nodes.emplace_back(m_nodes.back());
|
||||||
|
number_of_nodes +=1;
|
||||||
|
|
||||||
|
return number_of_nodes;
|
||||||
|
}
|
||||||
|
|
||||||
// adds an edge. Invalidates edge iterators for the source node
|
// adds an edge. Invalidates edge iterators for the source node
|
||||||
EdgeIterator InsertEdge(const NodeIterator from, const NodeIterator to, const EdgeDataT &data)
|
EdgeIterator InsertEdge(const NodeIterator from, const NodeIterator to, const EdgeDataT &data)
|
||||||
{
|
{
|
||||||
@ -190,7 +198,7 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
Edge &edge = m_edges[node.firstEdge + node.edges];
|
Edge &edge = m_edges[node.firstEdge + node.edges];
|
||||||
edge.target = to;
|
edge.target = to;
|
||||||
edge.data = data;
|
edge.data = data;
|
||||||
++m_numEdges;
|
++number_of_edges;
|
||||||
++node.edges;
|
++node.edges;
|
||||||
return EdgeIterator(node.firstEdge + node.edges);
|
return EdgeIterator(node.firstEdge + node.edges);
|
||||||
}
|
}
|
||||||
@ -199,7 +207,7 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
void DeleteEdge(const NodeIterator source, const EdgeIterator e)
|
void DeleteEdge(const NodeIterator source, const EdgeIterator e)
|
||||||
{
|
{
|
||||||
Node &node = m_nodes[source];
|
Node &node = m_nodes[source];
|
||||||
--m_numEdges;
|
--number_of_edges;
|
||||||
--node.edges;
|
--node.edges;
|
||||||
BOOST_ASSERT(std::numeric_limits<unsigned>::max() != node.edges);
|
BOOST_ASSERT(std::numeric_limits<unsigned>::max() != node.edges);
|
||||||
const unsigned last = node.firstEdge + node.edges;
|
const unsigned last = node.firstEdge + node.edges;
|
||||||
@ -226,7 +234,7 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_numEdges -= deleted;
|
number_of_edges -= deleted;
|
||||||
m_nodes[source].edges -= deleted;
|
m_nodes[source].edges -= deleted;
|
||||||
|
|
||||||
return deleted;
|
return deleted;
|
||||||
@ -270,8 +278,8 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
EdgeDataT data;
|
EdgeDataT data;
|
||||||
};
|
};
|
||||||
|
|
||||||
NodeIterator m_numNodes;
|
NodeIterator number_of_nodes;
|
||||||
std::atomic_uint m_numEdges;
|
std::atomic_uint number_of_edges;
|
||||||
|
|
||||||
std::vector<Node> m_nodes;
|
std::vector<Node> m_nodes;
|
||||||
DeallocatingVector<Edge> m_edges;
|
DeallocatingVector<Edge> m_edges;
|
||||||
|
Loading…
Reference in New Issue
Block a user