diff options
Diffstat (limited to 'packages/base/src/Data/Packed/Vector.hs')
-rw-r--r-- | packages/base/src/Data/Packed/Vector.hs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/packages/base/src/Data/Packed/Vector.hs b/packages/base/src/Data/Packed/Vector.hs new file mode 100644 index 0000000..b5a4318 --- /dev/null +++ b/packages/base/src/Data/Packed/Vector.hs | |||
@@ -0,0 +1,96 @@ | |||
1 | {-# LANGUAGE FlexibleContexts #-} | ||
2 | {-# LANGUAGE CPP #-} | ||
3 | ----------------------------------------------------------------------------- | ||
4 | -- | | ||
5 | -- Module : Data.Packed.Vector | ||
6 | -- Copyright : (c) Alberto Ruiz 2007-10 | ||
7 | -- License : GPL | ||
8 | -- | ||
9 | -- Maintainer : Alberto Ruiz <aruiz@um.es> | ||
10 | -- Stability : provisional | ||
11 | -- | ||
12 | -- 1D arrays suitable for numeric computations using external libraries. | ||
13 | -- | ||
14 | -- This module provides basic functions for manipulation of structure. | ||
15 | -- | ||
16 | ----------------------------------------------------------------------------- | ||
17 | {-# OPTIONS_HADDOCK hide #-} | ||
18 | |||
19 | module Data.Packed.Vector ( | ||
20 | Vector, | ||
21 | fromList, (|>), toList, buildVector, | ||
22 | dim, (@>), | ||
23 | subVector, takesV, vjoin, join, | ||
24 | mapVector, mapVectorWithIndex, zipVector, zipVectorWith, unzipVector, unzipVectorWith, | ||
25 | mapVectorM, mapVectorM_, mapVectorWithIndexM, mapVectorWithIndexM_, | ||
26 | foldLoop, foldVector, foldVectorG, foldVectorWithIndex | ||
27 | ) where | ||
28 | |||
29 | import Data.Packed.Internal.Vector | ||
30 | import Foreign.Storable | ||
31 | |||
32 | ------------------------------------------------------------------- | ||
33 | |||
34 | #ifdef BINARY | ||
35 | |||
36 | import Data.Binary | ||
37 | import Control.Monad(replicateM) | ||
38 | |||
39 | -- a 64K cache, with a Double taking 13 bytes in Bytestring, | ||
40 | -- implies a chunk size of 5041 | ||
41 | chunk :: Int | ||
42 | chunk = 5000 | ||
43 | |||
44 | chunks :: Int -> [Int] | ||
45 | chunks d = let c = d `div` chunk | ||
46 | m = d `mod` chunk | ||
47 | in if m /= 0 then reverse (m:(replicate c chunk)) else (replicate c chunk) | ||
48 | |||
49 | putVector v = do | ||
50 | let d = dim v | ||
51 | mapM_ (\i -> put $ v @> i) [0..(d-1)] | ||
52 | |||
53 | getVector d = do | ||
54 | xs <- replicateM d get | ||
55 | return $! fromList xs | ||
56 | |||
57 | instance (Binary a, Storable a) => Binary (Vector a) where | ||
58 | put v = do | ||
59 | let d = dim v | ||
60 | put d | ||
61 | mapM_ putVector $! takesV (chunks d) v | ||
62 | get = do | ||
63 | d <- get | ||
64 | vs <- mapM getVector $ chunks d | ||
65 | return $! vjoin vs | ||
66 | |||
67 | #endif | ||
68 | |||
69 | ------------------------------------------------------------------- | ||
70 | |||
71 | {- | creates a Vector of the specified length using the supplied function to | ||
72 | to map the index to the value at that index. | ||
73 | |||
74 | @> buildVector 4 fromIntegral | ||
75 | 4 |> [0.0,1.0,2.0,3.0]@ | ||
76 | |||
77 | -} | ||
78 | buildVector :: Storable a => Int -> (Int -> a) -> Vector a | ||
79 | buildVector len f = | ||
80 | fromList $ map f [0 .. (len - 1)] | ||
81 | |||
82 | |||
83 | -- | zip for Vectors | ||
84 | zipVector :: (Storable a, Storable b, Storable (a,b)) => Vector a -> Vector b -> Vector (a,b) | ||
85 | zipVector = zipVectorWith (,) | ||
86 | |||
87 | -- | unzip for Vectors | ||
88 | unzipVector :: (Storable a, Storable b, Storable (a,b)) => Vector (a,b) -> (Vector a,Vector b) | ||
89 | unzipVector = unzipVectorWith id | ||
90 | |||
91 | ------------------------------------------------------------------- | ||
92 | |||
93 | {-# DEPRECATED join "use vjoin or Data.Vector.concat" #-} | ||
94 | join :: Storable t => [Vector t] -> Vector t | ||
95 | join = vjoin | ||
96 | |||