@@ -133,7 +133,7 @@ Base.iszero(α::ScalarOperator) = iszero(α.val)
133133
134134getops (α:: ScalarOperator ) = (α. val,)
135135isconstant (α:: ScalarOperator ) = α. update_func == DEFAULT_UPDATE_FUNC
136- has_ldiv (α:: ScalarOperator ) = iszero (α. val)
136+ has_ldiv (α:: ScalarOperator ) = ! iszero (α. val)
137137has_ldiv! (α:: ScalarOperator ) = has_ldiv (α)
138138
139139update_coefficients! (L:: ScalarOperator ,u,p,t) = (L. val = L. update_func (L. val,u,p,t); nothing )
@@ -224,4 +224,50 @@ Base.:-(α::AbstractSciMLScalarOperator{T}) where{T} = (-one(T)) * α
224224getops (α:: ComposedScalarOperator ) = α. ops
225225has_ldiv (α:: ComposedScalarOperator ) = all (has_ldiv, α. ops)
226226has_ldiv! (α:: ComposedScalarOperator ) = all (has_ldiv!, α. ops)
227+
228+ """
229+ Lazy inversion of Scalar Operators
230+ """
231+ #=
232+ Keeping with the style, we avoid use of the generic InvertedOperator and instead
233+ have a specialized type for this purpose that subtypes AbstractSciMLScalarOperator.
234+ =#
235+ struct InvertedScalarOperator{T,λType} <: AbstractSciMLScalarOperator{T}
236+ λ:: λType
237+
238+ function InvertedScalarOperator (λ:: AbstractSciMLScalarOperator{T} ) where {T}
239+ new {T,typeof(λ)} (λ)
240+ end
241+ end
242+ Base. inv (L:: AbstractSciMLScalarOperator ) = InvertedScalarOperator (L)
243+
244+ for op in (
245+ :/ ,
246+ )
247+ for T in SCALINGNUMBERTYPES[2 : end ]
248+ @eval Base.$ op (α:: AbstractSciMLScalarOperator , x:: $T ) = α * inv (ScalarOperator (x))
249+ @eval Base.$ op (x:: $T , α:: AbstractSciMLScalarOperator ) = ScalarOperator (x) * inv (α)
250+ @eval Base.$ op (α:: AbstractSciMLScalarOperator , β:: AbstractSciMLScalarOperator ) = α * inv (β)
251+ end
252+ end
253+
254+ for op in (
255+ :\ ,
256+ )
257+ for T in SCALINGNUMBERTYPES[2 : end ]
258+ @eval Base.$ op (α:: AbstractSciMLScalarOperator , x:: $T ) = inv (α) * ScalarOperator (x)
259+ @eval Base.$ op (x:: $T , α:: AbstractSciMLScalarOperator ) = inv (ScalarOperator (x)) * α
260+ @eval Base.$ op (α:: AbstractSciMLScalarOperator , β:: AbstractSciMLScalarOperator ) = inv (α) * β
261+ end
262+ end
263+
264+ function Base. convert (:: Type{Number} , α:: InvertedScalarOperator{T} ) where {T}
265+ return inv (convert (Number, α. λ))
266+ end
267+
268+ Base. conj (L:: InvertedScalarOperator ) = InvertedScalarOperator (conj (L. λ))
269+
270+ getops (α:: InvertedScalarOperator ) = (α. λ,)
271+ has_ldiv (α:: InvertedScalarOperator ) = has_mul (α. λ)
272+ has_ldiv! (α:: InvertedScalarOperator ) = has_ldiv (α)
227273#
0 commit comments