property map: does a given key exist?

classic Classic list List threaded Threaded
4 messages Options
ijs
Reply | Threaded
Open this post in threaded view
|

property map: does a given key exist?

ijs
In nutshell: how can I check whether a property map has some given
key?

The exact problem is as follows.  I have graph edges with the property
"lambdas" of positive integers, but its the exact meaning is not
important here.  With the read_graphviz function I am loading graph
files which look like this:

graph {
   a;
   b;
   c;
   c -- a [distance="100"];
   a -- b [lambdas="8"];
}

After I load the file I want to examine which edges have the "lambdas"
property, but I don't know how to do this.  If I request the property
value with the "get" function, I get some random value.  My program is
at the bottom of this email.

The program prints the edge and the value of the "lambdas" property.
I get this:

(2,0): 33489268
(0,1): 8

The first line is bad: the edge (2,0), i.e. c -- a in my graphviz
file, has the reported value of 33489268.  The second line is OK.

Thanks for reading.


Best,
Irek

*********************************************************************

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <boost/graph/iteration_macros.hpp>
#include <boost/graph/graphviz.hpp>

using namespace boost;

typedef boost::adjacency_list<vecS, vecS, undirectedS,
        property<vertex_name_t, std::string>,
        property<edge_weight_t, double,
                property<edge_weight2_t, int> >,
        no_property > Graph;

int
main()
{
   Graph g;
   dynamic_properties dp;

   dp.property("node_id", get(vertex_name, g));
   dp.property("distance", get(edge_weight, g));
   dp.property("lambdas", get(edge_weight2, g));

   read_graphviz(std::cin, g, dp);

   typedef boost::property_map<Graph, edge_weight2_t>::type lambdas_t;

   lambdas_t weight2_map = get(edge_weight2, g);

   BGL_FORALL_EDGES(e, g, Graph)
     // Before printing this out I would like to make sure that an edge
     // has this property.
     std::cout << e << ": " << get(weight2_map, e) << std::endl;
}
_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Reply | Threaded
Open this post in threaded view
|

Re: property map: does a given key exist?

Daniel Mitchell-3
On Saturday 15 April 2006 15:25, Irek Szczesniak wrote:
> In nutshell: how can I check whether a property map has some given
> key?

Some property maps may provide bounds checking, but the property map concept
doesn't require it, so in general you can't.

>
> graph {
>    a;
>    b;
>    c;
>    c -- a [distance="100"];
>    a -- b [lambdas="8"];
> }
>

I think you'll need to give every edge a lambda number, but you might reserve
a special value to indicate that the lambda property isn't applicable to that
edge.

Daniel
_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
ijs
Reply | Threaded
Open this post in threaded view
|

Re: property map: does a given key exist?

ijs
Hi Daniel,

Thank you for your email.

 >>In nutshell: how can I check whether a property map has some given
 >>key?
 >
 > Some property maps may provide bounds checking, but the property map
 > concept doesn't require it, so in general you can't.

Good to know.  I didn't find this in the property map documentation.

 > I think you'll need to give every edge a lambda number, but you
 > might reserve a special value to indicate that the lambda property
 > isn't applicable to that edge.

I had the class def_int as the type of the lambda property:

struct def_int
{
   int value;

   def_int() : value(-1) {}

   def_int & operator = (int a)
   {
     value = a;
   }

   bool operator < (const def_int &a)
   {
     return value < a.value;
   }
};

In this way if a link doesn't have this property, then the property
map has -1 for that edge.  The problem is that I needed to define
operators =, <, <<, >> to make it work.  Then I wanted to use some
other stuff and got cryptic error messages at compilation.

Finally I dropped the def_int class in favor of the int type, and now
I make sure that every link in the .dot file has a lambdas property.


Best,
Irek
_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Reply | Threaded
Open this post in threaded view
|

Re: property map: does a given key exist?

Fernando Cacciola
In reply to this post by ijs
Irek Szczesniak wrote:
> In nutshell: how can I check whether a property map has some given
> key?
>
One way which may work for you is to use optional<value> as the actual
value_type of the map.
That way, your map can just return an absent optional if there is no value
associated with a key.

http://www.boost.org/libs/optional/doc/optional.html

--
Fernando Cacciola
SciSoft
http://fcacciola.50webs.com/ 



_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users