module ELynx.Tools.Vector
(
sumVec
, normalizeSumVec
, uniformVec
, meanVec
, chop
, randomInsert
) where
import Control.Monad.Primitive
import qualified Data.Vector.Generic as V
import System.Random.MWC
sumVec :: (Num a, V.Vector v a) => v a -> a
sumVec = V.foldl' (+) 0
normalizeSumVec :: (Fractional a, V.Vector v a) => a -> v a -> v a
normalizeSumVec c v = V.map (* c') v
where s = sumVec v
c' = c/s
uniformVec :: (Fractional a, V.Vector v a) => Int -> v a
uniformVec n = V.replicate n (1 / fromIntegral n)
meanVec :: (Fractional a, V.Vector v a) => v a -> a
meanVec v = sumVec v / fromIntegral (V.length v)
chop :: V.Vector v a => Int -> v a -> [v a]
chop n xs | V.length xs < n = []
| otherwise = V.take n xs : chop n (V.drop n xs)
randomInsert :: (PrimMonad m, V.Vector v a) => a -> v a -> Gen (PrimState m) -> m (v a)
randomInsert e v g = do
let l = V.length v
i <- uniformR (0, l) g
return $ V.take i v V.++ V.singleton e V.++ V.drop i v