module Data.Massiv.Array.Numeric
(
(.+)
, (.-)
, (.*)
, (.^)
, (|*|)
, negateA
, absA
, signumA
, fromIntegerA
, quotA
, remA
, divA
, modA
, quotRemA
, divModA
, (./)
, (.^^)
, recipA
, fromRationalA
, piA
, expA
, logA
, sqrtA
, (.**)
, logBaseA
, sinA
, cosA
, tanA
, asinA
, acosA
, atanA
, sinhA
, coshA
, tanhA
, asinhA
, acoshA
, atanhA
, truncateA
, roundA
, ceilingA
, floorA
, atan2A
) where
import Data.Massiv.Array.Delayed.Internal
import Data.Massiv.Array.Manifest.Internal (compute)
import Data.Massiv.Array.Ops.Fold as A
import Data.Massiv.Array.Ops.Map as A
import Data.Massiv.Array.Ops.Slice as A
import Data.Massiv.Array.Ops.Transform as A
import Data.Massiv.Core
import Data.Massiv.Core.Common
import Data.Monoid ((<>))
import Prelude as P
infixr 8 .^, .^^
infixl 7 .*, ./, `quotA`, `remA`, `divA`, `modA`
infixl 6 .+, .-
(.+)
:: (Source r1 ix e, Source r2 ix e, Num e)
=> Array r1 ix e -> Array r2 ix e -> Array D ix e
(.+) = liftArray2 (+)
(.-)
:: (Source r1 ix e, Source r2 ix e, Num e)
=> Array r1 ix e -> Array r2 ix e -> Array D ix e
(.-) = liftArray2 ()
(.*)
:: (Source r1 ix e, Source r2 ix e, Num e)
=> Array r1 ix e -> Array r2 ix e -> Array D ix e
(.*) = liftArray2 (*)
(.^)
:: (Source r ix e, Num e, Integral b)
=> Array r ix e -> b -> Array D ix e
(.^) arr n = liftArray (^ n) arr
(|*|) ::
( Mutable r1 Ix2 e
, Mutable r2 Ix2 e
, OuterSlice r1 Ix2 e
, OuterSlice r2 Ix2 e
, Source (EltRepr r1 Ix2) Ix1 e
, Source (EltRepr r2 Ix2) Ix1 e
, Num e
)
=> Array r1 Ix2 e
-> Array r2 Ix2 e
-> Array D Ix2 e
(|*|) = multArrs
multArrs :: forall r1 r2 e.
( Mutable r1 Ix2 e
, Mutable r2 Ix2 e
, OuterSlice r1 Ix2 e
, OuterSlice r2 Ix2 e
, Source (EltRepr r1 Ix2) Ix1 e
, Source (EltRepr r2 Ix2) Ix1 e
, Num e
)
=> Array r1 Ix2 e -> Array r2 Ix2 e -> Array D Ix2 e
multArrs arr1 arr2
| n1 /= m2 =
error $
"(|*|): Inner array dimensions must agree, but received: " ++
show (size arr1) ++ " and " ++ show (size arr2)
| otherwise =
DArray (getComp arr1 <> getComp arr2) (m1 :. n2) $ \(i :. j) ->
A.sum ((arr1' !> i) .* (arr2' !> j))
where
(m1 :. n1) = size arr1
(m2 :. n2) = size arr2
arr1' = setComp Seq arr1
arr2' :: Array r2 Ix2 e
arr2' = setComp Seq $ compute $ transpose arr2
negateA
:: (Source r ix e, Num e)
=> Array r ix e -> Array D ix e
negateA = liftArray negate
absA
:: (Source r ix e, Num e)
=> Array r ix e -> Array D ix e
absA = liftArray abs
signumA
:: (Source r ix e, Num e)
=> Array r ix e -> Array D ix e
signumA = liftArray signum
fromIntegerA
:: (Index ix, Num e)
=> Integer -> Array D ix e
fromIntegerA = singleton Seq . fromInteger
(./)
:: (Source r1 ix e, Source r2 ix e, Fractional e)
=> Array r1 ix e -> Array r2 ix e -> Array D ix e
(./) = liftArray2 (/)
(.^^)
:: (Source r ix e, Fractional e, Integral b)
=> Array r ix e -> b -> Array D ix e
(.^^) arr n = liftArray (^^ n) arr
recipA
:: (Source r ix e, Fractional e)
=> Array r ix e -> Array D ix e
recipA = liftArray recip
fromRationalA
:: (Index ix, Fractional e)
=> Rational -> Array D ix e
fromRationalA = singleton Seq . fromRational
piA
:: (Index ix, Floating e)
=> Array D ix e
piA = singleton Seq pi
expA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
expA = liftArray exp
sqrtA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
sqrtA = liftArray exp
logA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
logA = liftArray log
logBaseA
:: (Source r1 ix e, Source r2 ix e, Floating e)
=> Array r1 ix e -> Array r2 ix e -> Array D ix e
logBaseA = liftArray2 logBase
(.**)
:: (Source r1 ix e, Source r2 ix e, Floating e)
=> Array r1 ix e -> Array r2 ix e -> Array D ix e
(.**) = liftArray2 (**)
sinA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
sinA = liftArray sin
cosA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
cosA = liftArray cos
tanA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
tanA = liftArray cos
asinA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
asinA = liftArray asin
atanA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
atanA = liftArray atan
acosA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
acosA = liftArray acos
sinhA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
sinhA = liftArray sinh
tanhA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
tanhA = liftArray cos
coshA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
coshA = liftArray cosh
asinhA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
asinhA = liftArray asinh
acoshA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
acoshA = liftArray acosh
atanhA
:: (Source r ix e, Floating e)
=> Array r ix e -> Array D ix e
atanhA = liftArray atanh
quotA
:: (Source r1 ix e, Source r2 ix e, Integral e)
=> Array r1 ix e -> Array r2 ix e -> Array D ix e
quotA = liftArray2 (quot)
remA
:: (Source r1 ix e, Source r2 ix e, Integral e)
=> Array r1 ix e -> Array r2 ix e -> Array D ix e
remA = liftArray2 (rem)
divA
:: (Source r1 ix e, Source r2 ix e, Integral e)
=> Array r1 ix e -> Array r2 ix e -> Array D ix e
divA = liftArray2 (div)
modA
:: (Source r1 ix e, Source r2 ix e, Integral e)
=> Array r1 ix e -> Array r2 ix e -> Array D ix e
modA = liftArray2 (mod)
quotRemA
:: (Source r1 ix e, Source r2 ix e, Integral e)
=> Array r1 ix e -> Array r2 ix e -> (Array D ix e, Array D ix e)
quotRemA arr1 = A.unzip . liftArray2 (quotRem) arr1
divModA
:: (Source r1 ix e, Source r2 ix e, Integral e)
=> Array r1 ix e -> Array r2 ix e -> (Array D ix e, Array D ix e)
divModA arr1 = A.unzip . liftArray2 (divMod) arr1
truncateA
:: (Source r ix a, RealFrac a, Integral b)
=> Array r ix a -> Array D ix b
truncateA = liftArray truncate
roundA
:: (Source r ix a, RealFrac a, Integral b)
=> Array r ix a -> Array D ix b
roundA = liftArray round
ceilingA
:: (Source r ix a, RealFrac a, Integral b)
=> Array r ix a -> Array D ix b
ceilingA = liftArray ceiling
floorA
:: (Source r ix a, RealFrac a, Integral b)
=> Array r ix a -> Array D ix b
floorA = liftArray floor
atan2A
:: (Source r ix e, RealFloat e)
=> Array r ix e -> Array r ix e -> Array D ix e
atan2A = liftArray2 atan2