{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ViewPatterns #-}
module Numeric.Backprop (
BVar,
W,
Backprop (..),
ABP (..),
NumBP (..),
backprop,
E.evalBP,
gradBP,
backpropWith,
backprop2,
E.evalBP2,
gradBP2,
backpropWith2,
backpropN,
E.evalBPN,
gradBPN,
backpropWithN,
E.evalBP0,
E.constVar,
E.auto,
E.coerceVar,
(^^.),
(.~~),
(%~~),
(^^?),
(^^..),
(^^?!),
viewVar,
setVar,
overVar,
sequenceVar,
collectVar,
previewVar,
toListOfVar,
pattern T2,
pattern T3,
isoVar,
isoVar2,
isoVar3,
isoVarN,
liftOp,
liftOp1,
liftOp2,
liftOp3,
splitBV,
joinBV,
pattern BV,
E.BVGroup,
Op (..),
op0,
opConst,
idOp,
bpOp,
op1,
op2,
op3,
opCoerce,
opTup,
opIso,
opIsoN,
opLens,
noGrad1,
noGrad,
Reifies,
) where
import Data.Functor.Identity
import Data.Maybe
import Data.Reflection
import Data.Vinyl
import GHC.Generics
import Lens.Micro
import Numeric.Backprop.Class
import Numeric.Backprop.Explicit (BVar, W)
import qualified Numeric.Backprop.Explicit as E
import Numeric.Backprop.Op
backpropN ::
(RPureConstrained Backprop as, Backprop b) =>
(forall s. Reifies s W => Rec (BVar s) as -> BVar s b) ->
Rec Identity as ->
(b, Rec Identity as)
backpropN :: forall (as :: [*]) b.
(RPureConstrained Backprop as, Backprop b) =>
(forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Rec Identity as -> (b, Rec Identity as)
backpropN = Rec ZeroFunc as
-> OneFunc b
-> (forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Rec Identity as
-> (b, Rec Identity as)
forall (as :: [*]) b.
Rec ZeroFunc as
-> OneFunc b
-> (forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Rec Identity as
-> (b, Rec Identity as)
E.backpropN Rec ZeroFunc as
forall (as :: [*]). RPureConstrained Backprop as => Rec ZeroFunc as
E.zeroFuncs OneFunc b
forall a. Backprop a => OneFunc a
E.oneFunc
{-# INLINE backpropN #-}
backpropWithN ::
RPureConstrained Backprop as =>
(forall s. Reifies s W => Rec (BVar s) as -> BVar s b) ->
Rec Identity as ->
(b, b -> Rec Identity as)
backpropWithN :: forall (as :: [*]) b.
RPureConstrained Backprop as =>
(forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Rec Identity as -> (b, b -> Rec Identity as)
backpropWithN = Rec ZeroFunc as
-> (forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Rec Identity as
-> (b, b -> Rec Identity as)
forall (as :: [*]) b.
Rec ZeroFunc as
-> (forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Rec Identity as
-> (b, b -> Rec Identity as)
E.backpropWithN Rec ZeroFunc as
forall (as :: [*]). RPureConstrained Backprop as => Rec ZeroFunc as
E.zeroFuncs
{-# INLINE backpropWithN #-}
backprop ::
(Backprop a, Backprop b) =>
(forall s. Reifies s W => BVar s a -> BVar s b) ->
a ->
(b, a)
backprop :: forall a b.
(Backprop a, Backprop b) =>
(forall s. Reifies s W => BVar s a -> BVar s b) -> a -> (b, a)
backprop = ZeroFunc a
-> OneFunc b
-> (forall s. Reifies s W => BVar s a -> BVar s b)
-> a
-> (b, a)
forall a b.
ZeroFunc a
-> OneFunc b
-> (forall s. Reifies s W => BVar s a -> BVar s b)
-> a
-> (b, a)
E.backprop ZeroFunc a
forall a. Backprop a => ZeroFunc a
E.zeroFunc OneFunc b
forall a. Backprop a => OneFunc a
E.oneFunc
{-# INLINE backprop #-}
backpropWith ::
Backprop a =>
(forall s. Reifies s W => BVar s a -> BVar s b) ->
a ->
(b, b -> a)
backpropWith :: forall a b.
Backprop a =>
(forall s. Reifies s W => BVar s a -> BVar s b) -> a -> (b, b -> a)
backpropWith = ZeroFunc a
-> (forall s. Reifies s W => BVar s a -> BVar s b)
-> a
-> (b, b -> a)
forall a b.
ZeroFunc a
-> (forall s. Reifies s W => BVar s a -> BVar s b)
-> a
-> (b, b -> a)
E.backpropWith ZeroFunc a
forall a. Backprop a => ZeroFunc a
E.zeroFunc
{-# INLINE backpropWith #-}
gradBP ::
(Backprop a, Backprop b) =>
(forall s. Reifies s W => BVar s a -> BVar s b) ->
a ->
a
gradBP :: forall a b.
(Backprop a, Backprop b) =>
(forall s. Reifies s W => BVar s a -> BVar s b) -> a -> a
gradBP = ZeroFunc a
-> OneFunc b
-> (forall s. Reifies s W => BVar s a -> BVar s b)
-> a
-> a
forall a b.
ZeroFunc a
-> OneFunc b
-> (forall s. Reifies s W => BVar s a -> BVar s b)
-> a
-> a
E.gradBP ZeroFunc a
forall a. Backprop a => ZeroFunc a
E.zeroFunc OneFunc b
forall a. Backprop a => OneFunc a
E.oneFunc
{-# INLINE gradBP #-}
gradBPN ::
(RPureConstrained Backprop as, Backprop b) =>
(forall s. Reifies s W => Rec (BVar s) as -> BVar s b) ->
Rec Identity as ->
Rec Identity as
gradBPN :: forall (as :: [*]) b.
(RPureConstrained Backprop as, Backprop b) =>
(forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Rec Identity as -> Rec Identity as
gradBPN = Rec ZeroFunc as
-> OneFunc b
-> (forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Rec Identity as
-> Rec Identity as
forall (as :: [*]) b.
Rec ZeroFunc as
-> OneFunc b
-> (forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Rec Identity as
-> Rec Identity as
E.gradBPN Rec ZeroFunc as
forall (as :: [*]). RPureConstrained Backprop as => Rec ZeroFunc as
E.zeroFuncs OneFunc b
forall a. Backprop a => OneFunc a
E.oneFunc
{-# INLINE gradBPN #-}
backprop2 ::
(Backprop a, Backprop b, Backprop c) =>
(forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c) ->
a ->
b ->
(c, (a, b))
backprop2 :: forall a b c.
(Backprop a, Backprop b, Backprop c) =>
(forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c)
-> a -> b -> (c, (a, b))
backprop2 = ZeroFunc a
-> ZeroFunc b
-> OneFunc c
-> (forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c)
-> a
-> b
-> (c, (a, b))
forall a b c.
ZeroFunc a
-> ZeroFunc b
-> OneFunc c
-> (forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c)
-> a
-> b
-> (c, (a, b))
E.backprop2 ZeroFunc a
forall a. Backprop a => ZeroFunc a
E.zeroFunc ZeroFunc b
forall a. Backprop a => ZeroFunc a
E.zeroFunc OneFunc c
forall a. Backprop a => OneFunc a
E.oneFunc
{-# INLINE backprop2 #-}
backpropWith2 ::
(Backprop a, Backprop b) =>
(forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c) ->
a ->
b ->
(c, c -> (a, b))
backpropWith2 :: forall a b c.
(Backprop a, Backprop b) =>
(forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c)
-> a -> b -> (c, c -> (a, b))
backpropWith2 = ZeroFunc a
-> ZeroFunc b
-> (forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c)
-> a
-> b
-> (c, c -> (a, b))
forall a b c.
ZeroFunc a
-> ZeroFunc b
-> (forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c)
-> a
-> b
-> (c, c -> (a, b))
E.backpropWith2 ZeroFunc a
forall a. Backprop a => ZeroFunc a
E.zeroFunc ZeroFunc b
forall a. Backprop a => ZeroFunc a
E.zeroFunc
{-# INLINE backpropWith2 #-}
gradBP2 ::
(Backprop a, Backprop b, Backprop c) =>
(forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c) ->
a ->
b ->
(a, b)
gradBP2 :: forall a b c.
(Backprop a, Backprop b, Backprop c) =>
(forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c)
-> a -> b -> (a, b)
gradBP2 = ZeroFunc a
-> ZeroFunc b
-> OneFunc c
-> (forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c)
-> a
-> b
-> (a, b)
forall a b c.
ZeroFunc a
-> ZeroFunc b
-> OneFunc c
-> (forall s. Reifies s W => BVar s a -> BVar s b -> BVar s c)
-> a
-> b
-> (a, b)
E.gradBP2 ZeroFunc a
forall a. Backprop a => ZeroFunc a
E.zeroFunc ZeroFunc b
forall a. Backprop a => ZeroFunc a
E.zeroFunc OneFunc c
forall a. Backprop a => OneFunc a
E.oneFunc
{-# INLINE gradBP2 #-}
bpOp ::
RPureConstrained Backprop as =>
(forall s. Reifies s W => Rec (BVar s) as -> BVar s b) ->
Op as b
bpOp :: forall (as :: [*]) b.
RPureConstrained Backprop as =>
(forall s. Reifies s W => Rec (BVar s) as -> BVar s b) -> Op as b
bpOp = Rec ZeroFunc as
-> (forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Op as b
forall (as :: [*]) b.
Rec ZeroFunc as
-> (forall s. Reifies s W => Rec (BVar s) as -> BVar s b)
-> Op as b
E.bpOp Rec ZeroFunc as
forall (as :: [*]). RPureConstrained Backprop as => Rec ZeroFunc as
E.zeroFuncs
{-# INLINE bpOp #-}
(^^.) ::
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b ->
Lens' b a ->
BVar s a
BVar s b
x ^^. :: forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b -> Lens' b a -> BVar s a
^^. Lens' b a
l = Lens' b a -> BVar s b -> BVar s a
forall b a s.
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a -> BVar s b -> BVar s a
viewVar (a -> f a) -> b -> f b
Lens' b a
l BVar s b
x
infixl 8 ^^.
{-# INLINE (^^.) #-}
viewVar ::
forall b a s.
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a ->
BVar s b ->
BVar s a
viewVar :: forall b a s.
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a -> BVar s b -> BVar s a
viewVar = AddFunc a -> ZeroFunc b -> Lens' b a -> BVar s b -> BVar s a
forall a b s.
Reifies s W =>
AddFunc a -> ZeroFunc b -> Lens' b a -> BVar s b -> BVar s a
E.viewVar AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc ZeroFunc b
forall a. Backprop a => ZeroFunc a
E.zeroFunc
{-# INLINE viewVar #-}
(.~~) ::
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a ->
BVar s a ->
BVar s b ->
BVar s b
Lens' b a
l .~~ :: forall a b s.
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a -> BVar s a -> BVar s b -> BVar s b
.~~ BVar s a
x = Lens' b a -> BVar s a -> BVar s b -> BVar s b
forall a b s.
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a -> BVar s a -> BVar s b -> BVar s b
setVar (a -> f a) -> b -> f b
Lens' b a
l BVar s a
x
infixl 8 .~~
{-# INLINE (.~~) #-}
setVar ::
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a ->
BVar s a ->
BVar s b ->
BVar s b
setVar :: forall a b s.
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a -> BVar s a -> BVar s b -> BVar s b
setVar = AddFunc a
-> AddFunc b
-> ZeroFunc a
-> Lens' b a
-> BVar s a
-> BVar s b
-> BVar s b
forall a b s.
Reifies s W =>
AddFunc a
-> AddFunc b
-> ZeroFunc a
-> Lens' b a
-> BVar s a
-> BVar s b
-> BVar s b
E.setVar AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc AddFunc b
forall a. Backprop a => AddFunc a
E.addFunc ZeroFunc a
forall a. Backprop a => ZeroFunc a
E.zeroFunc
{-# INLINE setVar #-}
(%~~) ::
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a ->
(BVar s a -> BVar s a) ->
BVar s b ->
BVar s b
Lens' b a
l %~~ :: forall a b s.
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a -> (BVar s a -> BVar s a) -> BVar s b -> BVar s b
%~~ BVar s a -> BVar s a
f = Lens' b a -> (BVar s a -> BVar s a) -> BVar s b -> BVar s b
forall a b s.
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a -> (BVar s a -> BVar s a) -> BVar s b -> BVar s b
overVar (a -> f a) -> b -> f b
Lens' b a
l BVar s a -> BVar s a
f
infixr 4 %~~
{-# INLINE (%~~) #-}
overVar ::
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a ->
(BVar s a -> BVar s a) ->
BVar s b ->
BVar s b
overVar :: forall a b s.
(Backprop a, Backprop b, Reifies s W) =>
Lens' b a -> (BVar s a -> BVar s a) -> BVar s b -> BVar s b
overVar = AddFunc a
-> AddFunc b
-> ZeroFunc a
-> ZeroFunc b
-> Lens' b a
-> (BVar s a -> BVar s a)
-> BVar s b
-> BVar s b
forall s a b.
Reifies s W =>
AddFunc a
-> AddFunc b
-> ZeroFunc a
-> ZeroFunc b
-> Lens' b a
-> (BVar s a -> BVar s a)
-> BVar s b
-> BVar s b
E.overVar AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc AddFunc b
forall a. Backprop a => AddFunc a
E.addFunc ZeroFunc a
forall a. Backprop a => ZeroFunc a
E.zeroFunc ZeroFunc b
forall a. Backprop a => ZeroFunc a
E.zeroFunc
{-# INLINE overVar #-}
(^^?) ::
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b ->
Traversal' b a ->
Maybe (BVar s a)
BVar s b
v ^^? :: forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b -> Traversal' b a -> Maybe (BVar s a)
^^? Traversal' b a
t = Traversal' b a -> BVar s b -> Maybe (BVar s a)
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
Traversal' b a -> BVar s b -> Maybe (BVar s a)
previewVar (a -> f a) -> b -> f b
Traversal' b a
t BVar s b
v
infixl 8 ^^?
{-# INLINE (^^?) #-}
(^^?!) ::
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b ->
Traversal' b a ->
BVar s a
BVar s b
v ^^?! :: forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b -> Traversal' b a -> BVar s a
^^?! Traversal' b a
t = BVar s a -> Maybe (BVar s a) -> BVar s a
forall a. a -> Maybe a -> a
fromMaybe ([Char] -> BVar s a
forall a. HasCallStack => [Char] -> a
error [Char]
e) (Traversal' b a -> BVar s b -> Maybe (BVar s a)
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
Traversal' b a -> BVar s b -> Maybe (BVar s a)
previewVar (a -> f a) -> b -> f b
Traversal' b a
t BVar s b
v)
where
e :: [Char]
e = [Char]
"Numeric.Backprop.^^?!: Empty traversal"
infixl 8 ^^?!
{-# INLINE (^^?!) #-}
previewVar ::
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
Traversal' b a ->
BVar s b ->
Maybe (BVar s a)
previewVar :: forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
Traversal' b a -> BVar s b -> Maybe (BVar s a)
previewVar = AddFunc a
-> ZeroFunc b -> Traversal' b a -> BVar s b -> Maybe (BVar s a)
forall b a s.
Reifies s W =>
AddFunc a
-> ZeroFunc b -> Traversal' b a -> BVar s b -> Maybe (BVar s a)
E.previewVar AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc ZeroFunc b
forall a. Backprop a => ZeroFunc a
E.zeroFunc
{-# INLINE previewVar #-}
(^^..) ::
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b ->
Traversal' b a ->
[BVar s a]
BVar s b
v ^^.. :: forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b -> Traversal' b a -> [BVar s a]
^^.. Traversal' b a
t = Traversal' b a -> BVar s b -> [BVar s a]
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
Traversal' b a -> BVar s b -> [BVar s a]
toListOfVar (a -> f a) -> b -> f b
Traversal' b a
t BVar s b
v
{-# INLINE (^^..) #-}
toListOfVar ::
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
Traversal' b a ->
BVar s b ->
[BVar s a]
toListOfVar :: forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
Traversal' b a -> BVar s b -> [BVar s a]
toListOfVar = AddFunc a -> ZeroFunc b -> Traversal' b a -> BVar s b -> [BVar s a]
forall b a s.
Reifies s W =>
AddFunc a -> ZeroFunc b -> Traversal' b a -> BVar s b -> [BVar s a]
E.toListOfVar AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc ZeroFunc b
forall a. Backprop a => ZeroFunc a
E.zeroFunc
{-# INLINE toListOfVar #-}
sequenceVar ::
(Traversable t, Backprop a, Reifies s W) =>
BVar s (t a) ->
t (BVar s a)
sequenceVar :: forall (t :: * -> *) a s.
(Traversable t, Backprop a, Reifies s W) =>
BVar s (t a) -> t (BVar s a)
sequenceVar = AddFunc a -> ZeroFunc a -> BVar s (t a) -> t (BVar s a)
forall (t :: * -> *) a s.
(Reifies s W, Traversable t) =>
AddFunc a -> ZeroFunc a -> BVar s (t a) -> t (BVar s a)
E.sequenceVar AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc ZeroFunc a
forall a. Backprop a => ZeroFunc a
E.zeroFunc
{-# INLINE sequenceVar #-}
collectVar ::
(Foldable t, Functor t, Backprop a, Reifies s W) =>
t (BVar s a) ->
BVar s (t a)
collectVar :: forall (t :: * -> *) a s.
(Foldable t, Functor t, Backprop a, Reifies s W) =>
t (BVar s a) -> BVar s (t a)
collectVar = AddFunc a -> ZeroFunc a -> t (BVar s a) -> BVar s (t a)
forall (t :: * -> *) a s.
(Reifies s W, Foldable t, Functor t) =>
AddFunc a -> ZeroFunc a -> t (BVar s a) -> BVar s (t a)
E.collectVar AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc ZeroFunc a
forall a. Backprop a => ZeroFunc a
E.zeroFunc
{-# INLINE collectVar #-}
liftOp ::
(RPureConstrained Backprop as, Reifies s W) =>
Op as b ->
Rec (BVar s) as ->
BVar s b
liftOp :: forall (as :: [*]) s b.
(RPureConstrained Backprop as, Reifies s W) =>
Op as b -> Rec (BVar s) as -> BVar s b
liftOp = Rec AddFunc as -> Op as b -> Rec (BVar s) as -> BVar s b
forall (as :: [*]) b s.
Reifies s W =>
Rec AddFunc as -> Op as b -> Rec (BVar s) as -> BVar s b
E.liftOp Rec AddFunc as
forall (as :: [*]). RPureConstrained Backprop as => Rec AddFunc as
E.addFuncs
{-# INLINE liftOp #-}
liftOp1 ::
(Backprop a, Reifies s W) =>
Op '[a] b ->
BVar s a ->
BVar s b
liftOp1 :: forall a s b.
(Backprop a, Reifies s W) =>
Op '[a] b -> BVar s a -> BVar s b
liftOp1 = AddFunc a -> Op '[a] b -> BVar s a -> BVar s b
forall a b s.
Reifies s W =>
AddFunc a -> Op '[a] b -> BVar s a -> BVar s b
E.liftOp1 AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc
{-# INLINE liftOp1 #-}
liftOp2 ::
(Backprop a, Backprop b, Reifies s W) =>
Op '[a, b] c ->
BVar s a ->
BVar s b ->
BVar s c
liftOp2 :: forall a b s c.
(Backprop a, Backprop b, Reifies s W) =>
Op '[a, b] c -> BVar s a -> BVar s b -> BVar s c
liftOp2 = AddFunc a
-> AddFunc b -> Op '[a, b] c -> BVar s a -> BVar s b -> BVar s c
forall a b c s.
Reifies s W =>
AddFunc a
-> AddFunc b -> Op '[a, b] c -> BVar s a -> BVar s b -> BVar s c
E.liftOp2 AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc AddFunc b
forall a. Backprop a => AddFunc a
E.addFunc
{-# INLINE liftOp2 #-}
liftOp3 ::
(Backprop a, Backprop b, Backprop c, Reifies s W) =>
Op '[a, b, c] d ->
BVar s a ->
BVar s b ->
BVar s c ->
BVar s d
liftOp3 :: forall a b c s d.
(Backprop a, Backprop b, Backprop c, Reifies s W) =>
Op '[a, b, c] d -> BVar s a -> BVar s b -> BVar s c -> BVar s d
liftOp3 = AddFunc a
-> AddFunc b
-> AddFunc c
-> Op '[a, b, c] d
-> BVar s a
-> BVar s b
-> BVar s c
-> BVar s d
forall a b c d s.
Reifies s W =>
AddFunc a
-> AddFunc b
-> AddFunc c
-> Op '[a, b, c] d
-> BVar s a
-> BVar s b
-> BVar s c
-> BVar s d
E.liftOp3 AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc AddFunc b
forall a. Backprop a => AddFunc a
E.addFunc AddFunc c
forall a. Backprop a => AddFunc a
E.addFunc
{-# INLINE liftOp3 #-}
isoVar ::
(Backprop a, Reifies s W) =>
(a -> b) ->
(b -> a) ->
BVar s a ->
BVar s b
isoVar :: forall a s b.
(Backprop a, Reifies s W) =>
(a -> b) -> (b -> a) -> BVar s a -> BVar s b
isoVar = AddFunc a -> (a -> b) -> (b -> a) -> BVar s a -> BVar s b
forall s a b.
Reifies s W =>
AddFunc a -> (a -> b) -> (b -> a) -> BVar s a -> BVar s b
E.isoVar AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc
{-# INLINE isoVar #-}
isoVar2 ::
(Backprop a, Backprop b, Reifies s W) =>
(a -> b -> c) ->
(c -> (a, b)) ->
BVar s a ->
BVar s b ->
BVar s c
isoVar2 :: forall a b s c.
(Backprop a, Backprop b, Reifies s W) =>
(a -> b -> c) -> (c -> (a, b)) -> BVar s a -> BVar s b -> BVar s c
isoVar2 = AddFunc a
-> AddFunc b
-> (a -> b -> c)
-> (c -> (a, b))
-> BVar s a
-> BVar s b
-> BVar s c
forall s a b c.
Reifies s W =>
AddFunc a
-> AddFunc b
-> (a -> b -> c)
-> (c -> (a, b))
-> BVar s a
-> BVar s b
-> BVar s c
E.isoVar2 AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc AddFunc b
forall a. Backprop a => AddFunc a
E.addFunc
{-# INLINE isoVar2 #-}
isoVar3 ::
(Backprop a, Backprop b, Backprop c, Reifies s W) =>
(a -> b -> c -> d) ->
(d -> (a, b, c)) ->
BVar s a ->
BVar s b ->
BVar s c ->
BVar s d
isoVar3 :: forall a b c s d.
(Backprop a, Backprop b, Backprop c, Reifies s W) =>
(a -> b -> c -> d)
-> (d -> (a, b, c)) -> BVar s a -> BVar s b -> BVar s c -> BVar s d
isoVar3 = AddFunc a
-> AddFunc b
-> AddFunc c
-> (a -> b -> c -> d)
-> (d -> (a, b, c))
-> BVar s a
-> BVar s b
-> BVar s c
-> BVar s d
forall s a b c d.
Reifies s W =>
AddFunc a
-> AddFunc b
-> AddFunc c
-> (a -> b -> c -> d)
-> (d -> (a, b, c))
-> BVar s a
-> BVar s b
-> BVar s c
-> BVar s d
E.isoVar3 AddFunc a
forall a. Backprop a => AddFunc a
E.addFunc AddFunc b
forall a. Backprop a => AddFunc a
E.addFunc AddFunc c
forall a. Backprop a => AddFunc a
E.addFunc
{-# INLINE isoVar3 #-}
isoVarN ::
(RPureConstrained Backprop as, Reifies s W) =>
(Rec Identity as -> b) ->
(b -> Rec Identity as) ->
Rec (BVar s) as ->
BVar s b
isoVarN :: forall (as :: [*]) s b.
(RPureConstrained Backprop as, Reifies s W) =>
(Rec Identity as -> b)
-> (b -> Rec Identity as) -> Rec (BVar s) as -> BVar s b
isoVarN = Rec AddFunc as
-> (Rec Identity as -> b)
-> (b -> Rec Identity as)
-> Rec (BVar s) as
-> BVar s b
forall s (as :: [*]) b.
Reifies s W =>
Rec AddFunc as
-> (Rec Identity as -> b)
-> (b -> Rec Identity as)
-> Rec (BVar s) as
-> BVar s b
E.isoVarN Rec AddFunc as
forall (as :: [*]). RPureConstrained Backprop as => Rec AddFunc as
E.addFuncs
{-# INLINE isoVarN #-}
pattern T2 ::
(Backprop a, Backprop b, Reifies s W) =>
BVar s a ->
BVar s b ->
BVar s (a, b)
pattern $mT2 :: forall {r} {a} {b} {s}.
(Backprop a, Backprop b, Reifies s W) =>
BVar s (a, b) -> (BVar s a -> BVar s b -> r) -> ((# #) -> r) -> r
$bT2 :: forall a b s.
(Backprop a, Backprop b, Reifies s W) =>
BVar s a -> BVar s b -> BVar s (a, b)
T2 x y <- (\BVar s (a, b)
xy -> (BVar s (a, b)
xy BVar s (a, b) -> Lens' (a, b) a -> BVar s a
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b -> Lens' b a -> BVar s a
^^. (a -> f a) -> (a, b) -> f (a, b)
forall s t a b. Field1 s t a b => Lens s t a b
Lens' (a, b) a
_1, BVar s (a, b)
xy BVar s (a, b) -> Lens' (a, b) b -> BVar s b
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b -> Lens' b a -> BVar s a
^^. (b -> f b) -> (a, b) -> f (a, b)
forall s t a b. Field2 s t a b => Lens s t a b
Lens' (a, b) b
_2) -> (x, y))
where
T2 = (a -> b -> (a, b))
-> ((a, b) -> (a, b)) -> BVar s a -> BVar s b -> BVar s (a, b)
forall a b s c.
(Backprop a, Backprop b, Reifies s W) =>
(a -> b -> c) -> (c -> (a, b)) -> BVar s a -> BVar s b -> BVar s c
isoVar2 (,) (a, b) -> (a, b)
forall a. a -> a
id
#if MIN_VERSION_base(4,10,0)
{-# COMPLETE BV #-}
#endif
pattern T3 ::
(Backprop a, Backprop b, Backprop c, Reifies s W) =>
BVar s a ->
BVar s b ->
BVar s c ->
BVar s (a, b, c)
pattern $mT3 :: forall {r} {a} {b} {c} {s}.
(Backprop a, Backprop b, Backprop c, Reifies s W) =>
BVar s (a, b, c)
-> (BVar s a -> BVar s b -> BVar s c -> r) -> ((# #) -> r) -> r
$bT3 :: forall a b c s.
(Backprop a, Backprop b, Backprop c, Reifies s W) =>
BVar s a -> BVar s b -> BVar s c -> BVar s (a, b, c)
T3 x y z <- (\BVar s (a, b, c)
xyz -> (BVar s (a, b, c)
xyz BVar s (a, b, c) -> Lens' (a, b, c) a -> BVar s a
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b -> Lens' b a -> BVar s a
^^. (a -> f a) -> (a, b, c) -> f (a, b, c)
forall s t a b. Field1 s t a b => Lens s t a b
Lens' (a, b, c) a
_1, BVar s (a, b, c)
xyz BVar s (a, b, c) -> Lens' (a, b, c) b -> BVar s b
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b -> Lens' b a -> BVar s a
^^. (b -> f b) -> (a, b, c) -> f (a, b, c)
forall s t a b. Field2 s t a b => Lens s t a b
Lens' (a, b, c) b
_2, BVar s (a, b, c)
xyz BVar s (a, b, c) -> Lens' (a, b, c) c -> BVar s c
forall b a s.
(Backprop b, Backprop a, Reifies s W) =>
BVar s b -> Lens' b a -> BVar s a
^^. (c -> f c) -> (a, b, c) -> f (a, b, c)
forall s t a b. Field3 s t a b => Lens s t a b
Lens' (a, b, c) c
_3) -> (x, y, z))
where
T3 = (a -> b -> c -> (a, b, c))
-> ((a, b, c) -> (a, b, c))
-> BVar s a
-> BVar s b
-> BVar s c
-> BVar s (a, b, c)
forall a b c s d.
(Backprop a, Backprop b, Backprop c, Reifies s W) =>
(a -> b -> c -> d)
-> (d -> (a, b, c)) -> BVar s a -> BVar s b -> BVar s c -> BVar s d
isoVar3 (,,) (a, b, c) -> (a, b, c)
forall a. a -> a
id
#if MIN_VERSION_base(4,10,0)
{-# COMPLETE BV #-}
#endif
splitBV ::
( Generic (z f)
, Generic (z (BVar s))
, E.BVGroup s as (Rep (z f)) (Rep (z (BVar s)))
, Backprop (z f)
, Backprop (Rep (z f) ())
, RPureConstrained Backprop as
, Reifies s W
) =>
BVar s (z f) ->
z (BVar s)
splitBV :: forall (z :: (* -> *) -> *) (f :: * -> *) s (as :: [*]).
(Generic (z f), Generic (z (BVar s)),
BVGroup s as (Rep (z f)) (Rep (z (BVar s))), Backprop (z f),
Backprop (Rep (z f) ()), RPureConstrained Backprop as,
Reifies s W) =>
BVar s (z f) -> z (BVar s)
splitBV = AddFunc (Rep (z f) ())
-> Rec AddFunc as
-> ZeroFunc (z f)
-> Rec ZeroFunc as
-> BVar s (z f)
-> z (BVar s)
forall (z :: (* -> *) -> *) (f :: * -> *) s (as :: [*]).
(Generic (z f), Generic (z (BVar s)),
BVGroup s as (Rep (z f)) (Rep (z (BVar s))), Reifies s W) =>
AddFunc (Rep (z f) ())
-> Rec AddFunc as
-> ZeroFunc (z f)
-> Rec ZeroFunc as
-> BVar s (z f)
-> z (BVar s)
E.splitBV AddFunc (Rep (z f) ())
forall a. Backprop a => AddFunc a
E.addFunc Rec AddFunc as
forall (as :: [*]). RPureConstrained Backprop as => Rec AddFunc as
E.addFuncs ZeroFunc (z f)
forall a. Backprop a => ZeroFunc a
E.zeroFunc Rec ZeroFunc as
forall (as :: [*]). RPureConstrained Backprop as => Rec ZeroFunc as
E.zeroFuncs
{-# INLINE splitBV #-}
joinBV ::
( Generic (z f)
, Generic (z (BVar s))
, E.BVGroup s as (Rep (z f)) (Rep (z (BVar s)))
, Backprop (z f)
, Backprop (Rep (z f) ())
, RPureConstrained Backprop as
, Reifies s W
) =>
z (BVar s) ->
BVar s (z f)
joinBV :: forall (z :: (* -> *) -> *) (f :: * -> *) s (as :: [*]).
(Generic (z f), Generic (z (BVar s)),
BVGroup s as (Rep (z f)) (Rep (z (BVar s))), Backprop (z f),
Backprop (Rep (z f) ()), RPureConstrained Backprop as,
Reifies s W) =>
z (BVar s) -> BVar s (z f)
joinBV = AddFunc (z f)
-> Rec AddFunc as
-> ZeroFunc (Rep (z f) ())
-> Rec ZeroFunc as
-> z (BVar s)
-> BVar s (z f)
forall (z :: (* -> *) -> *) (f :: * -> *) s (as :: [*]).
(Generic (z f), Generic (z (BVar s)),
BVGroup s as (Rep (z f)) (Rep (z (BVar s))), Reifies s W) =>
AddFunc (z f)
-> Rec AddFunc as
-> ZeroFunc (Rep (z f) ())
-> Rec ZeroFunc as
-> z (BVar s)
-> BVar s (z f)
E.joinBV AddFunc (z f)
forall a. Backprop a => AddFunc a
E.addFunc Rec AddFunc as
forall (as :: [*]). RPureConstrained Backprop as => Rec AddFunc as
E.addFuncs ZeroFunc (Rep (z f) ())
forall a. Backprop a => ZeroFunc a
E.zeroFunc Rec ZeroFunc as
forall (as :: [*]). RPureConstrained Backprop as => Rec ZeroFunc as
E.zeroFuncs
{-# INLINE joinBV #-}
pattern BV ::
( Generic (z f)
, Generic (z (BVar s))
, E.BVGroup s as (Rep (z f)) (Rep (z (BVar s)))
, Backprop (Rep (z f) ())
, Backprop (z f)
, RPureConstrained Backprop as
, RecApplicative as
, Reifies s W
)
#if MIN_VERSION_base(4,10,0)
=> z (BVar s)
-> BVar s (z f)
#else
=> z (BVar s)
-> BVar s (z f)
#endif
pattern $mBV :: forall {r} {z :: (* -> *) -> *} {f :: * -> *} {s} {as :: [*]}.
(Generic (z f), Generic (z (BVar s)),
BVGroup s as (Rep (z f)) (Rep (z (BVar s))),
Backprop (Rep (z f) ()), Backprop (z f),
RPureConstrained Backprop as, RecApplicative as, Reifies s W) =>
BVar s (z f) -> (z (BVar s) -> r) -> ((# #) -> r) -> r
$bBV :: forall (z :: (* -> *) -> *) (f :: * -> *) s (as :: [*]).
(Generic (z f), Generic (z (BVar s)),
BVGroup s as (Rep (z f)) (Rep (z (BVar s))),
Backprop (Rep (z f) ()), Backprop (z f),
RPureConstrained Backprop as, RecApplicative as, Reifies s W) =>
z (BVar s) -> BVar s (z f)
BV v <- (splitBV -> v)
where
BV = z (BVar s) -> BVar s (z f)
forall (z :: (* -> *) -> *) (f :: * -> *) s (as :: [*]).
(Generic (z f), Generic (z (BVar s)),
BVGroup s as (Rep (z f)) (Rep (z (BVar s))), Backprop (z f),
Backprop (Rep (z f) ()), RPureConstrained Backprop as,
Reifies s W) =>
z (BVar s) -> BVar s (z f)
joinBV
#if MIN_VERSION_base(4,10,0)
{-# COMPLETE BV #-}
#endif