Dependency Queue

Stefan Behnel stefan_ml at behnel.de
Mon Apr 7 10:02:21 EDT 2008


Carl Banks wrote:
> I'm looking for any information about a certain kind of dynamic data
> structure.  Not knowing if it has some well-known name that I could
> have Googled, I'll just call it a dependency queue.  It's like a
> priority queue except instead of a strict ordering of items by
> priority, there is only a topological ordering (like you would have in
> a directed acyclic graph).
> 
> To date I've been generating a dependency graph in advance every
> iteration through my main loop, doing a topsort, and executing the
> values in order (the values are callable objects--this is a
> scheduler).
> 
> However, I'd like a dynamic dependency queue for two reasons: it would
> simplify things to not have to generate the whole graph in advance,
> and it could improve performance to run some tasks of the next
> iteration in the present one (this could potentially make better use
> of the dual-core and graphics hardware).
> 
> I'm pretty sure I could hack out this structure on my own, but I'd
> like to see any prior information if there is any, in case anyone's
> figured out things like, Is there an easy way to detect cycles on
> insertion? and so on.

You might consider flattening your graph to map it onto a heap (see the heapq
module). One way to do that might be to assign a different power of two to
each node and calculate the priority of each node as the sum of its parent's
numbers. That way, a child will always have a higher value (== lower priority)
than its parents, so the heap will return it after its parents. If you also
want a unique priority instead of the same one for all children of the same
set of parents, adding the number of the child itself will give you a
(possibly arbitrary) unique priority.

This (or a similar approach) may or may not solve your problem, depending on
how you determine the dependencies.

Stefan



More information about the Python-list mailing list