1- function check_eig_cotangents (D, VᴴΔV; degeneracy_atol:: Real = default_pullback_rank_atol (D), gauge_atol:: Real = default_pullback_gauge_atol (VᴴΔV))
2- mask = abs .(transpose (D) .- D) .< degeneracy_atol
3- # not GPU friendly...
4- Δgauge = norm (view (VᴴΔV, mask))
5- Δgauge ≤ gauge_atol ||
6- @warn " `eig` cotangents sensitive to gauge choice: (|Δgauge| = $Δgauge )"
7- return
8- end
9-
101"""
112 eig_pullback!(
123 ΔA::AbstractMatrix, A, DV, ΔDV, [ind];
@@ -49,7 +40,11 @@ function eig_pullback!(
4940 indV = axes (V, 2 )[ind]
5041 length (indV) == pV || throw (DimensionMismatch ())
5142 mul! (view (VᴴΔV, :, indV), V' , ΔV)
52- check_eig_cotangents (D, VᴴΔV; degeneracy_atol, gauge_atol)
43+
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 )"
5348
5449 VᴴΔV .*= conj .(inv_safe .(transpose (D) .- D, degeneracy_atol))
5550
@@ -83,16 +78,6 @@ function eig_pullback!(
8378 end
8479 return ΔA
8580end
86- function eig_pullback! (
87- ΔA:: Diagonal , A, DV, ΔDV, ind = Colon ();
88- degeneracy_atol:: Real = default_pullback_rank_atol (DV[1 ]),
89- gauge_atol:: Real = default_pullback_gauge_atol (ΔDV[2 ])
90- )
91- ΔA_full = zero! (similar (ΔA, size (ΔA)))
92- ΔA_full = eig_pullback! (ΔA_full, A, DV, ΔDV, ind; degeneracy_atol, gauge_atol)
93- diagview (ΔA) .+ = diagview (ΔA_full)
94- return ΔA
95- end
9681
9782"""
9883 eig_trunc_pullback!(
@@ -134,7 +119,10 @@ function eig_trunc_pullback!(
134119 if ! iszerotangent (ΔV)
135120 (n, p) == size (ΔV) || throw (DimensionMismatch ())
136121 VᴴΔV = V' * ΔV
137- check_eig_cotangents (D, VᴴΔV; degeneracy_atol, gauge_atol)
122+ mask = abs .(transpose (D) .- D) .< degeneracy_atol
123+ Δgauge = norm (view (VᴴΔV, mask), Inf )
124+ Δgauge ≤ gauge_atol ||
125+ @warn " `eig` cotangents sensitive to gauge choice: (|Δgauge| = $Δgauge )"
138126
139127 ΔVperp = ΔV - V * inv (G) * VᴴΔV
140128 VᴴΔV .*= conj .(inv_safe .(transpose (D) .- D, degeneracy_atol))
@@ -163,16 +151,6 @@ function eig_trunc_pullback!(
163151 end
164152 return ΔA
165153end
166- function eig_trunc_pullback! (
167- ΔA:: Diagonal , A, DV, ΔDV;
168- degeneracy_atol:: Real = default_pullback_rank_atol (DV[1 ]),
169- gauge_atol:: Real = default_pullback_gauge_atol (ΔDV[2 ])
170- )
171- ΔA_full = zero! (similar (ΔA, size (ΔA)))
172- ΔA_full = eig_trunc_pullback! (ΔA_full, A, DV, ΔDV; degeneracy_atol, gauge_atol)
173- diagview (ΔA) .+ = diagview (ΔA_full)
174- return ΔA
175- end
176154
177155"""
178156 eig_vals_pullback!(
@@ -193,6 +171,29 @@ function eig_vals_pullback!(
193171 ΔA, A, DV, ΔD, ind = Colon ();
194172 degeneracy_atol:: Real = default_pullback_rank_atol (DV[1 ]),
195173 )
174+
196175 ΔDV = (diagonal (ΔD), nothing )
197176 return eig_pullback! (ΔA, A, DV, ΔDV, ind; degeneracy_atol)
198177end
178+
179+ function eig_pullback! (
180+ ΔA:: Diagonal , A, DV, ΔDV, ind = Colon ();
181+ degeneracy_atol:: Real = default_pullback_rank_atol (DV[1 ]),
182+ gauge_atol:: Real = default_pullback_gauge_atol (ΔDV[2 ])
183+ )
184+ ΔA_full = zero! (similar (ΔA, size (ΔA)))
185+ eig_pullback! (ΔA_full, A, DV, ΔDV, ind; degeneracy_atol, gauge_atol)
186+ diagview (ΔA) .+ = diagview (ΔA_full)
187+ return ΔA
188+ end
189+
190+ function eig_trunc_pullback! (
191+ ΔA:: Diagonal , A, DV, ΔDV;
192+ degeneracy_atol:: Real = default_pullback_rank_atol (DV[1 ]),
193+ gauge_atol:: Real = default_pullback_gauge_atol (ΔDV[2 ])
194+ )
195+ ΔA_full = zero! (similar (ΔA, size (ΔA)))
196+ eig_trunc_pullback! (ΔA_full, A, DV, ΔDV; degeneracy_atol, gauge_atol)
197+ diagview (ΔA) .+ = diagview (ΔA_full)
198+ return ΔA
199+ end
0 commit comments