packages feed

rp-tree-0.2.0.0: src/Data/RPTree/Internal/Testing.hs

{-# options_ghc -Wno-unused-imports #-}
module Data.RPTree.Internal.Testing where

import Control.Monad.IO.Class (MonadIO(..))
import GHC.Word (Word8, Word64)

-- conduit
import qualified Data.Conduit as C (ConduitT, runConduit, yield, await, transPipe)
import Data.Conduit ((.|))
import qualified Data.Conduit.Combinators as C (map, mapM, scanl, scanlM, last, print)
import qualified Data.Conduit.List as C (chunksOf, unfold, unfoldM)
-- splitmix
import System.Random.SplitMix (initSMGen, unseedSMGen)
-- splitmix-distributions
import System.Random.SplitMix.Distributions (GenT)

import Data.RPTree.Internal (SVector, fromListSv, DVector, fromListDv)
import Data.RPTree.Gen (dense, sparse, normal2, normalSparse2, normalDense2)
import Data.RPTree.Conduit (dataSource)

data BenchConfig = BenchConfig {
  bcDescription :: String
  , bcMaxTreeDepth :: Int
  , bcMinLeafSize :: Int
  , bcNumTrees :: Int
  , bcChunkSize :: Int
  , bcNZDensity :: Double
  , bcVectorDim :: Int
  , bcDataSize :: Int
  , bcNumQueryPoints :: Int
                               } deriving (Show)

randSeed :: MonadIO m => m Word64
randSeed = liftIO (fst . unseedSMGen <$> initSMGen)


-- | binary mixture of isotropic Gaussian rvs
datD :: Monad m =>
        Int -- ^ number of data points
     -> Int -- ^ vector dimension
     -> C.ConduitT i (DVector Double) (GenT m) ()
datD n d = dataSource n $ normalDense2 d

-- | binary mixture of isotropic Gaussian rvs with sparse components
datS :: Monad m =>
        Int -- ^ number of data points
     -> Int -- ^ vector dimension
     -> Double -- ^ nonzero density
     -> C.ConduitT i (SVector Double) (GenT m) ()
datS n d pnz = dataSource n $ normalSparse2 pnz d