add function to add a node into DynamicGraph

This commit is contained in:
Dennis Luxen 2014-07-02 15:27:09 +02:00
parent ce684cf9d4
commit a64f2de9e1

View File

@ -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;