module Numeric.Statistics.Surrogate (
surrogate
) where
import Data.Packed.Vector
import qualified Data.Array.IArray as I
import Numeric.GSL.Permutation
import System.Random
surrogate :: Int
-> Int
-> (I.Array Int (Vector Double) -> a)
-> I.Array Int (Vector Double)
-> I.Array Int a
surrogate r n f d = I.listArray (1,n+1) $ (f d) : (surrogate' (mkStdGen r) n f d)
surrogate' :: StdGen -> Int-> (I.Array Int (Vector Double) -> a) -> I.Array Int (Vector Double) -> [a]
surrogate' _ 0 _ _ = []
surrogate' g n f d = let (g',g'') = split g
d' = permute_data g' d
in (f d) : (surrogate' g'' (n1) f d)
randomList :: StdGen -> Int -> [Int]
randomList _ 0 = []
randomList g n = let (r,g') = random g
in r : (randomList g' (n1))
permute_data :: StdGen -> I.Array Int (Vector Double) -> I.Array Int (Vector Double)
permute_data g d = let s = I.rangeSize $ I.bounds d
rs = randomList g s
ds = zip rs $ I.elems d
in I.listArray (I.bounds d) $ map (\(r,v) -> permute (random_permute r (dim v)) v) ds