Mercurial > repos > public > sbplib_julia
comparison src/LazyTensors/lazy_tensor_operations.jl @ 998:390dfc3db4b1 refactor/lazy_tensors
Move simplifying implementations from \circ to LazyTensorComposition
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Fri, 18 Mar 2022 21:36:17 +0100 |
parents | 20c376dffe84 |
children | 20cb83efb3f1 |
comparison
equal
deleted
inserted
replaced
997:20c376dffe84 | 998:390dfc3db4b1 |
---|---|
167 | 167 |
168 apply(tmi::IdentityTensor{T,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,D}) where {T,D} = v[I...] | 168 apply(tmi::IdentityTensor{T,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,D}) where {T,D} = v[I...] |
169 apply_transpose(tmi::IdentityTensor{T,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,D}) where {T,D} = v[I...] | 169 apply_transpose(tmi::IdentityTensor{T,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,D}) where {T,D} = v[I...] |
170 | 170 |
171 """ | 171 """ |
172 Base.:∘(tm, tmi) | 172 LazyTensorComposition(tm, tmi::IdentityTensor) |
173 Base.:∘(tmi, tm) | 173 LazyTensorComposition(tmi::IdentityTensor, tm) |
174 | 174 |
175 Composes a `Tensormapping` `tm` with an `IdentityTensor` `tmi`, by returning `tm` | 175 Composes a `Tensormapping` `tm` with an `IdentityTensor` `tmi`, by returning `tm` |
176 """ | 176 """ |
177 @inline function Base.:∘(tm::LazyTensor{T,R,D}, tmi::IdentityTensor{T,D}) where {T,R,D} | 177 function LazyTensorComposition(tm::LazyTensor{T,R,D}, tmi::IdentityTensor{T,D}) where {T,R,D} |
178 @boundscheck check_domain_size(tm, range_size(tmi)) | 178 @boundscheck check_domain_size(tm, range_size(tmi)) |
179 return tm | 179 return tm |
180 end | 180 end |
181 | 181 |
182 @inline function Base.:∘(tmi::IdentityTensor{T,R}, tm::LazyTensor{T,R,D}) where {T,R,D} | 182 function LazyTensorComposition(tmi::IdentityTensor{T,R}, tm::LazyTensor{T,R,D}) where {T,R,D} |
183 @boundscheck check_domain_size(tmi, range_size(tm)) | 183 @boundscheck check_domain_size(tmi, range_size(tm)) |
184 return tm | 184 return tm |
185 end | 185 end |
186 # Specialization for the case where tm is an IdentityTensor. Required to resolve ambiguity. | 186 # Specialization for the case where tm is an IdentityTensor. Required to resolve ambiguity. |
187 @inline function Base.:∘(tm::IdentityTensor{T,D}, tmi::IdentityTensor{T,D}) where {T,D} | 187 function LazyTensorComposition(tm::IdentityTensor{T,D}, tmi::IdentityTensor{T,D}) where {T,D} |
188 @boundscheck check_domain_size(tm, range_size(tmi)) | 188 @boundscheck check_domain_size(tm, range_size(tmi)) |
189 return tmi | 189 return tmi |
190 end | 190 end |
191 # TODO: Implement the above as LazyTensorComposition instead | |
192 # TODO: Move the operator definitions to one place | 191 # TODO: Move the operator definitions to one place |
193 | 192 |
194 """ | 193 """ |
195 ScalingTensor{T,D} <: LazyTensor{T,D,D} | 194 ScalingTensor{T,D} <: LazyTensor{T,D,D} |
196 | 195 |
204 LazyTensors.apply(tm::ScalingTensor{T,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,D}) where {T,D} = tm.λ*v[I...] | 203 LazyTensors.apply(tm::ScalingTensor{T,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,D}) where {T,D} = tm.λ*v[I...] |
205 LazyTensors.apply_transpose(tm::ScalingTensor{T,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,D}) where {T,D} = tm.λ*v[I...] | 204 LazyTensors.apply_transpose(tm::ScalingTensor{T,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,D}) where {T,D} = tm.λ*v[I...] |
206 | 205 |
207 LazyTensors.range_size(m::ScalingTensor) = m.size | 206 LazyTensors.range_size(m::ScalingTensor) = m.size |
208 LazyTensors.domain_size(m::ScalingTensor) = m.size | 207 LazyTensors.domain_size(m::ScalingTensor) = m.size |
209 | |
210 # TODO: Rename everything with mapping | |
211 # TODO: Remove ScalingOperator from tests | |
212 | 208 |
213 """ | 209 """ |
214 InflatedLazyTensor{T,R,D} <: LazyTensor{T,R,D} | 210 InflatedLazyTensor{T,R,D} <: LazyTensor{T,R,D} |
215 | 211 |
216 An inflated `LazyTensor` with dimensions added before and afer its actual dimensions. | 212 An inflated `LazyTensor` with dimensions added before and afer its actual dimensions. |