backprop 0.2.6.2 → 0.2.6.3
raw patch · 4 files changed
+208/−219 lines, 4 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Numeric.Backprop.Class: instance (Data.Vinyl.Core.ReifyConstraint Numeric.Backprop.Class.Backprop f rs, Data.Vinyl.Core.RMap rs, Data.Vinyl.Core.RApply rs) => Numeric.Backprop.Class.Backprop (Data.Vinyl.Core.Rec f rs)
+ Numeric.Backprop.Class: instance (Data.Vinyl.Core.ReifyConstraint Numeric.Backprop.Class.Backprop f rs, Data.Vinyl.Core.RMap rs, Data.Vinyl.Core.RApply rs, Data.Vinyl.Core.RecApplicative rs, Data.Vinyl.TypeLevel.NatToInt (Data.Vinyl.TypeLevel.RLength rs), Data.Vinyl.Core.RPureConstrained (Data.Vinyl.ARec.IndexableField rs) rs) => Numeric.Backprop.Class.Backprop (Data.Vinyl.ARec.ARec f rs)
+ Numeric.Backprop.Class: instance (Data.Vinyl.Core.ReifyConstraint Numeric.Backprop.Class.Backprop f rs, Data.Vinyl.Core.RMap rs, Data.Vinyl.Core.RApply rs, Data.Vinyl.XRec.IsoXRec f rs) => Numeric.Backprop.Class.Backprop (Data.Vinyl.XRec.XRec f rs)
+ Numeric.Backprop.Class: instance (Data.Vinyl.Core.ReifyConstraint Numeric.Backprop.Class.Backprop f rs, Data.Vinyl.Core.RMap rs, Data.Vinyl.Core.RApply rs, Foreign.Storable.Storable (Data.Vinyl.Core.Rec f rs)) => Numeric.Backprop.Class.Backprop (Data.Vinyl.SRec.SRec f rs)
+ Numeric.Backprop.Class: instance Numeric.Backprop.Class.Backprop (Data.Vinyl.Derived.Label field)
+ Numeric.Backprop.Class: instance Numeric.Backprop.Class.Backprop (Data.Vinyl.Derived.SField field)
+ Numeric.Backprop.Class: instance Numeric.Backprop.Class.Backprop (Data.Vinyl.XRec.HKD t a) => Numeric.Backprop.Class.Backprop (Data.Vinyl.XRec.XData t a)
+ Numeric.Backprop.Class: instance Numeric.Backprop.Class.Backprop (f (g a)) => Numeric.Backprop.Class.Backprop ((GHC.Generics.:.:) f g a)
+ Numeric.Backprop.Class: instance Numeric.Backprop.Class.Backprop (f (g a)) => Numeric.Backprop.Class.Backprop (Data.Vinyl.Functor.Compose f g a)
+ Numeric.Backprop.Class: instance Numeric.Backprop.Class.Backprop (op (f a) (g a)) => Numeric.Backprop.Class.Backprop (Data.Vinyl.Functor.Lift op f g a)
+ Numeric.Backprop.Class: instance Numeric.Backprop.Class.Backprop a => Numeric.Backprop.Class.Backprop (Data.Vinyl.Functor.Identity a)
+ Numeric.Backprop.Class: instance Numeric.Backprop.Class.Backprop a => Numeric.Backprop.Class.Backprop (Data.Vinyl.Functor.Thunk a)
+ Numeric.Backprop.Class: instance Numeric.Backprop.Class.Backprop t => Numeric.Backprop.Class.Backprop (Data.Vinyl.Functor.ElField '(s, t))
+ Numeric.Backprop.Class: instance Numeric.Backprop.Class.Backprop w => Numeric.Backprop.Class.Backprop (Data.Vinyl.Functor.Const w a)
Files
- CHANGELOG.md +11/−0
- backprop.cabal +3/−3
- src/Numeric/Backprop/Class.hs +171/−199
- src/Numeric/Backprop/Internal.hs +23/−17
CHANGELOG.md view
@@ -1,6 +1,17 @@ Changelog ========= +Version 0.2.6.3+---------------++*August 13, 2019*++<https://github.com/mstksg/backprop/releases/tag/v0.2.6.3>++* Add `Backprop` instances for the various *vinyl* types.+* Rewrite many `Backprop` instances over newtypes to coerce instead of go+ through Generics+ Version 0.2.6.2 ---------------
backprop.cabal view
@@ -1,13 +1,13 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.31.1.+-- This file has been generated from package.yaml by hpack version 0.31.2. -- -- see: https://github.com/sol/hpack ----- hash: fe389131c629c91aba7d98e6c95411c83f558b8fec788d0d12405bdf4db507aa+-- hash: a9461183db8be7dbe24825f41a9efd5aaa5b42ab7a4745958b02fe5e5e59f826 name: backprop-version: 0.2.6.2+version: 0.2.6.3 synopsis: Heterogeneous automatic differentation description: Write your functions to compute your result, and the library will automatically generate functions to compute your gradient.
src/Numeric/Backprop/Class.hs view
@@ -53,28 +53,33 @@ import Data.Coerce import Data.Complex import Data.Data-import Data.Foldable hiding (toList)+import Data.Foldable hiding (toList) import Data.Functor.Compose import Data.Functor.Identity-import Data.List.NonEmpty (NonEmpty(..))+import Data.List.NonEmpty (NonEmpty(..)) import Data.Monoid import Data.Ratio+import Data.Vinyl+import Data.Vinyl.ARec+import Data.Vinyl.TypeLevel import Data.Void import Data.Word import GHC.Exts import GHC.Generics import Numeric.Natural-import qualified Control.Arrow as Arr-import qualified Data.Functor.Product as DFP-import qualified Data.IntMap as IM-import qualified Data.Map as M-import qualified Data.Semigroup as SG-import qualified Data.Sequence as Seq-import qualified Data.Vector as V-import qualified Data.Vector.Generic as VG-import qualified Data.Vector.Primitive as VP-import qualified Data.Vector.Storable as VS-import qualified Data.Vector.Unboxed as VU+import qualified Control.Arrow as Arr+import qualified Data.Functor.Product as DFP+import qualified Data.IntMap as IM+import qualified Data.Map as M+import qualified Data.Semigroup as SG+import qualified Data.Sequence as Seq+import qualified Data.Vector as V+import qualified Data.Vector.Generic as VG+import qualified Data.Vector.Primitive as VP+import qualified Data.Vector.Storable as VS+import qualified Data.Vector.Unboxed as VU+import qualified Data.Vinyl.Functor as V+import qualified Data.Vinyl.XRec as V -- | Class of values that can be backpropagated in general. --@@ -811,20 +816,9 @@ {-# INLINE one #-} instance Backprop a => Backprop (Identity a) where- zero (Identity x) = Identity (zero x)- {-# INLINE zero #-}- add (Identity x) (Identity y) = Identity (add x y)- {-# INLINE add #-}- one (Identity x) = Identity (one x)- {-# INLINE one #-}---- instance Backprop a => Backprop (I a) where--- zero (I x) = I (zero x)--- {-# INLINE zero #-}--- add (I x) (I y) = I (add x y)--- {-# INLINE add #-}--- one (I x) = I (one x)--- {-# INLINE one #-}+ zero = coerce (zero @a)+ add = coerce (add @a)+ one = coerce (one @a) instance Backprop (Proxy a) where zero _ = Proxy@@ -836,9 +830,9 @@ -- | @since 0.2.2.0 instance Backprop w => Backprop (Const w a) where- zero (Const x) = Const (zero x)- add (Const x) (Const y) = Const (add x y)- one (Const x) = Const (one x)+ zero = coerce (zero @w)+ add = coerce (add @w)+ one = coerce (one @w) instance Backprop Void where zero = \case {}@@ -868,173 +862,27 @@ one = oneFunctor {-# INLINE one #-} --- instance ListC (Backprop <$> (f <$> as)) => Backprop (Prod f as) where--- zero = \case--- Ø -> Ø--- x :< xs -> zero x :< zero xs--- {-# INLINE zero #-}--- add = \case--- Ø -> \case--- Ø -> Ø--- x :< xs -> \case--- y :< ys -> add x y :< add xs ys--- {-# INLINE add #-}--- one = \case--- Ø -> Ø--- x :< xs -> one x :< one xs--- {-# INLINE one #-}---- instance M.MaybeC (Backprop M.<$> (f M.<$> a)) => Backprop (Option f a) where--- zero = \case--- Nothing_ -> Nothing_--- Just_ x -> Just_ (zero x)--- {-# INLINE zero #-}--- add = \case--- Nothing_ -> \case--- Nothing_ -> Nothing_--- Just_ x -> \case--- Just_ y -> Just_ (add x y)--- {-# INLINE add #-}--- one = \case--- Nothing_ -> Nothing_--- Just_ x -> Just_ (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance (Backprop (f a), Backprop (g a)) => Backprop ((f :&: g) a) where--- zero (x :&: y) = zero x :&: zero y--- {-# INLINE zero #-}--- add (x1 :&: y1) (x2 :&: y2) = add x1 x2 :&: add y1 y2--- {-# INLINE add #-}--- one (x :&: y) = one x :&: one y--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance (Backprop (f a), Backprop (g b)) => Backprop ((f TC.:*: g) '(a, b)) where--- zero (x TC.:*: y) = zero x TC.:*: zero y--- {-# INLINE zero #-}--- add (x1 TC.:*: y1) (x2 TC.:*: y2) = add x1 x2 TC.:*: add y1 y2--- {-# INLINE add #-}--- one (x TC.:*: y) = one x TC.:*: one y--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (f (g h) a) => Backprop (TC.Comp1 f g h a) where--- zero (TC.Comp1 x) = TC.Comp1 (zero x)--- {-# INLINE zero #-}--- add (TC.Comp1 x) (TC.Comp1 y) = TC.Comp1 (add x y)--- {-# INLINE add #-}--- one (TC.Comp1 x) = TC.Comp1 (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (f (g a)) => Backprop ((f TC.:.: g) a) where--- zero (Comp x) = Comp (zero x)--- {-# INLINE zero #-}--- add (Comp x) (Comp y) = Comp (add x y)--- {-# INLINE add #-}--- one (Comp x) = Comp (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop w => Backprop (TC.C w a) where--- zero (TC.C x) = TC.C (zero x)--- {-# INLINE zero #-}--- add (TC.C x) (TC.C y) = TC.C (add x y)--- {-# INLINE add #-}--- one (TC.C x) = TC.C (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (p a b) => Backprop (Flip p b a) where--- zero (Flip x) = Flip (zero x)--- {-# INLINE zero #-}--- add (Flip x) (Flip y) = Flip (add x y)--- {-# INLINE add #-}--- one (Flip x) = Flip (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (p '(a, b)) => Backprop (Cur p a b) where--- zero (Cur x) = Cur (zero x)--- {-# INLINE zero #-}--- add (Cur x) (Cur y) = Cur (add x y)--- {-# INLINE add #-}--- one (Cur x) = Cur (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (p a b) => Backprop (Uncur p '(a, b)) where--- zero (Uncur x) = Uncur (zero x)--- {-# INLINE zero #-}--- add (Uncur x) (Uncur y) = Uncur (add x y)--- {-# INLINE add #-}--- one (Uncur x) = Uncur (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (p '(a, b, c)) => Backprop (Cur3 p a b c) where--- zero (Cur3 x) = Cur3 (zero x)--- {-# INLINE zero #-}--- add (Cur3 x) (Cur3 y) = Cur3 (add x y)--- {-# INLINE add #-}--- one (Cur3 x) = Cur3 (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (p a b c) => Backprop (Uncur3 p '(a, b, c)) where--- zero (Uncur3 x) = Uncur3 (zero x)--- {-# INLINE zero #-}--- add (Uncur3 x) (Uncur3 y) = Uncur3 (add x y)--- {-# INLINE add #-}--- one (Uncur3 x) = Uncur3 (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (f a a) => Backprop (Join f a) where--- zero (Join x) = Join (zero x)--- {-# INLINE zero #-}--- add (Join x) (Join y) = Join (add x y)--- {-# INLINE add #-}--- one (Join x) = Join (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (t (Flip f b) a) => Backprop (Conj t f a b) where--- zero (Conj x) = Conj (zero x)--- {-# INLINE zero #-}--- add (Conj x) (Conj y) = Conj (add x y)--- {-# INLINE add #-}--- one (Conj x) = Conj (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (c (f a)) => Backprop (LL c a f) where--- zero (LL x) = LL (zero x)--- {-# INLINE zero #-}--- add (LL x) (LL y) = LL (add x y)--- {-# INLINE add #-}--- one (LL x) = LL (one x)--- {-# INLINE one #-}---- -- | @since 0.2.2.0--- instance Backprop (c (f a)) => Backprop (RR c f a) where--- zero (RR x) = RR (zero x)--- {-# INLINE zero #-}--- add (RR x) (RR y) = RR (add x y)--- {-# INLINE add #-}--- one (RR x) = RR (one x)--- {-# INLINE one #-}- -- | @since 0.2.2.0-instance Backprop a => Backprop (K1 i a p)+instance Backprop a => Backprop (K1 i a p) where+ zero = coerce (zero @a)+ add = coerce (add @a)+ one = coerce (one @a) -- | @since 0.2.2.0-instance Backprop (f p) => Backprop (M1 i c f p)+instance Backprop (f p) => Backprop (M1 i c f p) where+ zero = coerce (zero @(f p))+ add = coerce (add @(f p))+ one = coerce (one @(f p)) -- | @since 0.2.2.0 instance (Backprop (f p), Backprop (g p)) => Backprop ((f :*: g) p) +-- | @since 0.2.6.3+instance (Backprop (f (g a))) => Backprop ((f :.: g) a) where+ zero = coerce (zero @(f (g a)))+ add = coerce (add @(f (g a)))+ one = coerce (one @(f (g a)))+ -- | @since 0.2.2.0 instance Backprop (V1 p) @@ -1042,28 +890,52 @@ instance Backprop (U1 p) -- | @since 0.2.2.0-instance Backprop a => Backprop (Sum a)+instance Backprop a => Backprop (Sum a) where+ zero = coerce (zero @a)+ add = coerce (add @a)+ one = coerce (one @a) -- | @since 0.2.2.0-instance Backprop a => Backprop (Product a)+instance Backprop a => Backprop (Product a) where+ zero = coerce (zero @a)+ add = coerce (add @a)+ one = coerce (one @a) -- | @since 0.2.2.0-instance Backprop a => Backprop (SG.Option a)+instance Backprop a => Backprop (SG.Option a) where+ zero = coerce (zero @(Maybe a))+ add = coerce (add @(Maybe a))+ one = coerce (one @(Maybe a)) -- | @since 0.2.2.0-instance Backprop a => Backprop (SG.First a)+instance Backprop a => Backprop (SG.First a) where+ zero = coerce (zero @a)+ add = coerce (add @a)+ one = coerce (one @a) -- | @since 0.2.2.0-instance Backprop a => Backprop (SG.Last a)+instance Backprop a => Backprop (SG.Last a) where+ zero = coerce (zero @a)+ add = coerce (add @a)+ one = coerce (one @a) -- | @since 0.2.2.0-instance Backprop a => Backprop (First a)+instance Backprop a => Backprop (First a) where+ zero = coerce (zero @(Maybe a))+ add = coerce (add @(Maybe a))+ one = coerce (one @(Maybe a)) -- | @since 0.2.2.0-instance Backprop a => Backprop (Data.Monoid.Last a)+instance Backprop a => Backprop (Data.Monoid.Last a) where+ zero = coerce (zero @(Maybe a))+ add = coerce (add @(Maybe a))+ one = coerce (one @(Maybe a)) -- | @since 0.2.2.0-instance Backprop a => Backprop (Dual a)+instance Backprop a => Backprop (Dual a) where+ zero = coerce (zero @a)+ add = coerce (add @a)+ one = coerce (one @a) -- | @since 0.2.2.0 instance (Backprop a, Backprop b) => Backprop (SG.Arg a b)@@ -1072,7 +944,10 @@ instance (Backprop (f a), Backprop (g a)) => Backprop (DFP.Product f g a) -- | @since 0.2.2.0-instance Backprop (f (g a)) => Backprop (Compose f g a)+instance Backprop (f (g a)) => Backprop (Compose f g a) where+ zero = coerce (zero @(f (g a)))+ add = coerce (add @(f (g a)))+ one = coerce (one @(f (g a))) -- | 'add' adds together results; 'zero' and 'one' act on results. --@@ -1091,5 +966,102 @@ {-# INLINE zero #-} add (Arr.Kleisli f) (Arr.Kleisli g) = Arr.Kleisli $ \x -> add <$> f x <*> g x+ {-# INLINE add #-} one (Arr.Kleisli f) = Arr.Kleisli ((fmap . fmap) one f) {-# INLINE one #-}++-- | @since 0.2.6.3+instance (ReifyConstraint Backprop f rs, RMap rs, RApply rs) => Backprop (Rec f rs) where+ zero = rmap (\case V.Compose (Dict x) -> zero x)+ . reifyConstraint @Backprop+ {-# INLINE zero #-}+ add xs = rzipWith (\x -> \case V.Compose (Dict y) -> add x y) xs+ . reifyConstraint @Backprop+ {-# INLINE add #-}+ one = rmap (\case V.Compose (Dict x) -> one x)+ . reifyConstraint @Backprop+ {-# INLINE one #-}++-- | @since 0.2.6.3+instance (ReifyConstraint Backprop f rs, RMap rs, RApply rs, RecApplicative rs, NatToInt (RLength rs), RPureConstrained (IndexableField rs) rs)+ => Backprop (ARec f rs) where+ zero = toARec . zero . fromARec+ {-# INLINE zero #-}+ add xs ys = toARec $ add (fromARec xs) (fromARec ys)+ {-# INLINE add #-}+ one = toARec . zero . fromARec+ {-# INLINE one #-}++-- | @since 0.2.6.3+instance (ReifyConstraint Backprop f rs, RMap rs, RApply rs, VS.Storable (Rec f rs))+ => Backprop (SRec f rs) where+ zero = toSRec . zero . fromSRec+ {-# INLINE zero #-}+ add xs ys = toSRec $ add (fromSRec xs) (fromSRec ys)+ {-# INLINE add #-}+ one = toSRec . zero . fromSRec+ {-# INLINE one #-}++-- | @since 0.2.6.3+instance (ReifyConstraint Backprop f rs, RMap rs, RApply rs, IsoXRec f rs)+ => Backprop (XRec f rs) where+ zero = toXRec . zero . fromXRec+ {-# INLINE zero #-}+ add xs ys = toXRec $ add (fromXRec xs) (fromXRec ys)+ {-# INLINE add #-}+ one = toXRec . zero . fromXRec+ {-# INLINE one #-}++-- | @since 0.2.6.3+instance Backprop a => Backprop (V.Identity a) where+ zero = coerce (zero @a)+ add = coerce (add @a)+ one = coerce (one @a)++-- | @since 0.2.6.3+instance Backprop a => Backprop (V.Thunk a) where+ zero (V.Thunk x) = V.Thunk (zero x)+ add (V.Thunk x) (V.Thunk y) = V.Thunk (add x y)+ one (V.Thunk x) = V.Thunk (one x)++-- | @since 0.2.6.3+instance Backprop (op (f a) (g a)) => Backprop (V.Lift op f g a) where+ zero = coerce (zero @(op (f a) (g a)))+ add = coerce (add @(op (f a) (g a)))+ one = coerce (one @(op (f a) (g a)))++-- | @since 0.2.6.3+instance Backprop t => Backprop (V.ElField '(s, t)) where+ zero (V.Field x) = V.Field (zero x)+ add (V.Field x) (V.Field y) = V.Field (add x y)+ one (V.Field x) = V.Field (one x)++-- | @since 0.2.6.3+instance Backprop (f (g a)) => Backprop (V.Compose f g a) where+ zero = coerce (zero @(f (g a)))+ add = coerce (add @(f (g a)))+ one = coerce (one @(f (g a)))++-- | @since 0.2.6.3+instance Backprop w => Backprop (V.Const w a) where+ zero = coerce (zero @w)+ add = coerce (add @w)+ one = coerce (one @w)++-- | @since 0.2.6.3+instance Backprop (V.HKD t a) => Backprop (V.XData t a) where+ zero = coerce (zero @(V.HKD t a))+ add = coerce (add @(V.HKD t a))+ one = coerce (one @(V.HKD t a))++-- | @since 0.2.6.3+instance Backprop (SField field) where+ zero _ = SField+ add _ _ = SField+ one _ = SField++-- | @since 0.2.6.3+instance Backprop (Label field) where+ zero _ = Label+ add _ _ = Label+ one _ = Label
src/Numeric/Backprop/Internal.hs view
@@ -1,20 +1,22 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE EmptyCase #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeInType #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE ViewPatterns #-}-{-# OPTIONS_HADDOCK not-home #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE EmptyCase #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeInType #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE ViewPatterns #-}+{-# OPTIONS_HADDOCK not-home #-} -- | -- Module : Numeric.Backprop.Internal@@ -75,6 +77,7 @@ import qualified Data.Vector as V import qualified Data.Vector.Mutable as MV import qualified Data.Vinyl.Recursive as VR+import qualified Data.Vinyl.XRec as X -- | "Zero out" all components of a value. For scalar values, this should -- just be @'const' 0@. For vectors and matrices, this should set all@@ -190,6 +193,9 @@ -- | @since 0.1.5.1 deriving instance Typeable (BVar s a)++-- | @since 0.2.6.3+instance X.IsoHKD (BVar s) a data BRef (s :: Type) = BRInp !Int | BRIx !Int