Copyright | (c) 2001 The University of Glasgow (c) 2008 Jed Brown |
---|---|
License | BSD-style |
Maintainer | jed@59A2.org |
Stability | experimental |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell98 |
This module provides both the immutable CArray
and mutable IOCArray
. The
underlying storage is exactly the same - pinned memory on the GC'd heap.
Elements are stored according to the class Storable
. You can obtain a
pointer to the array contents to manipulate elements from languages like C.
CArray
is 16-byte aligned by default. If you create a CArray
with
unsafeForeignPtrToCArray
then it may not be aligned. This will be an issue
if you intend to use SIMD instructions.
CArray
is similar to UArray
but slower if you stay
within Haskell. CArray
can handle more types and can be used by external
libraries.
IOCArray
is equivalent to StorableArray
and similar
to IOUArray
but slower. IOCArray
has O(1) versions of
unsafeFreeze
and unsafeThaw
when converting to/from CArray
.
- data CArray i e = CArray !i !i Int !(ForeignPtr e)
- data IOCArray i e = IOCArray !i !i Int !(ForeignPtr e)
- withCArray :: CArray i e -> (Ptr e -> IO a) -> IO a
- withIOCArray :: IOCArray i e -> (Ptr e -> IO a) -> IO a
- touchIOCArray :: IOCArray i e -> IO ()
- unsafeForeignPtrToCArray :: Ix i => ForeignPtr e -> (i, i) -> IO (CArray i e)
- unsafeForeignPtrToIOCArray :: Ix i => ForeignPtr e -> (i, i) -> IO (IOCArray i e)
- toForeignPtr :: CArray i e -> (Int, ForeignPtr e)
- unsafeCArrayToByteString :: Storable e => CArray i e -> ByteString
- unsafeByteStringToCArray :: (Ix i, Storable e) => (i, i) -> ByteString -> Maybe (CArray i e)
- copy :: (Ix i, Storable e) => CArray i e -> IO (CArray i e)
- freezeIOCArray :: (Ix i, Storable e) => IOCArray i e -> IO (CArray i e)
- unsafeFreezeIOCArray :: Ix i => IOCArray i e -> IO (CArray i e)
- thawIOCArray :: (Ix i, Storable e) => CArray i e -> IO (IOCArray i e)
- unsafeThawIOCArray :: Ix i => CArray i e -> IO (IOCArray i e)
- zeroElem :: Storable a => a -> a
- unsafeArrayCArray :: (Storable e, Ix i) => (i, i) -> [(Int, e)] -> e -> IO (CArray i e)
- unsafeReplaceCArray :: (Storable e, Ix i) => CArray i e -> [(Int, e)] -> IO (CArray i e)
- unsafeAccumCArray :: (Storable e, Ix i) => (e -> e' -> e) -> CArray i e -> [(Int, e')] -> IO (CArray i e)
- unsafeAccumArrayCArray :: (Storable e, Ix i) => (e -> e' -> e) -> e -> (i, i) -> [(Int, e')] -> IO (CArray i e)
- eqCArray :: (Storable e, Ix i, Eq e) => CArray i e -> CArray i e -> Bool
- cmpCArray :: (Storable e, Ix i, Ord e) => CArray i e -> CArray i e -> Ordering
- cmpIntCArray :: (Storable e, Ord e) => CArray Int e -> CArray Int e -> Ordering
- reshape :: (Ix i, Ix j) => (j, j) -> CArray i e -> CArray j e
- flatten :: Ix i => CArray i e -> CArray Int e
- ixmapWithIndP :: (Ix i, Ix i', IArray a e, IArray a' e') => (i', i') -> (i' -> i) -> (i -> e -> i' -> e') -> a i e -> a' i' e'
- ixmapWithInd :: (Ix i, Ix i', IArray a e, IArray a e') => (i', i') -> (i' -> i) -> (i -> e -> i' -> e') -> a i e -> a i' e'
- ixmapWithP :: (Ix i, Ix i', IArray a e, IArray a' e') => (i', i') -> (i' -> i) -> (e -> e') -> a i e -> a' i' e'
- ixmapWith :: (Ix i, Ix i', IArray a e, IArray a e') => (i', i') -> (i' -> i) -> (e -> e') -> a i e -> a i' e'
- ixmapP :: (Ix i, Ix i', IArray a e, IArray a' e) => (i', i') -> (i' -> i) -> a i e -> a' i' e
- sliceStrideWithP :: (Ix i, Shapable i, Ix i', IArray a e, IArray a' e') => (i', i') -> (i, i, i) -> (e -> e') -> a i e -> a' i' e'
- sliceStrideWith :: (Ix i, Shapable i, Ix i', IArray a e, IArray a e') => (i', i') -> (i, i, i) -> (e -> e') -> a i e -> a i' e'
- sliceStrideP :: (Ix i, Shapable i, Ix i', IArray a e, IArray a' e) => (i', i') -> (i, i, i) -> a i e -> a' i' e
- sliceStride :: (Ix i, Shapable i, Ix i', IArray a e) => (i', i') -> (i, i, i) -> a i e -> a i' e
- sliceWithP :: (Ix i, Shapable i, Ix i', IArray a e, IArray a' e') => (i', i') -> (i, i) -> (e -> e') -> a i e -> a' i' e'
- sliceWith :: (Ix i, Shapable i, Ix i', IArray a e, IArray a e') => (i', i') -> (i, i) -> (e -> e') -> a i e -> a i' e'
- sliceP :: (Ix i, Shapable i, Ix i', IArray a e, IArray a' e) => (i', i') -> (i, i) -> a i e -> a' i' e
- slice :: (Ix i, Shapable i, Ix i', IArray a e) => (i', i') -> (i, i) -> a i e -> a i' e
- mapCArrayInPlace :: (Ix i, Storable e) => (e -> e) -> CArray i e -> CArray i e
- indexes :: (Ix i, Shapable i, IArray a e) => a i e -> i -> [Int]
- offsetShapeFromThenTo :: [Int] -> [Int] -> [Int] -> [Int] -> [Int]
- offsetShapeFromTo :: [Int] -> [Int] -> [Int] -> [Int]
- offsetShapeFromTo' :: ([[Int]] -> [[Int]]) -> [Int] -> [Int] -> [Int] -> [Int]
- offsets :: (Ix a, Shapable a) => (a, a) -> a -> [Int]
- normp :: (Ix i, RealFloat e', Abs e e', IArray a e) => e' -> a i e -> e'
- norm2 :: (Ix i, Floating e', Abs e e', IArray a e) => a i e -> e'
- normSup :: (Ix i, Num e', Ord e', Abs e e', IArray a e) => a i e -> e'
- liftArrayP :: (Ix i, IArray a e, IArray a1 e1) => (e -> e1) -> a i e -> a1 i e1
- liftArray :: (Ix i, IArray a e, IArray a e1) => (e -> e1) -> a i e -> a i e1
- liftArray2P :: (Ix i, IArray a e, IArray a1 e1, IArray a2 e2) => (e -> e1 -> e2) -> a i e -> a1 i e1 -> a2 i e2
- liftArray2 :: (Ix i, IArray a e, IArray a e1, IArray a e2) => (e -> e1 -> e2) -> a i e -> a i e1 -> a i e2
- liftArray3P :: (Ix i, IArray a e, IArray a1 e1, IArray a2 e2, IArray a3 e3) => (e -> e1 -> e2 -> e3) -> a i e -> a1 i e1 -> a2 i e2 -> a3 i e3
- liftArray3 :: (Ix i, IArray a e, IArray a e1, IArray a e2, IArray a e3) => (e -> e1 -> e2 -> e3) -> a i e -> a i e1 -> a i e2 -> a i e3
- class Abs a b | a -> b where
- mallocForeignPtrArrayAligned :: Storable a => Int -> IO (ForeignPtr a)
- mallocForeignPtrBytesAligned :: Int -> IO (ForeignPtr a)
- createCArray :: (Ix i, Storable e) => (i, i) -> (Ptr e -> IO ()) -> IO (CArray i e)
- unsafeCreateCArray :: (Ix i, Storable e) => (i, i) -> (Ptr e -> IO ()) -> CArray i e
Documentation
The immutable array type.
CArray !i !i Int !(ForeignPtr e) |
Storable e => IArray CArray e Source # | |
(Ix ix, Eq e, Storable e) => Eq (CArray ix e) Source # | |
(Data e, Data i) => Data (CArray i e) Source # | |
(Ix ix, Ord e, Storable e) => Ord (CArray ix e) Source # | |
(Ix ix, Show ix, Show e, Storable e) => Show (CArray ix e) Source # | |
(Ix i, Arbitrary i, Storable e, Arbitrary e) => Arbitrary (CArray i e) Source # | |
(Ix i, CoArbitrary i, Storable e, CoArbitrary e) => CoArbitrary (CArray i e) Source # | |
(Ix i, Binary i, Binary e, Storable e) => Binary (CArray i e) Source # | |
Absolutely equivalent representation, but used for the mutable interface.
IOCArray !i !i Int !(ForeignPtr e) |
withCArray :: CArray i e -> (Ptr e -> IO a) -> IO a Source #
The pointer to the array contents is obtained by withCArray
.
The idea is similar to ForeignPtr
(used internally here).
The pointer should be used only during execution of the IO
action
retured by the function passed as argument to withCArray
.
touchIOCArray :: IOCArray i e -> IO () Source #
If you want to use it afterwards, ensure that you
touchCArray
after the last use of the pointer,
so the array is not freed too early.
unsafeForeignPtrToCArray :: Ix i => ForeignPtr e -> (i, i) -> IO (CArray i e) Source #
O(1) Construct a CArray
from an arbitrary ForeignPtr
. It is
the caller's responsibility to ensure that the ForeignPtr
points to
an area of memory sufficient for the specified bounds.
unsafeForeignPtrToIOCArray :: Ix i => ForeignPtr e -> (i, i) -> IO (IOCArray i e) Source #
O(1) Construct a CArray
from an arbitrary ForeignPtr
. It is
the caller's responsibility to ensure that the ForeignPtr
points to
an area of memory sufficient for the specified bounds.
toForeignPtr :: CArray i e -> (Int, ForeignPtr e) Source #
O(1) Extract ForeignPtr from a CArray.
unsafeCArrayToByteString :: Storable e => CArray i e -> ByteString Source #
O(1) Turn a CArray into a ByteString. Unsafe because it uses
castForeignPtr
and thus is not platform independent.
unsafeByteStringToCArray :: (Ix i, Storable e) => (i, i) -> ByteString -> Maybe (CArray i e) Source #
O(1) Turn a ByteString into a CArray. Unsafe because it uses
castForeignPtr
and thus is not platform independent. Returns Nothing
if
the range specified is larger than the size of the ByteString or the start of
the ByteString does not fulfil the alignment requirement of the resulting
CArray (as specified by the Storable instance).
unsafeAccumCArray :: (Storable e, Ix i) => (e -> e' -> e) -> CArray i e -> [(Int, e')] -> IO (CArray i e) Source #
unsafeAccumArrayCArray :: (Storable e, Ix i) => (e -> e' -> e) -> e -> (i, i) -> [(Int, e')] -> IO (CArray i e) Source #
reshape :: (Ix i, Ix j) => (j, j) -> CArray i e -> CArray j e Source #
O(1) reshape an array. The number of elements in the new shape must not exceed the number in the old shape. The elements are in C-style ordering.
flatten :: Ix i => CArray i e -> CArray Int e Source #
O(1) make a rank 1 array from an arbitrary shape. It has the property that 'reshape (0, size a - 1) a == flatten a'.
ixmapWithIndP :: (Ix i, Ix i', IArray a e, IArray a' e') => (i', i') -> (i' -> i) -> (i -> e -> i' -> e') -> a i e -> a' i' e' Source #
Generic slice and map. This takes the new range, the inverse map on indices, and function to produce the next element. It is the most general operation in its class.
ixmapWithInd :: (Ix i, Ix i', IArray a e, IArray a e') => (i', i') -> (i' -> i) -> (i -> e -> i' -> e') -> a i e -> a i' e' Source #
Less polymorphic version.
ixmapWithP :: (Ix i, Ix i', IArray a e, IArray a' e') => (i', i') -> (i' -> i) -> (e -> e') -> a i e -> a' i' e' Source #
Perform an operation on the elements, independent of their location.
ixmapWith :: (Ix i, Ix i', IArray a e, IArray a e') => (i', i') -> (i' -> i) -> (e -> e') -> a i e -> a i' e' Source #
Less polymorphic version.
ixmapP :: (Ix i, Ix i', IArray a e, IArray a' e) => (i', i') -> (i' -> i) -> a i e -> a' i' e Source #
More polymorphic version of ixmap
.
sliceStrideWithP :: (Ix i, Shapable i, Ix i', IArray a e, IArray a' e') => (i', i') -> (i, i, i) -> (e -> e') -> a i e -> a' i' e' Source #
More friendly sub-arrays with element mapping.
sliceStrideWith :: (Ix i, Shapable i, Ix i', IArray a e, IArray a e') => (i', i') -> (i, i, i) -> (e -> e') -> a i e -> a i' e' Source #
Less polymorphic version.
sliceStrideP :: (Ix i, Shapable i, Ix i', IArray a e, IArray a' e) => (i', i') -> (i, i, i) -> a i e -> a' i' e Source #
Strided sub-array without element mapping.
sliceStride :: (Ix i, Shapable i, Ix i', IArray a e) => (i', i') -> (i, i, i) -> a i e -> a i' e Source #
Less polymorphic version.
sliceWithP :: (Ix i, Shapable i, Ix i', IArray a e, IArray a' e') => (i', i') -> (i, i) -> (e -> e') -> a i e -> a' i' e' Source #
Contiguous sub-array with element mapping.
sliceWith :: (Ix i, Shapable i, Ix i', IArray a e, IArray a e') => (i', i') -> (i, i) -> (e -> e') -> a i e -> a i' e' Source #
Less polymorphic version.
sliceP :: (Ix i, Shapable i, Ix i', IArray a e, IArray a' e) => (i', i') -> (i, i) -> a i e -> a' i' e Source #
Contiguous sub-array without element mapping.
slice :: (Ix i, Shapable i, Ix i', IArray a e) => (i', i') -> (i, i) -> a i e -> a i' e Source #
Less polymorphic version.
mapCArrayInPlace :: (Ix i, Storable e) => (e -> e) -> CArray i e -> CArray i e Source #
In-place map on CArray. Note that this is IN PLACE so you should not retain any reference to the original. It flagrantly breaks referential transparency!
normp :: (Ix i, RealFloat e', Abs e e', IArray a e) => e' -> a i e -> e' Source #
p-norm on the array taken as a vector
norm2 :: (Ix i, Floating e', Abs e e', IArray a e) => a i e -> e' Source #
2-norm on the array taken as a vector (Frobenius norm for matrices)
normSup :: (Ix i, Num e', Ord e', Abs e e', IArray a e) => a i e -> e' Source #
Sup norm on the array taken as a vector
liftArrayP :: (Ix i, IArray a e, IArray a1 e1) => (e -> e1) -> a i e -> a1 i e1 Source #
Polymorphic version of amap.
liftArray :: (Ix i, IArray a e, IArray a e1) => (e -> e1) -> a i e -> a i e1 Source #
Equivalent to amap. Here for consistency only.
liftArray2P :: (Ix i, IArray a e, IArray a1 e1, IArray a2 e2) => (e -> e1 -> e2) -> a i e -> a1 i e1 -> a2 i e2 Source #
Polymorphic 2-array lift.
liftArray2 :: (Ix i, IArray a e, IArray a e1, IArray a e2) => (e -> e1 -> e2) -> a i e -> a i e1 -> a i e2 Source #
Less polymorphic version.
liftArray3P :: (Ix i, IArray a e, IArray a1 e1, IArray a2 e2, IArray a3 e3) => (e -> e1 -> e2 -> e3) -> a i e -> a1 i e1 -> a2 i e2 -> a3 i e3 Source #
Polymorphic 3-array lift.
liftArray3 :: (Ix i, IArray a e, IArray a e1, IArray a e2, IArray a e3) => (e -> e1 -> e2 -> e3) -> a i e -> a i e1 -> a i e2 -> a i e3 Source #
Less polymorphic version.
mallocForeignPtrArrayAligned :: Storable a => Int -> IO (ForeignPtr a) Source #
Allocate an array which is 16-byte aligned. Essential for SIMD instructions.
mallocForeignPtrBytesAligned :: Int -> IO (ForeignPtr a) Source #
Allocate memory which is 16-byte aligned. This is essential for SIMD instructions. We know that mallocPlainForeignPtrBytes will give word-aligned memory, so we pad enough to be able to return the desired amount of memory after aligning our pointer.