hmatrix-backprop 0.1.1.0 → 0.1.2.0
raw patch · 3 files changed
+46/−20 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Numeric.LinearAlgebra.Static.Backprop: dzipWithVector :: (Reifies s W, KnownNat n, Domain field vec mat, Num (vec n), Num field) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field -> BVar s' field) -> BVar s (vec n) -> BVar s (vec n) -> BVar s (vec n)
- Numeric.LinearAlgebra.Static.Backprop: mmap :: (Reifies s W, KnownNat n, KnownNat m) => (BVar s Double -> BVar s Double) -> BVar s (L n m) -> BVar s (L n m)
+ Numeric.LinearAlgebra.Static.Backprop: mmap :: (Reifies s W, KnownNat n, KnownNat m) => (BVar s ℝ -> BVar s ℝ) -> BVar s (L n m) -> BVar s (L n m)
- Numeric.LinearAlgebra.Static.Backprop: vmap :: (Reifies s W, KnownNat n) => (BVar s Double -> BVar s Double) -> BVar s (R n) -> BVar s (R n)
+ Numeric.LinearAlgebra.Static.Backprop: vmap :: (Reifies s W, KnownNat n) => (BVar s ℝ -> BVar s ℝ) -> BVar s (R n) -> BVar s (R n)
- Numeric.LinearAlgebra.Static.Backprop: zipWithVector :: (Reifies s W, Num (vec n), Storable field, Storable (field, field, field), Sized field (vec n) Vector) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field -> BVar s' field) -> BVar s (vec n) -> BVar s (vec n) -> BVar s (vec n)
+ Numeric.LinearAlgebra.Static.Backprop: zipWithVector :: (Reifies s W, KnownNat n) => (BVar s ℝ -> BVar s ℝ -> BVar s ℝ) -> BVar s (R n) -> BVar s (R n) -> BVar s (R n)
- Numeric.LinearAlgebra.Static.Backprop: zipWithVector' :: (Reifies s W, KnownNat n, Domain field vec mat, Num (vec n), Num field) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field -> BVar s' field) -> BVar s (vec n) -> BVar s (vec n) -> BVar s (vec n)
+ Numeric.LinearAlgebra.Static.Backprop: zipWithVector' :: (Reifies s W, Num (vec n), Storable field, Sized field (vec n) Vector) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field -> BVar s' field) -> BVar s (vec n) -> BVar s (vec n) -> BVar s (vec n)
Files
- CHANGELOG.md +12/−0
- hmatrix-backprop.cabal +3/−3
- src/Numeric/LinearAlgebra/Static/Backprop.hs +31/−17
CHANGELOG.md view
@@ -1,6 +1,18 @@ Changelog ========= +Version 0.1.2.0+---------------++*Mar 30, 2018*++<https://github.com/mstksg/hmatrix-backprop/releases/tag/v0.1.2.0>++* `zipWithVector` family rewritten in the same way as `dvmap`/`dvmap` were+ for version 0.1.1.0, which is a breaking API change. However, again, it is+ unlikely that any code using the previous versions compiled at all, so in+ practicality, no actual code that previously worked is now breaking.+ Version 0.1.1.0 ---------------
hmatrix-backprop.cabal view
@@ -1,11 +1,11 @@--- This file has been generated from package.yaml by hpack version 0.20.0.+-- This file has been generated from package.yaml by hpack version 0.21.2. -- -- see: https://github.com/sol/hpack ----- hash: 7bd7d72297fd6caf75a31bbc3856f764f21999255f99a4f6bcad71e4739acf2a+-- hash: 11c33ad908b833f31f1c4bbe92635523c13c44f590d50114a5e0a4992e1c47a1 name: hmatrix-backprop-version: 0.1.1.0+version: 0.1.2.0 synopsis: hmatrix operations lifted for backprop description: hmatrix operations lifted for backprop. .
src/Numeric/LinearAlgebra/Static/Backprop.hs view
@@ -157,6 +157,7 @@ , outer , zipWithVector , zipWithVector'+ , dzipWithVector , det , invlndet , lndet@@ -793,7 +794,7 @@ :: ( Reifies s W , KnownNat n )- => (BVar s Double -> BVar s Double)+ => (BVar s H.ℝ -> BVar s H.ℝ) -> BVar s (H.R n) -> BVar s (H.R n) vmap f = isoVar (H.vecR . SVG.convert @V.Vector) (SVG.convert . H.rVec)@@ -846,7 +847,7 @@ , KnownNat n , KnownNat m )- => (BVar s Double -> BVar s Double)+ => (BVar s H.ℝ -> BVar s H.ℝ) -> BVar s (H.L n m) -> BVar s (H.L n m) mmap f = isoVar (H.vecL . SVG.convert @V.Vector) (SVG.convert . H.lVec)@@ -917,31 +918,44 @@ ) {-# INLINE outer #-} +-- | Note: if possible, use the potentially much more performant+-- 'zipWithVector''. zipWithVector+ :: ( Reifies s W, KnownNat n )+ => (BVar s H.ℝ -> BVar s H.ℝ -> BVar s H.ℝ)+ -> BVar s (H.R n)+ -> BVar s (H.R n)+ -> BVar s (H.R n)+zipWithVector f x y = isoVar (H.vecR . SVG.convert) (SVG.convert . H.rVec)+ $ B.liftA2 @(SV.Vector _) f (iv x) (iv y)+ where+ iv = isoVar (SVG.convert . H.rVec) (H.vecR . SVG.convert)+{-# INLINE zipWithVector #-}++zipWithVector' :: ( Reifies s W , Num (vec n) , Storable field- , Storable (field, field, field) , H.Sized field (vec n) HU.Vector ) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field -> BVar s' field) -> BVar s (vec n) -> BVar s (vec n) -> BVar s (vec n)-zipWithVector f = liftOp2 . op2 $ \(H.extract->x) (H.extract->y) ->- let (z,dx,dy) = VG.unzip3- $ VG.zipWith (\x' y' ->- let (z', (dx', dy')) = backprop2 f x' y'- in (z', dx', dy')- ) x y- in ( fromJust (H.create z)- , \d -> (d * fromJust (H.create dx), d * fromJust (H.create dy))+zipWithVector' f = liftOp2 . op2 $ \(VG.convert.H.extract->x) (VG.convert.H.extract->y) ->+ let (z, dx, dy) = V.unzip3 $ V.zipWith (\x' -> retup . backprop2 f x') x y+ in ( fromJust (H.create (VG.convert z))+ , \d -> ( d * fromJust (H.create (VG.convert dx))+ , d * fromJust (H.create (VG.convert dy))+ ) )-{-# INLINE zipWithVector #-}+ where+ retup (x, (y, z)) = (x, y, z)+{-# INLINE zipWithVector' #-} --- | A version of 'zipWithVector' that is less performant but is based on--- 'H.zipWithVector' from 'H.Domain'.-zipWithVector'+-- | A version of 'zipWithVector'' that is potentially less performant but+-- is based on 'H.zipWithVector' from 'H.Domain'.+dzipWithVector :: ( Reifies s W , KnownNat n , H.Domain field vec mat@@ -952,13 +966,13 @@ -> BVar s (vec n) -> BVar s (vec n) -> BVar s (vec n)-zipWithVector' f = liftOp2 . op2 $ \x y ->+dzipWithVector f = liftOp2 . op2 $ \x y -> ( H.zipWithVector (evalBP2 f) x y , \d -> let dx = H.zipWithVector (\x' -> fst . gradBP2 f x') x y dy = H.zipWithVector (\x' -> snd . gradBP2 f x') x y in (d * dx, d * dy) )-{-# INLINE zipWithVector' #-}+{-# INLINE dzipWithVector #-} det :: ( Reifies s W , KnownNat n