Boost logo

Boost Users :

Subject: [Boost-users] Problems calling make_reversed_graph in a call to dijkstra from version 1.48
From: Berit Dangaard Brouer (blof_at_[hidden])
Date: 2013-04-16 09:30:34


Hi,

First of all thank you for providign the boost BGL library. I use it
extensively.

I am having some problems with some code, that works just fine using
boost version 1.46, but cannot compile using version 1.48 and higher.

I have a Bidirectional Graph using bundled properties defined as:

struct Port
   {
     Port(int index=-1, int type=-1, int port_code=0, string UN="NN",
string name="NN", int service_id=-1 ): m_index(index), m_type(type),
m_port_code( port_code), UNLOCODE(UN), m_name(name),
m_service_id(service_id) {}

     int m_index;
     int m_type;//0 port, 1 port call
     int m_port_code;
     string UNLOCODE;
     string m_name;
     int m_service_id;
   };

struct Edge
   {

   Edge( int id=-1, int type=-1, double weight=0.0, double cost=0.0,
double dual_cost=0.0, double util=0.0, double cap=0.0, double r_cap=0.0
) : m_idx(id), m_type(type), m_weight(weight) , m_cost(cost),
m_dual_cost(dual_cost), m_utilization(util), m_capacity(cap),
m_res_cap(r_cap) {}

     unsigned int m_idx;
     int m_type;//0 is load edge, 1 is voyage edge, 2 forfeited edge
(commodity link)
     double m_weight; //distance
     double m_cost; //cost - only on load/unload/transhipment edges
     double m_dual_cost;
     double m_utilization;
     double m_capacity;
     double m_res_cap; //residual capacity
   };

//Graph
typedef adjacency_list<
vecS ,
vecS ,
bidirectionalS,
Port,
Edge>
mcf_graph;

I am trying to make a call to dijkstra on a reversed graph as follows:
(the reversed graph is also a filtered graph, but I do not think this is
an issue:

dijkstra_shortest_paths (make_reverse_graph(fg), before_p,
predecessor_map ( &p[0] ).distance_map ( &d[0] ).weight_map ( get (
&Edge::m_weight, fg) ).vertex_index_map ( get ( vertex_index,fg ) ) );

which works fine in 1.46, but it seems in 1.48 I can no longer use
make_reverse_graph(<mcf_graph&>) (returning a reverse graph) with the
bundled properties from fg. and I get the error (compressed summary -
full details attached)

usr/include/boost/property_map/property_map.hpp:354:56: error: no match
for 'operator[]' in '((const
boost::bundle_property_map<boost::adjacency_list<boost::vecS,
boost::vecS, boost::bidirectionalS, Port, Edge>,
boost::detail::edge_desc_impl<boost::bidirectional_tag, long unsigned
int>, Edge, double>&)pa)[k]'
/usr/include/boost/property_map/property_map.hpp:354:56: note: candidate is:
In file included from /usr/include/boost/graph/adjacency_list.hpp:44:0,
                  from /home/chrkr/git/lsndp/include/ipheuristic.h:36,
                  from /home/chrkr/git/lsndp/src/ipheuristic.cpp:29:
/usr/include/boost/graph/properties.hpp:399:15: note: T&
boost::bundle_property_map<Graph, Descriptor, Bundle,
T>::operator[](boost::bundle_property_map<Graph, Descriptor, Bundle,
T>::key_type) const [with Graph = boost::adjacency_list<boost::vecS,
boost::vecS, boost::bidirectionalS, Port, Edge>; Descriptor =
boost::detail::edge_desc_impl<boost::bidirectional_tag, long unsigned
int>; Bundle = Edge; T = double; boost::bundle_property_map<Graph,
Descriptor, Bundle, T>::reference = double&;
boost::bundle_property_map<Graph, Descriptor, Bundle, T>::key_type =
boost::detail::edge_desc_impl<boost::bidirectional_tag, long unsigned int>]
/usr/include/boost/graph/properties.hpp:399:15: note: no known
conversion for argument 1 from 'const
boost::detail::reverse_graph_edge_descriptor<boost::detail::edge_desc_impl<boost::bidirectional_tag,
long unsigned int> >' to
'boost::bundle_property_map<boost::adjacency_list<boost::vecS,
boost::vecS, boost::bidirectionalS, Port, Edge>,
boost::detail::edge_desc_impl<boost::bidirectional_tag, long unsigned
int>, Edge, double>::key_type {aka
boost::detail::edge_desc_impl<boost::bidirectional_tag, long unsigned int>}'

 From various sources I understand that as of 1.48 reverse graph is no
