Skip to content

Commit dc7bbeb

Browse files
committed
some changes
1 parent 64c849f commit dc7bbeb

1 file changed

Lines changed: 49 additions & 63 deletions

File tree

src/pushforwards/svd.jl

Lines changed: 49 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
= 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 *
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+
= 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ᴴ)
7864
end

0 commit comments

Comments
 (0)