{-# LANGUAGE BangPatterns #-}
module Utility
( sortSparseVector
, rankSparseVector
, medianSparseVector
, avgSparseVector
) where
import Data.Function (on)
import Data.List
import Control.Lens
import Statistics.Quantile
import Statistics.Sample (mean)
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import qualified Data.Sparse.Common as S
import qualified Data.Vector.Unboxed as V
avgSparseVector :: S.SpVector Double -> Double
avgSparseVector xs = mean . V.fromList . fmap snd . S.toListSV $ xs
medianSparseVector :: S.SpVector Double -> Double
medianSparseVector xs =
continuousBy s 2 4 . V.fromList . fmap snd . S.toListSV $ xs
sortSparseVector :: S.SpVector Double -> S.SpVector Double
sortSparseVector xs =
S.fromListDenseSV (S.svDim xs) . sort . fmap snd . S.toListSV $ xs
rankSparseVector :: S.SpVector Double -> S.SpVector Int
rankSparseVector xs = fmap (\k -> Map.findWithDefault 0 k rankMap) xs
where
rankMap = Map.fromList
. flip zip [1,2..]
. Set.toList
. Set.fromList
. fmap snd
. S.toListSV
$ xs