Opened 7 years ago
Last modified 6 years ago
#12038 new Bugs
Max-flow algorithms not working with named parameters.
Reported by: | Owned by: | Jeremiah Willcock | |
---|---|---|---|
Milestone: | To Be Determined | Component: | graph |
Version: | Boost 1.57.0 | Severity: | Problem |
Keywords: | Cc: |
Description
The named parameter called "edge capacity" is not working. As explained at the end of #8791, this is due to a slight inversion:
The line in boost/graph/named_function_params.hpp:326
typedef typename detail::choose_iml_result<boost::mph::true_, Graph, typename get_param_type<Params, edge_capacity_t>::type, edge_capacity_t>::type CapacityEdgeMap;
should rather be
typedef typename detail::choose_iml_result<boost::mph::true_, Graph, typename get_param_type<edge_capacity_t, Params>::type, edge_capacity_t>::type CapacityEdgeMap;
Here are the max-flow algorithms that are currently not working with the named parameter "Edge Capacity":
- edmonds_karp_max_flow,
- push_relabel_max_flow,
- boykov_kolmogorov_max_flow.
Minimal not-working example:
#include <boost/config.hpp> #include <iostream> #include <string> #include <boost/graph/edmonds_karp_max_flow.hpp> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/read_dimacs.hpp> #include <boost/graph/graph_utility.hpp> #include <boost/graph/find_flow_cost.hpp> using namespace boost; typedef adjacency_list_traits<vecS,vecS,directedS> traits; struct edge_t { double capacity; float cost; float residual_capacity; traits::edge_descriptor reversed_edge; }; struct node_t { std::string name; boost::default_color_type color; traits::edge_descriptor predecessor; }; typedef adjacency_list < listS, vecS, directedS, node_t, edge_t > Graph; int main() { Graph g; property_map < Graph, double edge_t::* >::type capacity = get(&edge_t::capacity, g); property_map < Graph, float edge_t::* >::type cost = get(&edge_t::cost, g); property_map < Graph, float edge_t::* >::type residual_capacity = get(&edge_t::residual_capacity, g); property_map < Graph, traits::edge_descriptor edge_t::* >::type rev = get(&edge_t::reversed_edge, g); property_map < Graph, std::string node_t::* >::type name = get(&node_t::name, g); property_map < Graph, boost::default_color_type node_t::* >::type col = get(&node_t::color, g); property_map < Graph, traits::edge_descriptor node_t::* >::type pred = get(&node_t::predecessor, g); traits::vertex_descriptor s, t; read_dimacs_max_flow(g, capacity, rev, s, t); // XXX The "named parameter version" (producing errors) // XXX I chose to show the error with edmonds_karp_max_flow(). flow = edmonds_karp_max_flow(g, s, t, capacity_map(capacity) .residual_capacity_map(residual_capacity) .reverse_edge_map(rev) .color_map(col) .predecessor_map(pred)); return EXIT_SUCCESS; }
Change History (3)
comment:1 by , 7 years ago
Component: | None → graph |
---|---|
Owner: | set to |
comment:2 by , 7 years ago
comment:3 by , 6 years ago
I re-submitted the patch in https://github.com/boostorg/graph/pull/61. It has been accepted yesterday, we may close that issue!
Note:
See TracTickets
for help on using tickets.
Added PR on Github: https://github.com/boostorg/graph/pull/60