[Haskell-cafe] Traversing a graph in STM
Jan-Willem Maessen
jmaessen at alum.mit.edu
Sun Sep 17 17:16:42 EDT 2006
On Sep 13, 2006, at 3:37 AM, Einar Karttunen wrote:
> Hello
>
> Is there an elegant way of traversing a directed graph in STM?
>
> type Node nt et = TVar (NodeT nt et)
> type Edge et = TVar et
> data NodeT nt et = NodeT nt [(Node nt et, Edge et)]
>
> type MyGraph = Node String Int
>
> When implementing a simple depth first search we need a way to
> mark nodes (= TVars) as visited. In addition multiple concurrent
> searches should be possible.
>
> Is it possible to avoid passing around an explicit Set of visited
> nodes?
You can associate a unique name with each traversal, and store a set
of traversals at each node (instead of a mark bit). But this set
grows without bound unless you follow each traversal with a "cleaning
traversal" which removes a traversal tag from the set. And you'd
need some way to generate the unique names.
If you're performing no side effects or accesses to TVars (which you
aren't, as your graph representation requires reading TVars all over
the place), you can in principle use the following horrid kludge:
1) keep a TVar indicating "visited" at each node.
2) within an atomic, perform your traversal in the usual
sequential way, setting the TVar
each time a node is visited.
3) when you're done, package up your desired result in an
exception and throw it.
All your marking work will be un-done and your result will emerge.
4) catch the exception outside the atomic and extract the result
again.
However, this will still preclude two simultaneous traversals of
overlapping portions of the graph. Really, you're just asking the
STM mechanism to maintain the hash table on your behalf; in practice
you will be better off doing it yourself.
Really, there's no such thing as a free lunch here, I'm afraid. If
you want to concurrently traverse a graph, you need to keep separate
cycle-avoidance state for each traversal. Using TVars doesn't change
that basic algorithmic detail.
> And is there a better way of getting TVar identity than
> StableNames?
Would that there were!
-Jan-Willem Maessen
>
> - Einar Karttunen
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2425 bytes
Desc: not available
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20060917/e8d68062/smime.bin
More information about the Haskell-Cafe
mailing list