[Boost-bugs] [Boost C++ Libraries] #12038: Max-flow algorithms not working with named parameters.

Subject: [Boost-bugs] [Boost C++ Libraries] #12038: Max-flow algorithms not working with named parameters.
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2016-03-02 14:56:52


#12038: Max-flow algorithms not working with named parameters.
-----------------------------------------+------------------------------
 Reporter: Maël Valais <mael.valais@…> | Type: Bugs
   Status: new | Milestone: To Be Determined
Component: None | Version: Boost 1.57.0
 Severity: Problem | Keywords:
-----------------------------------------+------------------------------
 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`
 {{{#!cpp
 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
 {{{#!cpp
 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:
 {{{#!cpp
 #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;
 }
 }}}

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/12038>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:19 UTC