|
38 | 38 | function ChainRulesCore.rrule(::typeof(qr_null!), A::AbstractMatrix, N, alg) |
39 | 39 | Ac = copy_input(qr_full, A) |
40 | 40 | QR = initialize_output(qr_full!, A, alg) |
41 | | - Q, R = qr_full!(Ac, QR, alg) |
42 | | - N = copy!(N, view(Q, 1:size(A, 1), (size(A, 2) + 1):size(A, 1))) |
| 41 | + QR = qr_full!(Ac, QR, alg) |
| 42 | + N = copy!(N, view(QR[1], 1:size(A, 1), (size(A, 2) + 1):size(A, 1))) |
43 | 43 | function qr_null_pullback(ΔN) |
44 | 44 | ΔA = zero(A) |
45 | | - (m, n) = size(A) |
46 | | - minmn = min(m, n) |
47 | | - ΔQ = zero!(similar(A, (m, m))) |
48 | | - view(ΔQ, 1:m, (minmn + 1):m) .= unthunk.(ΔN) |
49 | | - MatrixAlgebraKit.qr_compact_pullback!(ΔA, A, (Q, R), (ΔQ, ZeroTangent())) |
| 45 | + MatrixAlgebraKit.qr_null_pullback!(ΔA, A, QR, unthunk(ΔN)) |
50 | 46 | return NoTangent(), ΔA, ZeroTangent(), NoTangent() |
51 | 47 | end |
52 | 48 | function qr_null_pullback(::ZeroTangent) # is this extra definition useful? |
|
76 | 72 | function ChainRulesCore.rrule(::typeof(lq_null!), A::AbstractMatrix, Nᴴ, alg) |
77 | 73 | Ac = copy_input(lq_full, A) |
78 | 74 | LQ = initialize_output(lq_full!, A, alg) |
79 | | - L, Q = lq_full!(Ac, LQ, alg) |
80 | | - Nᴴ = copy!(Nᴴ, view(Q, (size(A, 1) + 1):size(A, 2), 1:size(A, 2))) |
| 75 | + LQ = lq_full!(Ac, LQ, alg) |
| 76 | + Nᴴ = copy!(Nᴴ, view(LQ[2], (size(A, 1) + 1):size(A, 2), 1:size(A, 2))) |
81 | 77 | function lq_null_pullback(ΔNᴴ) |
82 | 78 | ΔA = zero(A) |
83 | | - (m, n) = size(A) |
84 | | - minmn = min(m, n) |
85 | | - ΔQ = zero!(similar(A, (n, n))) |
86 | | - view(ΔQ, (minmn + 1):n, 1:n) .= unthunk.(ΔNᴴ) |
87 | | - MatrixAlgebraKit.lq_compact_pullback!(ΔA, A, (L, Q), (ZeroTangent(), ΔQ)) |
| 79 | + MatrixAlgebraKit.lq_null_pullback!(ΔA, A, LQ, unthunk(ΔNᴴ)) |
88 | 80 | return NoTangent(), ΔA, ZeroTangent(), NoTangent() |
89 | 81 | end |
90 | 82 | function lq_null_pullback(::ZeroTangent) # is this extra definition useful? |
|
0 commit comments