packages feed

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 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