@@ -21,7 +21,6 @@ rtol = 1e-9
2121Random. seed! (123456789 )
2222r = randn (dtype, ℂ^ m, ℂ^ n)
2323R = randn (space (r))
24- broadenings = [10.0 ^ k for k in - 16 : - 4 ]
2524
2625full_alg = SVDAdjoint (; rrule_alg= (; alg= :full , broadening= 0 ))
2726iter_alg = SVDAdjoint (; fwd_alg= (; alg= :iterative ))
4241 @test g_fullsvd[1 ] ≈ g_itersvd[1 ] rtol = rtol
4342end
4443
45- @testset " Truncated SVD with χ= $χ and ε= $ε broadening" for ε in broadenings
46- broadened_alg = @set full_alg . rrule_alg . broadening = ε
47- l_unbroadened, g_unbroadened = withgradient (A -> lossfun (A, full_alg, R, trunc), r)
48- l_broadened, g_broadened = withgradient (A -> lossfun (A, broadened_alg, R, trunc), r)
44+ @testset " Truncated SVD broadening" begin
45+ u, s, v, = tsvd (r)
46+ s . data[ 1 : 2 : m] . = s . data[ 2 : 2 : m] # make every singular value two-fold degenerate
47+ r_degen = u * s * v
4948
50- @test l_unbroadened ≈ l_broadened
51- @test 1e1 * norm (g_broadened[1 ]) * ε > norm (g_unbroadened[1 ] - g_broadened[1 ]) > ε
49+ no_broadening_no_cutoff_alg = @set full_alg. rrule_alg. broadening = 1e-30
50+ small_broadening_alg = @set full_alg. rrule_alg. broadening = 1e-13
51+
52+ l_only_cutoff, g_only_cutoff = withgradient (
53+ A -> lossfun (A, full_alg, R, trunc), r_degen
54+ ) # cutoff sets degenerate difference to zero
55+ l_no_broadening_no_cutoff, g_no_broadening_no_cutoff = withgradient ( # degenerate singular value differences lead to divergent contributions
56+ A -> lossfun (A, no_broadening_no_cutoff_alg, R, trunc),
57+ r_degen,
58+ )
59+ l_small_broadening, g_small_broadening = withgradient ( # Lorentzian broadening smoothens divergent contributions
60+ A -> lossfun (A, small_broadening_alg, R, trunc),
61+ r_degen,
62+ )
63+
64+ @test l_only_cutoff ≈ l_no_broadening_no_cutoff ≈ l_small_broadening
65+ @test norm (g_no_broadening_no_cutoff[1 ] - g_small_broadening[1 ]) > 1e-1 # divergences mess up the gradient
66+ @test g_only_cutoff[1 ] ≈ g_small_broadening[1 ] rtol = rtol # cutoff and Lorentzian broadening have similar effect
5267end
5368
5469symm_m, symm_n = 18 , 24
@@ -80,17 +95,29 @@ symm_R = randn(dtype, space(symm_r))
8095 @test g_fullsvd_tr[1 ] ≈ g_itersvd_fb[1 ] rtol = rtol
8196end
8297
83- @testset " Truncated symmetric SVD with χ=$χ and ε=$ε broadening" for ε in broadenings
84- broadened_alg = @set full_alg. rrule_alg. broadening = ε
85- l_unbroadened, g_unbroadened = withgradient (
86- A -> lossfun (A, full_alg, symm_R, symm_trspace), symm_r
98+ @testset " Truncated symmetric SVD broadening" begin
99+ u, s, v, = tsvd (symm_r)
100+ s. data[1 : 2 : m] .= s. data[2 : 2 : m] # make every singular value two-fold degenerate
101+ symm_r_degen = u * s * v
102+
103+ no_broadening_no_cutoff_alg = @set full_alg. rrule_alg. broadening = 1e-30
104+ small_broadening_alg = @set full_alg. rrule_alg. broadening = 1e-13
105+
106+ l_only_cutoff, g_only_cutoff = withgradient (
107+ A -> lossfun (A, full_alg, symm_R, symm_trspace), symm_r_degen
108+ ) # cutoff sets degenerate difference to zero
109+ l_no_broadening_no_cutoff, g_no_broadening_no_cutoff = withgradient ( # degenerate singular value differences lead to divergent contributions
110+ A -> lossfun (A, no_broadening_no_cutoff_alg, symm_R, symm_trspace),
111+ symm_r_degen,
87112 )
88- l_broadened, g_broadened = withgradient (
89- A -> lossfun (A, broadened_alg, symm_R, symm_trspace), symm_r
113+ l_small_broadening, g_small_broadening = withgradient ( # Lorentzian broadening smoothens divergent contributions
114+ A -> lossfun (A, small_broadening_alg, symm_R, symm_trspace),
115+ symm_r_degen,
90116 )
91117
92- @test l_unbroadened ≈ l_broadened
93- @test 1e1 * norm (g_broadened[1 ]) * ε > norm (g_unbroadened[1 ] - g_broadened[1 ]) > ε
118+ @test l_only_cutoff ≈ l_no_broadening_no_cutoff ≈ l_small_broadening
119+ @test norm (g_no_broadening_no_cutoff[1 ] - g_small_broadening[1 ]) > 1e-2 # divergences mess up the gradient
120+ @test g_only_cutoff[1 ] ≈ g_small_broadening[1 ] rtol = rtol # cutoff and Lorentzian broadening have similar effect
94121end
95122
96123# TODO : Add when IterSVD is implemented for HalfInfiniteEnv
0 commit comments