tsne-1.3.0: src/Data/Algorithm/TSNE/Run2D.hs
module Data.Algorithm.TSNE.Run2D where
import Control.Applicative
import Control.DeepSeq
import Data.Random.Normal (normalsIO')
import Pipes
import Data.Algorithm.TSNE.Types
import Data.Algorithm.TSNE.Preparation
import Data.Algorithm.TSNE.Stepping
initState2D :: Int -> IO TSNEState
initState2D n = do
s <- initSolution2D n
return $ TSNEState 0 s (rr 1) (rr 0)
where
rr = repeat.repeat
initSolution2D :: Int -> IO [[Double]]
initSolution2D n = do
let ns = normalsIO' (0, 1e-4)
xs <- ns
ys <- ns
return $ take n <$> [xs,ys]
runTSNE2D :: TSNEOptions -> TSNEInput -> [[Probability]] -> TSNEState -> Producer TSNEOutput2D IO ()
runTSNE2D opts vs ps st = do
yield $ output2D ps st
let st' = force $ stepTSNE opts vs ps st
runTSNE2D opts vs ps st'
solution2D :: [[Double]] -> [Position2D]
solution2D (xs:ys:_) = zip xs ys
output2D :: [[Double]] -> TSNEState -> TSNEOutput2D
output2D pss st = TSNEOutput2D i s c
where
i = stIteration st
s = (solution2D . stSolution) st
c = cost pss st