|
| 1 | +function check_eig_cotangents(D, VᴴΔV; |
| 2 | + degeneracy_atol::Real = default_pullback_rank_atol(D), |
| 3 | + gauge_atol::Real = default_pullback_gauge_atol(VᴴΔV) |
| 4 | + ) |
| 5 | + mask = abs.(transpose(D) .- D) .< degeneracy_atol |
| 6 | + Δgauge = norm(view(VᴴΔV, mask)) |
| 7 | + Δgauge ≤ gauge_atol || |
| 8 | + @warn "`eig` cotangents sensitive to gauge choice: (|Δgauge| = $Δgauge)" |
| 9 | + return |
| 10 | +end |
| 11 | + |
1 | 12 | """ |
2 | 13 | eig_pullback!( |
3 | 14 | ΔA::AbstractMatrix, A, DV, ΔDV, [ind]; |
@@ -41,10 +52,7 @@ function eig_pullback!( |
41 | 52 | length(indV) == pV || throw(DimensionMismatch()) |
42 | 53 | mul!(view(VᴴΔV, :, indV), V', ΔV) |
43 | 54 |
|
44 | | - mask = abs.(transpose(D) .- D) .< degeneracy_atol |
45 | | - Δgauge = norm(view(VᴴΔV, mask), Inf) |
46 | | - Δgauge ≤ gauge_atol || |
47 | | - @warn "`eig` cotangents sensitive to gauge choice: (|Δgauge| = $Δgauge)" |
| 55 | + check_eig_cotangents(D, VᴴΔV; degeneracy_atol, gauge_atol) |
48 | 56 |
|
49 | 57 | VᴴΔV .*= conj.(inv_safe.(transpose(D) .- D, degeneracy_atol)) |
50 | 58 |
|
@@ -129,10 +137,7 @@ function eig_trunc_pullback!( |
129 | 137 | if !iszerotangent(ΔV) |
130 | 138 | (n, p) == size(ΔV) || throw(DimensionMismatch()) |
131 | 139 | VᴴΔV = V' * ΔV |
132 | | - mask = abs.(transpose(D) .- D) .< degeneracy_atol |
133 | | - Δgauge = norm(view(VᴴΔV, mask), Inf) |
134 | | - Δgauge ≤ gauge_atol || |
135 | | - @warn "`eig` cotangents sensitive to gauge choice: (|Δgauge| = $Δgauge)" |
| 140 | + check_eig_cotangents(D, VᴴΔV; degeneracy_atol, gauge_atol) |
136 | 141 |
|
137 | 142 | ΔVperp = ΔV - V * inv(G) * VᴴΔV |
138 | 143 | VᴴΔV .*= conj.(inv_safe.(transpose(D) .- D, degeneracy_atol)) |
|
0 commit comments