Mercurial > repos > public > sbplib_julia
changeset 429:46acb2560451 feature/lazy_identity
Start implementing LazyIdentity
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Sun, 18 Oct 2020 22:30:17 +0200 |
parents | 10a67ac48d6e |
children | 541c16a8c791 904aae1899df |
files | src/LazyTensors/lazy_tensor_operations.jl test/testLazyTensors.jl |
diffstat | 2 files changed, 45 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/LazyTensors/lazy_tensor_operations.jl Sun Oct 18 22:21:43 2020 +0200 +++ b/src/LazyTensors/lazy_tensor_operations.jl Sun Oct 18 22:30:17 2020 +0200 @@ -141,3 +141,24 @@ function apply_transpose(llm::LazyLinearMap{T,R,D}, v::AbstractArray{T,R}, I::Vararg{Index,D}) where {T,R,D} apply(LazyLinearMap(llm.A, llm.domain_indicies, llm.range_indicies), v, I...) end + + +""" + LazyIdentity{T,D} <: TensorMapping{T,D,D} + +The lazy identity TensorMapping for a given size. Usefull for building up higher dimensional tensor mappings from lower +dimensional ones through outer products. Also used in the Implementation for InflatedTensorMapping. +""" +struct LazyIdentity{T,D} <: TensorMapping{T,D,D} + size::NTuple{D,Int} +end +export LazyIdentity + +LazyIdentity{T}(size::NTuple{D,Int}) where {T,D} = LazyIdentity{T,D}(size) + +range_size(tmi::LazyIdentity) = tmi.size +domain_size(tmi::LazyIdentity) = tmi.size + +apply(tmi::LazyIdentity{T,D}, v::AbstractArray{T,D}, I::Vararg{Index,D}) where {T,D} = v[Int.(I)...] +apply_transpose(tmi::LazyIdentity{T,D}, v::AbstractArray{T,D}, I::Vararg{Index,D}) where {T,D} = v[Int.(I)...] +
--- a/test/testLazyTensors.jl Sun Oct 18 22:21:43 2020 +0200 +++ b/test/testLazyTensors.jl Sun Oct 18 22:30:17 2020 +0200 @@ -259,4 +259,28 @@ end + +@testset "LazyIdentity" begin + @test LazyIdentity{Float64}((4,5)) isa LazyIdentity{T,2} where T + @test LazyIdentity{Float64}((4,5)) isa TensorMapping{T,2,2} where T + A = rand(3,4) + Ã = LazyLinearMap(A, (1,), (2,)) + v = rand(4) + + for sz ∈ [(4,5),(3,),(5,6,4)] + I = LazyIdentity{Float64}(sz) + v = rand(sz...) + @test I*v == v + @test I'*v == v + + @test range_size(I) == sz + @test domain_size(I) == sz + end + + I = LazyIdentity{Float64}((4,5)) + v = rand(4,5) + @inferred (I*v)[3,2] + @inferred range_size(I) end + +end