summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlberto Ruiz <aruiz@um.es>2008-06-05 12:04:40 +0000
committerAlberto Ruiz <aruiz@um.es>2008-06-05 12:04:40 +0000
commitcfd75ac234ef7d769f8a6f86949a18ee5f37fa00 (patch)
treec4610223df8f22aab256da147b64665e170adfa2 /lib
parentd0fde9bdcb7cf490f7b067f0fa4d15b4f8fc3a61 (diff)
first version of Data.Packed.ST
Diffstat (limited to 'lib')
-rw-r--r--lib/Data/Packed/Convert.hs61
1 files changed, 52 insertions, 9 deletions
diff --git a/lib/Data/Packed/Convert.hs b/lib/Data/Packed/Convert.hs
index 55fdf8f..206fa06 100644
--- a/lib/Data/Packed/Convert.hs
+++ b/lib/Data/Packed/Convert.hs
@@ -1,3 +1,5 @@
1{-# OPTIONS -XTypeOperators -XRank2Types -XFlexibleContexts #-}
2
1----------------------------------------------------------------------------- 3-----------------------------------------------------------------------------
2-- | 4-- |
3-- Module : Data.Packed.Convert 5-- Module : Data.Packed.Convert
@@ -9,18 +11,26 @@
9-- Portability : portable 11-- Portability : portable
10-- 12--
11-- Conversion of Vectors and Matrices to and from the standard Haskell arrays. 13-- Conversion of Vectors and Matrices to and from the standard Haskell arrays.
14-- (provisional)
12-- 15--
13----------------------------------------------------------------------------- 16-----------------------------------------------------------------------------
14 17
15module Data.Packed.Convert ( 18module Data.Packed.Convert (
16 vectorToStorableArray, 19 arrayFromVector, vectorFromArray,
17 storableArrayToVector, 20 mArrayFromVector, vectorFromMArray,
18-- unsafeUpdateVector, 21 vectorToStorableArray, storableArrayToVector,
22 arrayFromMatrix, matrixFromArray,
23 mArrayFromMatrix, matrixFromMArray,
24-- matrixToStorableArray, storableArrayToMatrix
19) where 25) where
20 26
21import Data.Packed.Internal 27import Data.Packed.Internal
22import Data.Array.Storable 28import Data.Array.Storable
23import Foreign 29import Foreign
30import Control.Monad.ST
31import Data.Array.ST
32import Data.Array.IArray
33import Data.Array.Unboxed
24 34
25-- | Creates a StorableArray indexed from 0 to dim -1. 35-- | Creates a StorableArray indexed from 0 to dim -1.
26-- (Memory is efficiently copied, so you can then freely modify the obtained array) 36-- (Memory is efficiently copied, so you can then freely modify the obtained array)
@@ -49,11 +59,44 @@ unsafeVectorToStorableArray v = unsafeForeignPtrToStorableArray (fptr v) (0,dim
49--unsafeStorableArrayToVector s = undefined -- the foreign ptr of Storable Array is not available? 59--unsafeStorableArrayToVector s = undefined -- the foreign ptr of Storable Array is not available?
50 60
51----------------------------------------------------------------- 61-----------------------------------------------------------------
62-- provisional, we need Unboxed arrays for Complex Double
63
64
65unsafeFreeze' :: (MArray a e m, Ix i) => a i e -> m (Array i e)
66unsafeFreeze' = unsafeFreeze
67
68-- | creates an immutable Array from an hmatrix Vector (to do: unboxed)
69arrayFromVector :: (Storable t) => Vector t -> Array Int t
70arrayFromVector x = runSTArray (mArrayFromVector x)
71
72-- | creates a mutable array from an hmatrix Vector (to do: unboxed)
73mArrayFromVector :: (MArray b t (ST s), Storable t) => Vector t -> ST s (b Int t)
74mArrayFromVector v = unsafeThaw =<< unsafeIOToST ( unsafeFreeze' =<< (vectorToStorableArray $ v))
75
76
77-- (creates an hmatrix Vector from an immutable array (to do: unboxed))
78vectorFromArray :: (Storable t) => Array Int t -> Vector t
79vectorFromArray a = unsafePerformIO $ storableArrayToVector =<< unsafeThaw a
80
81-- | creates a mutable Array from an hmatrix Vector for manipulation with runSTUArray (to do: unboxed)
82vectorFromMArray :: (Storable t, MArray a t (ST s)) => a Int t -> ST s (Vector t)
83vectorFromMArray x = fmap vectorFromArray (unsafeFreeze' x)
84
85--------------------------------------------------------------------
86-- provisional
87
88matrixFromArray :: UArray (Int, Int) Double -> Matrix Double
89matrixFromArray m = reshape c . fromList . elems $ m
90 where ((r1,c1),(r2,c2)) = bounds m
91 r = r2-r1+1
92 c = c2-c1+1
93
94arrayFromMatrix :: Matrix Double -> UArray (Int, Int) Double
95arrayFromMatrix m = listArray ((0,0),(rows m -1, cols m -1)) (toList $ flatten m)
96
52 97
98mArrayFromMatrix :: (MArray b Double m) => Matrix Double -> m (b (Int, Int) Double)
99mArrayFromMatrix = unsafeThaw . arrayFromMatrix
53 100
54unsafeUpdateVector :: Storable t => Int -- ^ position 101matrixFromMArray :: (MArray a Double (ST s)) => a (Int,Int) Double -> ST s (Matrix Double)
55 -> (t->t) -- ^ modification function 102matrixFromMArray x = fmap matrixFromArray (unsafeFreeze x)
56 -> Vector t -- ^ source
57 -> IO () -- ^ result
58unsafeUpdateVector k h v = do
59 withForeignPtr (fptr v) $ \s -> pokeElemOff s k (h (v`at'`k))