backprop 0.2.7.0 → 0.2.7.1
raw patch · 3 files changed
+53/−8 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Numeric.Backprop.Internal: data W
+ Numeric.Backprop.Internal: BRC :: BRef s
+ Numeric.Backprop.Internal: BRInp :: !Int -> BRef s
+ Numeric.Backprop.Internal: BRIx :: !Int -> BRef s
+ Numeric.Backprop.Internal: BV :: !BRef s -> !a -> BVar s a
+ Numeric.Backprop.Internal: R :: !MVector s (Maybe (Any :: Type)) -> !MVector s (Maybe (Any :: Type)) -> Runner s
+ Numeric.Backprop.Internal: W :: IORef (Int, [SomeTapeNode]) -> W
+ Numeric.Backprop.Internal: [STN] :: forall a. !TapeNode a -> SomeTapeNode
+ Numeric.Backprop.Internal: [TN] :: forall (as :: [Type]) a. !Rec InpRef as -> !a -> Rec Identity as -> TapeNode a
+ Numeric.Backprop.Internal: [_bvRef] :: BVar s a -> !BRef s
+ Numeric.Backprop.Internal: [_bvVal] :: BVar s a -> !a
+ Numeric.Backprop.Internal: [_rDelta] :: Runner s -> !MVector s (Maybe (Any :: Type))
+ Numeric.Backprop.Internal: [_rInputs] :: Runner s -> !MVector s (Maybe (Any :: Type))
+ Numeric.Backprop.Internal: [wRef] :: W -> IORef (Int, [SomeTapeNode])
+ Numeric.Backprop.Internal: bumpMaybe :: a -> (a -> b -> b) -> (a -> b) -> Maybe b -> Maybe b
+ Numeric.Backprop.Internal: bvConst :: BVar s a -> Maybe a
+ Numeric.Backprop.Internal: data BRef s
+ Numeric.Backprop.Internal: data Runner s
+ Numeric.Backprop.Internal: data SomeTapeNode
+ Numeric.Backprop.Internal: data TapeNode a
+ Numeric.Backprop.Internal: fillWengert :: forall (as :: [Type]) b. (forall s. Reifies s W => Rec (BVar s) as -> BVar s b) -> Rec Identity as -> IO (Either Int (Int, [SomeTapeNode]), b)
+ Numeric.Backprop.Internal: forceBVar :: BVar s a -> ()
+ Numeric.Backprop.Internal: forceInpRef :: InpRef a -> ()
+ Numeric.Backprop.Internal: forceSomeTapeNode :: SomeTapeNode -> ()
+ Numeric.Backprop.Internal: forceTapeNode :: TapeNode a -> ()
+ Numeric.Backprop.Internal: gradRunner :: b -> Runner s -> (Int, [SomeTapeNode]) -> ST s ()
+ Numeric.Backprop.Internal: initRunner :: (Int, [SomeTapeNode]) -> (Int, [Maybe (Any :: Type)]) -> ST s (Runner s)
+ Numeric.Backprop.Internal: initWengert :: IO W
+ Numeric.Backprop.Internal: insertNode :: TapeNode a -> a -> W -> IO (BVar s a)
+ Numeric.Backprop.Internal: newtype W
Files
- CHANGELOG.md +10/−0
- backprop.cabal +1/−1
- src/Numeric/Backprop/Internal.hs +42/−7
CHANGELOG.md view
@@ -1,6 +1,16 @@ Changelog ========= +Version 0.2.7.1+---------------++*June 1, 2025*++<https://github.com/mstksg/backprop/releases/tag/v0.2.7.1>++* Actually export internal constructors and utilities in+ `Numeric.Backprop.Internal`.+ Version 0.2.7.0 ---------------
backprop.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.12 name: backprop-version: 0.2.7.0+version: 0.2.7.1 synopsis: Heterogeneous automatic differentation description: Write your functions to compute your result, and the library will
src/Numeric/Backprop/Internal.hs view
@@ -35,8 +35,9 @@ -- -- @since 0.2.7.0 module Numeric.Backprop.Internal (- BVar,- W,+ -- * Exported for re-use+ BVar (..),+ W (..), backpropWithN, evalBPN, constVar,@@ -66,6 +67,23 @@ -- * Debug debugSTN, debugIR,++ -- * Only used internally+ TapeNode (..),+ SomeTapeNode (..),+ BRef (..),+ Runner (..),+ initWengert,+ insertNode,+ bvConst,+ forceBVar,+ forceInpRef,+ forceSomeTapeNode,+ forceTapeNode,+ fillWengert,+ bumpMaybe,+ initRunner,+ gradRunner, ) where import Control.DeepSeq@@ -207,10 +225,12 @@ -- -- See "Numeric.Backprop#liftops" and documentation for -- 'Numeric.Backprop.liftOp' for more information.-data BVar s a = BV- { _bvRef :: !(BRef s)- , _bvVal :: !a- }+data BVar s a+ = -- | @since 0.2.7.1+ BV+ { _bvRef :: !(BRef s)+ , _bvVal :: !a+ } -- | @since 0.1.5.1 deriving instance Typeable (BVar s a)@@ -218,6 +238,7 @@ -- | @since 0.2.6.3 instance X.IsoHKD (BVar s) a +-- | @since 0.2.7.1 data BRef (s :: Type) = BRInp !Int | BRIx !Int@@ -240,6 +261,7 @@ forceBVar (BV r !_) = force r `seq` () {-# INLINE forceBVar #-} +-- | @since 0.2.7.1 data InpRef :: Type -> Type where IR :: { _irIx :: !(BVar s b)@@ -248,6 +270,7 @@ } -> InpRef a +-- | @since 0.2.7.1 forceInpRef :: InpRef a -> () forceInpRef (IR v !_ !_) = forceBVar v `seq` () {-# INLINE forceInpRef #-}@@ -256,6 +279,7 @@ debugIR :: InpRef a -> String debugIR IR{..} = show (_bvRef _irIx) +-- | @since 0.2.7.1 data TapeNode :: Type -> Type where TN :: { _tnInputs :: !(Rec InpRef as)@@ -263,16 +287,19 @@ } -> TapeNode a +-- | @since 0.2.7.1 forceTapeNode :: TapeNode a -> () forceTapeNode (TN inps !_) = VR.rfoldMap forceInpRef inps `seq` () {-# INLINE forceTapeNode #-} +-- | @since 0.2.7.1 data SomeTapeNode :: Type where STN :: { _stnNode :: !(TapeNode a) } -> SomeTapeNode +-- | @since 0.2.7.1 forceSomeTapeNode :: SomeTapeNode -> () forceSomeTapeNode (STN n) = forceTapeNode n @@ -285,12 +312,16 @@ -- -- For the end user, one can just imagine @'Reifies' s 'W'@ as a required -- constraint on @s@ that allows backpropagation to work.-newtype W = W {wRef :: IORef (Int, [SomeTapeNode])}+newtype W+ = -- | @since 0.2.7.1+ W {wRef :: IORef (Int, [SomeTapeNode])} +-- | @since 0.2.7.1 initWengert :: IO W initWengert = W <$> newIORef (0, []) {-# INLINE initWengert #-} +-- | @since 0.2.7.1 insertNode :: TapeNode a -> -- | val@@ -659,11 +690,13 @@ BVar s b coerceVar v@(BV r x) = forceBVar v `seq` BV r (coerce x) +-- | @since 0.2.7.1 data Runner s = R { _rDelta :: !(MV.MVector s (Maybe Any)) , _rInputs :: !(MV.MVector s (Maybe Any)) } +-- | @since 0.2.7.1 initRunner :: (Int, [SomeTapeNode]) -> (Int, [Maybe Any]) ->@@ -677,6 +710,7 @@ return $ R delts inps {-# INLINE initRunner #-} +-- | @since 0.2.7.1 gradRunner :: forall b s. () =>@@ -709,6 +743,7 @@ {-# INLINE propagate #-} {-# INLINE gradRunner #-} +-- | @since 0.2.7.1 bumpMaybe :: -- | val a ->