packages feed

fregel-1.2.0: haskell/Graphs.hs

module Graphs where

import Fregel

-- make a graph

type VertexData a = (Vid, a)
type EdgeData b = (Vid, Vid, b)

mG :: [VertexData a] -> [EdgeData b] -> Bool -> Graph a b
mG vds eds True = toGraph vds (eds ++ flipEdgeList eds)
mG vds eds False = toGraph vds eds

flipEdgeList :: [EdgeData b] -> [EdgeData b]
flipEdgeList eds = [(d,s,b) | (s,d,b) <- eds]

toGraph :: [VertexData a] -> [EdgeData b] -> Graph a b
toGraph vds eds = gs
  where gs = [V vid a (inEdges vid) (outEdges vid) gs | (vid,a) <- vds]
        inEdges vid = [(b, gs !! (s-1)) | (s,d,b) <- eds, d == vid]
        outEdges vid = [(b, gs !! (d-1)) | (s,d,b) <- eds, s == vid]

valG :: Graph a b -> [(Vid, a)]
valG = map (\(V vid a _ _ _) -> (vid, a))

{-------------------------- Sample graphs ------------------------------}

{-
graph1:

     B <- A <-+
     |        |
     +------> C ----> D <-+
              |       |   |
              +-> E <-+   |
                  |       |
                  +-> F --+
-}

graph1 :: Graph String Int
graph1 = let va = V 1 "A" [(1, vc)] [(1, vb)] g
             vb = V 2 "B" [(1, va)] [(1, vc)] g
             vc = V 3 "C" [(1, vb)] [(1, va), (1, vd), (1, ve)] g
             vd = V 4 "D" [(1, vc), (1, vf)] [(1, ve)] g
             ve = V 5 "E" [(1, vc), (1, vd)] [(1, vf)] g
             vf = V 6 "F" [(1, ve)] [(1, vd)] g
             g = [va, vb, vc, vd, ve, vf]
         in g

{-
graph1n:
       -1    3
     B <- A <-+ 
     |        |  3       3
     +------> C ----> D <-+
      -1      |       |   |
              +-> E <-+   |
              1   |   -3  |
                 1+-> F --+

the Dijkstra algorithm (from A) fails: 
  it says cost(A,F) = 0 but this should be -1
-}

-- with negative edge
graph1n :: Graph String Int
graph1n = let va = V 1 "A" [(3, vc)] [(-1, vb)] g
              vb = V 2 "B" [(-1, va)] [(-1, vc)] g
              vc = V 3 "C" [(-1, vb)] [(3, va), (3, vd), (1, ve)] g
              vd = V 4 "D" [(3, vc), (3, vf)] [(-3, ve)] g
              ve = V 5 "E" [(1, vc), (-3, vd)] [(1, vf)] g
              vf = V 6 "F" [(1, ve)] [(3, vd)] g
              g = [va, vb, vc, vd, ve, vf] 
          in g

graph2 :: Graph Int Int
graph2 = mG [(1, 100), (2, 600), (3, 200), (4, 400), (5, 500), (6, 300)]
            [(1,2,1),(2,3,1),(3,1,1),(3,4,1),(3,5,1),(4,5,1),(5,6,1),(6,4,1)]
            True

graph3 :: Graph String Int
graph3 = mG [(1,"A"),(2,"B"),(3,"C"),(4,"D"),(5,"E"),(6,"F")]
            [(1,2,6),(1,3,4),(1,4,1),(2,1,6),(2,6,3),(3,2,1),(3,5,5),
             (4,3,2),(4,5,3),(5,6,6)]
            False

{-
graph4 (undirected (bi-directional)):

     A -- C -- B   
          |            
          |   +--- E ------+ 
          |   |    |       | 
          +-- D -- F -- H  |
              |    |       |
              +--- G ------+

   D,E,F,G forms a 4-clique  ->  the densest subgraph.

-}

graph4 :: Graph String Int
graph4 = mG [(1,"A"),(2,"B"),(3,"C"),(4,"D"),(5,"E"),(6,"F"),(7,"G"),(8,"H")]
            [(1,3,1),(2,3,1),(3,4,1),(4,5,1),(4,6,1),
             (4,7,1),(5,6,1),(5,7,1),(6,7,1),(6,8,1)]
            True

graph4' :: Graph Int Int
graph4' = mG [(1,10),(2,11),(3,12),(4,13),(5,14),(6,15),(7,16),(8,17)]
             [(1,3,1),(2,3,1),(3,4,1),(4,5,1),(4,6,1),
              (4,7,1),(5,6,1),(5,7,1),(6,7,1),(6,8,1)]
             True
{-
graph5:

    A <-> B            E <-> F            I <-> J 
          |            |     |            |
          +-> C <-> D <-     +-> G <-> H <-


-}

graph5 :: Graph String Int
graph5 = mG [(1,"A"),(2,"B"),(3,"C"),(4,"D"),(5,"E"),(6,"F"),(7,"G"),(8,"H"),
             (9,"I"),(10,"J")]
            [(1,2,1),(2,1,1),(2,3,1),(3,4,1),(4,3,1),(5,4,1),(5,6,1),(6,5,1),
             (6,7,1),(7,8,1),(8,7,1),(9,8,1),(9,10,1),(10,9,1)]
            False