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.