@@ -18,6 +18,7 @@ Base.convert(::Type{AbstractMatrix}, ::IdentityOperator{N}) where{N} = Diagonal(
1818Base. size (:: IdentityOperator{N} ) where {N} = (N, N)
1919Base. adjoint (A:: IdentityOperator ) = A
2020Base. transpose (A:: IdentityOperator ) = A
21+ Base. conj (A:: IdentityOperator ) = A
2122LinearAlgebra. opnorm (:: IdentityOperator{N} , p:: Real = 2 ) where {N} = true
2223for pred in (
2324 :issymmetric , :ishermitian , :isposdef ,
@@ -108,6 +109,7 @@ Base.convert(::Type{AbstractMatrix}, ::NullOperator{N}) where{N} = Diagonal(zero
108109Base. size (:: NullOperator{N} ) where {N} = (N, N)
109110Base. adjoint (A:: NullOperator ) = A
110111Base. transpose (A:: NullOperator ) = A
112+ Base. conj (A:: NullOperator ) = A
111113LinearAlgebra. opnorm (:: NullOperator{N} , p:: Real = 2 ) where {N} = false
112114for pred in (
113115 :issymmetric , :ishermitian ,
@@ -253,35 +255,26 @@ LinearAlgebra.ldiv!(α::ScalarOperator, u::AbstractVecOrMat) = ldiv!(α.val, u)
253255 (λ L)*(u) = λ * L(u)
254256"""
255257struct ScaledOperator{T,
256- λType<: ScalarOperator ,
257- LType<: AbstractSciMLOperator ,
258- C,
258+ λType,
259+ LType,
259260 } <: AbstractSciMLOperator{T}
260261 λ:: λType
261262 L:: LType
262- cache:: C
263263
264- function ScaledOperator (λ:: ScalarOperator {Tλ} ,
264+ function ScaledOperator (λ:: AbstractSciMLScalarOperator {Tλ} ,
265265 L:: AbstractSciMLOperator{TL} ,
266- cache = zeros (promote_type (Tλ,TL), 1 ),
267266 ) where {Tλ,TL}
268267 T = promote_type (Tλ, TL)
269- new {T,typeof(λ),typeof(L),typeof(cache) } (λ, L, cache )
268+ new {T,typeof(λ),typeof(L)} (λ, L)
270269 end
271270end
272271
273- ScalingNumberTypes = (
274- :ScalarOperator ,
275- :Number ,
276- :UniformScaling ,
277- )
278-
279272# constructors
280- for T in ScalingNumberTypes [2 : end ]
273+ for T in SCALINGNUMBERTYPES [2 : end ]
281274 @eval ScaledOperator (λ:: $T , L:: AbstractSciMLOperator ) = ScaledOperator (ScalarOperator (λ), L)
282275end
283276
284- for T in ScalingNumberTypes
277+ for T in SCALINGNUMBERTYPES
285278 @eval function ScaledOperator (λ:: $T , L:: ScaledOperator )
286279 λ = ScalarOperator (λ) * L. λ
287280 ScaledOperator (λ, L. L)
@@ -311,6 +304,7 @@ for op in (
311304 )
312305 @eval Base.$ op (L:: ScaledOperator ) = ScaledOperator ($ op (L. λ), $ op (L. L))
313306end
307+ Base. conj (L:: ScaledOperator ) = conj (L. λ) * conj (L. L)
314308LinearAlgebra. opnorm (L:: ScaledOperator , p:: Real = 2 ) = abs (L. λ) * opnorm (L. L, p)
315309
316310getops (L:: ScaledOperator ) = (L. λ, L. L,)
@@ -344,19 +338,19 @@ for fact in (
344338end
345339
346340# operator application, inversion
347- for op in (
348- :* , :\ ,
349- )
350- @eval Base.$ op (L:: ScaledOperator , x:: AbstractVecOrMat ) = $ op (L. λ, $ op (L. L, x))
351- end
341+ Base.:* (L:: ScaledOperator , u:: AbstractVecOrMat ) = L. λ * (L. L * u)
342+ Base.:\ (L:: ScaledOperator , u:: AbstractVecOrMat ) = L. λ \ (L. L \ u)
352343
353344function LinearAlgebra. mul! (v:: AbstractVecOrMat , L:: ScaledOperator , u:: AbstractVecOrMat )
354- mul! (v, L. L, u, L. λ. val, false )
345+ iszero (L. λ) && return lmul! (false , v)
346+ a = convert (Number, L. λ)
347+ mul! (v, L. L, u, a, false )
355348end
356349
357350function LinearAlgebra. mul! (v:: AbstractVecOrMat , L:: ScaledOperator , u:: AbstractVecOrMat , α, β)
358- mul! (L. cache, [L. λ. val,], [α,])
359- mul! (v, L. L, u, first (L. cache), β)
351+ iszero (L. λ) && return lmul! (β, v)
352+ a = convert (Number, L. λ* α)
353+ mul! (v, L. L, u, a, β)
360354end
361355
362356function LinearAlgebra. ldiv! (v:: AbstractVecOrMat , L:: ScaledOperator , u:: AbstractVecOrMat )
@@ -408,7 +402,7 @@ for op in (
408402 @eval Base.$ op (A:: AbstractSciMLOperator , B:: AddedOperator ) = AddedOperator (A, $ op (B). ops... )
409403 @eval Base.$ op (A:: AddedOperator , B:: AbstractSciMLOperator ) = AddedOperator (A. ops... , $ op (B))
410404
411- for T in ScalingNumberTypes
405+ for T in SCALINGNUMBERTYPES
412406 @eval function Base. $op (L:: AbstractSciMLOperator , λ:: $T )
413407 @assert issquare (L)
414408 N = size (L, 1 )
@@ -436,6 +430,7 @@ for op in (
436430 )
437431 @eval Base.$ op (L:: AddedOperator ) = AddedOperator ($ op .(L. ops)... )
438432end
433+ Base. conj (L:: AddedOperator ) = AddedOperator (conj .(L. ops))
439434
440435getops (L:: AddedOperator ) = L. ops
441436Base. iszero (L:: AddedOperator ) = all (iszero, getops (L))
@@ -546,11 +541,11 @@ for op in (
546541 end
547542
548543 # scalar operator
549- @eval function Base. $op (λ:: ScalarOperator , L:: ComposedOperator )
544+ @eval function Base. $op (λ:: AbstractSciMLScalarOperator , L:: ComposedOperator )
550545 ScaledOperator (λ, L)
551546 end
552547
553- @eval function Base. $op (L:: ComposedOperator , λ:: ScalarOperator )
548+ @eval function Base. $op (L:: ComposedOperator , λ:: AbstractSciMLScalarOperator )
554549 ScaledOperator (λ, L)
555550 end
556551end
@@ -564,8 +559,12 @@ for op in (
564559 :adjoint ,
565560 :transpose ,
566561 )
567- @eval Base.$ op (L:: ComposedOperator ) = ComposedOperator ($ op .(reverse (L. ops))... )
562+ @eval Base.$ op (L:: ComposedOperator ) = ComposedOperator (
563+ $ op .(reverse (L. ops))... ;
564+ cache= L. isset ? reverse (L. cache) : nothing ,
565+ )
568566end
567+ Base. conj (L:: ComposedOperator ) = ComposedOperator (conj .(L. ops); cache= L. cache)
569568LinearAlgebra. opnorm (L:: ComposedOperator ) = prod (opnorm, L. ops)
570569
571570getops (L:: ComposedOperator ) = L. ops
@@ -680,20 +679,23 @@ function InvertedOperator(L::AbstractSciMLOperator{T}; cache=nothing) where{T}
680679end
681680
682681Base. inv (L:: AbstractSciMLOperator ) = InvertedOperator (L)
682+
683+ Base.:\ (A:: AbstractSciMLOperator , B:: AbstractSciMLOperator ) = inv (A) * B
684+ Base.:/ (A:: AbstractSciMLOperator , B:: AbstractSciMLOperator ) = A * inv (B)
685+
683686Base. convert (:: Type{AbstractMatrix} , L:: InvertedOperator ) = inv (convert (AbstractMatrix, L. L))
684687
685688Base. size (L:: InvertedOperator ) = size (L. L) |> reverse
686- Base. adjoint (L:: InvertedOperator ) = InvertedOperator (L. L' )
689+ Base. transpose (L:: InvertedOperator ) = InvertedOperator (transpose (L. L); cache = L. isset ? L. cache' : nothing )
690+ Base. adjoint (L:: InvertedOperator ) = InvertedOperator (adjoint (L. L); cache = L. isset ? L. cache' : nothing )
691+ Base. conj (L:: InvertedOperator ) = InvertedOperator (conj (L. L); cache= L. cache)
687692
688693getops (L:: InvertedOperator ) = (L. L,)
689694
690695has_mul! (L:: InvertedOperator ) = has_ldiv! (L. L)
691696has_ldiv (L:: InvertedOperator ) = has_mul (L. L)
692697has_ldiv! (L:: InvertedOperator ) = has_mul! (L. L)
693698
694- Base.:\ (A:: AbstractSciMLOperator , B:: AbstractSciMLOperator ) = inv (A) * B
695- Base.:/ (A:: AbstractSciMLOperator , B:: AbstractSciMLOperator ) = A * inv (B)
696-
697699@forward InvertedOperator. L (
698700 # LinearAlgebra
699701 LinearAlgebra. issymmetric,
0 commit comments