packages feed

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

module Test.Graph.AdjacencyList.Metrics where

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

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

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

import Data.Graph.AdjacencyList.WFI
import Data.Graph.AdjacencyList.Metrics

import qualified Data.Binary as Bin

fastTests :: [Test]
fastTests = [ testEccentricity
            , testRadius
            , testDiameter
            , testDensity
            ]

ioTests :: [IO Test]
ioTests = [ test481150
          , test480967
          ]

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

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

testEccentricity :: Test
testEccentricity = do
  let name = "Eccentricity of vertex 2 in test graph"
      dists = unweightedShortestDistances graphTest
      out = graphEccentricity 2 dists
      expe = Just 3
   in case out == expe of
        True -> testPassed name $ "passed! " <> (show out)
        False -> testFailed name $ (,) (show dists) (show out)

testRadius :: Test
testRadius = do
  let name = "Radius of test graph should be 1 (8-7)"
      dists = unweightedShortestDistances graphTest
      out = graphRadius dists
      expe = Just 1
   in case out == expe of
        True -> testPassed name $ "passed! "
        False -> testFailed name $ (,) (show expe) (show out)

testDiameter :: Test
testDiameter = do
  let name = "Diameter 3 (2-7)"
      dists = unweightedShortestDistances graphTestDisco
      out = graphDiameter dists
      expe = Just 3
   in case out == expe of
        True -> testPassed name $ "passed! "
        False -> testFailed name $ (,) (show expe) (show out)

testDensity :: Test
testDensity = do
  let name = "Density of testgraph should be 13/56"
      out = graphDensity graphTest
      expe = 13 / 56
   in case out == expe of
        True -> testPassed name $ "passed! "
        False -> testFailed name $ (,) (show expe) (show out)

test481150 :: IO Test
test481150 = do
  let name = "compare with netmeta's distance matrix network 481150"
  es <- Bin.decodeFile "test/481150.edges"
  let gr = graphFromEdges es
      dists = unweightedShortestDistances $ makeUndirected gr
      rad = graphRadius dists
      diam = graphDiameter dists
      expe = (Just 2, Just 2)
   in case (rad, diam) == expe of
        True -> return $ testPassed name $ "passed! " <> (show dists)
        False -> return $ testFailed name $ (,) (show expe) (show rad)

test480967 :: IO Test
test480967 = do
  let name = "compare with netmeta's distance matrix network 480967"
  es <- Bin.decodeFile "test/480967.edges"
  let gr = graphFromEdges es
      dists = unweightedShortestDistances $ makeUndirected gr
      rad = graphRadius dists
      diam = graphDiameter dists
      expe = (Just 2, Just 3)
   in case (rad, diam) == expe of
        True -> return $ testPassed name $ "passed! "
        False -> return $ testFailed name $ (,) (show expe) (show rad)