Mercurial > repos > public > sbplib_julia
changeset 2061:e70417f95713 feature/lazy_tensors/zero_tensor
Add ZeroTensor
| author | Jonatan Werpers <jonatan@werpers.com> |
|---|---|
| date | Mon, 16 Feb 2026 21:46:35 +0100 |
| parents | 377df47849cb |
| children | |
| files | src/LazyTensors/LazyTensors.jl src/LazyTensors/lazy_tensor_operations.jl src/LazyTensors/tensor_types.jl test/LazyTensors/tensor_types_test.jl |
| diffstat | 4 files changed, 43 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/LazyTensors/LazyTensors.jl Sat Feb 14 23:37:40 2026 +0100 +++ b/src/LazyTensors/LazyTensors.jl Mon Feb 16 21:46:35 2026 +0100 @@ -12,6 +12,7 @@ export TensorNegation export TensorSum export IdentityTensor +export ZeroTensor export ScalingTensor export DiagonalTensor export DenseTensor
--- a/src/LazyTensors/lazy_tensor_operations.jl Sat Feb 14 23:37:40 2026 +0100 +++ b/src/LazyTensors/lazy_tensor_operations.jl Mon Feb 16 21:46:35 2026 +0100 @@ -113,6 +113,9 @@ range_size(tmBinOp::TensorSum) = range_size(tmBinOp.tms[1]) domain_size(tmBinOp::TensorSum) = domain_size(tmBinOp.tms[1]) +TensorSum(a::ZeroTensor{T,R,D}, b::ZeroTensor{T,R,D}) where {T,R,D} = ZeroTensor{T,R,D}() +TensorSum(::ZeroTensor, t::LazyTensor) = t +TensorSum(t::LazyTensor, ::ZeroTensor) = t """ TensorComposition{T,R,K,D} @@ -161,6 +164,20 @@ return tmi end + +function TensorComposition(a::ZeroTensor{T,R,D}, b::ZeroTensor{T,D,K}) where {T,R,D,K} + return ZeroTensor{T,R,K}() +end + +function TensorComposition(a::ZeroTensor{T,R,D}, b::LazyTensor{T,D,K}) where {T,R,D,K} + return ZeroTensor{T,R,K}() +end + +function TensorComposition(a::LazyTensor{T,R,D}, b::ZeroTensor{T,D,K}) where {T,R,D,K} + return ZeroTensor{T,R,K}() +end + + Base.:*(a::T, tm::LazyTensor{T}) where T = TensorComposition(ScalingTensor{T,range_dim(tm)}(a,range_size(tm)), tm) Base.:*(tm::LazyTensor{T}, a::T) where T = a*tm
--- a/src/LazyTensors/tensor_types.jl Sat Feb 14 23:37:40 2026 +0100 +++ b/src/LazyTensors/tensor_types.jl Mon Feb 16 21:46:35 2026 +0100 @@ -19,6 +19,12 @@ apply_transpose(tmi::IdentityTensor{T,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,D}) where {T,D} = v[I...] +struct ZeroTensor{T,R,D} <: LazyTensor{T,R,D} +end + +Base.zero(::LazyTensor{T,R,D}) where {T,R,D} = ZeroTensor{T,R,D}() +Base.zero(::Type{<:LazyTensor{T,R,D}}) where {T,R,D} = ZeroTensor{T,R,D}() + """ ScalingTensor{T,D} <: LazyTensor{T,D,D}
--- a/test/LazyTensors/tensor_types_test.jl Sat Feb 14 23:37:40 2026 +0100 +++ b/test/LazyTensors/tensor_types_test.jl Mon Feb 16 21:46:35 2026 +0100 @@ -44,6 +44,25 @@ @test_throws DomainSizeMismatch I1∘I2 end +@testset "ZeroTensor" begin + @test ZeroTensor{Float64,2,2}() isa LazyTensor{Float64, 2, 2} + @test zero(LazyTensor{Float64,2,2}) == ZeroTensor{Float64,2,2}() + @test zero(LazyTensor{Float64,2,3}) == ZeroTensor{Float64,2,3}() + @test zero(ScalingTensor(1, (10,4))) == ZeroTensor{Int,2,2}() + + @test ZeroTensor{Float64, 2,2}()∘ZeroTensor{Float64, 2,2}() == ZeroTensor{Float64, 2,2}() + @test ZeroTensor{Float64, 1,2}()∘ZeroTensor{Float64, 2,3}() == ZeroTensor{Float64, 1,3}() + @test ZeroTensor{Float64, 2, 2}()∘ScalingTensor(1., (10,9)) == ZeroTensor{Float64, 2, 2}() + @test ZeroTensor{Float64, 3, 2}()∘ScalingTensor(1., (10,9)) == ZeroTensor{Float64, 3, 2}() + @test ScalingTensor(1., (10,9))∘ZeroTensor{Float64, 2, 2}()== ZeroTensor{Float64, 2, 2}() + @test ScalingTensor(1., (10,9))∘ZeroTensor{Float64, 2, 3}()== ZeroTensor{Float64, 2, 3}() + + + @test ZeroTensor{Float64,2,2}() + ZeroTensor{Float64,2,2}() == ZeroTensor{Float64,2,2}() + @test ZeroTensor{Float64,2,3}() + ZeroTensor{Float64,2,3}() == ZeroTensor{Float64,2,3}() + @test ZeroTensor{Float64,2,2}() + ScalingTensor(1., (10,9)) == ScalingTensor(1., (10,9)) + @test ScalingTensor(1., (10,9)) + ZeroTensor{Float64,2,2}() == ScalingTensor(1., (10,9)) +end @testset "ScalingTensor" begin st = ScalingTensor(2.,(3,4))
