tsne-1.3.0: src/Data/Algorithm/TSNE/Checks.hs
module Data.Algorithm.TSNE.Checks where
import Data.Algorithm.TSNE.Types
isSquare :: Int -> [[a]] -> Bool
isSquare 0 [] = True
isSquare _ [] = False
isSquare n xss = length xss == n && all (\xs -> length xs == n) xss
has2DShape :: (Int, Int) -> [[a]] -> Bool
has2DShape (w,h) xss = length xss == h && all (\xs -> length xs == w) xss
shape2D :: [[a]] -> (Int, Int)
shape2D [] = (undefined, 0)
shape2D xss = (length (head xss), length xss)
isRectangular :: [[a]] -> Bool
isRectangular xss = has2DShape (shape2D xss) xss
inputSize :: TSNEInput -> Int
inputSize = length
inputValueSize :: TSNEInput -> Int
inputValueSize i = w
where (w,h) = shape2D i
inputIsValid :: TSNEInput -> Either String ()
inputIsValid [] = Left "empty input data"
inputIsValid xss
| not (isRectangular xss) = Left "input data values are not all the same length"
| otherwise = Right ()
isValidStateForInput :: Int -> TSNEInput -> TSNEState -> Either String ()
isValidStateForInput d i st
| not (has2DShape (n,d) s) = Left $ "solution is wrong shape: " ++ show (shape2D s)
| otherwise = Right ()
where
n = inputSize i
s = stSolution st