Hypergraph module (Re: instance Ord FiniteMap)

2002-05-30 Thread Eray Ozkural

On Wednesday 29 May 2002 02:58, Hal Daume III wrote:
 Is there any particular reason FiniteMap (and hence Set) aren't instances
 of Ord?  I realize it's weird to define a map to be ordered, but even if
 the Ord definition were in some sense nonsensical, being able to have,
 for instance, Sets of Sets of things would be really nice.

Check this out. It was working for me last time I used it.

Comments welcome,

-- 
Eray Ozkural (exa) [EMAIL PROTECTED]
Comp. Sci. Dept., Bilkent University, Ankara
www: http://www.cs.bilkent.edu.tr/~erayo  Malfunction: http://mp3.com/ariza
GPG public key fingerprint: 360C 852F 88B0 A745 F31B  EA0F 7C07 AE16 874D 539C


module Hypergraph where
import FiniteMap
import Set

-- A hypergraph is a family of sets which are subsets of a vertex set X
-- This implementation uses an edge list representation that
-- directly corresponds to the mathematical definition
-- n index type, w weight type
-- type Hypergraph n w = Array n [(n,w)]

-- show functions for set and finitemap

instance (Show a) = Show (Set a) where   
show set = show (setToList set)

instance (Show a, Show b) = Show (FiniteMap a b) where   
show vs = show (fmToList vs)

type HEdges l = FiniteMap l (Set l)

data Hypergraph l = Hypergraph (HEdges l) (HEdges l) deriving Show

-- hgraph constructor
-- takes a list of edges
hgraph list = let edges = hEdges list in
  Hypergraph edges (dualEdges edges)

-- hgraph edge_list
--hEdges :: [ [a] ] - HEdges a
hEdges el = listToFM (zip [1..length el] (map mkSet el))
-- = Hypergraph (listToFM . mkSet (edge_list)) (listToFM . mkSet (edge_list))

-- compute dual of a given hgraph

dualEdge (edgeIx, hEdge) = map (\x-(x, mkSet [edgeIx])) (setToList hEdge)

dualEdges hEdges = ( (addListToFM_C union emptyFM) . concat .
 (map dualEdge) . fmToList )
 hEdges
--hVertices el = (zip (map mkSet el) [1..length el])

-- hyper vertices are the dual of the hypergraph
--hVertices hEdges = (foldFM uni emptyFM). (mapFM dual)) hEdges
-- where uni = plusFM_C 
--dual hEdges = ( listToFM . map (\(x,y)-(y,x)) . fmToList) hEdges




Re: Hypergraph module (Re: instance Ord FiniteMap)

2002-05-30 Thread Johannes Waldmann

(Re: Eray's code using FiniteMaps/Sets)

 Comments welcome,

I'd suggest

 show s   = mkSet  ++ show (setToList s)
 show fm  = listToFM  ++ show (fmToList fm)

That way you can easily paste the output of a program
into your code back again, and you can easily tell 
the type of the `showed' object.

Best regards,
-- 
-- Johannes Waldmann  http://www.informatik.uni-leipzig.de/~joe/ --
-- [EMAIL PROTECTED] -- phone/fax (+49) 341 9732 204/252 --
___
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users