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,
|
Please
read about the ENERPLAN project
here
|
|
|