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