diff --git a/Project.toml b/Project.toml index 9a97b80..7a5ada9 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ITensorBase" uuid = "4795dd04-0d67-49bb-8f44-b89c448a1dc7" -version = "0.15.1" +version = "0.15.2" authors = ["ITensor developers and contributors"] [workspace] diff --git a/src/abstractnamedtensor.jl b/src/abstractnamedtensor.jl index c36352c..4423c00 100644 --- a/src/abstractnamedtensor.jl +++ b/src/abstractnamedtensor.jl @@ -1091,13 +1091,15 @@ function Base.getindex( end function Base.view(a::AbstractNamedTensor, I1::NamedViewIndex, Irest::NamedViewIndex...) I = (I1, Irest...) - perm = getperm(name.(I), names(a)) - isperm(perm) || throw( - NameMismatch( - "Dimension name mismatch $(names(a)), $(name.(I))." - ) - ) - Ip = map(p -> unnamed(I[p]), perm) + + # Check and throw if any index is a) not in `a` or b) repeated in `a`. + if !issubset(name.(I), names(a)) || !allunique(name.(I)) + throw(NameMismatch("Dimension name mismatch $(names(a)), $(name.(I)).")) + end + + Ip = map(getperm(name.(I), names(a))) do k + return isnothing(k) ? Colon() : unnamed(I[k]) + end return view_namedtensor(a, Ip...) end diff --git a/test/test_namedtensor_basics.jl b/test/test_namedtensor_basics.jl index 0c9b951..dd71c6f 100644 --- a/test/test_namedtensor_basics.jl +++ b/test/test_namedtensor_basics.jl @@ -519,4 +519,23 @@ end Name(:c_3_1) Name(:c_3_2) ] end + + @testset "view with a subset of named indices" begin + i, j, k = NamedOneTo(2, "i"), NamedOneTo(3, "j"), NamedOneTo(4, "k") + a = randn(i, j, k) + v = view(a, j[2:3]) + @test names(v) == names(a) + @test unnamed(v) == unnamed(a)[:, 2:3, :] + @test unnamed(v) === view(unnamed(a), :, (2:3), :) + @test unnamed(view(a, k[1:2], i[2:2])) == unnamed(a)[2:2, :, 1:2] + @test unnamed(a[j => 2:3]) == unnamed(a)[:, 2:3, :] + @test unnamed(view(a, j => 2:3)) == unnamed(a)[:, 2:3, :] + s = view(a, j[2]) + @test collect(names(s)) == collect(names(a))[[1, 3]] + @test unnamed(s) == unnamed(a)[:, 2, :] + @test unnamed(view(a, k[1:4], i[1:2], j[1:3])) == unnamed(a) + l = NamedOneTo(2, "l") + @test_throws NameMismatch view(a, l[1:2]) + @test_throws NameMismatch view(a, j[1:1], j[2:2]) + end end