summaryrefslogtreecommitdiff
path: root/lib/Data/Packed/Internal
diff options
context:
space:
mode:
authorBen Gamari <bgamari.foss@gmail.com>2013-08-15 14:19:57 -0400
committerBen Gamari <bgamari.foss@gmail.com>2013-08-15 14:19:57 -0400
commit83453a970491fc764a9e490e1f9791a289e9b571 (patch)
tree33ba6a9eb93129cb98e6ad4aef06e39977fc21d5 /lib/Data/Packed/Internal
parent955d569823230f871fba8c4492b5ad4a4a2def31 (diff)
parent374194ee454622e66c931dce8f315c68167c7ac9 (diff)
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'lib/Data/Packed/Internal')
-rw-r--r--lib/Data/Packed/Internal/Matrix.hs21
-rw-r--r--lib/Data/Packed/Internal/Vector.hs59
2 files changed, 15 insertions, 65 deletions
diff --git a/lib/Data/Packed/Internal/Matrix.hs b/lib/Data/Packed/Internal/Matrix.hs
index b8ed18d..255009c 100644
--- a/lib/Data/Packed/Internal/Matrix.hs
+++ b/lib/Data/Packed/Internal/Matrix.hs
@@ -47,6 +47,7 @@ import Data.Complex(Complex)
47import Foreign.C.Types 47import Foreign.C.Types
48import Foreign.C.String(newCString) 48import Foreign.C.String(newCString)
49import System.IO.Unsafe(unsafePerformIO) 49import System.IO.Unsafe(unsafePerformIO)
50import Control.DeepSeq
50 51
51----------------------------------------------------------------- 52-----------------------------------------------------------------
52 53
@@ -131,12 +132,10 @@ mat a f =
131 let m g = do 132 let m g = do
132 g (fi (rows a)) (fi (cols a)) p 133 g (fi (rows a)) (fi (cols a)) p
133 f m 134 f m
134 135-- | Creates a vector by concatenation of rows. If the matrix is ColumnMajor, this operation requires a transpose.
135{- | Creates a vector by concatenation of rows 136--
136 137-- @\> flatten ('ident' 3)
137@\> flatten ('ident' 3) 138-- 9 |> [1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0]@
1389 |> [1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0]@
139-}
140flatten :: Element t => Matrix t -> Vector t 139flatten :: Element t => Matrix t -> Vector t
141flatten = xdat . cmat 140flatten = xdat . cmat
142 141
@@ -459,3 +458,13 @@ size m = (rows m, cols m)
459 458
460shSize m = "(" ++ show (rows m) ++"><"++ show (cols m)++")" 459shSize m = "(" ++ show (rows m) ++"><"++ show (cols m)++")"
461 460
461----------------------------------------------------------------------
462
463instance (Storable t, NFData t) => NFData (Matrix t)
464 where
465 rnf m | d > 0 = rnf (v @> 0)
466 | otherwise = ()
467 where
468 d = dim v
469 v = xdat m
470
diff --git a/lib/Data/Packed/Internal/Vector.hs b/lib/Data/Packed/Internal/Vector.hs
index d3b80ff..5892e67 100644
--- a/lib/Data/Packed/Internal/Vector.hs
+++ b/lib/Data/Packed/Internal/Vector.hs
@@ -55,48 +55,17 @@ import GHC.Base
55import GHC.IOBase hiding (liftIO) 55import GHC.IOBase hiding (liftIO)
56#endif 56#endif
57 57
58#ifdef VECTOR
59import qualified Data.Vector.Storable as Vector 58import qualified Data.Vector.Storable as Vector
60import Data.Vector.Storable(Vector, 59import Data.Vector.Storable(Vector,
61 unsafeToForeignPtr, 60 unsafeToForeignPtr,
62 unsafeFromForeignPtr, 61 unsafeFromForeignPtr,
63 unsafeWith) 62 unsafeWith)
64#else
65import Foreign.ForeignPtr(withForeignPtr)
66#endif
67 63
68#ifdef VECTOR
69 64
70-- | Number of elements 65-- | Number of elements
71dim :: (Storable t) => Vector t -> Int 66dim :: (Storable t) => Vector t -> Int
72dim = Vector.length 67dim = Vector.length
73 68
74#else
75
76-- | One-dimensional array of objects stored in a contiguous memory block.
77data Vector t =
78 V { ioff :: {-# UNPACK #-} !Int -- ^ offset of first element
79 , idim :: {-# UNPACK #-} !Int -- ^ number of elements
80 , fptr :: {-# UNPACK #-} !(ForeignPtr t) -- ^ foreign pointer to the memory block
81 }
82
83unsafeToForeignPtr :: Storable a => Vector a -> (ForeignPtr a, Int, Int)
84unsafeToForeignPtr v = (fptr v, ioff v, idim v)
85
86-- | Same convention as in Roman Leshchinskiy's vector package.
87unsafeFromForeignPtr :: Storable a => ForeignPtr a -> Int -> Int -> Vector a
88unsafeFromForeignPtr fp i n | n > 0 = V {ioff = i, idim = n, fptr = fp}
89 | otherwise = error "unsafeFromForeignPtr with dim < 1"
90
91unsafeWith (V i _ fp) m = withForeignPtr fp $ \p -> m (p `advancePtr` i)
92{-# INLINE unsafeWith #-}
93
94-- | Number of elements
95dim :: (Storable t) => Vector t -> Int
96dim = idim
97
98#endif
99
100 69
101-- C-Haskell vector adapter 70-- C-Haskell vector adapter
102-- vec :: Adapt (CInt -> Ptr t -> r) (Vector t) r 71-- vec :: Adapt (CInt -> Ptr t -> r) (Vector t) r
@@ -204,36 +173,8 @@ subVector :: Storable t => Int -- ^ index of the starting element
204 -> Int -- ^ number of elements to extract 173 -> Int -- ^ number of elements to extract
205 -> Vector t -- ^ source 174 -> Vector t -- ^ source
206 -> Vector t -- ^ result 175 -> Vector t -- ^ result
207
208#ifdef VECTOR
209
210subVector = Vector.slice 176subVector = Vector.slice
211 177
212{-
213subVector k l v
214 | k<0 || k >= n || k+l > n || l < 0 = error "subVector out of range"
215 | otherwise = unsafeFromForeignPtr fp (i+k) l
216 where
217 (fp, i, n) = unsafeToForeignPtr v
218-}
219
220#else
221
222subVector k l v@V{idim = n, ioff = i}
223 | k<0 || k >= n || k+l > n || l < 0 = error "subVector out of range"
224 | otherwise = v {idim = l, ioff = i+k}
225
226{-
227subVectorCopy k l (v@V {idim=n})
228 | k<0 || k >= n || k+l > n || l < 0 = error "subVector out of range"
229 | otherwise = unsafePerformIO $ do
230 r <- createVector l
231 let f _ s _ d = copyArray d (advancePtr s k) l >> return 0
232 app2 f vec v vec r "subVector"
233 return r
234-}
235
236#endif
237 178
238{- | Reads a vector position: 179{- | Reads a vector position:
239 180