hmatrix-backprop 0.1.2.1 → 0.1.2.2
raw patch · 4 files changed
+183/−140 lines, 4 filesdep ~backpropPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: backprop
API changes (from Hackage documentation)
+ Numeric.LinearAlgebra.Static.Backprop: class Backprop a
- Numeric.LinearAlgebra.Static.Backprop: (#) :: (Reifies s W, KnownNat n, KnownNat m) => BVar s (R n) -> BVar s (R m) -> BVar s (R (n + m))
+ Numeric.LinearAlgebra.Static.Backprop: (#) :: (KnownNat n, KnownNat m, Reifies s W) => BVar s (R n) -> BVar s (R m) -> BVar s (R (n + m))
- Numeric.LinearAlgebra.Static.Backprop: (#>) :: (Reifies s W, KnownNat m, KnownNat n) => BVar s (L m n) -> BVar s (R n) -> BVar s (R m)
+ Numeric.LinearAlgebra.Static.Backprop: (#>) :: (KnownNat m, KnownNat n, Reifies s W) => BVar s (L m n) -> BVar s (R n) -> BVar s (R m)
- Numeric.LinearAlgebra.Static.Backprop: (&) :: (Reifies s W, KnownNat n, 1 <= n, KnownNat (n + 1)) => BVar s (R n) -> BVar s ℝ -> BVar s (R (n + 1))
+ Numeric.LinearAlgebra.Static.Backprop: (&) :: (KnownNat n, 1 <= n, KnownNat (n + 1), Reifies s W) => BVar s (R n) -> BVar s ℝ -> BVar s (R (n + 1))
- Numeric.LinearAlgebra.Static.Backprop: (<.>) :: (Reifies s W, KnownNat n) => BVar s (R n) -> BVar s (R n) -> BVar s ℝ
+ Numeric.LinearAlgebra.Static.Backprop: (<.>) :: (KnownNat n, Reifies s W) => BVar s (R n) -> BVar s (R n) -> BVar s ℝ
- Numeric.LinearAlgebra.Static.Backprop: (<>) :: (Reifies s W, KnownNat m, KnownNat k, KnownNat n) => BVar s (L m k) -> BVar s (L k n) -> BVar s (L m n)
+ Numeric.LinearAlgebra.Static.Backprop: (<>) :: (KnownNat m, KnownNat k, KnownNat n, Reifies s W) => BVar s (L m k) -> BVar s (L k n) -> BVar s (L m n)
- Numeric.LinearAlgebra.Static.Backprop: (<·>) :: (Reifies s W, KnownNat n) => BVar s (R n) -> BVar s (R n) -> BVar s ℝ
+ Numeric.LinearAlgebra.Static.Backprop: (<·>) :: (KnownNat n, Reifies s W) => BVar s (R n) -> BVar s (R n) -> BVar s ℝ
- Numeric.LinearAlgebra.Static.Backprop: (===) :: (Reifies s W, KnownNat c, KnownNat r1, KnownNat (r1 + r2)) => BVar s (L r1 c) -> BVar s (L r2 c) -> BVar s (L (r1 + r2) c)
+ Numeric.LinearAlgebra.Static.Backprop: (===) :: (KnownNat c, KnownNat r1, KnownNat (r1 + r2), Reifies s W) => BVar s (L r1 c) -> BVar s (L r2 c) -> BVar s (L (r1 + r2) c)
- Numeric.LinearAlgebra.Static.Backprop: (|||) :: (Reifies s W, KnownNat c, KnownNat r1, KnownNat (r1 + r2)) => BVar s (L c r1) -> BVar s (L c r2) -> BVar s (L c (r1 + r2))
+ Numeric.LinearAlgebra.Static.Backprop: (|||) :: (KnownNat c, KnownNat r1, KnownNat (r1 + r2), Reifies s W) => BVar s (L c r1) -> BVar s (L c r2) -> BVar s (L c (r1 + r2))
- Numeric.LinearAlgebra.Static.Backprop: app :: (Reifies s W, KnownNat m, KnownNat n, Domain field vec mat, Num (mat m n), Num (vec n), Num (vec m), Transposable (mat m n) (mat n m)) => BVar s (mat m n) -> BVar s (vec n) -> BVar s (vec m)
+ Numeric.LinearAlgebra.Static.Backprop: app :: (KnownNat m, KnownNat n, Domain field vec mat, Transposable (mat m n) (mat n m), Backprop (mat m n), Backprop (vec n), Reifies s W) => BVar s (mat m n) -> BVar s (vec n) -> BVar s (vec m)
- Numeric.LinearAlgebra.Static.Backprop: chol :: forall n s. (Reifies s W, KnownNat n) => BVar s (Sym n) -> BVar s (Sq n)
+ Numeric.LinearAlgebra.Static.Backprop: chol :: forall n s. (KnownNat n, Reifies s W) => BVar s (Sym n) -> BVar s (Sq n)
- Numeric.LinearAlgebra.Static.Backprop: col :: (Reifies s W, KnownNat n) => BVar s (R n) -> BVar s (L n 1)
+ Numeric.LinearAlgebra.Static.Backprop: col :: (KnownNat n, Reifies s W) => BVar s (R n) -> BVar s (L n 1)
- Numeric.LinearAlgebra.Static.Backprop: cov :: forall m n s. (Reifies s W, KnownNat n, KnownNat m, 1 <= m) => BVar s (L m n) -> BVar s (Sym n)
+ Numeric.LinearAlgebra.Static.Backprop: cov :: forall m n s. (KnownNat n, KnownNat m, 1 <= m, Reifies s W) => BVar s (L m n) -> BVar s (Sym n)
- Numeric.LinearAlgebra.Static.Backprop: create :: forall t s d q. (Reifies q W, Sized t s d, Backprop s, Num (d t), Backprop (d t)) => BVar q (d t) -> Maybe (BVar q s)
+ Numeric.LinearAlgebra.Static.Backprop: create :: (Sized t s d, Backprop s, Num (d t), Backprop (d t), Reifies q W) => BVar q (d t) -> Maybe (BVar q s)
- Numeric.LinearAlgebra.Static.Backprop: cross :: (Reifies s W, Domain field vec mat, Num (vec 3)) => BVar s (vec 3) -> BVar s (vec 3) -> BVar s (vec 3)
+ Numeric.LinearAlgebra.Static.Backprop: cross :: (Domain field vec mat, Reifies s W, Backprop (vec 3)) => BVar s (vec 3) -> BVar s (vec 3) -> BVar s (vec 3)
- Numeric.LinearAlgebra.Static.Backprop: det :: (Reifies s W, KnownNat n, Num (mat n n), Domain field vec mat, Sized field (mat n n) d, Transposable (mat n n) (mat n n)) => BVar s (mat n n) -> BVar s field
+ Numeric.LinearAlgebra.Static.Backprop: det :: (KnownNat n, Num (mat n n), Backprop (mat n n), Domain field vec mat, Sized field (mat n n) d, Transposable (mat n n) (mat n n), Reifies s W) => BVar s (mat n n) -> BVar s field
- Numeric.LinearAlgebra.Static.Backprop: diag :: (Reifies s W, KnownNat n) => BVar s (R n) -> BVar s (Sq n)
+ Numeric.LinearAlgebra.Static.Backprop: diag :: (KnownNat n, Reifies s W) => BVar s (R n) -> BVar s (Sq n)
- Numeric.LinearAlgebra.Static.Backprop: diagR :: forall m n k field vec mat s. (Reifies s W, Domain field vec mat, Num (vec k), Num (mat m n), KnownNat m, KnownNat n, KnownNat k, Container Vector field, Sized field (mat m n) Matrix, Sized field (vec k) Vector) => BVar s field -> BVar s (vec k) -> BVar s (mat m n)
+ Numeric.LinearAlgebra.Static.Backprop: diagR :: forall m n k field vec mat s. (Domain field vec mat, Num (vec k), Num (mat m n), KnownNat m, KnownNat n, KnownNat k, Container Vector field, Sized field (mat m n) Matrix, Sized field (vec k) Vector, Backprop field, Backprop (vec k), Reifies s W) => BVar s field -> BVar s (vec k) -> BVar s (mat m n)
- Numeric.LinearAlgebra.Static.Backprop: dmmap :: (Reifies s W, KnownNat n, KnownNat m, Domain field vec mat, Num (mat n m), Num field) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field) -> BVar s (mat n m) -> BVar s (mat n m)
+ Numeric.LinearAlgebra.Static.Backprop: dmmap :: (KnownNat n, KnownNat m, Domain field vec mat, Num (mat n m), Backprop (mat n m), Backprop field, Reifies s W) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field) -> BVar s (mat n m) -> BVar s (mat n m)
- Numeric.LinearAlgebra.Static.Backprop: dot :: (Reifies s W, KnownNat n, Domain field vec mat, Sized field (vec n) d, Num (vec n)) => BVar s (vec n) -> BVar s (vec n) -> BVar s field
+ Numeric.LinearAlgebra.Static.Backprop: dot :: (KnownNat n, Domain field vec mat, Sized field (vec n) d, Num (vec n), Backprop (vec n), Reifies s W) => BVar s (vec n) -> BVar s (vec n) -> BVar s field
- Numeric.LinearAlgebra.Static.Backprop: dvmap :: (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 (vec n) -> BVar s (vec n)
+ Numeric.LinearAlgebra.Static.Backprop: dvmap :: (KnownNat n, Domain field vec mat, Num (vec n), Backprop (vec n), Backprop field, Reifies s W) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field) -> BVar s (vec n) -> BVar s (vec n)
- 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: dzipWithVector :: (KnownNat n, Domain field vec mat, Num (vec n), Backprop (vec n), Backprop field, Reifies s W) => (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: eigensystem :: forall n s. (Reifies s W, KnownNat n) => BVar s (Sym n) -> (BVar s (R n), BVar s (L n n))
+ Numeric.LinearAlgebra.Static.Backprop: eigensystem :: forall n s. (KnownNat n, Reifies s W) => BVar s (Sym n) -> (BVar s (R n), BVar s (L n n))
- Numeric.LinearAlgebra.Static.Backprop: eigenvalues :: forall n s. (Reifies s W, KnownNat n) => BVar s (Sym n) -> BVar s (R n)
+ Numeric.LinearAlgebra.Static.Backprop: eigenvalues :: forall n s. (KnownNat n, Reifies s W) => BVar s (Sym n) -> BVar s (R n)
- Numeric.LinearAlgebra.Static.Backprop: extractV :: forall t s q. (Sized t s Vector, Konst t Int Vector, Container Vector t, Backprop t, Backprop s, Reifies q W) => BVar q s -> BVar q (Vector t)
+ Numeric.LinearAlgebra.Static.Backprop: extractV :: forall t s q. (Sized t s Vector, Konst t Int Vector, Container Vector t, Backprop s, Reifies q W) => BVar q s -> BVar q (Vector t)
- Numeric.LinearAlgebra.Static.Backprop: fromColumns :: forall m n s. (Reifies s W, KnownNat m, KnownNat n) => Vector n (BVar s (R m)) -> BVar s (L m n)
+ Numeric.LinearAlgebra.Static.Backprop: fromColumns :: forall m n s. (KnownNat n, Reifies s W) => Vector n (BVar s (R m)) -> BVar s (L m n)
- Numeric.LinearAlgebra.Static.Backprop: fromRows :: forall m n s. (Reifies s W, KnownNat m, KnownNat n) => Vector m (BVar s (R n)) -> BVar s (L m n)
+ Numeric.LinearAlgebra.Static.Backprop: fromRows :: forall m n s. (KnownNat m, Reifies s W) => Vector m (BVar s (R n)) -> BVar s (L m n)
- Numeric.LinearAlgebra.Static.Backprop: inv :: (Reifies s W, KnownNat n, Num (mat n n), Domain field vec mat, Transposable (mat n n) (mat n n)) => BVar s (mat n n) -> BVar s (mat n n)
+ Numeric.LinearAlgebra.Static.Backprop: inv :: (KnownNat n, Num (mat n n), Backprop (mat n n), Domain field vec mat, Transposable (mat n n) (mat n n), Reifies s W) => BVar s (mat n n) -> BVar s (mat n n)
- Numeric.LinearAlgebra.Static.Backprop: invlndet :: forall n mat field vec d s. (Reifies s W, KnownNat n, Num (mat n n), Domain field vec mat, Sized field (mat n n) d, Transposable (mat n n) (mat n n), Backprop field, Backprop (mat n n)) => BVar s (mat n n) -> (BVar s (mat n n), (BVar s field, BVar s field))
+ Numeric.LinearAlgebra.Static.Backprop: invlndet :: forall n mat field vec d s. (KnownNat n, Num (mat n n), Domain field vec mat, Sized field (mat n n) d, Transposable (mat n n) (mat n n), Backprop field, Backprop (mat n n), Reifies s W) => BVar s (mat n n) -> (BVar s (mat n n), (BVar s field, BVar s field))
- Numeric.LinearAlgebra.Static.Backprop: konst :: forall t s d q. (Reifies q W, Sized t s d, Container d t, Num s) => BVar q t -> BVar q s
+ Numeric.LinearAlgebra.Static.Backprop: konst :: forall t s d q. (Sized t s d, Container d t, Backprop t, Reifies q W) => BVar q t -> BVar q s
- Numeric.LinearAlgebra.Static.Backprop: linspace :: forall n s. (Reifies s W, KnownNat n) => BVar s ℝ -> BVar s ℝ -> BVar s (R n)
+ Numeric.LinearAlgebra.Static.Backprop: linspace :: forall n s. (KnownNat n, Reifies s W) => BVar s ℝ -> BVar s ℝ -> BVar s (R n)
- Numeric.LinearAlgebra.Static.Backprop: lndet :: forall n mat field vec d s. (Reifies s W, KnownNat n, Num (mat n n), Domain field vec mat, Sized field (mat n n) d, Transposable (mat n n) (mat n n)) => BVar s (mat n n) -> BVar s field
+ Numeric.LinearAlgebra.Static.Backprop: lndet :: forall n mat field vec d s. (KnownNat n, Num (mat n n), Backprop (mat n n), Domain field vec mat, Sized field (mat n n) d, Transposable (mat n n) (mat n n), Reifies s W) => BVar s (mat n n) -> BVar s field
- Numeric.LinearAlgebra.Static.Backprop: mTm :: (Reifies s W, KnownNat m, KnownNat n) => BVar s (L m n) -> BVar s (Sym n)
+ Numeric.LinearAlgebra.Static.Backprop: mTm :: (KnownNat m, KnownNat n, Reifies s W) => BVar s (L m n) -> BVar s (Sym n)
- Numeric.LinearAlgebra.Static.Backprop: matrix :: forall m n s. (Reifies s W, KnownNat m, KnownNat n) => [BVar s ℝ] -> BVar s (L m n)
+ Numeric.LinearAlgebra.Static.Backprop: matrix :: forall m n s. (KnownNat m, KnownNat n, Reifies s W) => [BVar s ℝ] -> BVar s (L m n)
- Numeric.LinearAlgebra.Static.Backprop: mean :: (Reifies s W, KnownNat n, 1 <= n) => BVar s (R n) -> BVar s ℝ
+ Numeric.LinearAlgebra.Static.Backprop: mean :: (KnownNat n, 1 <= n, Reifies s W) => BVar s (R n) -> BVar s ℝ
- Numeric.LinearAlgebra.Static.Backprop: meanCov :: forall m n s. (Reifies s W, KnownNat n, KnownNat m, 1 <= m) => BVar s (L m n) -> (BVar s (R n), BVar s (Sym n))
+ Numeric.LinearAlgebra.Static.Backprop: meanCov :: forall m n s. (KnownNat n, KnownNat m, 1 <= m, Reifies s W) => BVar s (L m n) -> (BVar s (R n), BVar s (Sym n))
- Numeric.LinearAlgebra.Static.Backprop: meanL :: forall m n s. (Reifies s W, KnownNat n, KnownNat m, 1 <= m) => BVar s (L m n) -> BVar s (R n)
+ Numeric.LinearAlgebra.Static.Backprop: meanL :: forall m n s. (KnownNat n, KnownNat m, 1 <= m, Reifies s W) => BVar s (L m n) -> BVar s (R n)
- 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: mmap :: (KnownNat n, KnownNat m, Reifies s W) => (BVar s ℝ -> BVar s ℝ) -> BVar s (L n m) -> BVar s (L n m)
- Numeric.LinearAlgebra.Static.Backprop: mmap' :: forall n m mat field s. (Reifies s W, KnownNat m, Num (mat n m), Sized field (mat n m) Matrix, Element field) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field) -> BVar s (mat n m) -> BVar s (mat n m)
+ Numeric.LinearAlgebra.Static.Backprop: mmap' :: forall n m mat field s. (KnownNat m, Num (mat n m), Backprop (mat n m), Backprop field, Sized field (mat n m) Matrix, Element field, Reifies s W) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field) -> BVar s (mat n m) -> BVar s (mat n m)
- Numeric.LinearAlgebra.Static.Backprop: mul :: (Reifies s W, KnownNat m, KnownNat k, KnownNat n, Domain field vec mat, Num (mat m k), Num (mat k n), Num (mat m n), Transposable (mat m k) (mat k m), Transposable (mat k n) (mat n k)) => BVar s (mat m k) -> BVar s (mat k n) -> BVar s (mat m n)
+ Numeric.LinearAlgebra.Static.Backprop: mul :: (KnownNat m, KnownNat k, KnownNat n, Domain field vec mat, Backprop (mat m k), Backprop (mat k n), Transposable (mat m k) (mat k m), Transposable (mat k n) (mat n k), Reifies s W) => BVar s (mat m k) -> BVar s (mat k n) -> BVar s (mat m n)
- Numeric.LinearAlgebra.Static.Backprop: norm_0 :: (Reifies s W, Normed a, Num a) => BVar s a -> BVar s ℝ
+ Numeric.LinearAlgebra.Static.Backprop: norm_0 :: (Normed a, Backprop a, Reifies s W) => BVar s a -> BVar s ℝ
- Numeric.LinearAlgebra.Static.Backprop: norm_1M :: (Reifies s W, KnownNat n, KnownNat m) => BVar s (L n m) -> BVar s ℝ
+ Numeric.LinearAlgebra.Static.Backprop: norm_1M :: (KnownNat n, KnownNat m, Reifies s W) => BVar s (L n m) -> BVar s ℝ
- Numeric.LinearAlgebra.Static.Backprop: norm_1V :: (Reifies s W, KnownNat n) => BVar s (R n) -> BVar s ℝ
+ Numeric.LinearAlgebra.Static.Backprop: norm_1V :: (KnownNat n, Reifies s W) => BVar s (R n) -> BVar s ℝ
- Numeric.LinearAlgebra.Static.Backprop: norm_2M :: (Reifies s W, KnownNat n, KnownNat m) => BVar s (L n m) -> BVar s ℝ
+ Numeric.LinearAlgebra.Static.Backprop: norm_2M :: (KnownNat n, KnownNat m, Reifies s W) => BVar s (L n m) -> BVar s ℝ
- Numeric.LinearAlgebra.Static.Backprop: norm_2V :: (Reifies s W, KnownNat n) => BVar s (R n) -> BVar s ℝ
+ Numeric.LinearAlgebra.Static.Backprop: norm_2V :: (KnownNat n, Reifies s W) => BVar s (R n) -> BVar s ℝ
- Numeric.LinearAlgebra.Static.Backprop: norm_InfM :: (Reifies s W, KnownNat n, KnownNat m) => BVar s (L n m) -> BVar s ℝ
+ Numeric.LinearAlgebra.Static.Backprop: norm_InfM :: (KnownNat n, KnownNat m, Reifies s W) => BVar s (L n m) -> BVar s ℝ
- Numeric.LinearAlgebra.Static.Backprop: norm_InfV :: (Reifies s W, KnownNat n) => BVar s (R n) -> BVar s ℝ
+ Numeric.LinearAlgebra.Static.Backprop: norm_InfV :: (KnownNat n, Reifies s W) => BVar s (R n) -> BVar s ℝ
- Numeric.LinearAlgebra.Static.Backprop: outer :: (Reifies s W, KnownNat m, KnownNat n, Domain field vec mat, Transposable (mat n m) (mat m n), Num (vec n), Num (vec m), Num (mat n m)) => BVar s (vec n) -> BVar s (vec m) -> BVar s (mat n m)
+ Numeric.LinearAlgebra.Static.Backprop: outer :: (KnownNat m, KnownNat n, Domain field vec mat, Transposable (mat n m) (mat m n), Backprop (vec n), Backprop (vec m), Reifies s W) => BVar s (vec n) -> BVar s (vec m) -> BVar s (mat n m)
- Numeric.LinearAlgebra.Static.Backprop: row :: (Reifies s W, KnownNat n) => BVar s (R n) -> BVar s (L 1 n)
+ Numeric.LinearAlgebra.Static.Backprop: row :: Reifies s W => BVar s (R n) -> BVar s (L 1 n)
- Numeric.LinearAlgebra.Static.Backprop: split :: forall p n s. (Reifies s W, KnownNat p, KnownNat n, p <= n) => BVar s (R n) -> (BVar s (R p), BVar s (R (n - p)))
+ Numeric.LinearAlgebra.Static.Backprop: split :: forall p n s. (KnownNat p, KnownNat n, p <= n, Reifies s W) => BVar s (R n) -> (BVar s (R p), BVar s (R (n - p)))
- Numeric.LinearAlgebra.Static.Backprop: splitCols :: forall p m n s. (Reifies s W, KnownNat p, KnownNat m, KnownNat n, KnownNat (n - p), p <= n) => BVar s (L m n) -> (BVar s (L m p), BVar s (L m (n - p)))
+ Numeric.LinearAlgebra.Static.Backprop: splitCols :: forall p m n s. (KnownNat p, KnownNat m, KnownNat n, KnownNat (n - p), p <= n, Reifies s W) => BVar s (L m n) -> (BVar s (L m p), BVar s (L m (n - p)))
- Numeric.LinearAlgebra.Static.Backprop: splitRows :: forall p m n s. (Reifies s W, KnownNat p, KnownNat m, KnownNat n, p <= m) => BVar s (L m n) -> (BVar s (L p n), BVar s (L (m - p) n))
+ Numeric.LinearAlgebra.Static.Backprop: splitRows :: forall p m n s. (KnownNat p, KnownNat m, KnownNat n, p <= m, Reifies s W) => BVar s (L m n) -> (BVar s (L p n), BVar s (L (m - p) n))
- Numeric.LinearAlgebra.Static.Backprop: sumElements :: forall t s d q. (Reifies q W, Sized t s d, Container d t, Num s) => BVar q s -> BVar q t
+ Numeric.LinearAlgebra.Static.Backprop: sumElements :: forall t s d q. (Sized t s d, Container d t, Backprop s, Reifies q W) => BVar q s -> BVar q t
- Numeric.LinearAlgebra.Static.Backprop: svd :: forall m n s. (Reifies s W, KnownNat m, KnownNat n) => BVar s (L m n) -> BVar s (R n)
+ Numeric.LinearAlgebra.Static.Backprop: svd :: forall m n s. (KnownNat m, KnownNat n, Reifies s W) => BVar s (L m n) -> BVar s (R n)
- Numeric.LinearAlgebra.Static.Backprop: svd_ :: forall m n s. (Reifies s W, KnownNat m, KnownNat n) => BVar s (L m n) -> (BVar s (L m m), BVar s (R n), BVar s (L n n))
+ Numeric.LinearAlgebra.Static.Backprop: svd_ :: forall m n s. (KnownNat m, KnownNat n, Reifies s W) => BVar s (L m n) -> (BVar s (L m m), BVar s (R n), BVar s (L n n))
- Numeric.LinearAlgebra.Static.Backprop: sym :: (Reifies s W, KnownNat n) => BVar s (Sq n) -> BVar s (Sym n)
+ Numeric.LinearAlgebra.Static.Backprop: sym :: (KnownNat n, Reifies s W) => BVar s (Sq n) -> BVar s (Sym n)
- Numeric.LinearAlgebra.Static.Backprop: takeDiag :: (Reifies s W, KnownNat n, Diag (mat n n) (vec n), Domain field vec mat, Num (vec n), Num (mat n n), Num field) => BVar s (mat n n) -> BVar s (vec n)
+ Numeric.LinearAlgebra.Static.Backprop: takeDiag :: (KnownNat n, Diag (mat n n) (vec n), Domain field vec mat, Num field, Backprop (mat n n), Reifies s W) => BVar s (mat n n) -> BVar s (vec n)
- Numeric.LinearAlgebra.Static.Backprop: toColumns :: forall m n s. (Reifies s W, KnownNat m, KnownNat n) => BVar s (L m n) -> Vector n (BVar s (R m))
+ Numeric.LinearAlgebra.Static.Backprop: toColumns :: forall m n s. (KnownNat m, KnownNat n, Reifies s W) => BVar s (L m n) -> Vector n (BVar s (R m))
- Numeric.LinearAlgebra.Static.Backprop: toRows :: forall m n s. (Reifies s W, KnownNat m, KnownNat n) => BVar s (L m n) -> Vector m (BVar s (R n))
+ Numeric.LinearAlgebra.Static.Backprop: toRows :: forall m n s. (KnownNat m, KnownNat n, Reifies s W) => BVar s (L m n) -> Vector m (BVar s (R n))
- Numeric.LinearAlgebra.Static.Backprop: tr :: (Reifies s W, Transposable m mt, Transposable mt m, Num m, Num mt) => BVar s m -> BVar s mt
+ Numeric.LinearAlgebra.Static.Backprop: tr :: (Transposable m mt, Transposable mt m, Backprop m, Reifies s W) => BVar s m -> BVar s mt
- Numeric.LinearAlgebra.Static.Backprop: unSym :: (Reifies s W, KnownNat n) => BVar s (Sym n) -> BVar s (Sq n)
+ Numeric.LinearAlgebra.Static.Backprop: unSym :: (KnownNat n, Reifies s W) => BVar s (Sym n) -> BVar s (Sq n)
- Numeric.LinearAlgebra.Static.Backprop: uncol :: (Reifies s W, KnownNat n) => BVar s (L n 1) -> BVar s (R n)
+ Numeric.LinearAlgebra.Static.Backprop: uncol :: (KnownNat n, Reifies s W) => BVar s (L n 1) -> BVar s (R n)
- Numeric.LinearAlgebra.Static.Backprop: unrow :: (Reifies s W, KnownNat n) => BVar s (L 1 n) -> BVar s (R n)
+ Numeric.LinearAlgebra.Static.Backprop: unrow :: (KnownNat n, Reifies s W) => BVar s (L 1 n) -> BVar s (R n)
- Numeric.LinearAlgebra.Static.Backprop: vector :: forall n s. (Reifies s W, KnownNat n) => Vector n (BVar s ℝ) -> BVar s (R n)
+ Numeric.LinearAlgebra.Static.Backprop: vector :: forall n s. Reifies s W => Vector n (BVar s ℝ) -> 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: vmap :: (KnownNat n, Reifies s W) => (BVar s ℝ -> BVar s ℝ) -> BVar s (R n) -> BVar s (R n)
- Numeric.LinearAlgebra.Static.Backprop: vmap' :: (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 (vec n) -> BVar s (vec n)
+ Numeric.LinearAlgebra.Static.Backprop: vmap' :: (Num (vec n), Storable field, Sized field (vec n) Vector, Backprop (vec n), Backprop field, Reifies s W) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field) -> 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 :: (KnownNat n, Reifies s W) => (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, 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)
+ Numeric.LinearAlgebra.Static.Backprop: zipWithVector' :: (Num (vec n), Backprop (vec n), Storable field, Backprop field, Sized field (vec n) Vector, Reifies s W) => (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 +14/−0
- hmatrix-backprop.cabal +5/−7
- src/Numeric/LinearAlgebra/Static/Backprop.hs +159/−132
- test/Nudge.hs +5/−1
CHANGELOG.md view
@@ -1,6 +1,20 @@ Changelog ========= +Version 0.1.2.2+---------------++*May 28, 2018*++<https://github.com/mstksg/hmatrix-backprop/releases/tag/v0.1.2.2>++* Fix compatibility with *backprop-0.2.4.0*.+* Rewrote most of *Numeric.LinearAlgebra.Static.Backprop* module to require+ `Backprop` constraints on everything instead of `Num` constraints+* Re-ordered constraint orders on various functions. *Potentially breaking+ change* if TypeApplications are used.+* Removed redundant dependency on *finite-typelits*.+ Version 0.1.2.1 ---------------
hmatrix-backprop.cabal view
@@ -1,11 +1,11 @@--- This file has been generated from package.yaml by hpack version 0.21.2.+-- This file has been generated from package.yaml by hpack version 0.28.2. -- -- see: https://github.com/sol/hpack ----- hash: 33301e0e44babbb514f51cf80addcfb5da2a0a2764c096e657abc8fa87db7879+-- hash: c8c0a720d86e2c1a4c75f474776c12fd1f024e07271a1beb72b7e28c260dc66d name: hmatrix-backprop-version: 0.1.2.1+version: 0.1.2.2 synopsis: hmatrix operations lifted for backprop description: hmatrix operations lifted for backprop, along with orphan instances. .@@ -24,7 +24,6 @@ license-file: LICENSE build-type: Simple cabal-version: >= 1.10- extra-source-files: CHANGELOG.md README.md@@ -38,9 +37,8 @@ src ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wredundant-constraints build-depends:- backprop >=0.2+ backprop >=0.2.4 , base >=4.7 && <5- , finite-typelits , ghc-typelits-knownnat , ghc-typelits-natnormalise , hmatrix >=0.18@@ -61,7 +59,7 @@ test ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N build-depends:- backprop >=0.2+ backprop >=0.2.4 , base >=4.7 && <5 , finite-typelits , hedgehog
src/Numeric/LinearAlgebra/Static/Backprop.hs view
@@ -188,30 +188,31 @@ -- -- @since 0.1.1.0 , BVar+ , Backprop , Reifies , W ) where import Data.Bifunctor+import Data.Coerce import Data.Maybe import Data.Proxy import Foreign.Storable import GHC.TypeLits import Lens.Micro hiding ((&))+import Numeric.Backprop import Numeric.Backprop.Class-import Numeric.Backprop.Num import Unsafe.Coerce import qualified Data.Vector as V import qualified Data.Vector.Generic as VG import qualified Data.Vector.Generic.Sized as SVG import qualified Data.Vector.Sized as SV import qualified Data.Vector.Storable.Sized as SVS-import qualified Numeric.Backprop as BBP import qualified Numeric.Backprop.Explicit as BE import qualified Numeric.LinearAlgebra as HU import qualified Numeric.LinearAlgebra.Static as H import qualified Numeric.LinearAlgebra.Static.Vector as H-import qualified Prelude.Backprop.Num as B+import qualified Prelude.Backprop as B #if MIN_VERSION_base(4,11,0) import Prelude hiding ((<>))@@ -272,7 +273,7 @@ (vX :< vY :< vZ :< vW :< Ø) {-# INLINE vec4 #-} -(&) :: (Reifies s W, KnownNat n, 1 <= n, KnownNat (n + 1))+(&) :: (KnownNat n, 1 <= n, KnownNat (n + 1), Reifies s W) => BVar s (H.R n) -> BVar s H.ℝ -> BVar s (H.R (n + 1))@@ -280,7 +281,7 @@ infixl 4 & {-# INLINE (&) #-} -(#) :: (Reifies s W, KnownNat n, KnownNat m)+(#) :: (KnownNat n, KnownNat m, Reifies s W) => BVar s (H.R n) -> BVar s (H.R m) -> BVar s (H.R (n + m))@@ -289,12 +290,12 @@ {-# INLINE (#) #-} split- :: forall p n s. (Reifies s W, KnownNat p, KnownNat n, p <= n)+ :: forall p n s. (KnownNat p, KnownNat n, p <= n, Reifies s W) => BVar s (H.R n) -> (BVar s (H.R p), BVar s (H.R (n - p))) split v = (t ^^. _1, t ^^. _2) where- t = BBP.isoVar H.split (uncurry (H.#)) v+ t = isoVar H.split (uncurry (H.#)) v {-# NOINLINE t #-} {-# INLINE split #-} @@ -304,7 +305,7 @@ -> (BVar s H.ℝ, BVar s (H.R (n - 1))) headTail v = (t ^^. _1, t ^^. _2) where- t = BBP.isoVar H.headTail+ t = isoVar H.headTail (\(d, dx) -> (H.konst d :: H.R 1) H.# dx) v {-# NOINLINE t #-}@@ -312,15 +313,16 @@ -- | Potentially extremely bad for anything but short lists!!! vector- :: forall n s. (Reifies s W, KnownNat n)+ :: forall n s. Reifies s W => SV.Vector n (BVar s H.ℝ) -> BVar s (H.R n)-vector = isoVar (H.vecR . SVG.convert) (SVG.convert . H.rVec)+vector = BE.isoVar afSV+ (H.vecR . SVG.convert) (SVG.convert . H.rVec) . collectVar {-# INLINE vector #-} linspace- :: forall n s. (Reifies s W, KnownNat n)+ :: forall n s. (KnownNat n, Reifies s W) => BVar s H.ℝ -> BVar s H.ℝ -> BVar s (H.R n)@@ -333,19 +335,19 @@ ) {-# INLINE linspace #-} -row :: (Reifies s W, KnownNat n)+row :: Reifies s W => BVar s (H.R n) -> BVar s (H.L 1 n) row = isoVar H.row H.unrow {-# INLINE row #-} -col :: (Reifies s W, KnownNat n)+col :: (KnownNat n, Reifies s W) => BVar s (H.R n) -> BVar s (H.L n 1) col = isoVar H.col H.uncol {-# INLINE col #-} -(|||) :: (Reifies s W, KnownNat c, KnownNat r1, KnownNat (r1 + r2))+(|||) :: (KnownNat c, KnownNat r1, KnownNat (r1 + r2), Reifies s W) => BVar s (H.L c r1) -> BVar s (H.L c r2) -> BVar s (H.L c (r1 + r2))@@ -353,7 +355,7 @@ infixl 3 ||| {-# INLINE (|||) #-} -(===) :: (Reifies s W, KnownNat c, KnownNat r1, KnownNat (r1 + r2))+(===) :: (KnownNat c, KnownNat r1, KnownNat (r1 + r2), Reifies s W) => BVar s (H.L r1 c) -> BVar s (H.L r2 c) -> BVar s (H.L (r1 + r2) c)@@ -362,47 +364,47 @@ {-# INLINE (===) #-} splitRows- :: forall p m n s. (Reifies s W, KnownNat p, KnownNat m, KnownNat n, p <= m)+ :: forall p m n s. (KnownNat p, KnownNat m, KnownNat n, p <= m, Reifies s W) => BVar s (H.L m n) -> (BVar s (H.L p n), BVar s (H.L (m - p) n)) splitRows v = (t ^^. _1, t ^^. _2) where- t = BBP.isoVar H.splitRows (uncurry (H.===)) v+ t = isoVar H.splitRows (uncurry (H.===)) v {-# NOINLINE t #-} {-# INLINE splitRows #-} splitCols- :: forall p m n s. (Reifies s W, KnownNat p, KnownNat m, KnownNat n, KnownNat (n - p), p <= n)+ :: forall p m n s. (KnownNat p, KnownNat m, KnownNat n, KnownNat (n - p), p <= n, Reifies s W) => BVar s (H.L m n) -> (BVar s (H.L m p), BVar s (H.L m (n - p))) splitCols v = (t ^^. _1, t ^^. _2) where- t = BBP.isoVar H.splitCols (uncurry (H.|||)) v+ t = isoVar H.splitCols (uncurry (H.|||)) v {-# NOINLINE t #-} {-# INLINE splitCols #-} unrow- :: (Reifies s W, KnownNat n)+ :: (KnownNat n, Reifies s W) => BVar s (H.L 1 n) -> BVar s (H.R n) unrow = isoVar H.unrow H.row {-# INLINE unrow #-} uncol- :: (Reifies s W, KnownNat n)+ :: (KnownNat n, Reifies s W) => BVar s (H.L n 1) -> BVar s (H.R n) uncol = isoVar H.uncol H.col {-# INLINE uncol #-} -tr :: (Reifies s W, HU.Transposable m mt, HU.Transposable mt m, Num m, Num mt)+tr :: (HU.Transposable m mt, HU.Transposable mt m, Backprop m, Reifies s W) => BVar s m -> BVar s mt tr = isoVar H.tr H.tr {-# INLINE tr #-} diag- :: (Reifies s W, KnownNat n)+ :: (KnownNat n, Reifies s W) => BVar s (H.R n) -> BVar s (H.Sq n) diag = liftOp1 . op1 $ \x -> (H.diag x, H.takeDiag)@@ -410,17 +412,20 @@ -- | Potentially extremely bad for anything but short lists!!! matrix- :: forall m n s. (Reifies s W, KnownNat m, KnownNat n)+ :: forall m n s. (KnownNat m, KnownNat n, Reifies s W) => [BVar s H.ℝ] -> BVar s (H.L m n) matrix = maybe (error "matrix: invalid number of elements")- (isoVar (H.vecL . SVG.convert) (SVG.convert . H.lVec) . collectVar)+ ( isoVar (H.vecL . SVG.convert . runABP) (ABP . SVG.convert . H.lVec)+ . collectVar+ . ABP+ ) . SV.fromList @(m * n) {-# INLINE matrix #-} -- | Matrix product (<>)- :: (Reifies s W, KnownNat m, KnownNat k, KnownNat n)+ :: (KnownNat m, KnownNat k, KnownNat n, Reifies s W) => BVar s (H.L m k) -> BVar s (H.L k n) -> BVar s (H.L m n)@@ -430,7 +435,7 @@ -- | Matrix-vector product (#>)- :: (Reifies s W, KnownNat m, KnownNat n)+ :: (KnownNat m, KnownNat n, Reifies s W) => BVar s (H.L m n) -> BVar s (H.R n) -> BVar s (H.R m)@@ -440,7 +445,7 @@ -- | Dot product (<.>)- :: (Reifies s W, KnownNat n)+ :: (KnownNat n, Reifies s W) => BVar s (H.R n) -> BVar s (H.R n) -> BVar s H.ℝ@@ -452,7 +457,7 @@ -- algorithm that can compute the gradients based on differentials for the -- other matricies! ---svd :: forall m n s. (Reifies s W, KnownNat m, KnownNat n)+svd :: forall m n s. (KnownNat m, KnownNat n, Reifies s W) => BVar s (H.L m n) -> BVar s (H.R n) svd = liftOp1 . op1 $ \x ->@@ -467,7 +472,7 @@ -- | Version of 'svd' that returns the full SVD, but if you attempt to find -- the gradient, it will fail at runtime if you ever use U or V. svd_- :: forall m n s. (Reifies s W, KnownNat m, KnownNat n)+ :: forall m n s. (KnownNat m, KnownNat n, Reifies s W) => BVar s (H.L m n) -> (BVar s (H.L m m), BVar s (H.R n), BVar s (H.L n n)) svd_ r = (t ^^. _1, t ^^. _2, t ^^. _3)@@ -482,7 +487,7 @@ else error "svd_: Cannot backprop if U and V are used." ) {-# INLINE o #-}- t = BBP.liftOp1 o r+ t = liftOp1 o r {-# NOINLINE t #-} {-# INLINE svd_ #-} @@ -497,7 +502,7 @@ -- used as a part of a larger computation, and the gradient as an -- intermediate step. eigensystem- :: forall n s. (Reifies s W, KnownNat n)+ :: forall n s. (KnownNat n, Reifies s W) => BVar s (H.Sym n) -> (BVar s (H.R n), BVar s (H.L n n)) eigensystem u = (t ^^. _1, t ^^. _2)@@ -514,7 +519,7 @@ H.<> vTr ) {-# INLINE o #-}- t = BBP.liftOp1 o u+ t = liftOp1 o u {-# NOINLINE t #-} {-# INLINE eigensystem #-} @@ -523,7 +528,7 @@ -- used as a part of a larger computation, and the gradient as an -- intermediate step. eigenvalues- :: forall n s. (Reifies s W, KnownNat n)+ :: forall n s. (KnownNat n, Reifies s W) => BVar s (H.Sym n) -> BVar s (H.R n) eigenvalues = liftOp1 . op1 $ \x ->@@ -544,7 +549,7 @@ -- used as a part of a larger computation, and the gradient as an -- intermediate step. chol- :: forall n s. (Reifies s W, KnownNat n)+ :: forall n s. (KnownNat n, Reifies s W) => BVar s (H.Sym n) -> BVar s (H.Sq n) chol = liftOp1 . op1 $ \x ->@@ -563,15 +568,15 @@ -- | Number of non-zero items norm_0- :: (Reifies s W, H.Normed a, Num a)+ :: (H.Normed a, Backprop a, Reifies s W) => BVar s a -> BVar s H.ℝ-norm_0 = liftOp1 . op1 $ \x -> (H.norm_0 x, const 0)+norm_0 = liftOp1 . op1 $ \x -> (H.norm_0 x, const (zero x)) {-# INLINE norm_0 #-} -- | Sum of absolute values norm_1V- :: (Reifies s W, KnownNat n)+ :: (KnownNat n, Reifies s W) => BVar s (H.R n) -> BVar s H.ℝ norm_1V = liftOp1 . op1 $ \x -> (H.norm_1 x, (* signum x) . H.konst)@@ -579,7 +584,7 @@ -- | Maximum 'H.norm_1' of columns norm_1M- :: (Reifies s W, KnownNat n, KnownNat m)+ :: (KnownNat n, KnownNat m, Reifies s W) => BVar s (H.L n m) -> BVar s H.ℝ norm_1M = liftOp1 . op1 $ \x ->@@ -599,7 +604,7 @@ -- -- Be aware that gradient diverges when the norm is zero norm_2V- :: (Reifies s W, KnownNat n)+ :: (KnownNat n, Reifies s W) => BVar s (H.R n) -> BVar s H.ℝ norm_2V = liftOp1 . op1 $ \x ->@@ -609,7 +614,7 @@ -- | Maximum singular value norm_2M- :: (Reifies s W, KnownNat n, KnownNat m)+ :: (KnownNat n, KnownNat m, Reifies s W) => BVar s (H.L n m) -> BVar s H.ℝ norm_2M = liftOp1 . op1 $ \x ->@@ -620,7 +625,7 @@ -- | Maximum absolute value norm_InfV- :: (Reifies s W, KnownNat n)+ :: (KnownNat n, Reifies s W) => BVar s (H.R n) -> BVar s H.ℝ norm_InfV = liftOp1 . op1 $ \x ->@@ -639,7 +644,7 @@ -- | Maximum 'H.norm_1' of rows norm_InfM- :: (Reifies s W, KnownNat n, KnownNat m)+ :: (KnownNat n, KnownNat m, Reifies s W) => BVar s (H.L n m) -> BVar s H.ℝ norm_InfM = liftOp1 . op1 $ \x ->@@ -657,7 +662,7 @@ {-# INLINE norm_InfM #-} mean- :: (Reifies s W, KnownNat n, 1 <= n)+ :: (KnownNat n, 1 <= n, Reifies s W) => BVar s (H.R n) -> BVar s H.ℝ mean = liftOp1 . op1 $ \x -> (H.mean x, H.konst . (/ H.norm_0 x))@@ -684,13 +689,13 @@ -- | Mean and covariance. If you know you only want to use one or the -- other, use 'meanL' or 'cov'. meanCov- :: forall m n s. (Reifies s W, KnownNat n, KnownNat m, 1 <= m)+ :: forall m n s. (KnownNat n, KnownNat m, 1 <= m, Reifies s W) => BVar s (H.L m n) -> (BVar s (H.R n), BVar s (H.Sym n)) meanCov v = (t ^^. _1, t ^^. _2) where m = fromInteger $ natVal (Proxy @m)- t = ($ v) . BBP.liftOp1 . op1 $ \x ->+ t = ($ v) . liftOp1 . op1 $ \x -> let ms@(μ, _) = H.meanCov x in ( ms , \(dμ, dσ) ->@@ -704,7 +709,7 @@ -- | 'meanCov', but if you know you won't use the covariance. meanL- :: forall m n s. (Reifies s W, KnownNat n, KnownNat m, 1 <= m)+ :: forall m n s. (KnownNat n, KnownNat m, 1 <= m, Reifies s W) => BVar s (H.L m n) -> BVar s (H.R n) meanL = liftOp1 . op1 $ \x ->@@ -717,7 +722,7 @@ -- | 'cov', but if you know you won't use the covariance. cov- :: forall m n s. (Reifies s W, KnownNat n, KnownNat m, 1 <= m)+ :: forall m n s. (KnownNat n, KnownNat m, 1 <= m, Reifies s W) => BVar s (H.L m n) -> BVar s (H.Sym n) cov = liftOp1 . op1 $ \x ->@@ -725,16 +730,15 @@ in (σ, gradCov x μ) {-# INLINE cov #-} -mul :: ( Reifies s W- , KnownNat m+mul :: ( KnownNat m , KnownNat k , KnownNat n , H.Domain field vec mat- , Num (mat m k)- , Num (mat k n)- , Num (mat m n)+ , Backprop (mat m k)+ , Backprop (mat k n) , HU.Transposable (mat m k) (mat k m) , HU.Transposable (mat k n) (mat n k)+ , Reifies s W ) => BVar s (mat m k) -> BVar s (mat k n)@@ -745,14 +749,13 @@ ) {-# INLINE mul #-} -app :: ( Reifies s W- , KnownNat m+app :: ( KnownNat m , KnownNat n , H.Domain field vec mat- , Num (mat m n)- , Num (vec n)- , Num (vec m) , HU.Transposable (mat m n) (mat n m)+ , Backprop (mat m n)+ , Backprop (vec n)+ , Reifies s W ) => BVar s (mat m n) -> BVar s (vec n)@@ -763,11 +766,12 @@ ) {-# INLINE app #-} -dot :: ( Reifies s W- , KnownNat n+dot :: ( KnownNat n , H.Domain field vec mat , H.Sized field (vec n) d , Num (vec n)+ , Backprop (vec n)+ , Reifies s W ) => BVar s (vec n) -> BVar s (vec n)@@ -780,9 +784,9 @@ {-# INLINE dot #-} cross- :: ( Reifies s W- , H.Domain field vec mat- , Num (vec 3)+ :: ( H.Domain field vec mat+ , Reifies s W+ , Backprop (vec 3) ) => BVar s (vec 3) -> BVar s (vec 3)@@ -796,8 +800,7 @@ -- | Create matrix with diagonal, and fill with default entries diagR :: forall m n k field vec mat s.- ( Reifies s W- , H.Domain field vec mat+ ( H.Domain field vec mat , Num (vec k) , Num (mat m n) , KnownNat m@@ -806,6 +809,9 @@ , HU.Container HU.Vector field , H.Sized field (mat m n) HU.Matrix , H.Sized field (vec k) HU.Vector+ , Backprop field+ , Backprop (vec k)+ , Reifies s W ) => BVar s field -- ^ default value -> BVar s (vec k) -- ^ diagonal@@ -820,24 +826,25 @@ -- | Note: if possible, use the potentially much more performant 'vmap''. vmap- :: ( Reifies s W- , KnownNat n- )+ :: (KnownNat n, Reifies s W) => (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)+vmap f = isoVar (H.vecR . SVG.convert @V.Vector . runABP)+ (ABP . SVG.convert . H.rVec) . B.fmap f- . isoVar (SVG.convert . H.rVec) (H.vecR . SVG.convert)+ . isoVar (ABP . SVG.convert . H.rVec) (H.vecR . SVG.convert . runABP) {-# INLINE vmap #-} -- | 'vmap', but potentially more performant. Only usable if the mapped -- function does not depend on any external 'BVar's. vmap'- :: ( Reifies s W- , Num (vec n)+ :: ( Num (vec n) , Storable field , H.Sized field (vec n) HU.Vector+ , Backprop (vec n)+ , Backprop field+ , Reifies s W ) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field) -> BVar s (vec n)@@ -855,11 +862,12 @@ -- | Note: Potentially less performant than 'vmap''. dvmap- :: ( Reifies s W- , KnownNat n+ :: ( KnownNat n , H.Domain field vec mat , Num (vec n)- , Num field+ , Backprop (vec n)+ , Backprop field+ , Reifies s W ) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field) -> BVar s (vec n)@@ -872,27 +880,27 @@ -- | Note: if possible, use the potentially much more performant 'mmap''. mmap- :: ( Reifies s W- , KnownNat n- , KnownNat m- )+ :: (KnownNat n, KnownNat m, Reifies s W) => (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)+mmap f = isoVar (H.vecL . SVG.convert @V.Vector . runABP)+ (ABP . SVG.convert . H.lVec) . B.fmap f- . isoVar (SVG.convert . H.lVec) (H.vecL . SVG.convert)+ . isoVar (ABP . SVG.convert . H.lVec) (H.vecL . SVG.convert . runABP) {-# INLINE mmap #-} -- | 'mmap', but potentially more performant. Only usable if the mapped -- function does not depend on any external 'BVar's. mmap' :: forall n m mat field s.- ( Reifies s W- , KnownNat m+ ( KnownNat m , Num (mat n m)+ , Backprop (mat n m)+ , Backprop field , H.Sized field (mat n m) HU.Matrix , HU.Element field+ , Reifies s W ) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field) -> BVar s (mat n m)@@ -911,12 +919,13 @@ -- | Note: Potentially less performant than 'mmap''. dmmap- :: ( Reifies s W- , KnownNat n+ :: ( KnownNat n , KnownNat m , H.Domain field vec mat , Num (mat n m)- , Num field+ , Backprop (mat n m)+ , Backprop field+ , Reifies s W ) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field) -> BVar s (mat n m)@@ -928,14 +937,13 @@ {-# INLINE dmmap #-} outer- :: ( Reifies s W- , KnownNat m+ :: ( KnownNat m , KnownNat n , H.Domain field vec mat , HU.Transposable (mat n m) (mat m n)- , Num (vec n)- , Num (vec m)- , Num (mat n m)+ , Backprop (vec n)+ , Backprop (vec m)+ , Reifies s W ) => BVar s (vec n) -> BVar s (vec m)@@ -950,22 +958,25 @@ -- | Note: if possible, use the potentially much more performant -- 'zipWithVector''. zipWithVector- :: ( Reifies s W, KnownNat n )+ :: (KnownNat n, Reifies s W) => (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)+zipWithVector f x y = isoVar (H.vecR . SVG.convert . runABP)+ (ABP . SVG.convert . H.rVec)+ $ B.liftA2 @(ABP (SV.Vector _)) f (iv x) (iv y) where- iv = isoVar (SVG.convert . H.rVec) (H.vecR . SVG.convert)+ iv = isoVar (ABP . SVG.convert . H.rVec) (H.vecR . SVG.convert . runABP) {-# INLINE zipWithVector #-} zipWithVector'- :: ( Reifies s W- , Num (vec n)+ :: ( Num (vec n)+ , Backprop (vec n) , Storable field+ , Backprop field , H.Sized field (vec n) HU.Vector+ , Reifies s W ) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field -> BVar s' field) -> BVar s (vec n)@@ -985,11 +996,12 @@ -- | A version of 'zipWithVector'' that is potentially less performant but -- is based on 'H.zipWithVector' from 'H.Domain'. dzipWithVector- :: ( Reifies s W- , KnownNat n+ :: ( KnownNat n , H.Domain field vec mat , Num (vec n)- , Num field+ , Backprop (vec n)+ , Backprop field+ , Reifies s W ) => (forall s'. Reifies s' W => BVar s' field -> BVar s' field -> BVar s' field) -> BVar s (vec n)@@ -1003,12 +1015,13 @@ ) {-# INLINE dzipWithVector #-} -det :: ( Reifies s W- , KnownNat n+det :: ( KnownNat n , Num (mat n n)+ , Backprop (mat n n) , H.Domain field vec mat , H.Sized field (mat n n) d , HU.Transposable (mat n n) (mat n n)+ , Reifies s W ) => BVar s (mat n n) -> BVar s field@@ -1022,14 +1035,14 @@ -- know you don't need the inverse, it is best to use 'lndet'. invlndet :: forall n mat field vec d s.- ( Reifies s W- , KnownNat n+ ( KnownNat n , Num (mat n n) , H.Domain field vec mat , H.Sized field (mat n n) d , HU.Transposable (mat n n) (mat n n) , Backprop field , Backprop (mat n n)+ , Reifies s W ) => BVar s (mat n n) -> (BVar s (mat n n), (BVar s field, BVar s field))@@ -1046,19 +1059,20 @@ in gradI + gradLDet ) {-# INLINE o #-}- t = BBP.liftOp1 o v+ t = liftOp1 o v {-# NOINLINE t #-} {-# INLINE invlndet #-} -- | The natural log of the determinant. lndet :: forall n mat field vec d s.- ( Reifies s W- , KnownNat n+ ( KnownNat n , Num (mat n n)+ , Backprop (mat n n) , H.Domain field vec mat , H.Sized field (mat n n) d , HU.Transposable (mat n n) (mat n n)+ , Reifies s W ) => BVar s (mat n n) -> BVar s field@@ -1067,11 +1081,12 @@ in (ldet, (* H.tr i) . H.konst) {-# INLINE lndet #-} -inv :: ( Reifies s W- , KnownNat n+inv :: ( KnownNat n , Num (mat n n)+ , Backprop (mat n n) , H.Domain field vec mat , HU.Transposable (mat n n) (mat n n)+ , Reifies s W ) => BVar s (mat n n) -> BVar s (mat n n)@@ -1082,35 +1097,40 @@ {-# INLINE inv #-} toRows- :: forall m n s. (Reifies s W, KnownNat m, KnownNat n)+ :: forall m n s. (KnownNat m, KnownNat n, Reifies s W) => BVar s (H.L m n) -> SV.Vector m (BVar s (H.R n))-toRows = sequenceVar . isoVar H.lRows H.rowsL+toRows = runABP . sequenceVar . isoVar (coerce H.lRows) (coerce H.rowsL) {-# INLINE toRows #-} toColumns- :: forall m n s. (Reifies s W, KnownNat m, KnownNat n)+ :: forall m n s. (KnownNat m, KnownNat n, Reifies s W) => BVar s (H.L m n) -> SV.Vector n (BVar s (H.R m))-toColumns = sequenceVar . isoVar H.lCols H.colsL+toColumns = runABP . sequenceVar . isoVar (coerce H.lCols) (coerce H.colsL) {-# INLINE toColumns #-} fromRows- :: forall m n s. (Reifies s W, KnownNat m, KnownNat n)+ :: forall m n s. (KnownNat m, Reifies s W) => SV.Vector m (BVar s (H.R n)) -> BVar s (H.L m n)-fromRows = isoVar H.rowsL H.lRows . collectVar+fromRows = isoVar (coerce H.rowsL) (coerce H.lRows) . collectVar . ABP {-# INLINE fromRows #-} fromColumns- :: forall m n s. (Reifies s W, KnownNat m, KnownNat n)+ :: forall m n s. (KnownNat n, Reifies s W) => SV.Vector n (BVar s (H.R m)) -> BVar s (H.L m n)-fromColumns = isoVar H.colsL H.lCols . collectVar+fromColumns = isoVar (coerce H.colsL) (coerce H.lCols) . collectVar . ABP {-# INLINE fromColumns #-} konst- :: forall t s d q. (Reifies q W, H.Sized t s d, HU.Container d t, Num s)+ :: forall t s d q.+ ( H.Sized t s d+ , HU.Container d t+ , Backprop t+ , Reifies q W+ ) => BVar q t -> BVar q s konst = liftOp1 . op1 $ \x ->@@ -1120,7 +1140,12 @@ {-# INLINE konst #-} sumElements- :: forall t s d q. (Reifies q W, H.Sized t s d, HU.Container d t, Num s)+ :: forall t s d q.+ ( H.Sized t s d+ , HU.Container d t+ , Backprop s+ , Reifies q W+ ) => BVar q s -> BVar q t sumElements = liftOp1 . op1 $ \x ->@@ -1136,13 +1161,12 @@ ( H.Sized t s HU.Vector , HU.Konst t Int HU.Vector , HU.Container HU.Vector t- , Backprop t , Backprop s , Reifies q W ) => BVar q s -> BVar q (HU.Vector t)-extractV = BBP.liftOp1 . op1 $ \x ->+extractV = liftOp1 . op1 $ \x -> let n = H.size x in ( H.extract x , \d -> let m = HU.size d@@ -1167,7 +1191,7 @@ ) => BVar q s -> BVar q (HU.Matrix t)-extractM = BE.liftOp1 BE.addFunc (BE.ZF (HU.cmap (const 0))) . op1 $ \x -> -- TODO: can be BBP once instances are in Numeric.LinearAlgebra.Backprop+extractM = liftOp1 . op1 $ \x -> let (xI,xJ) = H.size x in ( H.extract x , \d -> let (dI,dJ) = HU.size d@@ -1193,21 +1217,20 @@ {-# INLINE extractM #-} create- :: forall t s d q. (Reifies q W, H.Sized t s d, Backprop s, Num (d t), Backprop (d t))+ :: (H.Sized t s d, Backprop s, Num (d t), Backprop (d t), Reifies q W) => BVar q (d t) -> Maybe (BVar q s)-create = BBP.sequenceVar . BBP.isoVar H.create (maybe 0 H.extract)+create = sequenceVar . isoVar H.create (maybe 0 H.extract) {-# INLINE create #-} takeDiag- :: ( Reifies s W- , KnownNat n+ :: ( KnownNat n , H.Diag (mat n n) (vec n) , H.Domain field vec mat- , Num (vec n)- , Num (mat n n) , Num field+ , Backprop (mat n n)+ , Reifies s W ) => BVar s (mat n n) -> BVar s (vec n)@@ -1221,7 +1244,7 @@ -- \[ -- \frac{1}{2} (M + M^T) -- \]-sym :: (Reifies s W, KnownNat n)+sym :: (KnownNat n, Reifies s W) => BVar s (H.Sq n) -> BVar s (H.Sym n) sym = liftOp1 . op1 $ \x ->@@ -1234,7 +1257,7 @@ -- \[ -- M^T M -- \]-mTm :: (Reifies s W, KnownNat m, KnownNat n)+mTm :: (KnownNat m, KnownNat n, Reifies s W) => BVar s (H.L m n) -> BVar s (H.Sym n) mTm = liftOp1 . op1 $ \x ->@@ -1247,7 +1270,7 @@ -- meant to be used directly. Rather, it is meant to be used in the middle -- (or at the end) of a longer computation. unSym- :: (Reifies s W, KnownNat n)+ :: (KnownNat n, Reifies s W) => BVar s (H.Sym n) -> BVar s (H.Sq n) unSym = isoVar H.unSym unsafeCoerce@@ -1255,10 +1278,14 @@ -- | Unicode synonym for '<.>>' (<·>)- :: (Reifies s W, KnownNat n)+ :: (KnownNat n, Reifies s W) => BVar s (H.R n) -> BVar s (H.R n) -> BVar s H.ℝ (<·>) = dot infixr 8 <·> {-# INLINE (<·>) #-}++afSV :: Backprop a => BE.AddFunc (SV.Vector n a)+afSV = BE.AF (SV.zipWith add)+{-# INLINE afSV #-}
test/Nudge.hs view
@@ -10,7 +10,10 @@ {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} -module Nudge where+module Nudge (+ nudgeProp+ , nudgeProp2+ ) where import Control.Monad import Data.Bifunctor@@ -177,6 +180,7 @@ assert $ ((old - new)/old)**2 < eps instance (HU.Container HU.Vector a, Num a) => Backprop (HU.Matrix a) where+ -- TODO: make more efficient? zero = HU.cmap (const 0) add = HU.add one = HU.cmap (const 1)