Opened 7 years ago

Last modified 6 years ago

#12038 new Bugs

Max-flow algorithms not working with named parameters.

Reported by: Maël Valais <mael.valais@…> 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 Maël Valais <mael.valais@…>, 7 years ago

Component: Nonegraph
Owner: set to Jeremiah Willcock

comment:2 by Maël Valais <mael.valais@…>, 7 years ago

comment:3 by Maël Valais <mael.valais@…>, 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.