normalize-0.3.1.0: src/Utility.hs
{- Utility
Gregory W. Schwartz
Collections helper functions for the program.
-}
{-# LANGUAGE BangPatterns #-}
module Utility
( sortSparseVector
, rankSparseVector
, medianSparseVector
, avgSparseVector
) where
-- Standard
import Data.Function (on)
import Data.List
-- Cabal
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
-- Local
-- | Find the average of a sparse vector, ignoring zeros.
avgSparseVector :: S.SpVector Double -> Double
avgSparseVector xs = mean . V.fromList . fmap snd . S.toListSV $ xs
-- | Find the median of a sparse vector, ignoring zeros.
medianSparseVector :: S.SpVector Double -> Double
medianSparseVector xs =
continuousBy s 2 4 . V.fromList . fmap snd . S.toListSV $ xs
-- | Sort a sparse vector, ignoring zeros.
sortSparseVector :: S.SpVector Double -> S.SpVector Double
sortSparseVector xs =
S.fromListDenseSV (S.svDim xs) . sort . fmap snd . S.toListSV $ xs
-- | Get the rank transformed vector of a sparse vector, ignoring zeros.
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