longer an image of the graph, but another object, where I need the
actual property maps and the property maps of the reversed graph, but I
did not get much wiser on how to call dijkstra with the reversed graph
given these new description. I tried defining the reverse graph as a
separate object
reverse_graph<mcf_graph> r_fg=reverse_graph(fg);
dijkstra_shortest_paths (r_fg), before_p, predecessor_map ( &p[0]
).distance_map ( &d[0] ).weight_map ( get ( &Edge::m_weight, r_fg)
).vertex_index_map ( get ( vertex_index, r_fg ) ) );

indicating that I am not getting the right properties for the reverse graph:

equired from here
/usr/include/boost/graph/properties.hpp:420:44: error: no type named
'vertex_bundled' in 'class
boost::reverse_graph<boost::adjacency_list<boost::vecS, boost::vecS,
boost::bidirectionalS, Port, Edge> >'
/usr/include/boost/graph/properties.hpp:421:42: error: no type named
'edge_bundled' in 'class
boost::reverse_graph<boost::adjacency_list<boost::vecS, boost::vecS,
boost::bidirectionalS, Port, Edge> >'
/usr/include/boost/graph/properties.hpp:425:7: error: no type named
'vertex_bundled' in 'class
boost::reverse_graph<boost::adjacency_list<boost::vecS, boost::vecS,
boost::bidirectionalS, Port, Edge> >'
/usr/include/boost/graph/properties.hpp:429:7: error: no type named
'vertex_bundled' in 'class
boost::reverse_graph<boost::adjacency_list<boost::vecS, boost::vecS,
boost::bidirectionalS, Port, Edge> >'
/usr/include/boost/graph/properties.hpp:432:70: error: no type named
'vertex_bundled' in 'class
boost::reverse_graph<boost::adjacency_list<boost::vecS, boost::vecS,
boost::bidirectionalS, Port, Edge> >'
/usr/include/boost/graph/properties.hpp:434:7: error: no type named
'vertex_bundled' in 'class
boost::reverse_graph<boost::adjacency_list<boost::vecS, boost::vecS,
boost::bidirectionalS, Port, Edge> >'
/home/chrkr/git/lsndp/src/ipheuristic.cpp:939:132: error: no matching
function for call to 'get(double Edge::*,
boost::reverse_graph<boost::adjacency_list<boost::vecS, boost::vecS,
boost::bidirectionalS, Port, Edge> >&)'
/home/chrkr/git/lsndp/src/ipheuristic.cpp:939:132: note: candidates are:
In file included from /usr/include/boost/graph/adjacency_list.hpp:36:0,
                  from /home/chrkr/git/lsndp/include/ipheuristic.h:36,
                  from /home/chrkr/git/lsndp/src/ipheuristic.cpp:29:
/usr/include/boost/property_map/property_map.hpp:179:19: note:
template<class T> const T& get(const T*, std::ptrdiff_t)
/usr/include/boost/property_map/property_map.hpp:179:19: note: template
argument deduction/substitution failed:
/home/chrkr/git/lsndp/src/ipheuristic.cpp:939:132: note: mismatched
types 'const T*' and 'double Edge::*'
In file included from /usr/include/boost/graph/graphviz.hpp:25:0,
                  from /home/chrkr/git/lsndp/include/data.h:19,
                  from /home/chrkr/git/lsndp/include/ipheuristic.h:46,
                  from /home/chrkr/git/lsndp/src/ipheuristic.cpp:29:
/usr/include/boost/property_map/dynamic_property_map.hpp:322:1: note:
template<class Key> std::string boost::get(const string&, const
boost::dynamic_properties&, const Key&)
/usr/include/boost/property_map/dynamic_property_map.hpp:322:1: note:
template argument deduction/substitution failed:

Is the problem the bundled properties from the original graph or ?

-- 
Best Regards,
Ph.D. Berit Dangaard Brouer
Post Doc.
DTU Management Engineering, Management Science
Technical University of Denmark
	
Department of Management Engineering
Produktionstorvet, Bygning 426
2800 Kgs. Lyngby
blof_at_[hidden] <mailto:blof_at_[hidden]>
www.ms.man.dtu.dk <http://www.ms.man.dtu.dk>
http://www.maersk.com/innovation/leadingthroughinnovation/enerplan/
Please read about the ENERPLAN project here 
<http://www.maersk.com/innovation/leadingthroughinnovation/enerplan/>




DTU_email_logo_01.gif

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net