$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Geoff Hilton (geoff.hilton_at_[hidden])
Date: 2008-08-13 20:23:54
Hmm, maybe if I add some extra information someone will be better able 
to answer...
The basic premise is that I want the dijkstra algorithm to iterate 
through the Bar weights making its comparisons as it would were it only 
a POD (ie, as if it were using Foo instead). I've been reading the 
mailing list, online documentation and examples all day while trying 
different things, but I can't get it working. :|
I also tried this (weightMap is a local variable in main()):
dijkstra_shortest_paths(mygraph, *vi,
        weight_map(
                make_iterator_property_map(weightMap.begin(), get(edge_index, mygraph)
                )
        )
        .distance_map(
                        make_iterator_property_map(distances.begin(), vertex_ind)
        )
        .predecessor_map(
                make_iterator_property_map(predecessors.begin(), vertex_ind))
        .visitor(vis)
        );
This compiles (with warnings).. and runs without issue... but what I 
want is to point it towards the Bar member in my EdgeProperty struct.
Is it just a syntax issue? What is it I should alter?
Thanks again,
Geoff
Geoff Hilton wrote:
> Hi, I'm new to the boost and the BGL, and as the subject suggests, I'm
> trying to get my property bundle-using adjacency list to use a vector 
> for its WeightMap.
> 
> First off, the property bundles in question:
> 
> template<size_t NumberOfBar>
> struct EdgeProperty
> {
>     EdgeProperty(long double foo = 0):Foo(foo),
> Bar(NumberOfBar){}
>     long double Foo;
>     vector<long long> Bar;
> };
> 
> template<size_t NumberOfBar>
> struct VertexProperty
> {
>     VertexProperty():Baz(NumberOfBar){}
>     vector<pair<long long, long long> > Baz;
> };
> The visitor:
> struct MyVisitor
> : public default_dijkstra_visitor
> {
>     template <typename Vertex, typename Graph>
>     void discover_vertex(Vertex u, const Graph& g)
>     {
>         cout << "discovered " << u << '\n';
>     }
> 
>     template <typename Edge, typename Graph>
>     void tree_edge(Edge e, const Graph& g)
>     {
>         cout << "tree edge " << e << '\n';
>     }
> 
>     template <typename Edge, typename Graph>
>     void examine_edge(Edge e, const Graph& g)
>     {
>         cout << "examining edge " << e << '\n';
>     }
>     template <typename Vertex, typename Graph>
>     void finish_vertex(Vertex u, const Graph& g)
>     {
>         cout << "finishing vertex " << u << endl;
>     }
> };
> The graph typedef:
> typedef adjacency_list< vecS, vecS, bidirectionalS, 
> property<vertex_index_t, unsigned long long, VertexProperty<1> >, 
> property<edge_index_t, unsigned long long, EdgeProperty<1> > > graph_t;
> 
> Adding edges and vertices to the graph works without issue, as does 
> assigning values to the properties, and navigating it, I was also able 
> to get my test visitor to work.. using this code:
> 
> int _tmain(int argc, _TCHAR* argv[])
> {
>     graph_t mygraph;
>     //build graph
>     //...
>     //set up property accessors
>     typedef EdgeProperty<1> EdgeProp;
>     property_map<graph_t, long double EdgeProp::*>::type edge_foo_t = 
> get(&EdgeProp::foo, mygraph);
>     property_map<graph_t, vector<long long> EdgeProp::*>::type 
> edge_bar_t = get(&EdgeProp::Bar, mygraph);
>     property_map<graph_t, vertex_index_t>::type vertex_ind = 
> get(vertex_index, mygraph);
>     //dijkstra stuff
>     size_t numberOfVertices = num_vertices(mygraph);
>     std::vector<long double> distances(numberOfVertices, 
> (numeric_limits<long double>::max)());
>     vector<vertex_descriptor> predecessors(numberOfVertices);
> 
>     MyVisitor vis;
>     dijkstra_shortest_paths(mygraph, *vi,
>         weight_map(edge_foo_t)
>         .weight_map2(edge_bar_t)
>         .distance_map(
>             make_iterator_property_map(distances.begin(), vertex_ind)
>         )
>         .predecessor_map(
>             make_iterator_property_map(predecessors.begin(), vertex_ind)
>         )
>         .visitor(vis)
>     );
>     return 0;
> }
> 
> However when I switch edge_bar_t and edge_foo_t within the 
> weight_map/weight_map2 parentheses, I get this error (Visual Studio 
> 2005) 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const' 
> : cannot convert parameter 1 from 'std::vector<_Ty>' to 'const D &'
> 
> Of course that's normal because it's a vector. I figure I'm supposed to 
> use make_iterator_property_map and somehow point it to 
> &EdgeProp::Bar::begin() (or &EdgeProp::Bar::rbegin()) with a 
> property_map<...> as I did with the others...but what I've tried so far 
> hasn't worked.
> 
> Any ideas?
> 
> Thanks very much and best wishes,
> Geoff