12#ifndef MCRL2_PG_GRAPH_IMPL_H
13#define MCRL2_PG_GRAPH_IMPL_H
18#include <unordered_map>
24EdgeIterator &EdgeIterator::operator=(
const EdgeIterator &ei)
32std::pair<verti, verti> EdgeIterator::operator*()
34 return std::pair<verti, verti>(v, g->successors_[e]);
37std::pair<verti, verti> EdgeIterator::operator++()
39 if (++e < g->E_)
while (g->successor_index_[v + 1] < e) ++v;
43std::pair<verti, verti> EdgeIterator::operator++(
int)
45 std::pair<verti, verti> result = **
this;
51template<
class ForwardIterator>
53 ForwardIterator vertices_begin,
54 ForwardIterator vertices_end,
58 assert(vertices_begin <= vertices_end);
61 if (
static_cast<verti>(std::distance(vertices_begin, vertices_end)) < graph.
V()/3)
63 std::unordered_map<verti, verti> map;
65 vertices_end, map, proper,
edge_dir);
75template<
class ForwardIterator,
class VertexMapT>
77 ForwardIterator vertices_begin,
78 ForwardIterator vertices_end,
79 VertexMapT &vertex_map,
83 assert(
this != &graph);
85 verti num_vertices = 0;
89 for (ForwardIterator it = vertices_begin; it != vertices_end; ++it)
91 vertex_map[*it] = num_vertices++;
95 for (ForwardIterator it = vertices_begin; it != vertices_end; ++it)
108 while (a != b) num_edges += (vertex_map.find(*a++) != vertex_map.end());
119 for (ForwardIterator it = vertices_begin; it != vertices_end; ++it)
127 typename VertexMapT::const_iterator it(vertex_map.find(*succ_it));
128 if (it != vertex_map.end())
successors_[e++] = (*it).second;
131 if (!std::is_sorted(begin, end, std::less<verti>()))
133 std::sort(begin, end);
135 if (proper) assert(begin != end);
137 assert(v ==
V_ && e ==
E_);
146 for (ForwardIterator it = vertices_begin; it != vertices_end; ++it)
154 typename VertexMapT::const_iterator it(vertex_map.find(*pred_it));
158 if (!std::is_sorted(begin, end, std::less<verti>()))
160 std::sort(begin, end);
163 assert(v ==
V_ && e ==
E_);
std::size_t edgei
type used to number edges
std::size_t verti
type used to number vertices
const_iterator succ_end(verti v) const
void reset(verti V, edgei E, EdgeDirection edge_dir)
EdgeDirection edge_dir() const
void make_subgraph(const StaticGraph &graph, ForwardIterator vertices_begin, ForwardIterator vertices_end, bool proper, EdgeDirection edge_dir=EDGE_NONE)
edgei * predecessor_index_
const_iterator succ_begin(verti v) const
const_iterator pred_begin(verti v) const
const_iterator pred_end(verti v) const
const verti * const_iterator