module Statistics.Test.Internal (
rank
, splitByTags
) where
import qualified Data.Vector.Generic as G
data Rank v a = Rank {
rankCnt :: !Int
, rankVal :: !Double
, rankNum :: !Double
, rankVec :: v a
}
rank :: (G.Vector v a, G.Vector v Double)
=> (a -> a -> Bool)
-> v a
-> v Double
rank eq vec = G.unfoldr go (Rank 0 (1) 1 vec)
where
go (Rank 0 _ r v)
| G.null v = Nothing
| otherwise =
case G.length h of
1 -> Just (r, Rank 0 0 (r+1) rest)
n -> go Rank { rankCnt = n
, rankVal = 0.5 * (r*2 + fromIntegral (n1))
, rankNum = r + fromIntegral n
, rankVec = rest
}
where
(h,rest) = G.span (eq $ G.head v) v
go (Rank n val r v) = Just (val, Rank (n1) val r v)
splitByTags :: (G.Vector v a, G.Vector v (Bool,a)) => v (Bool,a) -> (v a, v a)
splitByTags vs = (G.map snd a, G.map snd b)
where
(a,b) = G.unstablePartition fst vs