module Data.Packed.Convert (
arrayFromVector, vectorFromArray,
mArrayFromVector, vectorFromMArray,
vectorToStorableArray, storableArrayToVector,
arrayFromMatrix, matrixFromArray,
mArrayFromMatrix, matrixFromMArray,
) where
import Data.Packed.Internal
import Data.Array.Storable
import Foreign
import Control.Monad.ST
import Data.Array.ST
import Data.Array.Unboxed
vectorToStorableArray :: Storable t => Vector t -> IO (StorableArray Int t)
vectorToStorableArray v = do
r <- cloneVector v
unsafeForeignPtrToStorableArray (fptr r) (0,dim r 1)
storableArrayToVector :: Storable t => StorableArray Int t -> IO (Vector t)
storableArrayToVector s = do
(a,b) <- getBounds s
let n = (ba+1)
r <- createVector n
withStorableArray s $ \p -> do
let f _ d = copyArray d p n >> return 0
app1 f vec r "storableArrayToVector"
return r
unsafeVectorToStorableArray :: Storable t => Vector t -> IO (StorableArray Int t)
unsafeVectorToStorableArray v = unsafeForeignPtrToStorableArray (fptr v) (0,dim v 1)
unsafeFreeze' :: (MArray a e m, Ix i) => a i e -> m (Array i e)
unsafeFreeze' = unsafeFreeze
arrayFromVector :: (Storable t) => Vector t -> Array Int t
arrayFromVector x = runSTArray (mArrayFromVector x)
mArrayFromVector :: (MArray b t (ST s), Storable t) => Vector t -> ST s (b Int t)
mArrayFromVector v = unsafeThaw =<< unsafeIOToST ( unsafeFreeze' =<< (vectorToStorableArray $ v))
vectorFromArray :: (Storable t) => Array Int t -> Vector t
vectorFromArray a = unsafePerformIO $ storableArrayToVector =<< unsafeThaw a
vectorFromMArray :: (Storable t, MArray a t (ST s)) => a Int t -> ST s (Vector t)
vectorFromMArray x = fmap vectorFromArray (unsafeFreeze' x)
matrixFromArray :: UArray (Int, Int) Double -> Matrix Double
matrixFromArray m = reshape c . fromList . elems $ m
where ((r1,c1),(r2,c2)) = bounds m
_r = r2r1+1
c = c2c1+1
arrayFromMatrix :: Matrix Double -> UArray (Int, Int) Double
arrayFromMatrix m = listArray ((0,0),(rows m 1, cols m 1)) (toList $ flatten m)
mArrayFromMatrix :: (MArray b Double m) => Matrix Double -> m (b (Int, Int) Double)
mArrayFromMatrix = unsafeThaw . arrayFromMatrix
matrixFromMArray :: (MArray a Double (ST s)) => a (Int,Int) Double -> ST s (Matrix Double)
matrixFromMArray x = fmap matrixFromArray (unsafeFreeze x)