@@ -168,87 +168,6 @@ for op in (
168168 end
169169end
170170
171- """
172- ScalarOperator(val[; update_func])
173-
174- (α::ScalarOperator)(a::Number) = α * a
175-
176- Represents a time-dependent scalar/scaling operator. The update function
177- is called by `update_coefficients!` and is assumed to have the following
178- signature:
179-
180- update_func(oldval,u,p,t) -> newval
181- """
182- struct ScalarOperator{T<: Number ,F} <: AbstractSciMLLinearOperator{T}
183- val:: T
184- update_func:: F
185- ScalarOperator (val:: T ; update_func= DEFAULT_UPDATE_FUNC) where {T} =
186- new {T,typeof(update_func)} (val, update_func)
187- end
188-
189- # constructors
190- Base. convert (:: Type{Number} , α:: ScalarOperator ) = α. val
191- Base. convert (:: Type{ScalarOperator} , α:: Number ) = ScalarOperator (α)
192-
193- ScalarOperator (α:: ScalarOperator ) = α
194- ScalarOperator (λ:: UniformScaling ) = ScalarOperator (λ. λ)
195-
196- # traits
197- Base. size (α:: ScalarOperator ) = ()
198- function Base. adjoint (α:: ScalarOperator ) # TODO - test this thoroughly
199- val = α. val'
200- update_func = (oldval,u,p,t) -> α. update_func (oldval' ,u,p,t)'
201- ScalarOperator (val; update_func= update_func)
202- end
203- Base. transpose (α:: ScalarOperator ) = α
204-
205- Base. one (:: ScalarOperator{T} ) where {T} = ScalarOperator (one (T))
206- Base. zero (:: ScalarOperator{T} ) where {T} = ScalarOperator (zero (T))
207-
208- Base. one (:: Type{<:AbstractSciMLOperator} ) = ScalarOperator (true )
209- Base. zero (:: Type{<:AbstractSciMLOperator} ) = ScalarOperator (false )
210-
211- getops (α:: ScalarOperator ) = (α. val,)
212- islinear (L:: ScalarOperator ) = true
213- issquare (L:: ScalarOperator ) = true
214- isconstant (α:: ScalarOperator ) = α. update_func == DEFAULT_UPDATE_FUNC
215- Base. iszero (α:: ScalarOperator ) = iszero (α. val)
216- has_adjoint (:: ScalarOperator ) = true
217- has_mul (:: ScalarOperator ) = true
218- has_mul! (:: ScalarOperator ) = true
219- has_ldiv (α:: ScalarOperator ) = iszero (α. val)
220- has_ldiv! (α:: ScalarOperator ) = iszero (α. val)
221-
222- for op in (
223- :* , :/ , :\ ,
224- )
225- for T in (
226- :Number ,
227- :AbstractVecOrMat ,
228- )
229- @eval Base.$ op (α:: ScalarOperator , x:: $T ) = $ op (α. val, x)
230- @eval Base.$ op (x:: $T , α:: ScalarOperator ) = $ op (x, α. val)
231- end
232- @eval Base.$ op (x:: ScalarOperator , y:: ScalarOperator ) = $ op (x. val, y. val) # TODO - lazy compose instead?
233- end
234-
235- for op in (:- , :+ )
236- @eval Base.$ op (α:: ScalarOperator , x:: Number ) = $ op (α. val, x)
237- @eval Base.$ op (x:: Number , α:: ScalarOperator ) = $ op (x, α. val)
238- @eval Base.$ op (x:: ScalarOperator , y:: ScalarOperator ) = $ op (x. val, y. val) # TODO - lazy sum instead?
239- end
240-
241- LinearAlgebra. lmul! (α:: ScalarOperator , u:: AbstractVecOrMat ) = lmul! (α. val, u)
242- LinearAlgebra. rmul! (u:: AbstractVecOrMat , α:: ScalarOperator ) = rmul! (u, α. val)
243- LinearAlgebra. mul! (v:: AbstractVecOrMat , α:: ScalarOperator , u:: AbstractVecOrMat ) = mul! (v, α. val, u)
244- LinearAlgebra. mul! (v:: AbstractVecOrMat , α:: ScalarOperator , u:: AbstractVecOrMat , a, b) = mul! (v, α. val, u, a, b)
245- LinearAlgebra. axpy! (α:: ScalarOperator , x:: AbstractVecOrMat , y:: AbstractVecOrMat ) = axpy! (α. val, x, y)
246- LinearAlgebra. axpby! (α:: ScalarOperator , x:: AbstractVecOrMat , β:: ScalarOperator , y:: AbstractVecOrMat ) = axpby! (α. val, x, β. val, y)
247- Base. abs (α:: ScalarOperator ) = abs (α. val)
248-
249- LinearAlgebra. ldiv! (v:: AbstractVecOrMat , α:: ScalarOperator , u:: AbstractVecOrMat ) = ldiv! (v, α. val, u)
250- LinearAlgebra. ldiv! (α:: ScalarOperator , u:: AbstractVecOrMat ) = ldiv! (α. val, u)
251-
252171"""
253172 ScaledOperator
254173
0 commit comments