subsample-0.1.0.0: src/Subsample.hs
{- Subsample
Gregory W. Schwartz
Collects the functions pertaining to subsampling the statuses with more samples.
-}
{-# LANGUAGE BangPatterns #-}
module Subsample
( smallestSampleNum
, getSubsampling
, filterRowsValid
) where
-- Standard
import Data.Semigroup
import qualified Data.Foldable as F
import qualified Data.Map.Strict as Map
import qualified Data.Sequence as Seq
import qualified Data.Set as Set
import qualified Data.Traversable as T
-- Cabal
import Data.Random
import qualified Data.Vector as V
-- Local
import Types
import Utility
-- | Find the smallest number of samples in a StatusMap.
smallestSampleNum :: StatusMap -> Size
smallestSampleNum = Size . F.minimum . Map.map Seq.length . unStatusMap
-- | Get the valid samples of a StatusMap by subsampling a certain number.
getSubsampling :: Size -> StatusMap -> IO (Set.Set Sample)
getSubsampling (Size size) =
fmap (Set.fromList . concat . Map.elems)
. T.mapM (\ xs -> sample
. shuffleNofM size (Seq.length xs)
. F.toList
$ xs
)
. unStatusMap
-- | Filter rows based on whether they contain valid values in a column.
filterRowsValid
:: (Eq a, Eq b, Ord a, Ord b, Show a)
=> a -> Set.Set b -> [Map.Map a b] -> [Map.Map a b]
filterRowsValid col valid = filter (flip Set.member valid . lookupWithErr col)