@@ -7,72 +7,58 @@ function svd_pushforward!(ΔA, A, USVᴴ, ΔUSVᴴ, ind = Colon(); rank_atol = d
77 ΔU, ΔS, ΔVᴴ = ΔUSVᴴ
88 r = svd_rank (S; rank_atol)
99
10- vΔS = view (diagview (ΔS), 1 : r)
11-
12- vU = view (U, :, 1 : r)
13- vS = view (S, 1 : r)
14- vSmat = view (Smat, 1 : r, 1 : r)
15- vVᴴ = view (Vᴴ, 1 : r, :)
10+ U₁ = view (U, :, 1 : r)
11+ S₁ = view (S, 1 : r)
12+ V₁ᴴ = view (Vᴴ, 1 : r, :)
1613
1714 # compact region
18- vV = adjoint (vVᴴ)
19- UΔAV = vU' * ΔA * vV
20- copyto! (vΔS, real .(diagview (UΔAV)))
21- F = inv_safe .(transpose (vS) .- vS)
22- G = inv_safe .(transpose (vS) .+ vS)
23- hUΔAV = F .* (UΔAV + UΔAV' ) ./ 2
24- aUΔAV = G .* (UΔAV - UΔAV' ) ./ 2
25- K̇ = hUΔAV + aUΔAV
26- Ṁ = hUΔAV - aUΔAV
27-
28- # check gauge condition
29- @assert isantihermitian (K̇)
30- @assert isantihermitian (Ṁ)
31- K̇diag = diagview (K̇)
32-
33- ∂U = vU * K̇
34- ∂V = vV * Ṁ
35- # full component
36- if size (U, 2 ) > minmn && size (Vᴴ, 1 ) > minmn
37- Uperp = view (U, :, (minmn + 1 ): m)
38- Vᴴperp = view (Vᴴ, (minmn + 1 ): n, :)
39-
40- aUAV = adjoint (Uperp) * A * adjoint (Vᴴperp)
41-
42- UÃÃV = similar (A, (size (aUAV, 1 ) + size (aUAV, 2 ), size (aUAV, 1 ) + size (aUAV, 2 )))
43- fill! (UÃÃV, 0 )
44- view (UÃÃV, (1 : size (aUAV, 1 )), size (aUAV, 1 ) .+ (1 : size (aUAV, 2 ))) .= aUAV
45- view (UÃÃV, size (aUAV, 1 ) .+ (1 : size (aUAV, 2 )), 1 : size (aUAV, 1 )) .= aUAV'
46- rhs = vcat (adjoint (Uperp * ΔA * Vᴴ), Vᴴperp * ΔA' * U)
47- superKM = - _sylvester (UÃÃV, Smat, rhs)
48- K̇perp = view (superKM, 1 : size (aUAV, 2 ))
49- Ṁperp = view (superKM, (size (aUAV, 2 ) + 1 ): (size (aUAV, 1 ) + size (aUAV, 2 )))
50- ∂U .+ = Uperp * K̇perp
51- ∂V .+ = Vᴴperp * Ṁperp
52- else
53- ImUU = (UniformScaling (1 ) - vU * vU' )
54- ImVV = (UniformScaling (1 ) - vV * vVᴴ)
55- upper = ImUU * ΔA * vV
56- lower = ImVV * ΔA' * vU
57- rhs = vcat (upper, lower)
58-
59- Ã = ImUU * A * ImVV
60- ÃÃ = similar (A, (m + n, m + n))
61- fill! (ÃÃ, 0 )
62- view (ÃÃ, (1 : m), m .+ (1 : n)) .= Ã
63- view (ÃÃ, m .+ (1 : n), 1 : m) .= Ã'
64-
65- superLN = - _sylvester (ÃÃ, vSmat, rhs)
66- ∂U += view (superLN, 1 : size (upper, 1 ), :)
67- ∂V += view (superLN, (size (upper, 1 ) + 1 ): (size (upper, 1 ) + size (lower, 1 )), :)
68- end
69- if ! iszerotangent (ΔU)
70- vΔU = view (ΔU, :, 1 : r)
71- copyto! (vΔU, ∂U)
15+ V₁ = adjoint (V₁ᴴ)
16+ ΔAV₁ = ΔA * V₁
17+ UᴴΔAV₁ = U₁' * ΔAV₁
18+ if ! iszerotangent (ΔS)
19+ ΔS₁ = view (diagview (ΔS), 1 : r)
20+ ΔS₁ .= real .(diagview (UᴴΔAV₁))
7221 end
73- if ! iszerotangent (ΔVᴴ)
74- vΔVᴴ = view (ΔVᴴ, 1 : r, :)
75- adjoint! (vΔVᴴ, ∂V)
22+ if ! iszerotangent (ΔU) || ! iszerotangent (ΔVᴴ)
23+ hUᴴΔAV₁ = inv_safe .(transpose (S₁) .- S₁) .* project_hermitian (UᴴΔAV₁)
24+ aUᴴΔAV₁ = inv_safe .(transpose (S₁) .+ S₁) .* project_antihermitian (UᴴΔAV₁)
25+ if ! iszerotangent (ΔU)
26+ ΔU₁ = view (ΔU, :, 1 : r)
27+ K̇ = hUᴴΔAV₁ + aUᴴΔAV₁
28+ mul! (ΔU₁, U₁, K̇)
29+ if m > r
30+ ΔAV₁ = mul! (ΔAV₁, U₁, UᴴΔAV₁, - 1 , 1 )
31+ ΔU₁ .+ = ΔAV₁ ./ transpose (S₁)
32+ end
33+ if size (U, 2 ) > r # these columns of U are undetermined, but U' * U̇ should be antihermitian
34+ U₂ = view (U, :, (r + 1 ): size (U, 2 ))
35+ ΔU₁ᴴU₂ = ΔU₁' * U₂
36+ ΔU₂ = view (ΔU, :, (r + 1 ): size (U, 2 ))
37+ mul! (ΔU₂, U₁, ΔU₁ᴴU₂, - 1 , 0 )
38+ end
39+ end
40+ if ! iszerotangent (ΔVᴴ)
41+ ΔV₁ᴴ = view (ΔVᴴ, 1 : r, :)
42+ Ṁ = hUᴴΔAV₁ - aUᴴΔAV₁
43+ mul! (ΔV₁ᴴ, Ṁ' , V₁ᴴ)
44+ if n > r
45+ UᴴΔA₁ = U₁' * ΔA
46+ UᴴΔA₁ = mul! (UᴴΔA₁, UᴴΔAV₁, V₁ᴴ, - 1 , 1 )
47+ ΔV₁ᴴ .+ = S₁ .\ UᴴΔA₁
48+ end
49+ if size (Vᴴ, 1 ) > r # these rows of Vᴴ are undetermined, but V * V̇ should be antihermitian
50+ V₂ᴴ = view (Vᴴ, (r + 1 ): size (Vᴴ, 1 ), :)
51+ V₂ᴴΔV₁ = V₂ᴴ * ΔV₁ᴴ'
52+ ΔV₂ᴴ = view (ΔVᴴ, (r + 1 ): size (Vᴴ, 1 ), :)
53+ mul! (ΔV₂ᴴ, V₂ᴴΔV₁, V₁ᴴ, - 1 , 0 )
54+ end
55+ end
56+ if eltype (U) <: Complex && ! iszerotangent (ΔU) && ! iszerotangent (ΔVᴴ) # fix gauge
57+ _, I = findmax (abs, U₁; dims = 1 )
58+ infinitesimal_phases = imag .(ΔU₁[I] ./ U₁[I])
59+ ΔU₁ .- = im .* U₁ .* infinitesimal_phases
60+ ΔV₁ᴴ .+ = im .* transpose (infinitesimal_phases) .* V₁ᴴ
61+ end
7662 end
7763 return (ΔU, ΔS, ΔVᴴ)
7864end
0 commit comments