packages feed

algraph-0.7.0.0: test/Test/Graph/AdjacencyList/BFS.hs

module Test.Graph.AdjacencyList.BFS where

import Data.Maybe
import Data.List
import Data.List.Unique
import TestHS

import qualified Data.IntMap.Strict as IM
import Data.Maybe

import qualified Data.Graph.Inductive as I
import qualified Data.Graph.Inductive.Graph as G
import qualified Data.Graph.Inductive.Query.BFS as IBFS

import Data.Graph.AdjacencyList
import Data.Graph.AdjacencyList.BFS
import Data.Graph.AdjacencyList.Grid

fastTests :: [Test]
fastTests = [ test1
            , test2
            , spanningtreetest
            , spanningtreeUndirected
            ]


graphTest1 = 
  let vs = [1..7]
      neis = (\v -> let nei 1 = [2,5,6]
                        nei 2 = [5,3]
                        nei 3 = [4]
                        nei 4 = []
                        nei 5 = [4,7]
                        nei 6 = [7]
                        nei 7 = [4]
                     in nei v
             )
   in createGraph vs neis

test1 :: Test
test1 = do
  let name = "Test bfs on TestGraph1"
      out = level $ bfs graphTest1 1
      expe = IM.fromList [(1,0),(2,1),(5,1),(6,1),(3,2),(4,2),(7,2)]
   in case  out == expe of
        True -> testPassed name "passed!"
        False -> testFailed name $ (,) (show expe) (show out)

test2 :: Test
test2 = do
  let name = "BFS in undirected grid tested against fgl library"
      l    = (6 :: L)
      d    = (3 :: D)
      lat  = graphCubicPBC (PBCSquareLattice  l d)
      latbfs = bfs lat 18
      out = sort $ IM.toList (level latbfs)
      vs = map (\v -> (v,())) $ vertices lat :: [G.UNode]
      es = map (\(f,t) -> (f,t,1)) $ (map toTuple (edges lat)) :: [G.LEdge Double]
      ingr = G.mkGraph vs es :: I.Gr () Double
      expe = sort $ IBFS.level 18 ingr
  case expe == out of
    True -> testPassed name $ "passed!"
    False -> testFailed name $ (,) ("\n" ++ show expe) 
      ("\n" ++ show out ++ "\n" ++ show latbfs ++ "\n" ++ show lat)

spanningtreetest :: Test
spanningtreetest = do
  let name = "Get Spanning Tree from BFS"
      out = spanningTree $ bfs graphTest1 1
      expe = map fromTuple [(1,2),(2,3),(5,4),(1,5),(1,6),(5,7)]
   in case  out == expe of
        True -> testPassed name "passed!"
        False -> testFailed name $ (,) (show expe) (show out)

spanningtreeUndirected :: Test
spanningtreeUndirected = do
  let name = "Get Spanning Tree from BFS undirected graph"
      ungr = makeUndirected graphTest1
      out = spanningTree $ bfs ungr 1
      expe = map fromTuple [(1,2),(2,3),(5,4),(1,5),(1,6),(5,7)]
   in case  out == expe of
        True -> testPassed name "passed!"
        False -> testFailed name $ (,) (show expe) (show out)