{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Massiv.Array.Delayed.Pull
( D(..)
, Array(..)
, delay
, eq
, ord
, imap
) where
import qualified Data.Foldable as F
import Data.Massiv.Array.Ops.Fold.Internal as A
import Data.Massiv.Vector.Stream as S (steps)
import Data.Massiv.Core.Common
import Data.Massiv.Core.Operations
import Data.Massiv.Core.List (L, showArrayList, showsArrayPrec)
import GHC.Base (build)
import Prelude hiding (zipWith)
#include "massiv.h"
data D = D deriving Int -> D -> ShowS
[D] -> ShowS
D -> String
(Int -> D -> ShowS) -> (D -> String) -> ([D] -> ShowS) -> Show D
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [D] -> ShowS
$cshowList :: [D] -> ShowS
show :: D -> String
$cshow :: D -> String
showsPrec :: Int -> D -> ShowS
$cshowsPrec :: Int -> D -> ShowS
Show
data instance Array D ix e = DArray { Array D ix e -> Comp
dComp :: !Comp
, Array D ix e -> Sz ix
dSize :: !(Sz ix)
, Array D ix e -> ix -> e
dIndex :: ix -> e }
instance (Ragged L ix e, Show e) => Show (Array D ix e) where
showsPrec :: Int -> Array D ix e -> ShowS
showsPrec = (Array D ix e -> Array D ix e) -> Int -> Array D ix e -> ShowS
forall r r' ix ix' e.
(Ragged L ix' e, Load r ix e, Source r' ix' e, Show e) =>
(Array r ix e -> Array r' ix' e) -> Int -> Array r ix e -> ShowS
showsArrayPrec Array D ix e -> Array D ix e
forall a. a -> a
id
showList :: [Array D ix e] -> ShowS
showList = [Array D ix e] -> ShowS
forall arr. Show arr => [arr] -> ShowS
showArrayList
instance Index ix => Resize D ix where
unsafeResize :: Sz ix' -> Array D ix e -> Array D ix' e
unsafeResize !Sz ix'
sz !Array D ix e
arr =
Comp -> Sz ix' -> (ix' -> e) -> Array D ix' e
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Array D ix e -> Comp
forall ix e. Array D ix e -> Comp
dComp Array D ix e
arr) Sz ix'
sz ((ix' -> e) -> Array D ix' e) -> (ix' -> e) -> Array D ix' e
forall a b. (a -> b) -> a -> b
$ \ !ix'
ix ->
Array D ix e -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array D ix e
arr (Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex (Array D ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array D ix e
arr) (Sz ix' -> ix' -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex Sz ix'
sz ix'
ix))
{-# INLINE unsafeResize #-}
instance Index ix => Extract D ix e where
unsafeExtract :: ix -> Sz ix -> Array D ix e -> Array (R D) ix e
unsafeExtract !ix
sIx !Sz ix
newSz !Array D ix e
arr =
Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Array D ix e -> Comp
forall ix e. Array D ix e -> Comp
dComp Array D ix e
arr) Sz ix
newSz ((ix -> e) -> Array D ix e) -> (ix -> e) -> Array D ix e
forall a b. (a -> b) -> a -> b
$ \ !ix
ix ->
Array D ix e -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array D ix e
arr ((Int -> Int -> Int) -> ix -> ix -> ix
forall ix. Index ix => (Int -> Int -> Int) -> ix -> ix -> ix
liftIndex2 Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) ix
ix ix
sIx)
{-# INLINE unsafeExtract #-}
instance Index ix => Construct D ix e where
setComp :: Comp -> Array D ix e -> Array D ix e
setComp Comp
c Array D ix e
arr = Array D ix e
R:ArrayDixe ix e
arr { dComp :: Comp
dComp = Comp
c }
{-# INLINE setComp #-}
makeArray :: Comp -> Sz ix -> (ix -> e) -> Array D ix e
makeArray = Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray
{-# INLINE makeArray #-}
instance Index ix => Source D ix e where
unsafeIndex :: Array D ix e -> ix -> e
unsafeIndex = INDEX_CHECK("(Source D ix e).unsafeIndex", size, dIndex)
{-# INLINE unsafeIndex #-}
unsafeLinearSlice :: Int -> Sz1 -> Array D ix e -> Array D Int e
unsafeLinearSlice !Int
o !Sz1
sz Array D ix e
arr =
Comp -> Sz1 -> (Int -> e) -> Array D Int e
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Array D ix e -> Comp
forall ix e. Array D ix e -> Comp
dComp Array D ix e
arr) Sz1
sz ((Int -> e) -> Array D Int e) -> (Int -> e) -> Array D Int e
forall a b. (a -> b) -> a -> b
$ \ !Int
i -> Array D ix e -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array D ix e
arr (Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex (Array D ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array D ix e
arr) (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
o))
{-# INLINE unsafeLinearSlice #-}
instance ( Index ix
, Index (Lower ix)
, Elt D ix e ~ Array D (Lower ix) e
) =>
Slice D ix e where
unsafeSlice :: Array D ix e -> ix -> Sz ix -> Dim -> m (Elt D ix e)
unsafeSlice Array D ix e
arr ix
start cut :: Sz ix
cut@(SafeSz ix
cutSz) Dim
dim = do
Lower ix
newSz <- ix -> Dim -> m (Lower ix)
forall (m :: * -> *) ix.
(MonadThrow m, Index ix) =>
ix -> Dim -> m (Lower ix)
dropDimM ix
cutSz Dim
dim
Array D (Lower ix) e -> m (Array D (Lower ix) e)
forall (m :: * -> *) a. Monad m => a -> m a
return (Array D (Lower ix) e -> m (Array D (Lower ix) e))
-> Array D (Lower ix) e -> m (Array D (Lower ix) e)
forall a b. (a -> b) -> a -> b
$ Sz (Lower ix) -> Array D ix e -> Array D (Lower ix) e
forall r ix ix' e.
(Resize r ix, Index ix') =>
Sz ix' -> Array r ix e -> Array r ix' e
unsafeResize (Lower ix -> Sz (Lower ix)
forall ix. ix -> Sz ix
SafeSz Lower ix
newSz) (ix -> Sz ix -> Array D ix e -> Array (R D) ix e
forall r ix e.
Extract r ix e =>
ix -> Sz ix -> Array r ix e -> Array (R r) ix e
unsafeExtract ix
start Sz ix
cut Array D ix e
arr)
{-# INLINE unsafeSlice #-}
instance (Elt D ix e ~ Array D (Lower ix) e, Index ix) => OuterSlice D ix e where
unsafeOuterSlice :: Array D ix e -> Int -> Elt D ix e
unsafeOuterSlice !Array D ix e
arr !Int
i =
Comp -> Sz (Lower ix) -> (Lower ix -> e) -> Array D (Lower ix) e
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Array D ix e -> Comp
forall ix e. Array D ix e -> Comp
dComp Array D ix e
arr) ((Sz1, Sz (Lower ix)) -> Sz (Lower ix)
forall a b. (a, b) -> b
snd (Sz ix -> (Sz1, Sz (Lower ix))
forall ix. Index ix => Sz ix -> (Sz1, Sz (Lower ix))
unconsSz (Array D ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array D ix e
arr))) (\ !Lower ix
ix -> Array D ix e -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array D ix e
arr (Int -> Lower ix -> ix
forall ix. Index ix => Int -> Lower ix -> ix
consDim Int
i Lower ix
ix))
{-# INLINE unsafeOuterSlice #-}
instance (Elt D ix e ~ Array D (Lower ix) e, Index ix) => InnerSlice D ix e where
unsafeInnerSlice :: Array D ix e -> (Sz (Lower ix), Sz1) -> Int -> Elt D ix e
unsafeInnerSlice !Array D ix e
arr (Sz (Lower ix)
szL, Sz1
_) !Int
i =
Comp -> Sz (Lower ix) -> (Lower ix -> e) -> Array D (Lower ix) e
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Array D ix e -> Comp
forall ix e. Array D ix e -> Comp
dComp Array D ix e
arr) Sz (Lower ix)
szL (\ !Lower ix
ix -> Array D ix e -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array D ix e
arr (Lower ix -> Int -> ix
forall ix. Index ix => Lower ix -> Int -> ix
snocDim Lower ix
ix Int
i))
{-# INLINE unsafeInnerSlice #-}
instance (Eq e, Index ix) => Eq (Array D ix e) where
== :: Array D ix e -> Array D ix e -> Bool
(==) = (e -> e -> Bool) -> Array D ix e -> Array D ix e -> Bool
forall r1 ix e1 r2 e2.
(Source r1 ix e1, Source r2 ix e2) =>
(e1 -> e2 -> Bool) -> Array r1 ix e1 -> Array r2 ix e2 -> Bool
eq e -> e -> Bool
forall a. Eq a => a -> a -> Bool
(==)
{-# INLINE (==) #-}
instance (Ord e, Index ix) => Ord (Array D ix e) where
compare :: Array D ix e -> Array D ix e -> Ordering
compare = (e -> e -> Ordering) -> Array D ix e -> Array D ix e -> Ordering
forall r1 ix e1 r2 e2.
(Source r1 ix e1, Source r2 ix e2) =>
(e1 -> e2 -> Ordering)
-> Array r1 ix e1 -> Array r2 ix e2 -> Ordering
ord e -> e -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
{-# INLINE compare #-}
instance Functor (Array D ix) where
fmap :: (a -> b) -> Array D ix a -> Array D ix b
fmap a -> b
f (DArray c sz g) = Comp -> Sz ix -> (ix -> b) -> Array D ix b
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray Comp
c Sz ix
sz (a -> b
f (a -> b) -> (ix -> a) -> ix -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ix -> a
g)
{-# INLINE fmap #-}
<$ :: a -> Array D ix b -> Array D ix a
(<$) a
e (DArray c sz _) = Comp -> Sz ix -> (ix -> a) -> Array D ix a
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray Comp
c Sz ix
sz (a -> ix -> a
forall a b. a -> b -> a
const a
e)
{-# INLINE (<$) #-}
instance Index ix => Applicative (Array D ix) where
pure :: a -> Array D ix a
pure = a -> Array D ix a
forall r ix e. Construct r ix e => e -> Array r ix e
singleton
{-# INLINE pure #-}
<*> :: Array D ix (a -> b) -> Array D ix a -> Array D ix b
(<*>) (DArray c1 (SafeSz sz1) uIndex1) (DArray c2 (SafeSz sz2) uIndex2) =
Comp -> Sz ix -> (ix -> b) -> Array D ix b
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Comp
c1 Comp -> Comp -> Comp
forall a. Semigroup a => a -> a -> a
<> Comp
c2) (ix -> Sz ix
forall ix. ix -> Sz ix
SafeSz ((Int -> Int -> Int) -> ix -> ix -> ix
forall ix. Index ix => (Int -> Int -> Int) -> ix -> ix -> ix
liftIndex2 Int -> Int -> Int
forall a. Ord a => a -> a -> a
min ix
sz1 ix
sz2)) ((ix -> b) -> Array D ix b) -> (ix -> b) -> Array D ix b
forall a b. (a -> b) -> a -> b
$ \ !ix
ix ->
ix -> a -> b
uIndex1 ix
ix (ix -> a
uIndex2 ix
ix)
{-# INLINE (<*>) #-}
instance Index ix => Foldable (Array D ix) where
fold :: Array D ix m -> m
fold = Array D ix m -> m
forall e r ix. (Monoid e, Source r ix e) => Array r ix e -> e
A.fold
{-# INLINE fold #-}
foldMap :: (a -> m) -> Array D ix a -> m
foldMap = (a -> m) -> Array D ix a -> m
forall r ix e m.
(Source r ix e, Monoid m) =>
(e -> m) -> Array r ix e -> m
A.foldMono
{-# INLINE foldMap #-}
foldl :: (b -> a -> b) -> b -> Array D ix a -> b
foldl = (b -> a -> b) -> b -> Array D ix a -> b
forall r ix e a.
Source r ix e =>
(a -> e -> a) -> a -> Array r ix e -> a
lazyFoldlS
{-# INLINE foldl #-}
foldl' :: (b -> a -> b) -> b -> Array D ix a -> b
foldl' = (b -> a -> b) -> b -> Array D ix a -> b
forall r ix e a.
Source r ix e =>
(a -> e -> a) -> a -> Array r ix e -> a
foldlS
{-# INLINE foldl' #-}
foldr :: (a -> b -> b) -> b -> Array D ix a -> b
foldr = (a -> b -> b) -> b -> Array D ix a -> b
forall r ix e b.
Source r ix e =>
(e -> b -> b) -> b -> Array r ix e -> b
foldrFB
{-# INLINE foldr #-}
foldr' :: (a -> b -> b) -> b -> Array D ix a -> b
foldr' = (a -> b -> b) -> b -> Array D ix a -> b
forall r ix e b.
Source r ix e =>
(e -> b -> b) -> b -> Array r ix e -> b
foldrS
{-# INLINE foldr' #-}
null :: Array D ix a -> Bool
null (DArray _ sz _) = Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
{-# INLINE null #-}
length :: Array D ix a -> Int
length = Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem (Sz ix -> Int) -> (Array D ix a -> Sz ix) -> Array D ix a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array D ix a -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size
{-# INLINE length #-}
elem :: a -> Array D ix a -> Bool
elem a
e = (a -> Bool) -> Array D ix a -> Bool
forall r ix e. Source r ix e => (e -> Bool) -> Array r ix e -> Bool
A.any (a
e a -> a -> Bool
forall a. Eq a => a -> a -> Bool
==)
{-# INLINE elem #-}
toList :: Array D ix a -> [a]
toList Array D ix a
arr = (forall b. (a -> b -> b) -> b -> b) -> [a]
forall a. (forall b. (a -> b -> b) -> b -> b) -> [a]
build (\ a -> b -> b
c b
n -> (a -> b -> b) -> b -> Array D ix a -> b
forall r ix e b.
Source r ix e =>
(e -> b -> b) -> b -> Array r ix e -> b
foldrFB a -> b -> b
c b
n Array D ix a
arr)
{-# INLINE toList #-}
instance Index ix => Load D ix e where
size :: Array D ix e -> Sz ix
size = Array D ix e -> Sz ix
forall ix e. Array D ix e -> Sz ix
dSize
{-# INLINE size #-}
getComp :: Array D ix e -> Comp
getComp = Array D ix e -> Comp
forall ix e. Array D ix e -> Comp
dComp
{-# INLINE getComp #-}
loadArrayM :: Scheduler m () -> Array D ix e -> (Int -> e -> m ()) -> m ()
loadArrayM !Scheduler m ()
scheduler !Array D ix e
arr = Scheduler m () -> Int -> (Int -> e) -> (Int -> e -> m ()) -> m ()
forall (m :: * -> *) b.
Monad m =>
Scheduler m () -> Int -> (Int -> b) -> (Int -> b -> m ()) -> m ()
splitLinearlyWith_ Scheduler m ()
scheduler (Array D ix e -> Int
forall r ix e. Load r ix e => Array r ix e -> Int
elemsCount Array D ix e
arr) (Array D ix e -> Int -> e
forall r ix e. Source r ix e => Array r ix e -> Int -> e
unsafeLinearIndex Array D ix e
arr)
{-# INLINE loadArrayM #-}
instance Index ix => StrideLoad D ix e
instance Index ix => Stream D ix e where
toStream :: Array D ix e -> Steps Id e
toStream = Array D ix e -> Steps Id e
forall r ix e (m :: * -> *).
(Monad m, Source r ix e) =>
Array r ix e -> Steps m e
S.steps
{-# INLINE toStream #-}
toStreamIx :: Array D ix e -> Steps Id (ix, e)
toStreamIx = Array D ix (ix, e) -> Steps Id (ix, e)
forall r ix e (m :: * -> *).
(Monad m, Source r ix e) =>
Array r ix e -> Steps m e
S.steps (Array D ix (ix, e) -> Steps Id (ix, e))
-> (Array D ix e -> Array D ix (ix, e))
-> Array D ix e
-> Steps Id (ix, e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ix -> e -> (ix, e)) -> Array D ix e -> Array D ix (ix, e)
forall r ix e' e.
Source r ix e' =>
(ix -> e' -> e) -> Array r ix e' -> Array D ix e
imap (,)
{-# INLINE toStreamIx #-}
imap :: Source r ix e' => (ix -> e' -> e) -> Array r ix e' -> Array D ix e
imap :: (ix -> e' -> e) -> Array r ix e' -> Array D ix e
imap ix -> e' -> e
f !Array r ix e'
arr = Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Array r ix e' -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e'
arr) (Array r ix e' -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e'
arr) (\ !ix
ix -> ix -> e' -> e
f ix
ix (Array r ix e' -> ix -> e'
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r ix e'
arr ix
ix))
{-# INLINE imap #-}
instance (Index ix, Num e) => Num (Array D ix e) where
+ :: Array D ix e -> Array D ix e -> Array D ix e
(+) = (e -> e -> e) -> Array D ix e -> Array D ix e -> Array D ix e
forall r e ix a b.
(Numeric r e, Index ix) =>
(a -> b -> e) -> Array r ix a -> Array r ix b -> Array r ix e
unsafeLiftArray2 e -> e -> e
forall a. Num a => a -> a -> a
(+)
{-# INLINE (+) #-}
(-) = (e -> e -> e) -> Array D ix e -> Array D ix e -> Array D ix e
forall r e ix a b.
(Numeric r e, Index ix) =>
(a -> b -> e) -> Array r ix a -> Array r ix b -> Array r ix e
unsafeLiftArray2 (-)
{-# INLINE (-) #-}
* :: Array D ix e -> Array D ix e -> Array D ix e
(*) = (e -> e -> e) -> Array D ix e -> Array D ix e -> Array D ix e
forall r e ix a b.
(Numeric r e, Index ix) =>
(a -> b -> e) -> Array r ix a -> Array r ix b -> Array r ix e
unsafeLiftArray2 e -> e -> e
forall a. Num a => a -> a -> a
(*)
{-# INLINE (*) #-}
abs :: Array D ix e -> Array D ix e
abs = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Num a => a -> a
abs
{-# INLINE abs #-}
signum :: Array D ix e -> Array D ix e
signum = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Num a => a -> a
signum
{-# INLINE signum #-}
fromInteger :: Integer -> Array D ix e
fromInteger = e -> Array D ix e
forall r ix e. Construct r ix e => e -> Array r ix e
singleton (e -> Array D ix e) -> (Integer -> e) -> Integer -> Array D ix e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> e
forall a. Num a => Integer -> a
fromInteger
{-# INLINE fromInteger #-}
instance (Index ix, Fractional e) => Fractional (Array D ix e) where
/ :: Array D ix e -> Array D ix e -> Array D ix e
(/) = (e -> e -> e) -> Array D ix e -> Array D ix e -> Array D ix e
forall r e ix a b.
(Numeric r e, Index ix) =>
(a -> b -> e) -> Array r ix a -> Array r ix b -> Array r ix e
unsafeLiftArray2 e -> e -> e
forall a. Fractional a => a -> a -> a
(/)
{-# INLINE (/) #-}
fromRational :: Rational -> Array D ix e
fromRational = e -> Array D ix e
forall r ix e. Construct r ix e => e -> Array r ix e
singleton (e -> Array D ix e) -> (Rational -> e) -> Rational -> Array D ix e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> e
forall a. Fractional a => Rational -> a
fromRational
{-# INLINE fromRational #-}
instance (Index ix, Floating e) => Floating (Array D ix e) where
pi :: Array D ix e
pi = e -> Array D ix e
forall r ix e. Construct r ix e => e -> Array r ix e
singleton e
forall a. Floating a => a
pi
{-# INLINE pi #-}
exp :: Array D ix e -> Array D ix e
exp = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
exp
{-# INLINE exp #-}
log :: Array D ix e -> Array D ix e
log = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
log
{-# INLINE log #-}
sin :: Array D ix e -> Array D ix e
sin = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
sin
{-# INLINE sin #-}
cos :: Array D ix e -> Array D ix e
cos = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
cos
{-# INLINE cos #-}
asin :: Array D ix e -> Array D ix e
asin = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
asin
{-# INLINE asin #-}
atan :: Array D ix e -> Array D ix e
atan = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
atan
{-# INLINE atan #-}
acos :: Array D ix e -> Array D ix e
acos = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
acos
{-# INLINE acos #-}
sinh :: Array D ix e -> Array D ix e
sinh = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
sinh
{-# INLINE sinh #-}
cosh :: Array D ix e -> Array D ix e
cosh = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
cosh
{-# INLINE cosh #-}
asinh :: Array D ix e -> Array D ix e
asinh = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
asinh
{-# INLINE asinh #-}
atanh :: Array D ix e -> Array D ix e
atanh = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
atanh
{-# INLINE atanh #-}
acosh :: Array D ix e -> Array D ix e
acosh = (e -> e) -> Array D ix e -> Array D ix e
forall r e ix a.
(Numeric r e, Index ix) =>
(a -> e) -> Array r ix a -> Array r ix e
unsafeLiftArray e -> e
forall a. Floating a => a -> a
acosh
{-# INLINE acosh #-}
instance Num e => Numeric D e where
unsafeLiftArray :: (a -> e) -> Array D ix a -> Array D ix e
unsafeLiftArray a -> e
f Array D ix a
arr = Array D ix a
R:ArrayDixe ix a
arr {dIndex :: ix -> e
dIndex = a -> e
f (a -> e) -> (ix -> a) -> ix -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array D ix a -> ix -> a
forall ix e. Array D ix e -> ix -> e
dIndex Array D ix a
arr}
{-# INLINE unsafeLiftArray #-}
unsafeLiftArray2 :: (a -> b -> e) -> Array D ix a -> Array D ix b -> Array D ix e
unsafeLiftArray2 a -> b -> e
f Array D ix a
a1 Array D ix b
a2 =
Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Array D ix a -> Comp
forall ix e. Array D ix e -> Comp
dComp Array D ix a
a1 Comp -> Comp -> Comp
forall a. Semigroup a => a -> a -> a
<> Array D ix b -> Comp
forall ix e. Array D ix e -> Comp
dComp Array D ix b
a2) (ix -> Sz ix
forall ix. ix -> Sz ix
SafeSz ((Int -> Int -> Int) -> ix -> ix -> ix
forall ix. Index ix => (Int -> Int -> Int) -> ix -> ix -> ix
liftIndex2 Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Sz ix -> ix
forall ix. Sz ix -> ix
unSz (Array D ix a -> Sz ix
forall ix e. Array D ix e -> Sz ix
dSize Array D ix a
a1)) (Sz ix -> ix
forall ix. Sz ix -> ix
unSz (Array D ix b -> Sz ix
forall ix e. Array D ix e -> Sz ix
dSize Array D ix b
a2)))) ((ix -> e) -> Array D ix e) -> (ix -> e) -> Array D ix e
forall a b. (a -> b) -> a -> b
$ \ix
i ->
a -> b -> e
f (Array D ix a -> ix -> a
forall ix e. Array D ix e -> ix -> e
dIndex Array D ix a
a1 ix
i) (Array D ix b -> ix -> b
forall ix e. Array D ix e -> ix -> e
dIndex Array D ix b
a2 ix
i)
{-# INLINE unsafeLiftArray2 #-}
instance Floating e => NumericFloat D e where
delay :: Source r ix e => Array r ix e -> Array D ix e
delay :: Array r ix e -> Array D ix e
delay Array r ix e
arr = Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) (Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e
arr) (Array r ix e -> ix -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r ix e
arr)
{-# INLINE [1] delay #-}
{-# RULES
"delay" [~1] forall (arr :: Array D ix e) . delay arr = arr
#-}
eq :: (Source r1 ix e1, Source r2 ix e2) =>
(e1 -> e2 -> Bool) -> Array r1 ix e1 -> Array r2 ix e2 -> Bool
eq :: (e1 -> e2 -> Bool) -> Array r1 ix e1 -> Array r2 ix e2 -> Bool
eq e1 -> e2 -> Bool
f Array r1 ix e1
arr1 Array r2 ix e2
arr2 =
(Array r1 ix e1 -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r1 ix e1
arr1 Sz ix -> Sz ix -> Bool
forall a. Eq a => a -> a -> Bool
== Array r2 ix e2 -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r2 ix e2
arr2) Bool -> Bool -> Bool
&&
Array D ix Bool -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
F.and
(Comp -> Sz ix -> (ix -> Bool) -> Array D ix Bool
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Array r1 ix e1 -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r1 ix e1
arr1 Comp -> Comp -> Comp
forall a. Semigroup a => a -> a -> a
<> Array r2 ix e2 -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r2 ix e2
arr2) (Array r1 ix e1 -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r1 ix e1
arr1) ((ix -> Bool) -> Array D ix Bool)
-> (ix -> Bool) -> Array D ix Bool
forall a b. (a -> b) -> a -> b
$ \ix
ix ->
e1 -> e2 -> Bool
f (Array r1 ix e1 -> ix -> e1
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r1 ix e1
arr1 ix
ix) (Array r2 ix e2 -> ix -> e2
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r2 ix e2
arr2 ix
ix))
{-# INLINE eq #-}
ord :: (Source r1 ix e1, Source r2 ix e2) =>
(e1 -> e2 -> Ordering) -> Array r1 ix e1 -> Array r2 ix e2 -> Ordering
ord :: (e1 -> e2 -> Ordering)
-> Array r1 ix e1 -> Array r2 ix e2 -> Ordering
ord e1 -> e2 -> Ordering
f Array r1 ix e1
arr1 Array r2 ix e2
arr2 =
Sz ix -> Sz ix -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Array r1 ix e1 -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r1 ix e1
arr1) (Array r2 ix e2 -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r2 ix e2
arr2) Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
<>
Array D ix Ordering -> Ordering
forall e r ix. (Monoid e, Source r ix e) => Array r ix e -> e
A.fold
(Comp -> Sz ix -> (ix -> Ordering) -> Array D ix Ordering
forall ix e. Comp -> Sz ix -> (ix -> e) -> Array D ix e
DArray (Array r1 ix e1 -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r1 ix e1
arr1 Comp -> Comp -> Comp
forall a. Semigroup a => a -> a -> a
<> Array r2 ix e2 -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r2 ix e2
arr2) (Array r1 ix e1 -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r1 ix e1
arr1) ((ix -> Ordering) -> Array D ix Ordering)
-> (ix -> Ordering) -> Array D ix Ordering
forall a b. (a -> b) -> a -> b
$ \ix
ix ->
e1 -> e2 -> Ordering
f (Array r1 ix e1 -> ix -> e1
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r1 ix e1
arr1 ix
ix) (Array r2 ix e2 -> ix -> e2
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r2 ix e2
arr2 ix
ix))
{-# INLINE ord #-}