|
Boost Users : |
From: David Abrahams (dave_at_[hidden])
Date: 2005-06-14 15:59:14
martin f krafft <madduck_at_[hidden]> writes:
>> > In the context of my application, I know have two options: adopt the
>> > graph-centric perspective of BGL, in which the graph object is
>> > needed to answer any questions about the graph, even about single
>> > components therein, or to strap a layer on top of all this to
>> > return to proper object encapsulation:
>> >
>> > - where a node knows about its incident edges
>> > - where an edge knows about its source and target vertices
>> > - where both give access to the associated properties.
>>
>> Why is that more "proper?"
>
> It feels more proper to me in the context of my needs.
Fair enough.
>> > Does anyone have any experience with folding BGL into an existing
>> > graph-like structure?
>>
>> Yes, it has been done many times.
>
> Do you have pointers to examples?
I think the LEDA graph adapter is probably a good one.
>> > My ideal solution would be my neuron and synapse classes derived
>> > from the vertex and edge descriptors, such that I can treat them
>> > like components of the graph as well as neural components.
>>
>> I'm not sure precisely what your situation is, but it's certainly
>> possible to build a graph wherein you have vertex and edge "objects"
>> by using pointers to edges and vertices as descriptors.
>
> This is an interesting thought. Nevertheless, in order to get
> adjacent objects, I still need access to the graph object.
>
> Or am I misunderstanding something here?
Yep.
class vertex;
class edge
{
public:
edge(vertex* s, vertex* d)
: s(s), t(t) {}
// ... your stuff here
private:
vertex *s, *t;
};
class vertex
{
// ... your stuff here...
std::vector<edge> edges;
};
class graph
{
std::list<vertex> vertices;
};
Now satisfy the graph requirements, something like:
template <>
struct graph_traits<graph>
{
// types required by one of the graph concepts at
// http://www.boost.org/libs/graph/doc/graph_concepts.html
// or, as you can see from
// http://www.boost.org/libs/graph/doc/graph_traits.html,
// these can go directly in your graph class
};
// Free functions required by one of the graph concepts at
// http://www.boost.org/libs/graph/doc/graph_concepts.html
There probably ought to be a tutorial example in the docs that walks
through this in detail.
>> It sounds to me like, if a Node really needs to have access to its
>> edges, *and* if you only are only looking at the BGL for its graph
>> representation and not for its algorithms, that the BGL can't help
>> you.
>
> Well, that's part of the reason. The other part was that I wanted to
> stay compatible to the BGL just in case we need graph algorithms
> later on. After all, we are in research where those unexpected needs
> arise all the time.
>
>> It's pretty easy to build the kind of graph structure you want by
>> hand,
>
> The other reason is that your claim is not true. It *sounds* easy,
> and it's really easy to get wrong.
Maybe you should have asked for help with _that_ project. It
*really* shouldn't be too hard.
> I tried several days before giving in and looking at the BGL.
>
> Then again, my implementation tried to be generic wrt to the types
> you store for each edge or node *and* to avoid polymorphism for
> space efficiency reasons.
Avoiding runtime polymorphism is pretty natural with BGL-conformant
graphs.
-- Dave Abrahams Boost Consulting www.boost-consulting.com
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