From 8318638803e62aa6b9892004653d7cb5e46056cf Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Thu, 15 Jan 2026 12:45:50 +0100 Subject: [PATCH 1/2] specialize UniqueFusion norm --- src/tensors/linalg.jl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/tensors/linalg.jl b/src/tensors/linalg.jl index 38c45c1f9..0608d6ea5 100644 --- a/src/tensors/linalg.jl +++ b/src/tensors/linalg.jl @@ -278,6 +278,12 @@ function _norm(blockiter, p::Real, init::Real) throw(ArgumentError(msg)) end end +function LinearAlgebra.norm(t::TensorMap, p::Real = 2) + InnerProductStyle(t) === EuclideanInnerProduct() || throw_invalid_innerproduct(:norm) + # performance specialization: + FusionStyle(sectortype(t)) isa UniqueFusion && return norm(t.data, p) + return _norm(blocks(t), p, float(zero(real(scalartype(t))))) +end _default_rtol(t) = eps(real(float(scalartype(t)))) * min(dim(domain(t)), dim(codomain(t))) From d7ece93a32ff932fc50fa40cd3168f9cc954ef2d Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Thu, 15 Jan 2026 12:46:05 +0100 Subject: [PATCH 2/2] replace `sum` with manual loop because less allocations for some reason --- src/tensors/linalg.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tensors/linalg.jl b/src/tensors/linalg.jl index 0608d6ea5..d174bef71 100644 --- a/src/tensors/linalg.jl +++ b/src/tensors/linalg.jl @@ -269,8 +269,9 @@ function _norm(blockiter, p::Real, init::Real) return isempty(b) ? init : oftype(init, LinearAlgebra.normInf(b)) end elseif p > 0 # finite positive p - np = sum(blockiter; init) do (c, b) - return oftype(init, dim(c) * norm(b, p)^p) + np = init + for (c, b) in blockiter + np += oftype(init, dim(c) * norm(b, p)^p) end return np^(inv(oftype(np, p))) else