From b21723dcfda84bb65621251d3a82fd5b92388229 Mon Sep 17 00:00:00 2001 From: Confusio Date: Sat, 8 Mar 2025 21:52:07 +0800 Subject: [PATCH] docs(projectors): improve documentation and fix issues * Enhance documentation of `compute_projector` function in projectors.jl * Renormalize expanded corner tensors in sequential.jl and simultaneous.jl * Refactor `sequential_projectors` and `simultaneous_projectors` to use `compute_projector` * Remove unnecessary changes from previous commits Note: Tests in heisenberg.jl and tf_ising.jl fail due to KrylovKit issue #110 (https://github.com/Jutho/KrylovKit.jl/issues/110) --- src/algorithms/ctmrg/projectors.jl | 2 +- src/algorithms/ctmrg/sequential.jl | 14 ++++++++++---- src/algorithms/ctmrg/simultaneous.jl | 14 ++++++++++---- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/algorithms/ctmrg/projectors.jl b/src/algorithms/ctmrg/projectors.jl index c89bb8db..83d7f1ba 100644 --- a/src/algorithms/ctmrg/projectors.jl +++ b/src/algorithms/ctmrg/projectors.jl @@ -10,7 +10,7 @@ struct FixedSpaceTruncation <: TensorKit.TruncationScheme end """ ProjectorAlgorithm -Abstract super type for all CTMRG projector algorithms. +Abstract super type for all projector algorithms. """ abstract type ProjectorAlgorithm end diff --git a/src/algorithms/ctmrg/sequential.jl b/src/algorithms/ctmrg/sequential.jl index 1a9367bc..46521cd8 100644 --- a/src/algorithms/ctmrg/sequential.jl +++ b/src/algorithms/ctmrg/sequential.jl @@ -90,10 +90,10 @@ function sequential_projectors( r′ = _prev(r, size(env, 2)) Q1 = TensorMap(EnlargedCorner(network, env, (SOUTHWEST, r, c)), SOUTHWEST) Q2 = TensorMap(EnlargedCorner(network, env, (NORTHWEST, r′, c)), NORTHWEST) - + Q1, Q2 = Q1 / norm(Q1), Q2 / norm(Q2) alg = @set alg.svd_alg = svd_algorithm(alg, coordinate) - return compute_projector(Q1 / norm(Q1), Q2 / norm(Q2), alg) + return compute_projector(Q1, Q2, alg) end function sequential_projectors( coordinate::NTuple{3,Int}, network, env::CTMRGEnv, alg::FullInfiniteProjector @@ -102,15 +102,21 @@ function sequential_projectors( coordinate_nw = _next_coordinate(coordinate, rowsize, colsize) coordinate_ne = _next_coordinate(coordinate_nw, rowsize, colsize) coordinate_se = _next_coordinate(coordinate_ne, rowsize, colsize) - ec = ( + ec0 = ( TensorMap(EnlargedCorner(network, env, coordinate_se), SOUTHEAST), TensorMap(EnlargedCorner(network, env, coordinate), SOUTHWEST), TensorMap(EnlargedCorner(network, env, coordinate_nw), NORTHWEST), TensorMap(EnlargedCorner(network, env, coordinate_ne), NORTHEAST), ) - ec[:] /= norm.(ec[:]) + ec = ( + ec0[1] / norm(ec0[1]), + ec0[2] / norm(ec0[2]), + ec0[3] / norm(ec0[3]), + ec0[4] / norm(ec0[4]), + ) alg = @set alg.svd_alg = svd_algorithm(alg, coordinate) Q1, Q2 = ec[1] ⊙ ec[2], ec[3] ⊙ ec[4] + return compute_projector(Q1, Q2, alg) end diff --git a/src/algorithms/ctmrg/simultaneous.jl b/src/algorithms/ctmrg/simultaneous.jl index 9af43386..8105a72f 100644 --- a/src/algorithms/ctmrg/simultaneous.jl +++ b/src/algorithms/ctmrg/simultaneous.jl @@ -76,8 +76,8 @@ function simultaneous_projectors( coordinate, enlarged_corners::Array{E,3}, alg::HalfInfiniteProjector ) where {E} coordinate′ = _next_coordinate(coordinate, size(enlarged_corners)[2:3]...) - ec = (enlarged_corners[coordinate...], enlarged_corners[coordinate′...]) - ec[:] /= norm.(ec[:]) + ec0 = (enlarged_corners[coordinate...], enlarged_corners[coordinate′...]) + ec = (ec0[1] / norm(ec0[1]), ec0[2] / norm(ec0[2])) alg = @set alg.svd_alg = svd_algorithm(alg, coordinate) return compute_projector(ec[1], ec[2], alg) @@ -89,15 +89,21 @@ function simultaneous_projectors( coordinate2 = _next_coordinate(coordinate, rowsize, colsize) coordinate3 = _next_coordinate(coordinate2, rowsize, colsize) coordinate4 = _next_coordinate(coordinate3, rowsize, colsize) - ec = ( + ec0 = ( enlarged_corners[coordinate4...], enlarged_corners[coordinate...], enlarged_corners[coordinate2...], enlarged_corners[coordinate3...], ) - ec[:] /= norm.(ec[:]) + ec = ( + ec0[1] / norm(ec0[1]), + ec0[2] / norm(ec0[2]), + ec0[3] / norm(ec0[3]), + ec0[4] / norm(ec0[4]), + ) alg = @set alg.svd_alg = svd_algorithm(alg, coordinate) Q1, Q2 = ec[1] ⊙ ec[2], ec[3] ⊙ ec[4] + return compute_projector(Q1, Q2, alg) end