packages feed

hw-packed-vector 0.0.0.2 → 0.0.0.3

raw patch · 4 files changed

+81/−16 lines, 4 filesdep +criteriondep +directorydep ~hw-primPVP: minor bump suggested

API additions: PVP suggests at least a minor version bump

Dependencies added: criterion, directory

Dependency ranges changed: hw-prim

API changes (from Hackage documentation)

+ HaskellWorks.Data.PackedVector.PackedVector64: fromListN :: Count -> Count -> [Word64] -> PackedVector64

Files

+ bench/Main.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Main where++import Control.Monad+import Criterion.Main+import Data.List+import Data.Monoid      ((<>))+import Data.Word+import System.Directory++import qualified Data.Vector.Storable                as DVS+import qualified HaskellWorks.Data.AtIndex           as HW+import qualified HaskellWorks.Data.FromForeignRegion as IO+import qualified HaskellWorks.Data.PackedVector      as PV+++makeBenchW64s :: IO [Benchmark]+makeBenchW64s = do+  entries <- listDirectory "data/bench"+  let files = ("data/bench/" ++) <$> (".word64s" `isSuffixOf`) `filter` entries+  benchmarks <- forM files $ \file -> return+    [ env (IO.mmapFromForeignRegion file) $ \(v :: DVS.Vector Word64) -> bgroup "with Vector64" $ mempty+      <> [bench ("PV.fromList"  <> file) (whnf (PV.fromList                10) (DVS.toList v))]+      <> [bench ("PV.fromListN" <> file) (whnf (PV.fromListN (HW.length v) 10) (DVS.toList v))]+    , env (fmap (PV.fromList 10 . DVS.toList) (IO.mmapFromForeignRegion file)) $ \pv -> bgroup "with PackedVector64" $ mempty+      <> [bench ("PV.atIndex "  <> file) (whnf (HW.atIndex pv) 20)]+    ]+  return (join benchmarks)++main :: IO ()+main = do+  benchmarks <- (mconcat <$>) $ sequence $ mempty+    <> [makeBenchW64s]+  defaultMain benchmarks
hw-packed-vector.cabal view
@@ -1,7 +1,7 @@ cabal-version:      2.2  name:               hw-packed-vector-version:            0.0.0.2+version:            0.0.0.3 synopsis:           Packed Vector description:        Packed Vector. Please see README.md category:           Data, Vector@@ -24,13 +24,15 @@ common base                 { build-depends: base                 >= 4          && < 5      }  common bytestring           { build-depends: bytestring           >= 0.10.8.2   && < 0.11   }+common criterion            { build-depends: criterion            >= 1.4.1.0    && < 1.6    } common deepseq              { build-depends: deepseq              >= 1.4        && < 1.5    }+common directory            { build-depends: directory            >= 1.3        && < 1.4    } common hedgehog             { build-depends: hedgehog             >= 0.6        && < 1.1    } common hspec                { build-depends: hspec                >= 2.7.1      && < 3      } common hw-bits              { build-depends: hw-bits              >= 0.7.0.6    && < 0.8    } common hw-hedgehog          { build-depends: hw-hedgehog          >= 0.1.0.3    && < 0.2    } common hw-hspec-hedgehog    { build-depends: hw-hspec-hedgehog    >= 0.1.0.7    && < 0.2    }-common hw-prim              { build-depends: hw-prim              >= 0.6.2.25   && < 0.7    }+common hw-prim              { build-depends: hw-prim              >= 0.6.2.27   && < 0.7    } common vector               { build-depends: vector               >= 0.12.0.3   && < 0.13   }  common config@@ -73,3 +75,18 @@   ghc-options:      -threaded -rtsopts -with-rtsopts=-N   build-depends:    hw-packed-vector   build-tools:      hspec-discover++benchmark bench+  import:   base, config+          , criterion+          , directory+          , hedgehog+          , hspec+          , hw-prim+          , vector+  type:               exitcode-stdio-1.0+  main-is:            Main.hs+  hs-source-dirs:     bench+  other-modules:      Paths_hw_packed_vector+  build-depends:      hw-packed-vector+  autogen-modules:    Paths_hw_packed_vector
src/HaskellWorks/Data/PackedVector/PackedVector64.hs view
@@ -5,6 +5,7 @@   ( PackedVector64(..)   , empty   , fromList+  , fromListN   , toList   ) where @@ -58,18 +59,24 @@         let loBitsSize  = 64 - toCount r             hiBitsSize  = bitSize - loBitsSize             loBits      = ((vv !!! q) .>. unsign r) .&. loBitsSized loBitsSize-            hiBits      = if r > 64 - fromIntegral bitSize then (vv !!! (q + 1)) .&. loBitsSized hiBitsSize else 0+            hiBits      = (vv !!! (q + 1)) .&. loBitsSized hiBitsSize         in  loBits .|. (hiBits .<. loBitsSize)   (!!!)       = atIndex   {-# INLINE (!!!)   #-}   {-# INLINE atIndex #-}  fromList :: Count -> [Word64] -> PackedVector64-fromList wl ws =-  PackedVector64-  { swBuffer    = DVS.fromList (packBits wl ws)+fromList wordLength ws = PackedVector64+  { swBuffer    = DVS.fromList (packBits wordLength ws)   , swBufferLen = fromIntegral (length ws)-  , swBitSize   = fromIntegral wl+  , swBitSize   = fromIntegral wordLength+  }++fromListN :: Count -> Count -> [Word64] -> PackedVector64+fromListN vectorSize wordLength ws = PackedVector64+  { swBuffer    = DVS.fromListN (fromIntegral vectorSize) (packBits wordLength ws)+  , swBufferLen = fromIntegral (length ws)+  , swBitSize   = fromIntegral wordLength   }  toList :: PackedVector64 -> [Word64]
test/HaskellWorks/Data/PackedVector/PackedVector64Spec.hs view
@@ -1,28 +1,34 @@ module HaskellWorks.Data.PackedVector.PackedVector64Spec (spec) where -import HaskellWorks.Data.AtIndex+import HaskellWorks.Data.AtIndex                     ((!!!)) import HaskellWorks.Data.PackedVector.PackedVector64+import HaskellWorks.Hspec.Hedgehog import Hedgehog import Test.Hspec--- import Test.QuickCheck-import HaskellWorks.Hspec.Hedgehog -import qualified HaskellWorks.Gen          as G-import qualified Hedgehog.Gen              as G-import qualified Hedgehog.Range            as R+import qualified HaskellWorks.Data.AtIndex                     as HW+import qualified HaskellWorks.Data.PackedVector.PackedVector64 as PV+import qualified HaskellWorks.Gen                              as G+import qualified Hedgehog.Gen                                  as G+import qualified Hedgehog.Range                                as R  {-# ANN module ("HLint: Ignore Redundant do" :: String) #-}  spec :: Spec spec = describe "HaskellWorks.Data.PackedVector.PackedVector64Spec" $ do-  it "Round trip from list" $ require $ property $ do+  it "fromList/toList works" $ require $ property $ do     wSize <- forAll $ G.subWordSize 64     len   <- forAll $ G.int   (R.linear 1 128)     ws    <- forAll $ G.list  (R.singleton len) (G.word64OfSize wSize)     toList (fromList wSize ws) === ws-  it "Round trip from list" $ require $ property $ do+  it "fromListN/toList works" $ require $ property $ do     wSize <- forAll $ G.subWordSize 64+    len   <- forAll $ G.int   (R.linear 1 128)+    ws    <- forAll $ G.list  (R.singleton len) (G.word64OfSize wSize)+    toList (fromListN (HW.length ws) wSize ws) === ws+  it "Index lookup works" $ require $ property $ do+    wSize <- forAll $ G.subWordSize 64     len   <- forAll $ G.int   (R.linear 1 32)     ws    <- forAll $ G.list  (R.singleton len) (G.word64OfSize wSize)     i     <- forAll $ G.int64 (R.linear 0 (fromIntegral len - 1))-    (fromList wSize ws !!! i) === (ws !!! i)+    (PV.fromList wSize ws !!! i) === (ws !!! i)