diff --git a/src/tensors/linalg.jl b/src/tensors/linalg.jl index 38c45c1f9..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 @@ -278,6 +279,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)))