2
0
mirror of https://github.com/boostorg/graph.git synced 2026-02-01 08:32:11 +00:00

Fixed construction and assignment of bidirectional CSR graphs from other graphs; removed add_edges* functions (which were broken and not documented) from bidirectional CSR; fixes #7002

[SVN r79179]
This commit is contained in:
Jeremiah Willcock
2012-06-29 20:26:26 +00:00
parent 215359117a
commit 849d1538ed

View File

@@ -929,6 +929,7 @@ class compressed_sparse_row_graph<bidirectionalS, VertexProperty, EdgeProperty,
{
m_forward.assign(g, vi, numverts, numedges);
inherited_vertex_properties::resize(numverts);
set_up_backward_property_links();
}
// Requires the above, plus VertexListGraph and EdgeListGraph
@@ -942,6 +943,7 @@ class compressed_sparse_row_graph<bidirectionalS, VertexProperty, EdgeProperty,
vertices_size_type numverts = num_vertices(g);
m_forward.assign(g, vi, numverts, numedges);
inherited_vertex_properties::resize(numverts);
set_up_backward_property_links();
}
// Requires the above, plus a vertex_index map.
@@ -955,125 +957,7 @@ class compressed_sparse_row_graph<bidirectionalS, VertexProperty, EdgeProperty,
vertices_size_type numverts = num_vertices(g);
m_forward.assign(g, get(vertex_index, g), numverts, numedges);
inherited_vertex_properties::resize(numverts);
}
// Add edges from a sorted (smallest sources first) range of pairs and edge
// properties
template <typename BidirectionalIteratorOrig, typename EPIterOrig,
typename GlobalToLocal>
void
add_edges_sorted_internal(
BidirectionalIteratorOrig first_sorted,
BidirectionalIteratorOrig last_sorted,
EPIterOrig ep_iter_sorted,
const GlobalToLocal& global_to_local) {
m_forward.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted, global_to_local);
}
template <typename BidirectionalIteratorOrig, typename EPIterOrig>
void
add_edges_sorted_internal(
BidirectionalIteratorOrig first_sorted,
BidirectionalIteratorOrig last_sorted,
EPIterOrig ep_iter_sorted) {
m_forward.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted, typed_identity_property_map<Vertex>());
}
// Add edges from a sorted (smallest sources first) range of pairs
template <typename BidirectionalIteratorOrig>
void
add_edges_sorted_internal(
BidirectionalIteratorOrig first_sorted,
BidirectionalIteratorOrig last_sorted) {
m_forward.add_edges_sorted_internal(first_sorted, last_sorted, detail::default_construct_iterator<edge_bundled>());
}
template <typename BidirectionalIteratorOrig, typename GlobalToLocal>
void
add_edges_sorted_internal_global(
BidirectionalIteratorOrig first_sorted,
BidirectionalIteratorOrig last_sorted,
const GlobalToLocal& global_to_local) {
m_forward.add_edges_sorted_internal(first_sorted, last_sorted, detail::default_construct_iterator<edge_bundled>(), global_to_local);
}
template <typename BidirectionalIteratorOrig, typename EPIterOrig,
typename GlobalToLocal>
void
add_edges_sorted_internal_global(
BidirectionalIteratorOrig first_sorted,
BidirectionalIteratorOrig last_sorted,
EPIterOrig ep_iter_sorted,
const GlobalToLocal& global_to_local) {
m_forward.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted, global_to_local);
}
// Add edges from a range of (source, target) pairs that are unsorted
template <typename InputIterator, typename GlobalToLocal>
inline void
add_edges_internal(InputIterator first, InputIterator last,
const GlobalToLocal& global_to_local) {
typedef compressed_sparse_row_graph Graph;
typedef typename boost::graph_traits<Graph>::vertex_descriptor vertex_t;
typedef typename boost::graph_traits<Graph>::vertices_size_type vertex_num;
typedef typename boost::graph_traits<Graph>::edges_size_type edge_num;
typedef std::vector<std::pair<vertex_t, vertex_t> > edge_vector_t;
edge_vector_t new_edges(first, last);
if (new_edges.empty()) return;
std::sort(new_edges.begin(), new_edges.end());
this->add_edges_sorted_internal_global(new_edges.begin(), new_edges.end(), global_to_local);
}
template <typename InputIterator>
inline void
add_edges_internal(InputIterator first, InputIterator last) {
this->add_edges_internal(first, last, typed_identity_property_map<Vertex>());
}
// Add edges from a range of (source, target) pairs and edge properties that
// are unsorted
template <typename InputIterator, typename EPIterator, typename GlobalToLocal>
inline void
add_edges_internal(InputIterator first, InputIterator last,
EPIterator ep_iter, EPIterator ep_iter_end,
const GlobalToLocal& global_to_local) {
typedef compressed_sparse_row_graph Graph;
typedef typename boost::graph_traits<Graph>::vertex_descriptor vertex_t;
typedef typename boost::graph_traits<Graph>::vertices_size_type vertex_num;
typedef typename boost::graph_traits<Graph>::edges_size_type edge_num;
typedef std::pair<vertex_t, vertex_t> vertex_pair;
typedef std::vector<
boost::tuple<vertex_pair,
edge_bundled> >
edge_vector_t;
edge_vector_t new_edges
(boost::make_zip_iterator(boost::make_tuple(first, ep_iter)),
boost::make_zip_iterator(boost::make_tuple(last, ep_iter_end)));
if (new_edges.empty()) return;
std::sort(new_edges.begin(), new_edges.end(),
boost::detail::compare_first<
std::less<vertex_pair> >());
m_forward.add_edges_sorted_internal
(boost::make_transform_iterator(
new_edges.begin(),
boost::detail::my_tuple_get_class<0, vertex_pair>()),
boost::make_transform_iterator(
new_edges.end(),
boost::detail::my_tuple_get_class<0, vertex_pair>()),
boost::make_transform_iterator(
new_edges.begin(),
boost::detail::my_tuple_get_class
<1, edge_bundled>()),
global_to_local);
}
// Add edges from a range of (source, target) pairs and edge properties that
// are unsorted
template <typename InputIterator, typename EPIterator>
inline void
add_edges_internal(InputIterator first, InputIterator last,
EPIterator ep_iter, EPIterator ep_iter_end) {
this->add_edges_internal(first, last, ep_iter, ep_iter_end, typed_identity_property_map<Vertex>());
set_up_backward_property_links();
}
using inherited_vertex_properties::operator[];