From d40d61016fb903248f279e0905bf7e9e35b03d38 Mon Sep 17 00:00:00 2001 From: Yue Zhengyuan Date: Tue, 27 Oct 2026 15:42:35 +0800 Subject: [PATCH 1/2] Fix eigenvalue selection in Arnoldi fixed-point gradient solver --- src/algorithms/optimization/implicit_differentiation.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/algorithms/optimization/implicit_differentiation.jl b/src/algorithms/optimization/implicit_differentiation.jl index 7eeeec356..c819c8a77 100644 --- a/src/algorithms/optimization/implicit_differentiation.jl +++ b/src/algorithms/optimization/implicit_differentiation.jl @@ -345,7 +345,8 @@ function fixedpoint_gradient(∂E∂x, ∂f∂x, ∂f∂A, x₀, alg::KrylovKit. return (VI.add!!(y, ∂E∂x, X[2]), X[2]) end X₀ = (x₀, one(scalartype(x₀))) - _, vecs, info = realeigsolve(f, X₀, 1, :LM, alg) + which = EigSorter(λ -> abs(λ - one(λ))) + _, vecs, info = realeigsolve(f, X₀, 1, which, alg) if alg.verbosity > 0 && info.converged < 1 @warn("gradient fixed-point iteration reached maximal number of iterations:", info) end From 8dfd0cabe22be94df4c67cd5a637352f14218009 Mon Sep 17 00:00:00 2001 From: leburgel Date: Wed, 28 Oct 2026 13:54:51 +0100 Subject: [PATCH 2/2] Differentiate the global phases in the gauge-fixed CTMRG iteration and restore :LM --- .../optimization/implicit_differentiation.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/algorithms/optimization/implicit_differentiation.jl b/src/algorithms/optimization/implicit_differentiation.jl index c819c8a77..def6063f9 100644 --- a/src/algorithms/optimization/implicit_differentiation.jl +++ b/src/algorithms/optimization/implicit_differentiation.jl @@ -227,11 +227,12 @@ function _rrule( alg_fixed = _set_fixed_truncation(alg) # fix spaces during differentiation alg_gauge = _scrambling_env_gauge(alg) # select appropriate gauge-fixing algorithm env_conv, info = ctmrg_iteration(InfiniteSquareNetwork(state), env, alg_fixed) - signs, corner_phases, edge_phases = compute_gauge_fix_gauge(env_conv, env, alg_gauge) + signs, = compute_gauge_fix_gauge(env_conv, env, alg_gauge) + # fix global phases relative to the fixed point inside the iteration function gauge_fixed_iteration(A, x) - return fix_phases( - ctmrg_iteration(InfiniteSquareNetwork(A), x, alg_fixed)[1], - signs, corner_phases, edge_phases, + return fix_global_phases( + fix_relative_phases(ctmrg_iteration(InfiniteSquareNetwork(A), x, alg_fixed)[1], signs), + env, ) end # prepare its pullback @@ -345,8 +346,7 @@ function fixedpoint_gradient(∂E∂x, ∂f∂x, ∂f∂A, x₀, alg::KrylovKit. return (VI.add!!(y, ∂E∂x, X[2]), X[2]) end X₀ = (x₀, one(scalartype(x₀))) - which = EigSorter(λ -> abs(λ - one(λ))) - _, vecs, info = realeigsolve(f, X₀, 1, which, alg) + _, vecs, info = realeigsolve(f, X₀, 1, :LM, alg) if alg.verbosity > 0 && info.converged < 1 @warn("gradient fixed-point iteration reached maximal number of iterations:", info) end