Boost logo

Boost Users :

Subject: Re: [Boost-users] [graph] File Dependency Example with updates
From: Jeremiah Willcock (jewillco_at_[hidden])
Date: 2012-11-16 10:57:44


On Thu, 15 Nov 2012, Brian Budge wrote:

> Hi all -
> I am toying around with the file dependency example  that is part of the boost graph documentation as a way of
> adapting the concepts to my own use cases.
>
> What I want to do is update the graph over time (add more files with more dependencies), and incrementally decide
> what needs to be built, and in what order.

Does that mean that you are only adding dependencies, not removing them?

> It makes sense that doing a breadth-first search from a changed node will give me everything that might be affected;
> however, if I change many nodes, is there something better?

It depends on if you think a lot of the BFS levels will be changed by your
updates. If you think they will be, just re-do the BFS from scratch. If
not, you might want to keep a level map, then stop on any vertices whose
level values don't change when running the BFS from the updated sources.
What I think will work (not tested) is to:

1. Start with source vertices of newly added edges marked as white and in
the list of start vertices (see below); color the other vertices black.

2. In examine_edge, if the target's level is larger than the source's
level + 1, set the target's color to white.

> I could imagine that I might mark nodes as they are
> encountered so that other BFS from other changed nodes won't traverse those as well.  With boost graph, how can I
> control the BFS to stop recursion if a vertex has already been visited?

There are multi-source BFS versions in Boost.Graph now, although they are
not documented; the version to use is:

template <class VertexListGraph, class SourceIterator,
           class Buffer, class BFSVisitor,
           class ColorMap>
void breadth_first_search
   (const VertexListGraph& g,
    SourceIterator sources_begin, SourceIterator sources_end,
    Buffer& Q, BFSVisitor vis, ColorMap color);

> I guess then once I have seen all the stale vertices, I can make a
> smaller graph that only has the stale vertices and their connections,
> and I can topologically sort the sub-graph to find the parallel build
> order?

An efficient incremental topological sort is apparently hard to do; BFS
isn't as fast as a specialized algorithm for that, but should work.

-- Jeremiah Willcock


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