diff --git a/src/tensoralgebra.jl b/src/tensoralgebra.jl index 4ea92b9..86e8091 100644 --- a/src/tensoralgebra.jl +++ b/src/tensoralgebra.jl @@ -263,6 +263,23 @@ for f in [ end end +function MAK.qr_compact!( + a::AbstractNamedTensor, names_codomain, names_domain; name = (;), kwargs... + ) + # `name` is a keyword here, so reach the `name` function through the module. + codomain = ITensorBase.name.(names_codomain) + domain = ITensorBase.name.(names_domain) + q_unnamed, r_unnamed = + TA.qr_compact!(unnamed(a), names(a), codomain, domain; kwargs...) + bond = to_uniquename_function(name)(nametype(a)) + return NamedTensor(q_unnamed, (codomain..., bond)), + NamedTensor(r_unnamed, (bond, domain...)) +end +function MAK.qr_compact!(a::AbstractNamedTensor, names_codomain; kwargs...) + codomain = name.(names_codomain) + return MAK.qr_compact!(a, codomain, names_setdiff(names(a), codomain); kwargs...) +end + # # SVD (three-output). # diff --git a/test/test_tensoralgebra.jl b/test/test_tensoralgebra.jl index e453767..e60cfe3 100644 --- a/test/test_tensoralgebra.jl +++ b/test/test_tensoralgebra.jl @@ -2,7 +2,8 @@ using ITensorBase: ITensorBase, Index, NamedOneTo, id, inds, mulopadd!, name, op prime, rename, unname, unnamed using LinearAlgebra: mul!, norm, tr using MatrixAlgebraKit: left_null, left_orth, left_polar, lq_compact, lq_full, qr_compact, - qr_full, right_null, right_orth, right_polar, svd_compact, svd_trunc, svd_vals + qr_compact!, qr_full, right_null, right_orth, right_polar, svd_compact, svd_trunc, + svd_vals using StableRNGs: StableRNG using TensorAlgebra: TensorAlgebra, contract, directsum, matricize, project, trivialrange, unchecked_project, unmatricize @@ -121,6 +122,12 @@ using Test: @test, @test_broken, @testset x, y = f(a, (i, k), (j, l)) @test x * y ≈ a end + + q, r = qr_compact(a, (i, k), (j, l)) + q′, r′ = qr_compact!(copy(a), (i, k), (j, l); name = Returns(names(r, 1))) + @test q′ ≈ q && r′ ≈ r + q′, r′ = qr_compact!(copy(a), (i, k)) + @test q′ * r′ ≈ a end @testset "svd" begin dims = (2, 2, 2, 2)