{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}
module Numeric.Backprop.Op (
Op (..),
Rec (..),
runOp,
evalOp,
gradOp,
gradOpWith,
op0,
opConst,
idOp,
opLens,
op1,
op2,
op3,
opCoerce,
opTup,
opIso,
opIso2,
opIso3,
opIsoN,
noGrad1,
noGrad,
composeOp,
composeOp1,
(~.),
(+.),
(-.),
(*.),
negateOp,
absOp,
signumOp,
(/.),
recipOp,
expOp,
logOp,
sqrtOp,
(**.),
logBaseOp,
sinOp,
cosOp,
tanOp,
asinOp,
acosOp,
atanOp,
sinhOp,
coshOp,
tanhOp,
asinhOp,
acoshOp,
atanhOp,
) where
import Control.Applicative
import Data.Bifunctor
import Data.Coerce
import Data.Functor.Identity
import Data.List (foldl')
import Data.Type.Util
import Data.Vinyl.Core
import qualified Data.Vinyl.Recursive as VR
import Lens.Micro
import Lens.Micro.Extras
newtype Op as a
=
Op
{ forall (as :: [*]) a.
Op as a -> Rec Identity as -> (a, a -> Rec Identity as)
runOpWith :: Rec Identity as -> (a, a -> Rec Identity as)
}
newtype OpCont as a = OC {forall (as :: [*]) a. OpCont as a -> a -> Rec Identity as
runOpCont :: a -> Rec Identity as}
composeOp ::
forall as bs c.
RPureConstrained Num as =>
Rec (Op as) bs ->
Op bs c ->
Op as c
composeOp :: forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp Rec (Op as) bs
os Op bs c
o = (Rec Identity as -> (c, c -> Rec Identity as)) -> Op as c
forall (as :: [*]) a.
(Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
Op ((Rec Identity as -> (c, c -> Rec Identity as)) -> Op as c)
-> (Rec Identity as -> (c, c -> Rec Identity as)) -> Op as c
forall a b. (a -> b) -> a -> b
$ \Rec Identity as
xs ->
let (Rec Identity bs
ys, Rec (OpCont as) bs
conts) = (forall x. Op as x -> (Identity x, OpCont as x))
-> forall (xs :: [*]).
Rec (Op as) xs -> (Rec Identity xs, Rec (OpCont as) xs)
forall {k} (f :: k -> *) (g :: k -> *) (h :: k -> *).
(forall (x :: k). f x -> (g x, h x))
-> forall (xs :: [k]). Rec f xs -> (Rec g xs, Rec h xs)
runzipWith ((x -> Identity x)
-> ((x -> Rec Identity as) -> OpCont as x)
-> (x, x -> Rec Identity as)
-> (Identity x, OpCont as x)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap x -> Identity x
forall a. a -> Identity a
Identity (x -> Rec Identity as) -> OpCont as x
forall (as :: [*]) a. (a -> Rec Identity as) -> OpCont as a
OC ((x, x -> Rec Identity as) -> (Identity x, OpCont as x))
-> (Op as x -> (x, x -> Rec Identity as))
-> Op as x
-> (Identity x, OpCont as x)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Op as x -> Rec Identity as -> (x, x -> Rec Identity as))
-> Rec Identity as -> Op as x -> (x, x -> Rec Identity as)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Op as x -> Rec Identity as -> (x, x -> Rec Identity as)
forall (as :: [*]) a.
Op as a -> Rec Identity as -> (a, a -> Rec Identity as)
runOpWith Rec Identity as
xs) Rec (Op as) bs
os
(c
z, c -> Rec Identity bs
gFz) = Op bs c -> Rec Identity bs -> (c, c -> Rec Identity bs)
forall (as :: [*]) a.
Op as a -> Rec Identity as -> (a, a -> Rec Identity as)
runOpWith Op bs c
o Rec Identity bs
ys
gFunc :: c -> Rec Identity as
gFunc c
g0 =
let g1 :: Rec Identity bs
g1 = c -> Rec Identity bs
gFz c
g0
g2s :: Rec (Const (Rec Identity as)) bs
g2s :: Rec (Const (Rec Identity as)) bs
g2s =
(forall x. OpCont as x -> Identity x -> Const (Rec Identity as) x)
-> forall (xs :: [*]).
Rec (OpCont as) xs
-> Rec Identity xs -> Rec (Const (Rec Identity as)) xs
forall {k} (f :: k -> *) (g :: k -> *) (h :: k -> *).
(forall (x :: k). f x -> g x -> h x)
-> forall (xs :: [k]). Rec f xs -> Rec g xs -> Rec h xs
VR.rzipWith
(\OpCont as x
oc (Identity x
g) -> Rec Identity as -> Const (Rec Identity as) x
forall {k} a (b :: k). a -> Const a b
Const (Rec Identity as -> Const (Rec Identity as) x)
-> Rec Identity as -> Const (Rec Identity as) x
forall a b. (a -> b) -> a -> b
$ OpCont as x -> x -> Rec Identity as
forall (as :: [*]) a. OpCont as a -> a -> Rec Identity as
runOpCont OpCont as x
oc x
g)
Rec (OpCont as) bs
conts
Rec Identity bs
g1
in (forall x. Dict Num x -> Identity x)
-> Rec (Dict Num) as -> Rec Identity as
forall {u} (f :: u -> *) (g :: u -> *) (rs :: [u]).
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
VR.rmap (\(Dict x
x) -> x -> Identity x
forall a. a -> Identity a
Identity x
x)
(Rec (Dict Num) as -> Rec Identity as)
-> (Rec (Const (Rec Identity as)) bs -> Rec (Dict Num) as)
-> Rec (Const (Rec Identity as)) bs
-> Rec Identity as
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rec (Dict Num) as -> Rec Identity as -> Rec (Dict Num) as)
-> Rec (Dict Num) as -> [Rec Identity as] -> Rec (Dict Num) as
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl'
( (forall x. Dict Num x -> Identity x -> Dict Num x)
-> forall (xs :: [*]).
Rec (Dict Num) xs -> Rec Identity xs -> Rec (Dict Num) xs
forall {k} (f :: k -> *) (g :: k -> *) (h :: k -> *).
(forall (x :: k). f x -> g x -> h x)
-> forall (xs :: [k]). Rec f xs -> Rec g xs -> Rec h xs
VR.rzipWith
( \(Dict !x
x) (Identity x
y) ->
let q :: x
q = x
x x -> x -> x
forall a. Num a => a -> a -> a
+ x
y in x
q x -> Dict Num x -> Dict Num x
forall a b. a -> b -> b
`seq` x -> Dict Num x
forall (c :: * -> Constraint) a. c a => a -> Dict c a
Dict x
q
)
)
(forall {k} (c :: k -> Constraint) (ts :: [k]) (f :: k -> *).
RPureConstrained c ts =>
(forall (a :: k). c a => f a) -> Rec f ts
forall (c :: * -> Constraint) (ts :: [*]) (f :: * -> *).
RPureConstrained c ts =>
(forall a. c a => f a) -> Rec f ts
rpureConstrained @Num (forall (c :: * -> Constraint) a. c a => a -> Dict c a
Dict @Num a
0))
([Rec Identity as] -> Rec (Dict Num) as)
-> (Rec (Const (Rec Identity as)) bs -> [Rec Identity as])
-> Rec (Const (Rec Identity as)) bs
-> Rec (Dict Num) as
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall x. Const (Rec Identity as) x -> [Rec Identity as])
-> Rec (Const (Rec Identity as)) bs -> [Rec Identity as]
forall {u} (f :: u -> *) m (rs :: [u]).
Monoid m =>
(forall (x :: u). f x -> m) -> Rec f rs -> m
VR.rfoldMap ((Rec Identity as -> [Rec Identity as] -> [Rec Identity as]
forall a. a -> [a] -> [a]
: []) (Rec Identity as -> [Rec Identity as])
-> (Const (Rec Identity as) x -> Rec Identity as)
-> Const (Rec Identity as) x
-> [Rec Identity as]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Const (Rec Identity as) x -> Rec Identity as
forall {k} a (b :: k). Const a b -> a
getConst)
(Rec (Const (Rec Identity as)) bs -> Rec Identity as)
-> Rec (Const (Rec Identity as)) bs -> Rec Identity as
forall a b. (a -> b) -> a -> b
$ Rec (Const (Rec Identity as)) bs
g2s
in (c
z, c -> Rec Identity as
gFunc)
composeOp1 ::
RPureConstrained Num as =>
Op as b ->
Op '[b] c ->
Op as c
composeOp1 :: forall (as :: [*]) b c.
RPureConstrained Num as =>
Op as b -> Op '[b] c -> Op as c
composeOp1 = Rec (Op as) '[b] -> Op '[b] c -> Op as c
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Rec (Op as) '[b] -> Op '[b] c -> Op as c)
-> (Op as b -> Rec (Op as) '[b]) -> Op as b -> Op '[b] c -> Op as c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Op as b -> Rec (Op as) '[] -> Rec (Op as) '[b]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil)
infixr 9 ~.
(~.) ::
RPureConstrained Num as =>
Op '[b] c ->
Op as b ->
Op as c
~. :: forall (as :: [*]) b c.
RPureConstrained Num as =>
Op '[b] c -> Op as b -> Op as c
(~.) = (Op as b -> Op '[b] c -> Op as c)
-> Op '[b] c -> Op as b -> Op as c
forall a b c. (a -> b -> c) -> b -> a -> c
flip Op as b -> Op '[b] c -> Op as c
forall (as :: [*]) b c.
RPureConstrained Num as =>
Op as b -> Op '[b] c -> Op as c
composeOp1
{-# INLINE (~.) #-}
evalOp :: Op as a -> Rec Identity as -> a
evalOp :: forall (as :: [*]) a. Op as a -> Rec Identity as -> a
evalOp Op as a
o = (a, a -> Rec Identity as) -> a
forall a b. (a, b) -> a
fst ((a, a -> Rec Identity as) -> a)
-> (Rec Identity as -> (a, a -> Rec Identity as))
-> Rec Identity as
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Op as a -> Rec Identity as -> (a, a -> Rec Identity as)
forall (as :: [*]) a.
Op as a -> Rec Identity as -> (a, a -> Rec Identity as)
runOpWith Op as a
o
{-# INLINE evalOp #-}
runOp :: Num a => Op as a -> Rec Identity as -> (a, Rec Identity as)
runOp :: forall a (as :: [*]).
Num a =>
Op as a -> Rec Identity as -> (a, Rec Identity as)
runOp Op as a
o = ((a -> Rec Identity as) -> Rec Identity as)
-> (a, a -> Rec Identity as) -> (a, Rec Identity as)
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second ((a -> Rec Identity as) -> a -> Rec Identity as
forall a b. (a -> b) -> a -> b
$ a
1) ((a, a -> Rec Identity as) -> (a, Rec Identity as))
-> (Rec Identity as -> (a, a -> Rec Identity as))
-> Rec Identity as
-> (a, Rec Identity as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Op as a -> Rec Identity as -> (a, a -> Rec Identity as)
forall (as :: [*]) a.
Op as a -> Rec Identity as -> (a, a -> Rec Identity as)
runOpWith Op as a
o
{-# INLINE runOp #-}
gradOpWith ::
Op as a ->
Rec Identity as ->
a ->
Rec Identity as
gradOpWith :: forall (as :: [*]) a.
Op as a -> Rec Identity as -> a -> Rec Identity as
gradOpWith Op as a
o = (a, a -> Rec Identity as) -> a -> Rec Identity as
forall a b. (a, b) -> b
snd ((a, a -> Rec Identity as) -> a -> Rec Identity as)
-> (Rec Identity as -> (a, a -> Rec Identity as))
-> Rec Identity as
-> a
-> Rec Identity as
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Op as a -> Rec Identity as -> (a, a -> Rec Identity as)
forall (as :: [*]) a.
Op as a -> Rec Identity as -> (a, a -> Rec Identity as)
runOpWith Op as a
o
{-# INLINE gradOpWith #-}
gradOp :: Num a => Op as a -> Rec Identity as -> Rec Identity as
gradOp :: forall a (as :: [*]).
Num a =>
Op as a -> Rec Identity as -> Rec Identity as
gradOp Op as a
o Rec Identity as
i = Op as a -> Rec Identity as -> a -> Rec Identity as
forall (as :: [*]) a.
Op as a -> Rec Identity as -> a -> Rec Identity as
gradOpWith Op as a
o Rec Identity as
i a
1
{-# INLINE gradOp #-}
opCoerce :: Coercible a b => Op '[a] b
opCoerce :: forall a b. Coercible a b => Op '[a] b
opCoerce = (a -> b) -> (b -> a) -> Op '[a] b
forall a b. (a -> b) -> (b -> a) -> Op '[a] b
opIso a -> b
forall a b. Coercible a b => a -> b
coerce b -> a
forall a b. Coercible a b => a -> b
coerce
{-# INLINE opCoerce #-}
noGrad1 :: (a -> b) -> Op '[a] b
noGrad1 :: forall a b. (a -> b) -> Op '[a] b
noGrad1 a -> b
f = (a -> (b, b -> a)) -> Op '[a] b
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (b, b -> a)) -> Op '[a] b)
-> (a -> (b, b -> a)) -> Op '[a] b
forall a b. (a -> b) -> a -> b
$ \a
x ->
( a -> b
f a
x
, \b
_ -> [Char] -> a
forall a. [Char] -> a
errorWithoutStackTrace [Char]
"Numeric.Backprop.Op.noGrad1: no gradient defined"
)
{-# INLINE noGrad1 #-}
noGrad :: (Rec Identity as -> b) -> Op as b
noGrad :: forall (as :: [*]) b. (Rec Identity as -> b) -> Op as b
noGrad Rec Identity as -> b
f = (Rec Identity as -> (b, b -> Rec Identity as)) -> Op as b
forall (as :: [*]) a.
(Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
Op ((Rec Identity as -> (b, b -> Rec Identity as)) -> Op as b)
-> (Rec Identity as -> (b, b -> Rec Identity as)) -> Op as b
forall a b. (a -> b) -> a -> b
$ \Rec Identity as
xs ->
( Rec Identity as -> b
f Rec Identity as
xs
, \b
_ -> [Char] -> Rec Identity as
forall a. [Char] -> a
errorWithoutStackTrace [Char]
"Numeric.Backprop.Op.noGrad: no gradient defined"
)
{-# INLINE noGrad #-}
idOp :: Op '[a] a
idOp :: forall a. Op '[a] a
idOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 (,a -> a
forall a. a -> a
id)
{-# INLINE idOp #-}
opTup :: Op as (Rec Identity as)
opTup :: forall (as :: [*]). Op as (Rec Identity as)
opTup = (Rec Identity as
-> (Rec Identity as, Rec Identity as -> Rec Identity as))
-> Op as (Rec Identity as)
forall (as :: [*]) a.
(Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
Op (,Rec Identity as -> Rec Identity as
forall a. a -> a
id)
{-# INLINE opTup #-}
opIso :: (a -> b) -> (b -> a) -> Op '[a] b
opIso :: forall a b. (a -> b) -> (b -> a) -> Op '[a] b
opIso a -> b
to' b -> a
from' = (a -> (b, b -> a)) -> Op '[a] b
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (b, b -> a)) -> Op '[a] b)
-> (a -> (b, b -> a)) -> Op '[a] b
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> b
to' a
x, b -> a
from')
{-# INLINE opIso #-}
opIso2 :: (a -> b -> c) -> (c -> (a, b)) -> Op '[a, b] c
opIso2 :: forall a b c. (a -> b -> c) -> (c -> (a, b)) -> Op '[a, b] c
opIso2 a -> b -> c
to' c -> (a, b)
from' = (a -> b -> (c, c -> (a, b))) -> Op '[a, b] c
forall a b c. (a -> b -> (c, c -> (a, b))) -> Op '[a, b] c
op2 ((a -> b -> (c, c -> (a, b))) -> Op '[a, b] c)
-> (a -> b -> (c, c -> (a, b))) -> Op '[a, b] c
forall a b. (a -> b) -> a -> b
$ \a
x b
y -> (a -> b -> c
to' a
x b
y, c -> (a, b)
from')
{-# INLINE opIso2 #-}
opIso3 :: (a -> b -> c -> d) -> (d -> (a, b, c)) -> Op '[a, b, c] d
opIso3 :: forall a b c d.
(a -> b -> c -> d) -> (d -> (a, b, c)) -> Op '[a, b, c] d
opIso3 a -> b -> c -> d
to' d -> (a, b, c)
from' = (a -> b -> c -> (d, d -> (a, b, c))) -> Op '[a, b, c] d
forall a b c d.
(a -> b -> c -> (d, d -> (a, b, c))) -> Op '[a, b, c] d
op3 ((a -> b -> c -> (d, d -> (a, b, c))) -> Op '[a, b, c] d)
-> (a -> b -> c -> (d, d -> (a, b, c))) -> Op '[a, b, c] d
forall a b. (a -> b) -> a -> b
$ \a
x b
y c
z -> (a -> b -> c -> d
to' a
x b
y c
z, d -> (a, b, c)
from')
{-# INLINE opIso3 #-}
opIsoN :: (Rec Identity as -> b) -> (b -> Rec Identity as) -> Op as b
opIsoN :: forall (as :: [*]) b.
(Rec Identity as -> b) -> (b -> Rec Identity as) -> Op as b
opIsoN Rec Identity as -> b
to' b -> Rec Identity as
from' = (Rec Identity as -> (b, b -> Rec Identity as)) -> Op as b
forall (as :: [*]) a.
(Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
Op ((Rec Identity as -> (b, b -> Rec Identity as)) -> Op as b)
-> (Rec Identity as -> (b, b -> Rec Identity as)) -> Op as b
forall a b. (a -> b) -> a -> b
$ \Rec Identity as
xs -> (Rec Identity as -> b
to' Rec Identity as
xs, b -> Rec Identity as
from')
{-# INLINE opIsoN #-}
opLens :: Num a => Lens' a b -> Op '[a] b
opLens :: forall a b. Num a => Lens' a b -> Op '[a] b
opLens Lens' a b
l = (a -> (b, b -> a)) -> Op '[a] b
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (b, b -> a)) -> Op '[a] b)
-> (a -> (b, b -> a)) -> Op '[a] b
forall a b. (a -> b) -> a -> b
$ \a
x -> (Getting b a b -> a -> b
forall a s. Getting a s a -> s -> a
view Getting b a b
Lens' a b
l a
x, \b
d -> ASetter a a b b -> b -> a -> a
forall s t a b. ASetter s t a b -> b -> s -> t
set ASetter a a b b
Lens' a b
l b
d a
0)
{-# INLINE opLens #-}
opConst ::
forall as a.
RPureConstrained Num as =>
a ->
Op as a
opConst :: forall (as :: [*]) a. RPureConstrained Num as => a -> Op as a
opConst a
x =
(Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
forall (as :: [*]) a.
(Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
Op ((Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a)
-> (Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
forall a b. (a -> b) -> a -> b
$
(a, a -> Rec Identity as)
-> Rec Identity as -> (a, a -> Rec Identity as)
forall a b. a -> b -> a
const
(a
x, Rec Identity as -> a -> Rec Identity as
forall a b. a -> b -> a
const (Rec Identity as -> a -> Rec Identity as)
-> Rec Identity as -> a -> Rec Identity as
forall a b. (a -> b) -> a -> b
$ forall {k} (c :: k -> Constraint) (ts :: [k]) (f :: k -> *).
RPureConstrained c ts =>
(forall (a :: k). c a => f a) -> Rec f ts
forall (c :: * -> Constraint) (ts :: [*]) (f :: * -> *).
RPureConstrained c ts =>
(forall a. c a => f a) -> Rec f ts
rpureConstrained @Num Identity a
forall a. Num a => Identity a
0)
{-# INLINE opConst #-}
op0 :: a -> Op '[] a
op0 :: forall a. a -> Op '[] a
op0 a
x = (Rec Identity '[] -> (a, a -> Rec Identity '[])) -> Op '[] a
forall (as :: [*]) a.
(Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
Op ((Rec Identity '[] -> (a, a -> Rec Identity '[])) -> Op '[] a)
-> (Rec Identity '[] -> (a, a -> Rec Identity '[])) -> Op '[] a
forall a b. (a -> b) -> a -> b
$ \case
Rec Identity '[]
RNil -> (a
x, Rec Identity '[] -> a -> Rec Identity '[]
forall a b. a -> b -> a
const Rec Identity '[]
forall {u} (a :: u -> *). Rec a '[]
RNil)
{-# INLINE op0 #-}
op1 ::
(a -> (b, b -> a)) ->
Op '[a] b
op1 :: forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 a -> (b, b -> a)
f = (Rec Identity '[a] -> (b, b -> Rec Identity '[a])) -> Op '[a] b
forall (as :: [*]) a.
(Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
Op ((Rec Identity '[a] -> (b, b -> Rec Identity '[a])) -> Op '[a] b)
-> (Rec Identity '[a] -> (b, b -> Rec Identity '[a])) -> Op '[a] b
forall a b. (a -> b) -> a -> b
$ \case
Identity r
x :& Rec Identity rs
RNil ->
let (b
y, b -> a
dx) = a -> (b, b -> a)
f a
r
x
in (b
y, \(!b
d) -> (Identity a -> Rec Identity '[] -> Rec Identity '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec Identity '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) (Identity a -> Rec Identity '[a])
-> (b -> Identity a) -> b -> Rec Identity '[a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Identity a
forall a. a -> Identity a
Identity (a -> Identity a) -> (b -> a) -> b -> Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> a
dx (b -> Rec Identity '[a]) -> b -> Rec Identity '[a]
forall a b. (a -> b) -> a -> b
$ b
d)
{-# INLINE op1 #-}
op2 ::
(a -> b -> (c, c -> (a, b))) ->
Op '[a, b] c
op2 :: forall a b c. (a -> b -> (c, c -> (a, b))) -> Op '[a, b] c
op2 a -> b -> (c, c -> (a, b))
f = (Rec Identity '[a, b] -> (c, c -> Rec Identity '[a, b]))
-> Op '[a, b] c
forall (as :: [*]) a.
(Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
Op ((Rec Identity '[a, b] -> (c, c -> Rec Identity '[a, b]))
-> Op '[a, b] c)
-> (Rec Identity '[a, b] -> (c, c -> Rec Identity '[a, b]))
-> Op '[a, b] c
forall a b. (a -> b) -> a -> b
$ \case
Identity r
x :& Identity r
y :& Rec Identity rs
RNil ->
let (c
z, c -> (a, b)
dxdy) = a -> b -> (c, c -> (a, b))
f a
r
x b
r
y
in (c
z, (\(!a
dx, !b
dy) -> a -> Identity a
forall a. a -> Identity a
Identity a
dx Identity a -> Rec Identity '[b] -> Rec Identity '[a, b]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& b -> Identity b
forall a. a -> Identity a
Identity b
dy Identity b -> Rec Identity '[] -> Rec Identity '[b]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec Identity '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) ((a, b) -> Rec Identity '[a, b])
-> (c -> (a, b)) -> c -> Rec Identity '[a, b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> (a, b)
dxdy)
{-# INLINE op2 #-}
op3 ::
(a -> b -> c -> (d, d -> (a, b, c))) ->
Op '[a, b, c] d
op3 :: forall a b c d.
(a -> b -> c -> (d, d -> (a, b, c))) -> Op '[a, b, c] d
op3 a -> b -> c -> (d, d -> (a, b, c))
f = (Rec Identity '[a, b, c] -> (d, d -> Rec Identity '[a, b, c]))
-> Op '[a, b, c] d
forall (as :: [*]) a.
(Rec Identity as -> (a, a -> Rec Identity as)) -> Op as a
Op ((Rec Identity '[a, b, c] -> (d, d -> Rec Identity '[a, b, c]))
-> Op '[a, b, c] d)
-> (Rec Identity '[a, b, c] -> (d, d -> Rec Identity '[a, b, c]))
-> Op '[a, b, c] d
forall a b. (a -> b) -> a -> b
$ \case
Identity r
x :& Identity r
y :& Identity r
z :& Rec Identity rs
RNil ->
let (d
q, d -> (a, b, c)
dxdydz) = a -> b -> c -> (d, d -> (a, b, c))
f a
r
x b
r
y c
r
z
in (d
q, (\(!a
dx, !b
dy, !c
dz) -> a -> Identity a
forall a. a -> Identity a
Identity a
dx Identity a -> Rec Identity '[b, c] -> Rec Identity '[a, b, c]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& b -> Identity b
forall a. a -> Identity a
Identity b
dy Identity b -> Rec Identity '[c] -> Rec Identity '[b, c]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& c -> Identity c
forall a. a -> Identity a
Identity c
dz Identity c -> Rec Identity '[] -> Rec Identity '[c]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec Identity '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) ((a, b, c) -> Rec Identity '[a, b, c])
-> (d -> (a, b, c)) -> d -> Rec Identity '[a, b, c]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. d -> (a, b, c)
dxdydz)
{-# INLINE op3 #-}
instance (RPureConstrained Num as, Num a) => Num (Op as a) where
Op as a
o1 + :: Op as a -> Op as a -> Op as a
+ Op as a
o2 = Rec (Op as) '[a, a] -> Op '[a, a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o1 Op as a -> Rec (Op as) '[a] -> Rec (Op as) '[a, a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Op as a
o2 Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a, a] a
forall a. Num a => Op '[a, a] a
(+.)
{-# INLINE (+) #-}
Op as a
o1 - :: Op as a -> Op as a -> Op as a
- Op as a
o2 = Rec (Op as) '[a, a] -> Op '[a, a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o1 Op as a -> Rec (Op as) '[a] -> Rec (Op as) '[a, a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Op as a
o2 Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a, a] a
forall a. Num a => Op '[a, a] a
(-.)
{-# INLINE (-) #-}
Op as a
o1 * :: Op as a -> Op as a -> Op as a
* Op as a
o2 = Rec (Op as) '[a, a] -> Op '[a, a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o1 Op as a -> Rec (Op as) '[a] -> Rec (Op as) '[a, a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Op as a
o2 Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a, a] a
forall a. Num a => Op '[a, a] a
(*.)
{-# INLINE (*) #-}
negate :: Op as a -> Op as a
negate Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Num a => Op '[a] a
negateOp
{-# INLINE negate #-}
signum :: Op as a -> Op as a
signum Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Num a => Op '[a] a
signumOp
{-# INLINE signum #-}
abs :: Op as a -> Op as a
abs Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Num a => Op '[a] a
absOp
{-# INLINE abs #-}
fromInteger :: Integer -> Op as a
fromInteger Integer
x = a -> Op as a
forall (as :: [*]) a. RPureConstrained Num as => a -> Op as a
opConst (Integer -> a
forall a. Num a => Integer -> a
fromInteger Integer
x)
{-# INLINE fromInteger #-}
instance (RPureConstrained Num as, Fractional a) => Fractional (Op as a) where
Op as a
o1 / :: Op as a -> Op as a -> Op as a
/ Op as a
o2 = Rec (Op as) '[a, a] -> Op '[a, a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o1 Op as a -> Rec (Op as) '[a] -> Rec (Op as) '[a, a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Op as a
o2 Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a, a] a
forall a. Fractional a => Op '[a, a] a
(/.)
recip :: Op as a -> Op as a
recip Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Fractional a => Op '[a] a
recipOp
{-# INLINE recip #-}
fromRational :: Rational -> Op as a
fromRational Rational
x = a -> Op as a
forall (as :: [*]) a. RPureConstrained Num as => a -> Op as a
opConst (Rational -> a
forall a. Fractional a => Rational -> a
fromRational Rational
x)
{-# INLINE fromRational #-}
instance (RPureConstrained Num as, Floating a) => Floating (Op as a) where
pi :: Op as a
pi = a -> Op as a
forall (as :: [*]) a. RPureConstrained Num as => a -> Op as a
opConst a
forall a. Floating a => a
pi
{-# INLINE pi #-}
exp :: Op as a -> Op as a
exp Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
expOp
{-# INLINE exp #-}
log :: Op as a -> Op as a
log Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
logOp
{-# INLINE log #-}
sqrt :: Op as a -> Op as a
sqrt Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
sqrtOp
{-# INLINE sqrt #-}
Op as a
o1 ** :: Op as a -> Op as a -> Op as a
** Op as a
o2 = Rec (Op as) '[a, a] -> Op '[a, a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o1 Op as a -> Rec (Op as) '[a] -> Rec (Op as) '[a, a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Op as a
o2 Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a, a] a
forall a. Floating a => Op '[a, a] a
(**.)
{-# INLINE (**) #-}
logBase :: Op as a -> Op as a -> Op as a
logBase Op as a
o1 Op as a
o2 = Rec (Op as) '[a, a] -> Op '[a, a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o1 Op as a -> Rec (Op as) '[a] -> Rec (Op as) '[a, a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Op as a
o2 Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a, a] a
forall a. Floating a => Op '[a, a] a
logBaseOp
{-# INLINE logBase #-}
sin :: Op as a -> Op as a
sin Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
sinOp
{-# INLINE sin #-}
cos :: Op as a -> Op as a
cos Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
cosOp
{-# INLINE cos #-}
tan :: Op as a -> Op as a
tan Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
tanOp
{-# INLINE tan #-}
asin :: Op as a -> Op as a
asin Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
asinOp
{-# INLINE asin #-}
acos :: Op as a -> Op as a
acos Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
acosOp
{-# INLINE acos #-}
atan :: Op as a -> Op as a
atan Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
atanOp
{-# INLINE atan #-}
sinh :: Op as a -> Op as a
sinh Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
sinhOp
{-# INLINE sinh #-}
cosh :: Op as a -> Op as a
cosh Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
coshOp
{-# INLINE cosh #-}
tanh :: Op as a -> Op as a
tanh Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
tanhOp
{-# INLINE tanh #-}
asinh :: Op as a -> Op as a
asinh Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
asinhOp
{-# INLINE asinh #-}
acosh :: Op as a -> Op as a
acosh Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
acoshOp
{-# INLINE acosh #-}
atanh :: Op as a -> Op as a
atanh Op as a
o = Rec (Op as) '[a] -> Op '[a] a -> Op as a
forall (as :: [*]) (bs :: [*]) c.
RPureConstrained Num as =>
Rec (Op as) bs -> Op bs c -> Op as c
composeOp (Op as a
o Op as a -> Rec (Op as) '[] -> Rec (Op as) '[a]
forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec (Op as) '[]
forall {u} (a :: u -> *). Rec a '[]
RNil) Op '[a] a
forall a. Floating a => Op '[a] a
atanhOp
{-# INLINE atanh #-}
(+.) :: Num a => Op '[a, a] a
+. :: forall a. Num a => Op '[a, a] a
(+.) = (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b c. (a -> b -> (c, c -> (a, b))) -> Op '[a, b] c
op2 ((a -> a -> (a, a -> (a, a))) -> Op '[a, a] a)
-> (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b. (a -> b) -> a -> b
$ \a
x a
y -> (a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
y, \a
g -> (a
g, a
g))
{-# INLINE (+.) #-}
(-.) :: Num a => Op '[a, a] a
-. :: forall a. Num a => Op '[a, a] a
(-.) = (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b c. (a -> b -> (c, c -> (a, b))) -> Op '[a, b] c
op2 ((a -> a -> (a, a -> (a, a))) -> Op '[a, a] a)
-> (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b. (a -> b) -> a -> b
$ \a
x a
y -> (a
x a -> a -> a
forall a. Num a => a -> a -> a
- a
y, \a
g -> (a
g, -a
g))
{-# INLINE (-.) #-}
(*.) :: Num a => Op '[a, a] a
*. :: forall a. Num a => Op '[a, a] a
(*.) = (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b c. (a -> b -> (c, c -> (a, b))) -> Op '[a, b] c
op2 ((a -> a -> (a, a -> (a, a))) -> Op '[a, a] a)
-> (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b. (a -> b) -> a -> b
$ \a
x a
y -> (a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
y, \a
g -> (a
y a -> a -> a
forall a. Num a => a -> a -> a
* a
g, a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
g))
{-# INLINE (*.) #-}
(/.) :: Fractional a => Op '[a, a] a
/. :: forall a. Fractional a => Op '[a, a] a
(/.) = (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b c. (a -> b -> (c, c -> (a, b))) -> Op '[a, b] c
op2 ((a -> a -> (a, a -> (a, a))) -> Op '[a, a] a)
-> (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b. (a -> b) -> a -> b
$ \a
x a
y -> (a
x a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
y, \a
g -> (a
g a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
y, -(a
g a -> a -> a
forall a. Num a => a -> a -> a
* a
x a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a
y a -> a -> a
forall a. Num a => a -> a -> a
* a
y))))
{-# INLINE (/.) #-}
(**.) :: Floating a => Op '[a, a] a
**. :: forall a. Floating a => Op '[a, a] a
(**.) = (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b c. (a -> b -> (c, c -> (a, b))) -> Op '[a, b] c
op2 ((a -> a -> (a, a -> (a, a))) -> Op '[a, a] a)
-> (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b. (a -> b) -> a -> b
$ \a
x a
y ->
( a
x a -> a -> a
forall a. Floating a => a -> a -> a
** a
y
, let dx :: a
dx = a
y a -> a -> a
forall a. Num a => a -> a -> a
* a
x a -> a -> a
forall a. Floating a => a -> a -> a
** (a
y a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
dy :: a
dy = a
x a -> a -> a
forall a. Floating a => a -> a -> a
** a
y a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
log a
x
in \a
g -> (a
g a -> a -> a
forall a. Num a => a -> a -> a
* a
dx, a
g a -> a -> a
forall a. Num a => a -> a -> a
* a
dy)
)
{-# INLINE (**.) #-}
negateOp :: Num a => Op '[a] a
negateOp :: forall a. Num a => Op '[a] a
negateOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Num a => a -> a
negate a
x, a -> a
forall a. Num a => a -> a
negate)
{-# INLINE negateOp #-}
signumOp :: Num a => Op '[a] a
signumOp :: forall a. Num a => Op '[a] a
signumOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Num a => a -> a
signum a
x, a -> a -> a
forall a b. a -> b -> a
const a
0)
{-# INLINE signumOp #-}
absOp :: Num a => Op '[a] a
absOp :: forall a. Num a => Op '[a] a
absOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Num a => a -> a
abs a
x, (a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Num a => a -> a
signum a
x))
{-# INLINE absOp #-}
recipOp :: Fractional a => Op '[a] a
recipOp :: forall a. Fractional a => Op '[a] a
recipOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Fractional a => a -> a
recip a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x)) (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
forall a. Num a => a -> a
negate)
{-# INLINE recipOp #-}
expOp :: Floating a => Op '[a] a
expOp :: forall a. Floating a => Op '[a] a
expOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
exp a
x, (a -> a
forall a. Floating a => a -> a
exp a
x a -> a -> a
forall a. Num a => a -> a -> a
*))
{-# INLINE expOp #-}
logOp :: Floating a => Op '[a] a
logOp :: forall a. Floating a => Op '[a] a
logOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
log a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
x))
{-# INLINE logOp #-}
sqrtOp :: Floating a => Op '[a] a
sqrtOp :: forall a. Floating a => Op '[a] a
sqrtOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
sqrt a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
sqrt a
x)))
{-# INLINE sqrtOp #-}
logBaseOp :: Floating a => Op '[a, a] a
logBaseOp :: forall a. Floating a => Op '[a, a] a
logBaseOp = (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b c. (a -> b -> (c, c -> (a, b))) -> Op '[a, b] c
op2 ((a -> a -> (a, a -> (a, a))) -> Op '[a, a] a)
-> (a -> a -> (a, a -> (a, a))) -> Op '[a, a] a
forall a b. (a -> b) -> a -> b
$ \a
x a
y ->
( a -> a -> a
forall a. Floating a => a -> a -> a
logBase a
x a
y
, let dx :: a
dx = -(a -> a -> a
forall a. Floating a => a -> a -> a
logBase a
x a
y a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a -> a
forall a. Floating a => a -> a
log a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x))
in \a
g -> (a
g a -> a -> a
forall a. Num a => a -> a -> a
* a
dx, a
g a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a
y a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
log a
x))
)
{-# INLINE logBaseOp #-}
sinOp :: Floating a => Op '[a] a
sinOp :: forall a. Floating a => Op '[a] a
sinOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
sin a
x, (a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
cos a
x))
{-# INLINE sinOp #-}
cosOp :: Floating a => Op '[a] a
cosOp :: forall a. Floating a => Op '[a] a
cosOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
cos a
x, (a -> a -> a
forall a. Num a => a -> a -> a
* (-a -> a
forall a. Floating a => a -> a
sin a
x)))
{-# INLINE cosOp #-}
tanOp :: Floating a => Op '[a] a
tanOp :: forall a. Floating a => Op '[a] a
tanOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
tan a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ a -> a
forall a. Floating a => a -> a
cos a
x a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
2 :: Int)))
{-# INLINE tanOp #-}
asinOp :: Floating a => Op '[a] a
asinOp :: forall a. Floating a => Op '[a] a
asinOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
asin a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ a -> a
forall a. Floating a => a -> a
sqrt (a
1 a -> a -> a
forall a. Num a => a -> a -> a
- a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x)))
{-# INLINE asinOp #-}
acosOp :: Floating a => Op '[a] a
acosOp :: forall a. Floating a => Op '[a] a
acosOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
acos a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ a -> a
forall a. Floating a => a -> a
sqrt (a
1 a -> a -> a
forall a. Num a => a -> a -> a
- a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x)) (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
forall a. Num a => a -> a
negate)
{-# INLINE acosOp #-}
atanOp :: Floating a => Op '[a] a
atanOp :: forall a. Floating a => Op '[a] a
atanOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
atan a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)))
{-# INLINE atanOp #-}
sinhOp :: Floating a => Op '[a] a
sinhOp :: forall a. Floating a => Op '[a] a
sinhOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
sinh a
x, (a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
cosh a
x))
{-# INLINE sinhOp #-}
coshOp :: Floating a => Op '[a] a
coshOp :: forall a. Floating a => Op '[a] a
coshOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
cosh a
x, (a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
sinh a
x))
{-# INLINE coshOp #-}
tanhOp :: Floating a => Op '[a] a
tanhOp :: forall a. Floating a => Op '[a] a
tanhOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
tanh a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ a -> a
forall a. Floating a => a -> a
cosh a
x a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
2 :: Int)))
{-# INLINE tanhOp #-}
asinhOp :: Floating a => Op '[a] a
asinhOp :: forall a. Floating a => Op '[a] a
asinhOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
asinh a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ a -> a
forall a. Floating a => a -> a
sqrt (a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)))
{-# INLINE asinhOp #-}
acoshOp :: Floating a => Op '[a] a
acoshOp :: forall a. Floating a => Op '[a] a
acoshOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
acosh a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ a -> a
forall a. Floating a => a -> a
sqrt (a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x a -> a -> a
forall a. Num a => a -> a -> a
- a
1)))
{-# INLINE acoshOp #-}
atanhOp :: Floating a => Op '[a] a
atanhOp :: forall a. Floating a => Op '[a] a
atanhOp = (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> (b, b -> a)) -> Op '[a] b
op1 ((a -> (a, a -> a)) -> Op '[a] a)
-> (a -> (a, a -> a)) -> Op '[a] a
forall a b. (a -> b) -> a -> b
$ \a
x -> (a -> a
forall a. Floating a => a -> a
atanh a
x, (a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a
1 a -> a -> a
forall a. Num a => a -> a -> a
- a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x)))
{-# INLINE atanhOp #-}