[Haskell-cafe] Re: ANNOUNCE: vacuum-cairo: a cairo frontend to vacuum for live Haskell data visualization

Don Stewart dons at galois.com
Wed Apr 1 16:13:53 EDT 2009


Did you use hubigraph?

    http://ooxo.org/hubigraph/

This cabalized project doesn't appear to be on hackage!

gleb.alexeev:
> Don Stewart wrote:
>> I am pleased to announce the release of vacuum-cairo, a Haskell library
>> for interactive rendering and display of values on the GHC heap using
>> Matt Morrow's vacuum library.
>
> Awesome stuff, kudos to you and Matt Morrow!
>
> I thought it'd be fun to visualize data structures in three dimensions.  
> Attached is quick and dirty hack based on your code and Ubigraph server  
> (http://ubietylab.net/ubigraph/).
>
> The demo video (apologies for poor quality):  
> http://www.youtube.com/watch?v=3mMH1cHWB6c
>
> If someone finds it fun enough, I'll cabalize it and upload to Hackage.

> module Ubigraph where
> 
> import Network.XmlRpc.Client
> 
> type Url = String
> type VertexId = Int
> type EdgeId = Int
> 
> defaultServer = "http://127.0.0.1:20738/RPC2"
> 
> void :: IO Int -> IO ()
> void m = m >> return ()
> 
> clear :: Url -> IO ()
> clear url = void (remote url "ubigraph.clear")
> 
> newVertex :: Url -> IO VertexId
> newVertex url = remote url "ubigraph.new_vertex"
> 
> newEdge :: Url -> VertexId -> VertexId -> IO EdgeId
> newEdge url = remote url "ubigraph.new_edge"
> 
> removeVertex :: Url -> VertexId -> IO ()
> removeVertex url vid = void (remote url "ubigraph.remove_vertex" vid)
> 
> removeEgde :: Url -> EdgeId -> IO ()
> removeEgde url eid= void (remote url "ubigraph.remove_edge" eid)
> 
> 
> zeroOnSuccess :: IO Int -> IO Bool
> zeroOnSuccess = fmap (==0) 
> 
> newVertexWithId :: Url -> VertexId -> IO Bool
> newVertexWithId url vid = zeroOnSuccess (remote url "ubigraph.new_vertex_w_id" vid)
> 
> newEdgeWithId :: Url -> EdgeId -> VertexId -> VertexId -> IO Bool
> newEdgeWithId url eid x y = zeroOnSuccess (remote url "ubigraph.new_edge_w_id" eid x y)
> 
> setVertexAttribute :: Url -> VertexId -> String -> String -> IO Bool
> setVertexAttribute url vid attr val = zeroOnSuccess (remote url "ubigraph.set_vertex_attribute" vid attr val)
> 
> setEdgeAttribute :: Url -> VertexId -> String -> String -> IO Bool
> setEdgeAttribute url eid attr val = zeroOnSuccess (remote url "ubigraph.set_edge_attribute" eid attr val)

> module VacuumUbigraph where
> 
> import GHC.Vacuum
> import Data.Char
> import Text.Printf
> import Data.List
> 
> import qualified Data.IntMap as IntMap
> import qualified Data.IntSet as IntSet
> 
> import qualified Ubigraph as U
> 
> nodeStyle n =
>     case nodeName n of
>       ":"  -> ("(:)", "cube", "#0000ff")
> 
>       -- atomic stuff is special
>       k | k `elem` ["S#" ,"I#" ,"W#"
>                    ,"I8#" ,"I16#" ,"I32#" ,"I64#"
>                    ,"W8#" ,"W16#" ,"W32#" ,"W64#"] -> (showLit n, "sphere", "#00ff00")
>       -- chars
>       "C#" -> (show . chr . fromIntegral . head . nodeLits $ n, "sphere", "#00ff00")
>       "D#" -> ("Double", "sphere", "#009900")
>       "F#" -> ("Float", "sphere", "#009900")
> 
>       -- bytestrings
>       "PS"    -> (printf "ByteString[%d,%d]" (nodeLits n !! 1) (nodeLits n !! 2), "cube", "#ff0000")
>       "Chunk" -> (printf "Chunk[%d,%d]" (nodeLits n !! 1) (nodeLits n !! 2), "cube", "#ff0000")
> 
>       -- otherwise just the constructor and local fields
>       c   | z > 0 ->
>                     (c ++ show (take (fromIntegral z) $ nodeLits n), "cube", "#990000")
>           | otherwise -> (c, "cube", "#990000")
>                     where z = itabLits (nodeInfo n)
>         where
>           showLit n = show (head $ nodeLits n)
> 
> view a = do
>   U.clear srv
>   mapM_ renderNode nodes
>   mapM_ renderEdge edges
>     where      
>       g = vacuum a
>       alist = toAdjList g
>       nodes = nub $ map fst alist ++ concatMap snd alist
>       edges = concatMap (\(n, ns) -> map ((,) n) ns) alist
> 
>       style nid = maybe ("...", "cube", "#ff0000") nodeStyle (IntMap.lookup nid g)
> 
>       renderNode nid = do
>            U.newVertexWithId srv nid
>            let (label, shape, color) = style nid
>            U.setVertexAttribute srv nid "label" label
>            U.setVertexAttribute srv nid "shape" shape
>            U.setVertexAttribute srv nid "color" color
>       
>       renderEdge (a, b) = do
>            e <- U.newEdge srv a b
>            U.setEdgeAttribute srv e "stroke" "dotted"
>            U.setEdgeAttribute srv e "arrow" "true"
> 
>       srv = U.defaultServer
> 

> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe



More information about the Haskell-Cafe mailing list