From a487ba019d431451e98cd094bb8d8c792904fb2f Mon Sep 17 00:00:00 2001 From: Sebastian Brockmeyer <937096+sebrockm@users.noreply.github.com> Date: Sat, 15 Oct 2022 22:17:00 +0200 Subject: [PATCH] Add a test for the all defaults overload with custom properties --- test/boykov_kolmogorov_max_flow_test.cpp | 110 +++++++++++++++++++++-- 1 file changed, 104 insertions(+), 6 deletions(-) diff --git a/test/boykov_kolmogorov_max_flow_test.cpp b/test/boykov_kolmogorov_max_flow_test.cpp index 95fe4a7a..9e0ce7b3 100644 --- a/test/boykov_kolmogorov_max_flow_test.cpp +++ b/test/boykov_kolmogorov_max_flow_test.cpp @@ -174,14 +174,109 @@ template < typename EdgeDescriptor > struct Link EdgeDescriptor edge_reverse; }; +typedef adjacency_list_traits< vecS, vecS, directedS > tTraits; +typedef Node< tTraits::edge_descriptor > tVertex; +typedef Link< tTraits::edge_descriptor > tEdge; +typedef adjacency_list< vecS, vecS, directedS, tVertex, tEdge > tBundleGraph; + +namespace boost +{ +template <> struct property_map< tBundleGraph, edge_capacity_t > +{ + typedef adj_list_edge_property_map< directed_tag, long, long&, size_t, + tEdge, long tEdge::* > + type; + typedef adj_list_edge_property_map< directed_tag, long, const long&, size_t, + const tEdge, long tEdge::* > + const_type; +}; + +template <> struct property_map< tBundleGraph, edge_residual_capacity_t > +{ + typedef adj_list_edge_property_map< directed_tag, long, long&, size_t, + tEdge, long tEdge::* > + type; + typedef adj_list_edge_property_map< directed_tag, long, const long&, size_t, + const tEdge, long tEdge::* > + const_type; +}; + +template <> struct property_map< tBundleGraph, edge_reverse_t > +{ + typedef adj_list_edge_property_map< directed_tag, tTraits::edge_descriptor, + tTraits::edge_descriptor&, size_t, tEdge, + tTraits::edge_descriptor tEdge::* > + type; + typedef adj_list_edge_property_map< directed_tag, tTraits::edge_descriptor, + const tTraits::edge_descriptor&, size_t, const tEdge, + tTraits::edge_descriptor tEdge::* > + const_type; +}; +template <> struct property_map< tBundleGraph, vertex_predecessor_t > +{ + typedef vec_adj_list_vertex_property_map< tBundleGraph, tBundleGraph*, + tTraits::edge_descriptor, tTraits::edge_descriptor&, + tTraits::edge_descriptor tVertex::* > + type; + typedef vec_adj_list_vertex_property_map< tBundleGraph, const tBundleGraph*, + tTraits::edge_descriptor, const tTraits::edge_descriptor&, + tTraits::edge_descriptor tVertex::* > + const_type; +}; +template <> struct property_map< tBundleGraph, vertex_color_t > +{ + typedef vec_adj_list_vertex_property_map< tBundleGraph, tBundleGraph*, + default_color_type, default_color_type&, default_color_type tVertex::* > + type; + typedef vec_adj_list_vertex_property_map< tBundleGraph, const tBundleGraph*, + default_color_type, const default_color_type&, + default_color_type tVertex::* > + const_type; +}; +template <> struct property_map< tBundleGraph, vertex_distance_t > +{ + typedef vec_adj_list_vertex_property_map< tBundleGraph, tBundleGraph*, long, + long&, long tVertex::* > + type; + typedef vec_adj_list_vertex_property_map< tBundleGraph, const tBundleGraph*, + long, const long&, long tVertex::* > + const_type; +}; +} + +property_map< tBundleGraph, edge_capacity_t >::const_type get( + edge_capacity_t, const tBundleGraph& g) +{ + return get(&tEdge::edge_capacity, g); +} +property_map< tBundleGraph, edge_residual_capacity_t >::type get( + edge_residual_capacity_t, tBundleGraph& g) +{ + return get(&tEdge::edge_residual_capacity, g); +} +property_map< tBundleGraph, edge_reverse_t >::const_type get( + edge_reverse_t, const tBundleGraph& g) +{ + return get(&tEdge::edge_reverse, g); +} +property_map< tBundleGraph, vertex_predecessor_t >::type get( + vertex_predecessor_t, tBundleGraph& g) +{ + return get(&tVertex::vertex_predecessor, g); +} +property_map< tBundleGraph, vertex_color_t >::type get( + vertex_color_t, tBundleGraph& g) +{ + return get(&tVertex::vertex_color, g); +} +property_map< tBundleGraph, vertex_distance_t >::type get( + vertex_distance_t, tBundleGraph& g) +{ + return get(&tVertex::vertex_distance, g); +} + long test_bundled_properties(int n_verts, int n_edges, std::size_t seed) { - typedef adjacency_list_traits< vecS, vecS, directedS > tTraits; - typedef Node< tTraits::edge_descriptor > tVertex; - typedef Link< tTraits::edge_descriptor > tEdge; - typedef adjacency_list< vecS, vecS, directedS, tVertex, tEdge > - tBundleGraph; - tBundleGraph g; graph_traits< tBundleGraph >::vertex_descriptor src, sink; @@ -189,6 +284,8 @@ long test_bundled_properties(int n_verts, int n_edges, std::size_t seed) = fill_random_max_flow_graph(g, get(&tEdge::edge_capacity, g), get(&tEdge::edge_reverse, g), n_verts, n_edges, seed); + long flow_all_defaults_overload = boykov_kolmogorov_max_flow(g, src, sink); + long flow_unnamed_overload = boykov_kolmogorov_max_flow(g, get(&tEdge::edge_capacity, g), get(&tEdge::edge_residual_capacity, g), get(&tEdge::edge_reverse, g), get(&tVertex::vertex_predecessor, g), @@ -204,6 +301,7 @@ long test_bundled_properties(int n_verts, int n_edges, std::size_t seed) .distance_map(get(&tVertex::vertex_distance, g)) .vertex_index_map(get(vertex_index, g))); + BOOST_TEST(flow_all_defaults_overload == flow_unnamed_overload); BOOST_TEST(flow_unnamed_overload == flow_named_overload); return flow_named_overload; }