{-# LANGUAGE FlexibleInstances #-}
module ArrayFire.Index where
import ArrayFire.Internal.Index
import ArrayFire.Internal.Types
import ArrayFire.FFI
import ArrayFire.Exception
import Foreign
import System.IO.Unsafe
import Control.Exception
index
:: Array a
-> [Seq]
-> Array a
{-# NOINLINE index #-}
index :: forall a. Array a -> [Seq] -> Array a
index (Array ForeignPtr ()
fptr) [Seq]
seqs =
IO (Array a) -> Array a
forall a. IO a -> a
unsafePerformIO (IO (Array a) -> Array a)
-> ((AFArray -> IO (Array a)) -> IO (Array a))
-> (AFArray -> IO (Array a))
-> Array a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO (Array a) -> IO (Array a)
forall a. IO a -> IO a
mask_ (IO (Array a) -> IO (Array a))
-> ((AFArray -> IO (Array a)) -> IO (Array a))
-> (AFArray -> IO (Array a))
-> IO (Array a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ForeignPtr () -> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr ()
fptr ((AFArray -> IO (Array a)) -> Array a)
-> (AFArray -> IO (Array a)) -> Array a
forall a b. (a -> b) -> a -> b
$ \AFArray
ptr -> do
(Ptr AFArray -> IO (Array a)) -> IO (Array a)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr AFArray -> IO (Array a)) -> IO (Array a))
-> (Ptr AFArray -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \Ptr AFArray
aptr ->
[AFSeq] -> (Ptr AFSeq -> IO (Array a)) -> IO (Array a)
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray (Seq -> AFSeq
toAFSeq (Seq -> AFSeq) -> [Seq] -> [AFSeq]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Seq]
seqs) ((Ptr AFSeq -> IO (Array a)) -> IO (Array a))
-> (Ptr AFSeq -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \Ptr AFSeq
sptr -> do
AFErr -> IO ()
throwAFError (AFErr -> IO ()) -> IO AFErr -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr AFArray -> AFArray -> CUInt -> Ptr AFSeq -> IO AFErr
af_index Ptr AFArray
aptr AFArray
ptr CUInt
n Ptr AFSeq
sptr
ForeignPtr () -> Array a
forall a. ForeignPtr () -> Array a
Array (ForeignPtr () -> Array a) -> IO (ForeignPtr ()) -> IO (Array a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
FinalizerPtr () -> AFArray -> IO (ForeignPtr ())
forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FinalizerPtr ()
af_release_array_finalizer
(AFArray -> IO (ForeignPtr ())) -> IO AFArray -> IO (ForeignPtr ())
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr AFArray -> IO AFArray
forall a. Storable a => Ptr a -> IO a
peek Ptr AFArray
aptr
where
n :: CUInt
n = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Seq] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Seq]
seqs)
lookup
:: Array a
-> Array Int
-> Int
-> Array a
lookup :: forall a. Array a -> Array Int -> Int -> Array a
lookup Array a
a Array Int
b Int
n = Array a
-> Array Int
-> (Ptr AFArray -> AFArray -> AFArray -> IO AFErr)
-> Array a
forall b a c.
Array b
-> Array a
-> (Ptr AFArray -> AFArray -> AFArray -> IO AFErr)
-> Array c
op2 Array a
a Array Int
b ((Ptr AFArray -> AFArray -> AFArray -> IO AFErr) -> Array a)
-> (Ptr AFArray -> AFArray -> AFArray -> IO AFErr) -> Array a
forall a b. (a -> b) -> a -> b
$ \Ptr AFArray
p AFArray
x AFArray
y -> Ptr AFArray -> AFArray -> AFArray -> CUInt -> IO AFErr
af_lookup Ptr AFArray
p AFArray
x AFArray
y (Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
assignSeq
:: Array a
-> [Seq]
-> Array a
-> Array a
{-# NOINLINE assignSeq #-}
assignSeq :: forall a. Array a -> [Seq] -> Array a -> Array a
assignSeq (Array ForeignPtr ()
fptr) [Seq]
seqs (Array ForeignPtr ()
rhsFptr) =
IO (Array a) -> Array a
forall a. IO a -> a
unsafePerformIO (IO (Array a) -> Array a)
-> (IO (Array a) -> IO (Array a)) -> IO (Array a) -> Array a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO (Array a) -> IO (Array a)
forall a. IO a -> IO a
mask_ (IO (Array a) -> Array a) -> IO (Array a) -> Array a
forall a b. (a -> b) -> a -> b
$
ForeignPtr () -> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr ()
fptr ((AFArray -> IO (Array a)) -> IO (Array a))
-> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \AFArray
ptr ->
ForeignPtr () -> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr ()
rhsFptr ((AFArray -> IO (Array a)) -> IO (Array a))
-> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \AFArray
rhsPtr ->
[AFSeq] -> (Ptr AFSeq -> IO (Array a)) -> IO (Array a)
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray (Seq -> AFSeq
toAFSeq (Seq -> AFSeq) -> [Seq] -> [AFSeq]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Seq]
seqs) ((Ptr AFSeq -> IO (Array a)) -> IO (Array a))
-> (Ptr AFSeq -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \Ptr AFSeq
sptr ->
(Ptr AFArray -> IO (Array a)) -> IO (Array a)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr AFArray -> IO (Array a)) -> IO (Array a))
-> (Ptr AFArray -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \Ptr AFArray
aptr -> do
AFErr -> IO ()
throwAFError (AFErr -> IO ()) -> IO AFErr -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr AFArray -> AFArray -> CUInt -> Ptr AFSeq -> AFArray -> IO AFErr
af_assign_seq Ptr AFArray
aptr AFArray
ptr CUInt
n Ptr AFSeq
sptr AFArray
rhsPtr
ForeignPtr () -> Array a
forall a. ForeignPtr () -> Array a
Array (ForeignPtr () -> Array a) -> IO (ForeignPtr ()) -> IO (Array a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (FinalizerPtr () -> AFArray -> IO (ForeignPtr ())
forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FinalizerPtr ()
af_release_array_finalizer (AFArray -> IO (ForeignPtr ())) -> IO AFArray -> IO (ForeignPtr ())
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr AFArray -> IO AFArray
forall a. Storable a => Ptr a -> IO a
peek Ptr AFArray
aptr)
where
n :: CUInt
n = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Seq] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Seq]
seqs)
indexGen
:: Array a
-> [Index]
-> Array a
{-# NOINLINE indexGen #-}
indexGen :: forall a. Array a -> [Index] -> Array a
indexGen (Array ForeignPtr ()
fptr) [Index]
indices =
IO (Array a) -> Array a
forall a. IO a -> a
unsafePerformIO (IO (Array a) -> Array a)
-> (IO (Array a) -> IO (Array a)) -> IO (Array a) -> Array a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO (Array a) -> IO (Array a)
forall a. IO a -> IO a
mask_ (IO (Array a) -> Array a) -> IO (Array a) -> Array a
forall a b. (a -> b) -> a -> b
$
ForeignPtr () -> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr ()
fptr ((AFArray -> IO (Array a)) -> IO (Array a))
-> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \AFArray
ptr -> do
afIndices <- (Index -> IO AFIndex) -> [Index] -> IO [AFIndex]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse Index -> IO AFIndex
toAFIndex [Index]
indices
withArray afIndices $ \Ptr AFIndex
iptr ->
(Ptr AFArray -> IO (Array a)) -> IO (Array a)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr AFArray -> IO (Array a)) -> IO (Array a))
-> (Ptr AFArray -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \Ptr AFArray
aptr -> do
AFErr -> IO ()
throwAFError (AFErr -> IO ()) -> IO AFErr -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr AFArray -> AFArray -> DimT -> Ptr AFIndex -> IO AFErr
af_index_gen Ptr AFArray
aptr AFArray
ptr (Int -> DimT
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) Ptr AFIndex
iptr
(Index -> IO ()) -> [Index] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Index -> IO ()
touchIdxFPtr [Index]
indices
ForeignPtr () -> Array a
forall a. ForeignPtr () -> Array a
Array (ForeignPtr () -> Array a) -> IO (ForeignPtr ()) -> IO (Array a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (FinalizerPtr () -> AFArray -> IO (ForeignPtr ())
forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FinalizerPtr ()
af_release_array_finalizer (AFArray -> IO (ForeignPtr ())) -> IO AFArray -> IO (ForeignPtr ())
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr AFArray -> IO AFArray
forall a. Storable a => Ptr a -> IO a
peek Ptr AFArray
aptr)
where
n :: Int
n = [Index] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Index]
indices
touchIdxFPtr :: Index -> IO ()
touchIdxFPtr (ArrIndex Bool
_ (Array ForeignPtr ()
p)) = ForeignPtr () -> IO ()
forall a. ForeignPtr a -> IO ()
touchForeignPtr ForeignPtr ()
p
touchIdxFPtr Index
_ = () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
assignGen
:: Array a
-> [Index]
-> Array a
-> Array a
{-# NOINLINE assignGen #-}
assignGen :: forall a. Array a -> [Index] -> Array a -> Array a
assignGen (Array ForeignPtr ()
fptr) [Index]
indices (Array ForeignPtr ()
rhsFptr) =
IO (Array a) -> Array a
forall a. IO a -> a
unsafePerformIO (IO (Array a) -> Array a)
-> (IO (Array a) -> IO (Array a)) -> IO (Array a) -> Array a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO (Array a) -> IO (Array a)
forall a. IO a -> IO a
mask_ (IO (Array a) -> Array a) -> IO (Array a) -> Array a
forall a b. (a -> b) -> a -> b
$
ForeignPtr () -> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr ()
fptr ((AFArray -> IO (Array a)) -> IO (Array a))
-> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \AFArray
ptr ->
ForeignPtr () -> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr ()
rhsFptr ((AFArray -> IO (Array a)) -> IO (Array a))
-> (AFArray -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \AFArray
rhsPtr -> do
afIndices <- (Index -> IO AFIndex) -> [Index] -> IO [AFIndex]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse Index -> IO AFIndex
toAFIndex [Index]
indices
withArray afIndices $ \Ptr AFIndex
iptr ->
(Ptr AFArray -> IO (Array a)) -> IO (Array a)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr AFArray -> IO (Array a)) -> IO (Array a))
-> (Ptr AFArray -> IO (Array a)) -> IO (Array a)
forall a b. (a -> b) -> a -> b
$ \Ptr AFArray
aptr -> do
AFErr -> IO ()
throwAFError (AFErr -> IO ()) -> IO AFErr -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr AFArray
-> AFArray -> DimT -> Ptr AFIndex -> AFArray -> IO AFErr
af_assign_gen Ptr AFArray
aptr AFArray
ptr (Int -> DimT
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) Ptr AFIndex
iptr AFArray
rhsPtr
(Index -> IO ()) -> [Index] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Index -> IO ()
touchIdxFPtr [Index]
indices
ForeignPtr () -> Array a
forall a. ForeignPtr () -> Array a
Array (ForeignPtr () -> Array a) -> IO (ForeignPtr ()) -> IO (Array a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (FinalizerPtr () -> AFArray -> IO (ForeignPtr ())
forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FinalizerPtr ()
af_release_array_finalizer (AFArray -> IO (ForeignPtr ())) -> IO AFArray -> IO (ForeignPtr ())
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr AFArray -> IO AFArray
forall a. Storable a => Ptr a -> IO a
peek Ptr AFArray
aptr)
where
n :: Int
n = [Index] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Index]
indices
touchIdxFPtr :: Index -> IO ()
touchIdxFPtr (ArrIndex Bool
_ (Array ForeignPtr ()
p)) = ForeignPtr () -> IO ()
forall a. ForeignPtr a -> IO ()
touchForeignPtr ForeignPtr ()
p
touchIdxFPtr Index
_ = () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
afSpan :: Seq
afSpan :: Seq
afSpan = Double -> Double -> Double -> Seq
Seq Double
1 Double
1 Double
0
full :: Index
full :: Index
full = Bool -> Seq -> Index
SeqIndex Bool
False Seq
afSpan
class ToIndexList a where
toIndexList :: a -> [Index]
instance ToIndexList Index where
toIndexList :: Index -> [Index]
toIndexList Index
x = [Index
x]
instance ToIndexList (Index, Index) where
toIndexList :: (Index, Index) -> [Index]
toIndexList (Index
a, Index
b) = [Index
a, Index
b]
instance ToIndexList (Index, Index, Index) where
toIndexList :: (Index, Index, Index) -> [Index]
toIndexList (Index
a, Index
b, Index
c) = [Index
a, Index
b, Index
c]
instance ToIndexList (Index, Index, Index, Index) where
toIndexList :: (Index, Index, Index, Index) -> [Index]
toIndexList (Index
a, Index
b, Index
c, Index
d) = [Index
a, Index
b, Index
c, Index
d]
idx :: Seq -> Index
idx :: Seq -> Index
idx Seq
s = Bool -> Seq -> Index
SeqIndex Bool
False Seq
s
(!) :: ToIndexList ix => Array a -> ix -> Array a
Array a
a ! :: forall ix a. ToIndexList ix => Array a -> ix -> Array a
! ix
ix = Array a -> [Index] -> Array a
forall a. Array a -> [Index] -> Array a
indexGen Array a
a (ix -> [Index]
forall a. ToIndexList a => a -> [Index]
toIndexList ix
ix)
infixl 9 !
(.~) :: ToIndexList ix => ix -> Array a -> Array a -> Array a
(ix
ix .~ :: forall ix a. ToIndexList ix => ix -> Array a -> Array a -> Array a
.~ Array a
rhs) Array a
arr = Array a -> [Index] -> Array a -> Array a
forall a. Array a -> [Index] -> Array a -> Array a
assignGen Array a
arr (ix -> [Index]
forall a. ToIndexList a => a -> [Index]
toIndexList ix
ix) Array a
rhs
infixr 4 .~