From e52acb69fe5323b9c3124d73bf7ed57f7f7ae72d Mon Sep 17 00:00:00 2001 From: mtfishman Date: Thu, 6 Feb 2025 09:47:38 -0500 Subject: [PATCH 1/4] Use `dual` to take the dual of the codomain when building symmetric operators --- Project.toml | 6 +++--- .../QuantumOperatorDefinitionsITensorBaseExt.jl | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Project.toml b/Project.toml index 05781c7..82de063 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "QuantumOperatorDefinitions" uuid = "826dd319-6fd5-459a-a990-3a4f214664bf" authors = ["ITensor developers and contributors"] -version = "0.1.6" +version = "0.1.7" [deps] LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -10,13 +10,13 @@ Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" [weakdeps] BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" GradedUnitRanges = "e2de450a-8a67-46c7-b59c-01d5a3d041c5" -LabelledNumbers = "f856a3a6-4152-4ec4-b2a7-02c1a55d7993" ITensorBase = "4795dd04-0d67-49bb-8f44-b89c448a1dc7" +LabelledNumbers = "f856a3a6-4152-4ec4-b2a7-02c1a55d7993" NamedDimsArrays = "60cbd0c0-df58-4cb7-918c-6f5607b73fde" SymmetrySectors = "f8a8ad64-adbc-4fce-92f7-ffe2bb36a86e" [extensions] -QuantumOperatorDefinitionsITensorBaseExt = ["ITensorBase", "NamedDimsArrays"] +QuantumOperatorDefinitionsITensorBaseExt = ["ITensorBase", "GradedUnitRanges", "NamedDimsArrays"] QuantumOperatorDefinitionsSymmetrySectorsExt = ["BlockArrays", "GradedUnitRanges", "LabelledNumbers", "SymmetrySectors"] [compat] diff --git a/ext/QuantumOperatorDefinitionsITensorBaseExt/QuantumOperatorDefinitionsITensorBaseExt.jl b/ext/QuantumOperatorDefinitionsITensorBaseExt/QuantumOperatorDefinitionsITensorBaseExt.jl index c958bbd..f97004a 100644 --- a/ext/QuantumOperatorDefinitionsITensorBaseExt/QuantumOperatorDefinitionsITensorBaseExt.jl +++ b/ext/QuantumOperatorDefinitionsITensorBaseExt/QuantumOperatorDefinitionsITensorBaseExt.jl @@ -1,6 +1,7 @@ module QuantumOperatorDefinitionsITensorBaseExt -using ITensorBase: ITensorBase, ITensor, Index, dag, gettag, prime, settag +using ITensorBase: ITensorBase, ITensor, Index, gettag, prime, settag +using GradedUnitRanges: dual using NamedDimsArrays: dename using QuantumOperatorDefinitions: QuantumOperatorDefinitions, @@ -38,7 +39,7 @@ function QuantumOperatorDefinitions.has_fermion_string(n::String, r::Index) end function Base.axes(::OpName, domain::Tuple{Vararg{Index}}) - return (prime.(domain)..., dag.(domain)...) + return (prime.(domain)..., dual.(domain)...) end ## function Base.axes(::OpName"SWAP", domain::Tuple{Vararg{Index}}) ## return (prime.(reverse(domain))..., dag.(domain)...) From 98806b393c2d9dea298690a53b88f3cf66e49f50 Mon Sep 17 00:00:00 2001 From: mtfishman Date: Thu, 6 Feb 2025 14:22:33 -0500 Subject: [PATCH 2/4] Fix tests --- src/sitetype.jl | 1 - test/test_itensorbaseext.jl | 1 + test/test_symmetrysectorsext.jl | 24 ++++++++---------------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/sitetype.jl b/src/sitetype.jl index 373e65d..81c69b1 100644 --- a/src/sitetype.jl +++ b/src/sitetype.jl @@ -79,7 +79,6 @@ function Base.AbstractUnitRange(t::SiteType) end return Base.OneTo(length(t)) end -# kwargs are passed for fancier constructors, like `ITensors.Index`. function (rangetype::Type{<:AbstractUnitRange})(t::SiteType) return rangetype(AbstractUnitRange(t)) end diff --git a/test/test_itensorbaseext.jl b/test/test_itensorbaseext.jl index 7f07191..853ddc9 100644 --- a/test/test_itensorbaseext.jl +++ b/test/test_itensorbaseext.jl @@ -1,3 +1,4 @@ +using GradedUnitRanges: GradedUnitRanges using ITensorBase: ITensor, Index, gettag, hastag, prime, settag using NamedDimsArrays: dename using QuantumOperatorDefinitions: OpName, SiteType, StateName, op, site, sites, state diff --git a/test/test_symmetrysectorsext.jl b/test/test_symmetrysectorsext.jl index e7da36d..9c7b1c2 100644 --- a/test/test_symmetrysectorsext.jl +++ b/test/test_symmetrysectorsext.jl @@ -1,6 +1,6 @@ using BlockArrays: AbstractBlockArray, blocklengths using BlockSparseArrays: BlockSparseArray -using GradedUnitRanges: blocklabels +using GradedUnitRanges: blocklabels, dual, isdual using ITensorBase: ITensor, Index, gettag, prime, settag using QuantumOperatorDefinitions: OpName, SiteType, StateName, op, state using SymmetrySectors: SectorProduct, U1, Z @@ -64,11 +64,7 @@ using Test: @test, @test_broken, @testset t = SiteType("S=1/2"; gradings=("Sz",)) a = AbstractArray(2.0 * StateName("0"), t) @test a == [2, 0] - @test a isa AbstractBlockArray - # TODO: Currently slicing a dense array by graded ranges outputs a `BlockedArray` - # rather than a `BlockSparseArray`. - # See: https://github.com/ITensor/GradedUnitRanges.jl/issues/9 - @test_broken a isa BlockSparseArray + @test a isa BlockSparseArray (r1,) = axes(a) @test blocklabels(r1) == [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(1)))] @test blocklengths(r1) == [1, 1] @@ -76,13 +72,11 @@ using Test: @test, @test_broken, @testset t = SiteType("S=1/2"; gradings=("Sz",)) a = op("σ⁺", t) @test a == [0 2; 0 0] - @test a isa AbstractBlockArray - @test_broken a isa BlockSparseArray + @test a isa BlockSparseArray (r1, r2) = axes(a) @test blocklabels(r1) == [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(1)))] @test blocklengths(r1) == [1, 1] - # TODO: This is a bug in indexing with GradedUnitRangeDual, fix this. - @test_broken blocklabels(r2) == + @test blocklabels(r2) == [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(-1)))] @test blocklengths(r2) == [1, 1] end @@ -97,17 +91,15 @@ end i′ = prime(i) a = op("σ⁺", i) - # TODO: The indices should be `(i′, dual(i))`. - @test a == ITensor([0 2; 0 0], (i′, i)) + @test a == ITensor([0 2; 0 0], (i′, dual(i))) + @test all(isdual.(axes(a)) .== (false, true)) a′ = dename(a) - @test a′ isa AbstractBlockArray - @test_broken a′ isa BlockSparseArray + @test a′ isa BlockSparseArray # TODO: Test these without denaming `a`. (r1, r2) = axes(a′) @test blocklabels(r1) == [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(1)))] @test blocklengths(r1) == [1, 1] - # TODO: This is a bug in indexing with GradedUnitRangeDual, fix this. - @test_broken blocklabels(r2) == + @test blocklabels(r2) == [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(-1)))] @test blocklengths(r2) == [1, 1] end From e92761529586c8605b071a712922cc6d1cf14a42 Mon Sep 17 00:00:00 2001 From: mtfishman Date: Thu, 6 Feb 2025 14:24:23 -0500 Subject: [PATCH 3/4] Format --- test/test_symmetrysectorsext.jl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/test_symmetrysectorsext.jl b/test/test_symmetrysectorsext.jl index 9c7b1c2..6285b4a 100644 --- a/test/test_symmetrysectorsext.jl +++ b/test/test_symmetrysectorsext.jl @@ -76,8 +76,7 @@ using Test: @test, @test_broken, @testset (r1, r2) = axes(a) @test blocklabels(r1) == [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(1)))] @test blocklengths(r1) == [1, 1] - @test blocklabels(r2) == - [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(-1)))] + @test blocklabels(r2) == [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(-1)))] @test blocklengths(r2) == [1, 1] end @@ -99,7 +98,6 @@ end (r1, r2) = axes(a′) @test blocklabels(r1) == [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(1)))] @test blocklengths(r1) == [1, 1] - @test blocklabels(r2) == - [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(-1)))] + @test blocklabels(r2) == [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(-1)))] @test blocklengths(r2) == [1, 1] end From 7af59e5b121299fffa604298c4a0dc9e626699df Mon Sep 17 00:00:00 2001 From: mtfishman Date: Mon, 10 Feb 2025 17:56:21 -0500 Subject: [PATCH 4/4] Test no longer broken --- test/test_symmetrysectorsext.jl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/test_symmetrysectorsext.jl b/test/test_symmetrysectorsext.jl index 6285b4a..4f1f2e6 100644 --- a/test/test_symmetrysectorsext.jl +++ b/test/test_symmetrysectorsext.jl @@ -5,7 +5,7 @@ using ITensorBase: ITensor, Index, gettag, prime, settag using QuantumOperatorDefinitions: OpName, SiteType, StateName, op, state using SymmetrySectors: SectorProduct, U1, Z using NamedDimsArrays: dename -using Test: @test, @test_broken, @testset +using Test: @test, @testset @testset "SymmetrySectorsExt" begin t = SiteType("S=1/2"; gradings=("Sz",)) @@ -54,10 +54,8 @@ using Test: @test, @test_broken, @testset @test blocklabels(r2) == [SectorProduct((; Sz=U1(0))), SectorProduct((; Sz=U1(-1)))] @test blocklengths(r2) == [1, 1] - # TODO: There is a bug slicing `BitVector` by `GradedOneTo` in Julia 1.11, - # investigate. See: https://github.com/ITensor/GradedUnitRanges.jl/issues/9 t = SiteType("S=1/2"; gradings=("Sz",)) - @test state("0", t) == [1, 0] broken = VERSION ≥ v"1.11" + @test state("0", t) == [1, 0] # Force conversion to `Vector{Float64}` before conversion, # since there is a bug slicing `BitVector` by `GradedOneTo`.