packages feed

Persistence-2.0: testing/Testing.hs

{-# LANGUAGE FlexibleInstances #-}

import Persistence.Util
import Persistence.Matrix
import Persistence.SimplicialComplex
import Persistence.HasseDiagram
import Persistence.Filtration

import Data.Vector as V
import Data.List as L

class ToString a where
  toString :: a -> String

instance ToString Double where
  toString = show

instance ToString Int where
  toString = show

instance ToString Bool where
  toString b = if b then "1" else "0"

instance ToString IMatrix where
  toString mat =
    let printVec vec =
          if V.null vec then ""
          else
            let x = V.head vec
            in (show x) L.++ ((if x < 0 then " " else "  ") L.++ (printVec $ V.tail vec))
        print m =
          if V.null m then ""
          else (printVec $ V.head m) L.++ ('\n':(print $ V.tail m))
    in print mat

instance ToString [Int] where
  toString = show

instance ToString [[Int]] where
  toString = show

instance Show a => ToString (Vector (Vector (BarCode a))) where
  toString = unlines . V.toList . (V.map show)

instance ToString Landscape where
  toString = show

instance ToString a => ToString (Maybe a) where
  toString (Just a) = "Just " L.++ (toString a)
  toString Nothing  = "Nothing"

data TestResult = Success | Failure String deriving Eq

checkPass :: (Eq a, ToString a) => String -> a -> Maybe a -> TestResult
checkPass msg actual expect =
  case expect of
    Just e  ->
      if actual == e then Success
      else
        Failure $ msg L.++ ":\nActual:\n"
          L.++ (toString actual) L.++ "\nExpected:\n" L.++ (toString e)
    Nothing ->
      Failure $ msg L.++ ":\nActual:\n" L.++ (toString actual) L.++ "\nExpected: ?"


formatTestResults :: [TestResult] -> String
formatTestResults results =
  let numTests  = L.length results
      numPassed = L.length $ L.filter (\r -> r == Success) results
      summary   = (show numPassed) L.++ "/" L.++ (show numTests) L.++ " Tests Passed.\n"
      accum a r =
        case r of
          Success   -> a
          Failure m -> a L.++ [m L.++ "\n"]
      details   = L.foldl accum [] results
  in '\n':(unlines $ summary:details)

matrix1 :: IMatrix
matrix1 = V.fromList $ L.map V.fromList
  [ [ 2, 3, 5]
  , [-4, 2, 3]
  ]

kernel1 :: IMatrix
kernel1 = V.fromList $ L.map V.fromList [[-1, -26, 16]]

matrix2 :: IMatrix
matrix2 = V.fromList $ L.map V.fromList
  [ [1, -1,  3]
  , [5,  6, -4]
  , [7,  4,  2]
  ]

kernel2 :: IMatrix
kernel2 = V.fromList $ L.map V.fromList [[14, -19, -11]]

matrix3 :: IMatrix
matrix3 = V.fromList $ L.map V.fromList $
  [ [1, 0, -3, 0,  2, -8]
  , [0, 1,  5, 0, -1,  4]
  , [0, 0,  0, 1,  7, -9]
  , [0, 0,  0, 0,  0,  0]
  ]

kernel3 :: IMatrix
kernel3 = V.fromList $ L.map V.fromList $
  [ [ 3, -5, 1,  0, 0, 0]
  , [-2,  1, 0, -7, 1, 0]
  , [ 8, -4, 0,  9, 0, 1]
  ]

matrix4 :: IMatrix
matrix4 = V.fromList $ L.map V.fromList
  [ [ 2,  4,   4]
  , [-6,  6,  12]
  , [10, -4, -16]
  ]

snf4 :: IMatrix
snf4 = V.fromList $ L.map V.fromList
  [ [2, 0,  0]
  , [0, 6,  0]
  , [0, 0, 12]
  ]

matrix5 :: IMatrix
matrix5 = V.fromList $ L.map V.fromList $
  [ [  9,  -36,   30]
  , [-36,  192, -180]
  , [ 30, -180,  180]
  ]

snf5 :: IMatrix
snf5 = V.fromList $ L.map V.fromList $
  [ [3, 0, 0]
  , [0, 12, 0]
  , [0, 0, 60]
  ]

matrix6 :: IMatrix
matrix6 = V.fromList $ L.map V.fromList $
  [ [  9, 0, -36,  30]
  , [  0, 0,   0,   0]
  , [-36, 0,  19, -18]
  , [ 30, 0, -18,  18]
  ]

snf6 :: IMatrix
snf6 = V.fromList $ L.map V.fromList $
  [ [ 1, 0,   0, 0]
  , [ 0, 3,   0, 0]
  , [ 0, 0, 462, 0]
  , [ 0, 0,   0, 0]
  ]

pointCloud1 = Right
  [ ( -7, -19)
  , ( -6, -16)
  , (  2, -16)
  , ( 11, -16)
  , ( 11, -11)
  , ( -6,  -9)
  , (  2,  -9)
  , ( 11,  -6)
  , (-11,  -5)
  , (  6,  -3)
  , (  0,   0)
  , ( -2,   3)
  , ( 11,   3)
  , (-14,   8)
  , (  1,   8)
  , ( -8,  14)
  , ( 10,  19)
  , ( 17,  20)
  ]

metric2 :: Floating a => (a, a) -> (a, a) -> a
metric2 (a, b) (c, d) =
  let x = a - c; y = b - d
  in sqrt $ x*x + y*y

scales1 = Right [10.0, 8.0, 6.0]
testFiltration1 = makeRipsFiltrationFast scales1 metric2 pointCloud1
nsTestFiltration1 = simple2Filtr testFiltration1

pointCloud2 = Right
  [ (  1, -22)
  , (  4, -21)
  , ( -3, -20)
  , (  4, -19)
  , ( -7, -18)
  , (  5, -17)
  , ( -7, -12)
  , ( -1, -12)
  , (  3, -12)
  , (  6, -12)
  , (  8, -12)
  , ( -9, -10)
  , ( -4,  -9)
  , (-12,  -8)
  , (  7,  -8)
  , ( -8,  -7)
  , ( -5,  -7)
  , (-11,  -6)
  , (  9,  -5)
  , ( -6,  -4)
  , (-14,  -3)
  , (-12,  -3)
  , (  7,  -3)
  , (  5,  -1)
  , ( -7,   0)
  , (  0,   0)
  , (  8,   0)
  , (-12,   1)
  , (  2,   1)
  , (  0,   2)
  , (-10,   3)
  , ( -7,   3)
  , (  6,   3)
  , ( -2,   5)
  , ( 10,   5)
  , ( -8,   9)
  , (  8,   9)
  , ( -9,  11)
  , (  6,  11)
  , ( -6,  12)
  , ( -4,  13)
  , (  2,  13)
  , (  8,  13)
  , ( -2,  14)
  , (  5,  14)
  , ( -4,  16)
  , (  1,  16)
  ]

--8 connected components at index 0, 2 connected components at index 1, 1 connected component at index 2
--1 loop lasting from 0 to 1, 1 loop lasting from 1 to 2, 1 loop starting at 1, 1 loop starting at 2
scales2 = Right [10.0, 8.0, 6.0]
testFiltration2 = makeRipsFiltrationFast scales2 metric2 pointCloud2
nsTestFiltration2 = simple2Filtr testFiltration2

octahedralCloud = Right
  [ ( 1, 0, 0)
  , (-1, 0, 0)
  , ( 0, 1, 0)
  , ( 0,-1, 0)
  , ( 0, 0, 1)
  , ( 0, 0,-1)
  ]

metric3 :: Floating a => (a, a, a) -> (a, a, a) -> a
metric3 (x0, y0, z0) (x1, y1, z1) =
  let dx = x1 - x0; dy = y1 - y0; dz = z1 - z0 in
  sqrt (dx*dx + dy*dy + dz*dz)

octaScales = Right [2.1, 1.6, 1.1, 0.5]

--5 connected components from 0 to 2, 1 void from 2 to 3
octahedron = makeRipsFiltrationFast octaScales metric3 octahedralCloud
nsoctahedron = simple2Filtr octahedron

sqrCloud = Right
  [ (0, 0)
  , (1, 0)
  , (2, 0)
  , (3, 0)
  , (3, 1)
  , (3, 2)
  , (3, 3)
  , (2, 3)
  , (1, 3)
  , (0, 3)
  , (0, 2)
  , (0, 1)
  ]

sqrScales = Right [2.0, 1.5, 1.1, 0.5]

--11 connected components from 0 to 1, 1 loop starting at 1
square = makeRipsFiltrationFast sqrScales metric2 sqrCloud
nssquare = simple2Filtr square

dGraph1 =
  [ ( 0,  1)
  , ( 0,  2)
  , ( 1,  2)
  , ( 1,  3)
  , ( 1,  4)
  , ( 1,  6)
  , ( 1,  7)
  , ( 2,  4)
  , ( 2,  6)
  , ( 2,  7)
  , ( 3,  2)
  , ( 3,  4)
  , ( 3,  6)
  , ( 3,  7)
  , ( 4,  5)
  , ( 4,  6)
  , ( 4,  7)
  , ( 5,  9)
  , ( 5, 11)
  , ( 6,  7)
  , ( 6, 10)
  , ( 6, 12)
  , ( 7,  8)
  , ( 7, 12)
  , ( 8,  4)
  , ( 8,  5)
  , ( 8,  9)
  , (11,  8)
  , (11,  9)
  , (11, 14)
  , (12, 10)
  , (12, 13)
  , (13, 15)
  , (13, 17)
  , (14, 13)
  , (14, 15)
  , (14, 16)
  , (14, 17)
  , (16, 13)
  , (16, 15)
  , (16, 17)
  , (17, 15)
  ]

directedGraph = encodeDirectedGraph 18 dGraph1
dCliqueComplex = hDiagram2sc $ directedFlagComplex directedGraph

--Mobius strip created in blender
mobius = Right
  [ ( 1.250000,  0.000000,  0.000000)
  , ( 0.750000,  0.000000,  0.000000)
  , (-1.250000,  0.000000,  0.000000)
  , (-1.199179,  0.064705,  0.321319)
  , (-1.053526,  0.125000,  0.608253)
  , (-0.832107,  0.176777,  0.832107)
  , (-0.562500,  0.216506,  0.974279)
  , (-0.275566,  0.241481,  1.028426)
  , ( 0.000000,  0.250000,  1.000000)
  , ( 0.242072,  0.241481,  0.903426)
  , ( 0.437500,  0.216506,  0.757772)
  , ( 0.582106,  0.176777,  0.582107)
  , ( 0.678525,  0.125000,  0.391747)
  , ( 0.732673,  0.064705,  0.196319)
  , (-1.207407, -0.000000, -0.323524)
  , (-1.082532, -0.000000, -0.625000)
  , (-0.883884, -0.000000, -0.883884)
  , (-0.625000, -0.000000, -1.082532)
  , (-0.323524, -0.000000, -1.207408)
  , ( 0.000000, -0.000000, -1.250001)
  , ( 0.323524, -0.000000, -1.207408)
  , ( 0.625001, -0.000000, -1.082533)
  , ( 0.883884, -0.000000, -0.883884)
  , ( 1.082533, -0.000000, -0.625000)
  , ( 1.207409, -0.000000, -0.323524)
  , (-0.258819,  0.000000,  0.965926)
  , (-0.562438, -0.099169,  0.732983)
  , ( 0.562437,  0.099169,  0.732983)
  , (-0.707107,  0.000000,  0.707107)
  , ( 0.000000,  0.000000,  1.000000)
  , (-1.030574,  0.047835,  0.426877)
  , ( 1.000000,  0.000000,  0.000000)
  , ( 0.868575,  0.016316,  0.114350)
  , (-1.114315,  0.016316,  0.146703)
  , ( 0.965926,  0.000000,  0.258819)
  , ( 1.030574, -0.047835,  0.426878)
  , (-0.872030,  0.076095,  0.669132)
  , ( 0.872030, -0.076095,  0.669132)
  , ( 0.707106,  0.000000,  0.707107)
  , (-0.400989,  0.115485,  0.968074)
  , ( 0.128396,  0.123931,  0.975269)
  , ( 0.364378,  0.115485,  0.879685)
  , (-0.128397, -0.123931,  0.975268)
  , (-1.115376, -0.000000, -0.146842)
  , (-1.039365, -0.000000, -0.430519)
  , (-0.866026, -0.000000, -0.500000)
  , (-0.694184,  0.000000, -0.532666)
  , (-0.684857, -0.000000, -0.892523)
  , (-0.500000, -0.000000, -0.866026)
  , (-0.334848,  0.000000, -0.808395)
  , (-0.146842, -0.000000, -1.115376)
  , ( 0.000000, -0.000000, -1.000000)
  , ( 0.114211,  0.000000, -0.867515)
  , ( 0.430519, -0.000000, -1.039365)
  , ( 0.500000, -0.000000, -0.866026)
  , ( 0.532667,  0.000000, -0.694185)
  , ( 0.892523, -0.000000, -0.684857)
  , ( 0.866026, -0.000000, -0.500000)
  , ( 0.808395,  0.000000, -0.334848)
  , ( 1.115377, -0.000000, -0.146842)
  ]

mobScales = Right [0.5, 0.45, 0.4, 0.35, 0.3, 0.25, 0.2, 0.15]
mobiusStrip = makeRipsFiltrationFast mobScales metric3 mobius
nsmobius = simple2Filtr mobiusStrip

tests =
  [ let actual = kernelInt matrix1
        expect = Just $ kernel1
    in checkPass "kernelInt matrix1" actual expect

  , let actual = kernelIntPar matrix1
        expect = Just $ kernel1
    in checkPass "kernelIntPar matrix1" actual expect

  , let actual = kernelInt matrix2
        expect = Just $ kernel2
    in checkPass "kernelInt matrix2" actual expect

  , let actual = kernelIntPar matrix2
        expect = Just $ kernel2
    in checkPass "kernelIntPar matrix2" actual expect

  , let actual = kernelInt matrix3
        expect = Just $ kernel3
    in checkPass "kernelInt matrix3" actual expect

  , let actual = kernelIntPar matrix3
        expect = Just $ kernel3
    in checkPass "kernelIntPar matrix3" actual expect

  , let actual = normalFormInt matrix4
        expect = Just $ snf4
    in checkPass "normalFormInt matrix4" actual expect

  , let actual = normalFormIntPar matrix4
        expect = Just $ snf4
    in checkPass "normalFormIntPar matrix4" actual expect

  , let actual = normalFormInt matrix5
        expect = Just $ snf5
    in checkPass "normalFormInt matrix5" actual expect

  , let actual = normalFormIntPar matrix5
        expect = Just $ snf5
    in checkPass "normalFormIntPar matrix5" actual expect

  , let actual = normalFormInt matrix6
        expect = Just $ snf6
    in checkPass "normalFormInt matrix6" actual expect

  , let actual = normalFormIntPar matrix6
        expect = Just $ snf6
    in checkPass "normalFormIntPar matrix6" actual expect

  --test filtration 1

  , let actual = indexBarCodesSimple testFiltration1
        expect = Just $ V.fromList $ L.map V.fromList [[(0, Finite 2), (0, Finite 2), (0,Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Infinity), (0, Infinity), (0, Infinity)], [(2,Infinity),(2,Infinity)], []]
    in checkPass "indexBarCodesSimple testFiltration1" actual expect

  , let actual = scaleBarCodesSimple scales1 testFiltration1
        expect = Just $ V.fromList $ L.map V.fromList [[(6.0, Finite 10.0), (6.0, Finite 10.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Infinity), (6.0, Infinity), (6.0, Infinity)], [(10.0, Infinity), (10.0, Infinity)], []]
    in checkPass "scaleBarCodesSimple testFiltration1" actual expect

  , let actual = indexBarCodes nsTestFiltration1
        expect = Just $ V.fromList $ L.map V.fromList [[(0, Finite 2), (0, Finite 2), (0,Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Infinity), (0, Infinity), (0, Infinity)], [(2,Infinity),(2,Infinity)], [], []]
    in checkPass "indexBarCodes testFiltration1" actual expect

  , let actual = scaleBarCodes scales1 nsTestFiltration1
        expect = Just $ V.fromList $ L.map V.fromList [[(6.0, Finite 10.0), (6.0, Finite 10.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Finite 8.0), (6.0, Infinity), (6.0, Infinity), (6.0, Infinity)], [(10.0, Infinity), (10.0, Infinity)], [], []]
    in checkPass "scaleBarCodes testFiltration1" actual expect

  --octahedral filtration

  , let actual = indexBarCodesSimple octahedron
        expect = Just $ V.fromList $ L.map V.fromList [[(0, Finite 2), (0, Finite 2), (0, Finite 2), (0, Finite 2), (0,Finite 2),(0,Infinity)], [], [(2,Finite 3)], [], []]
    in checkPass "indexBarCodesSimple octahedron" actual expect

  , let actual = scaleBarCodesSimple octaScales octahedron
        expect = Just $ V.fromList $ L.map V.fromList [[(0.5, Finite 1.6),(0.5, Finite 1.6),(0.5, Finite 1.6),(0.5, Finite 1.6),(0.5, Finite 1.6), (0.5, Infinity)], [], [(1.6,Finite 2.1)], [], []]
    in checkPass "scaleBarCodesSimple octahedron" actual expect

  , let actual = indexBarCodes nsoctahedron
        expect = Just $ V.fromList $ L.map V.fromList [[(0, Finite 2), (0, Finite 2), (0, Finite 2), (0, Finite 2), (0,Finite 2),(0,Infinity)], [], [(2,Finite 3)], [], [], []]
    in checkPass "indexBarCodes octahedron" actual expect

  , let actual = scaleBarCodes octaScales nsoctahedron
        expect = Just $ V.fromList $ L.map V.fromList [[(0.5, Finite 1.6),(0.5, Finite 1.6),(0.5, Finite 1.6),(0.5, Finite 1.6),(0.5, Finite 1.6), (0.5, Infinity)], [], [(1.6,Finite 2.1)], [], [], []]
    in checkPass "scaleBarCodes octahedron" actual expect

  --square filtration

  , let actual = indexBarCodesSimple square
        expect = Just $ V.fromList $ L.map V.fromList [[(0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Infinity)], [(1,Infinity)]]
    in checkPass "indexBarCodesSimple square" actual expect

  , let actual = scaleBarCodesSimple sqrScales square
        expect = Just $ V.fromList $ L.map V.fromList [[(0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Infinity)], [(1.1,Infinity)]]
    in checkPass "scaleBarCodesSimple square" actual expect

  , let actual = indexBarCodes nssquare
        expect = Just $ V.fromList $ L.map V.fromList [[(0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Infinity)], [(1,Infinity)], []]
    in checkPass "indexBarCodes square" actual expect

  , let actual = scaleBarCodes sqrScales nssquare
        expect = Just $ V.fromList $ L.map V.fromList [[(0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Finite 1.1), (0.5, Infinity)], [(1.1,Infinity)], []]
    in checkPass "scaleBarCodes square" actual expect

  --mobius strip filtration

  , let actual = indexBarCodesSimple mobiusStrip
        expect = Just $ V.fromList $ L.map V.fromList [[(0, Finite 4), (0, Finite 4), (0, Finite 4), (0, Finite 4), (0, Finite 4), (0, Finite 2), (0, Finite 2), (0, Finite 2), (0, Finite 2), (0,Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0,Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1),(0,Finite 1),(0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Infinity)], [(4, Finite 5), (3, Finite 5), (3, Finite 5), (4, Infinity)], [], [], []]
    in checkPass "indexBarCodesSimple mobius" actual expect

  , let actual = scaleBarCodesSimple mobScales mobiusStrip
        expect = Just $ V.fromList $ L.map V.fromList $ [[(0.15, Finite 0.35), (0.15, Finite 0.35), (0.15, Finite 0.35), (0.15, Finite 0.35), (0.15, Finite 0.35), (0.15, Finite 0.25), (0.15, Finite 0.25), (0.15, Finite 0.25), (0.15, Finite 0.25), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Infinity)], [(0.35, Finite 0.4), (0.3, Finite 0.4), (0.3, Finite 0.4), (0.35, Infinity)], [], [], []]
    in checkPass "scaleBarCodesSimple mobius" actual expect

  , let actual = indexBarCodes nsmobius
        expect = Just $ V.fromList $ L.map V.fromList [[(0, Finite 4), (0, Finite 4), (0, Finite 4), (0, Finite 4), (0, Finite 4), (0, Finite 2), (0, Finite 2), (0, Finite 2), (0, Finite 2), (0,Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0,Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1),(0,Finite 1),(0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Finite 1), (0, Infinity)], [(4, Finite 5), (3, Finite 5), (3, Finite 5), (4, Infinity)], [], [], [], []]
    in checkPass "indexBarCodes mobius" actual expect

  , let actual = scaleBarCodes mobScales nsmobius
        expect = Just $ V.fromList $ L.map V.fromList $ [[(0.15, Finite 0.35), (0.15, Finite 0.35), (0.15, Finite 0.35), (0.15, Finite 0.35), (0.15, Finite 0.35), (0.15, Finite 0.25), (0.15, Finite 0.25), (0.15, Finite 0.25), (0.15, Finite 0.25), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Finite 0.2), (0.15, Infinity)], [(0.35, Finite 0.4), (0.3, Finite 0.4), (0.3, Finite 0.4), (0.35, Infinity)], [], [], [], []]
    in checkPass "scaleBarCodes mobius" actual expect

  , let complex = getComplex 1 $ Right nssquare
        actual  = bettiNumbers complex
        expect  = Just [1,1]
    in checkPass "bettiNumbers nssquare 1" actual expect

  , let complex = getComplex 1 $ Right nssquare
        actual  = bettiNumbersPar complex
        expect  = Just [1,1]
    in checkPass "bettiNumbersPar nssquare 1" actual expect

  , let complex = getComplex 2 $ Left octahedron
        actual  = bettiNumbers complex
        expect  = Just [1,0,1]
    in checkPass "bettiNumbers octahedron 2" actual expect

  , let complex = getComplex 2 $ Left octahedron
        actual  = bettiNumbersPar complex
        expect  = Just [1,0,1]
    in checkPass "bettiNumbersPar octahedron 2" actual expect

  , let complex = getComplex 2 $ Left testFiltration1
        actual  = bettiNumbers complex
        expect  = Just [3,2,0,0]
    in checkPass "bettiNumbers testFiltration1 2" actual expect

  , let complex = getComplex 2 $ Left testFiltration1
        actual  = bettiNumbersPar complex
        expect  = Just [3,2,0,0]
    in checkPass "bettiNumbersPar testFiltration1 2" actual expect

  --for now we only check if the landscape functions don't throw errors

  , let ibarcodes = indexBarCodesSimple testFiltration1
        actual    = calcLandscape $ ibarcodes ! 0
        expect    = Nothing
    in checkPass "calcLandscape testFiltration1 0-dimensional" actual expect

  , let ibarcodes = indexBarCodesSimple mobiusStrip
        actual    = calcLandscape $ ibarcodes ! 1
        expect    = Nothing
    in checkPass "calcLandscape mobiusStrip 1-dimensional" actual expect

  , let ibarcodestest = indexBarCodesSimple testFiltration1
        ibarcodesmob  = indexBarCodesSimple mobiusStrip
        testscape     = calcLandscape $ ibarcodestest ! 0
        mobscape      = calcLandscape $ ibarcodesmob ! 1
        actual        = avgLandscapes [testscape, mobscape]
        expect        = Nothing
    in checkPass "avgLandscapes testFiltration1 mobiuStrip" actual expect

  , let ibarcodestest = indexBarCodesSimple testFiltration1
        ibarcodesmob  = indexBarCodesSimple mobiusStrip
        testscape     = calcLandscape $ ibarcodestest ! 0
        mobscape      = calcLandscape $ ibarcodesmob ! 1
        actual        = diffLandscapes testscape mobscape
        expect        = Nothing
    in checkPass "diffLandscapes testFiltration1 mobiusStrip" actual expect

  , let ibarcodestest = indexBarCodesSimple testFiltration1
        ibarcodesmob  = indexBarCodesSimple mobiusStrip
        testscape     = calcLandscape $ ibarcodestest ! 0
        mobscape      = calcLandscape $ ibarcodesmob ! 1
        actual        = metricLp (Finite 3.0) (0.0, 5.0) 0.5 testscape mobscape
        expect        = Nothing
    in checkPass "metricLp 3.0 (0.0, 5.0) testFiltration1 mobiusStrip" actual expect

  --Hasse diagram tests

  , let complex = dGraph2sc 18 dGraph1
        actual  = bettiNumbers complex
        expect  = Just [1,25]
    in checkPass "bettiNumbers dGraph2sc dGraph1" actual expect

  , let actual = bettiNumbers dCliqueComplex
        expect = Just [1,8,2,0,0,0,0]
    in checkPass "bettiNumbers dCliquecComplex" actual expect
  ]

main = putStrLn $ formatTestResults tests