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
diff -r 377df47849cb -r e70417f95713 src/LazyTensors/LazyTensors.jl
--- 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
diff -r 377df47849cb -r e70417f95713 src/LazyTensors/lazy_tensor_operations.jl
--- 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
 
diff -r 377df47849cb -r e70417f95713 src/LazyTensors/tensor_types.jl
--- 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}
 
diff -r 377df47849cb -r e70417f95713 test/LazyTensors/tensor_types_test.jl
--- 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))