From a515a437bd3c400564ce2984c785af716b294c14 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Wed, 29 Apr 2026 08:54:59 -0400 Subject: [PATCH 1/2] Fix creation of dense similar for linalg --- src/auxiliary/blockarrays.jl | 9 +++++++++ src/linalg/factorizations.jl | 6 ++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/auxiliary/blockarrays.jl b/src/auxiliary/blockarrays.jl index 94be967..53a2a69 100644 --- a/src/auxiliary/blockarrays.jl +++ b/src/auxiliary/blockarrays.jl @@ -1,3 +1,12 @@ +similar_dense(::Type{Vector{T}}, sz::NTuple{N, Ti}) where {T, N, Ti} = Array{T, N}(undef, sz) +similar_dense(::Type{TA}, sz) where {T, N, P, TA <: Base.SubArray{T, N, P}} = similar_dense(P, sz) +similar_dense(::Type{TA}, sz) where {T, N, P, TA <: Base.ReshapedArray{T, N, P}} = similar_dense(P, sz) +similar_dense(::Type{TA}, sz) where {T, N, TA <: AbstractArray{T, N}} = TA(undef, sz) +function similar_dense(A::BlockMatrix{T, R}) where {T, R} + Adense = similar_dense(eltype(R), size(A)) + return Adense +end + function copy_dense!(Adense, A) for block_index in Iterators.product(blockaxes(A)...) a = view(A, block_index...) diff --git a/src/linalg/factorizations.jl b/src/linalg/factorizations.jl index 1b06be9..5d49f65 100644 --- a/src/linalg/factorizations.jl +++ b/src/linalg/factorizations.jl @@ -25,7 +25,8 @@ for f! in ( ) @eval function MAK.$f!(t::AbstractBlockTensorMap, F, alg::AbstractAlgorithm) TensorKit.foreachblock(t, F...) do _, (tblock, Fblocks...) - Fblocks′ = MAK.$f!(copy_dense!(similar(tblock, size(tblock)), tblock), alg) + dense_block = similar_dense(tblock) + Fblocks′ = MAK.$f!(copy_dense!(dense_block, tblock), alg) # deal with the case where the output is not in-place for (b′, b) in zip(Fblocks′, Fblocks) b === b′ || copy!(b, b′) @@ -44,7 +45,8 @@ for f! in ( ) @eval function MAK.$f!(t::AbstractBlockTensorMap, N, alg::AbstractAlgorithm) TensorKit.foreachblock(t, N) do _, (tblock, Nblock) - Nblock′ = MAK.$f!(copy_dense!(similar(tblock, size(tblock)), tblock), alg) + dense_block = similar_dense(tblock) + Nblock′ = MAK.$f!(copy_dense!(dense_block, tblock), alg) # deal with the case where the output is not the same as the input Nblock === Nblock′ || copy!(Nblock, Nblock′) return nothing From aadf49a6fcaaca923cc2cf33ac2285180dbc789e Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Wed, 29 Apr 2026 09:03:55 -0400 Subject: [PATCH 2/2] Use Dims --- src/auxiliary/blockarrays.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/auxiliary/blockarrays.jl b/src/auxiliary/blockarrays.jl index 53a2a69..ce5a44d 100644 --- a/src/auxiliary/blockarrays.jl +++ b/src/auxiliary/blockarrays.jl @@ -1,4 +1,4 @@ -similar_dense(::Type{Vector{T}}, sz::NTuple{N, Ti}) where {T, N, Ti} = Array{T, N}(undef, sz) +similar_dense(::Type{Vector{T}}, sz::Dims{N}) where {T, N} = Array{T, N}(undef, sz) similar_dense(::Type{TA}, sz) where {T, N, P, TA <: Base.SubArray{T, N, P}} = similar_dense(P, sz) similar_dense(::Type{TA}, sz) where {T, N, P, TA <: Base.ReshapedArray{T, N, P}} = similar_dense(P, sz) similar_dense(::Type{TA}, sz) where {T, N, TA <: AbstractArray{T, N}} = TA(undef, sz)