@@ -18,9 +18,10 @@ Base.convert(::Type{AbstractMatrix}, ::IdentityOperator{N}) where{N} = Diagonal(
1818# traits
1919Base. size (:: IdentityOperator{N} ) where {N} = (N, N)
2020Base. adjoint (A:: IdentityOperator ) = A
21+ Base. transpose (A:: IdentityOperator ) = A
2122LinearAlgebra. opnorm (:: IdentityOperator{N} , p:: Real = 2 ) where {N} = true
2223for pred in (
23- :isreal , : issymmetric , :ishermitian , :isposdef ,
24+ :issymmetric , :ishermitian , :isposdef ,
2425 )
2526 @eval LinearAlgebra.$ pred (:: IdentityOperator ) = true
2627end
@@ -98,9 +99,10 @@ Base.convert(::Type{AbstractMatrix}, ::NullOperator{N}) where{N} = Diagonal(zero
9899# traits
99100Base. size (:: NullOperator{N} ) where {N} = (N, N)
100101Base. adjoint (A:: NullOperator ) = A
102+ Base. transpose (A:: NullOperator ) = A
101103LinearAlgebra. opnorm (:: NullOperator{N} , p:: Real = 2 ) where {N} = false
102104for pred in (
103- :isreal , : issymmetric , :ishermitian ,
105+ :issymmetric , :ishermitian ,
104106 )
105107 @eval LinearAlgebra.$ pred (:: NullOperator ) = true
106108end
@@ -184,6 +186,7 @@ function Base.adjoint(α::ScalarOperator) # TODO - test
184186 update_func = (oldval,u,p,t) -> α. update_func (oldval' ,u,p,t)'
185187 ScalarOperator (val; update_func= update_func)
186188end
189+ Base. transpose (α:: ScalarOperator ) = α
187190
188191getops (α:: ScalarOperator ) = (α. val)
189192islinear (L:: ScalarOperator ) = true
@@ -286,7 +289,12 @@ SparseArrays.sparse(L::ScaledOperator) = L.λ * sparse(L.L)
286289
287290# traits
288291Base. size (L:: ScaledOperator ) = size (L. L)
289- Base. adjoint (L:: ScaledOperator ) = ScaledOperator (L. λ' , L. op' )
292+ for op in (
293+ :adjoint ,
294+ :transpose ,
295+ )
296+ @eval Base.$ op (L:: ScaledOperator ) = ScaledOperator ($ op (L. λ), $ op (L. op))
297+ end
290298LinearAlgebra. opnorm (L:: ScaledOperator , p:: Real = 2 ) = abs (L. λ) * opnorm (L. L, p)
291299
292300getops (L:: ScaledOperator ) = (L. λ, L. L)
@@ -404,7 +412,12 @@ SparseArrays.sparse(L::AddedOperator) = sum(_sparse, L.ops)
404412
405413# traits
406414Base. size (L:: AddedOperator ) = size (first (L. ops))
407- Base. adjoint (L:: AddedOperator ) = AddedOperator (adjoint .(L. ops)... )
415+ for op in (
416+ :adjoint ,
417+ :transpose ,
418+ )
419+ @eval Base.$ op (L:: AddedOperator ) = AddedOperator ($ op .(L. ops)... )
420+ end
408421
409422getops (L:: AddedOperator ) = L. ops
410423Base. iszero (L:: AddedOperator ) = all (iszero, getops (L))
@@ -486,7 +499,12 @@ SparseArrays.sparse(L::ComposedOperator) = prod(_sparse, L.ops)
486499
487500# traits
488501Base. size (L:: ComposedOperator ) = (size (first (L. ops), 1 ), size (last (L. ops),2 ))
489- Base. adjoint (L:: ComposedOperator ) = ComposedOperator (adjoint .(reverse (L. ops)))
502+ for op in (
503+ :adjoint ,
504+ :transpose ,
505+ )
506+ @eval Base.$ op (L:: ComposedOperator ) = ComposedOperator ($ op .(reverse (L. ops))... )
507+ end
490508LinearAlgebra. opnorm (L:: ComposedOperator ) = prod (opnorm, L. ops)
491509
492510getops (L:: ComposedOperator ) = L. ops
@@ -495,7 +513,7 @@ Base.iszero(L::ComposedOperator) = all(iszero, getops(L))
495513has_adjoint (L:: ComposedOperator ) = all (has_adjoint, L. ops)
496514has_mul! (L:: ComposedOperator ) = all (has_mul!, L. ops)
497515has_ldiv (L:: ComposedOperator ) = all (has_ldiv, L. ops)
498- has_ldiv! (L:: ComposedOperator ) = all (has_mul !, L. ops)
516+ has_ldiv! (L:: ComposedOperator ) = all (has_ldiv !, L. ops)
499517
500518factorize (L:: ComposedOperator ) = prod (factorize, reverse (L. ops))
501519for fact in (
593611AbstractAdjointedVector = Adjoint{ <: Number , <: AbstractVector }
594612AbstractTransposedVector = Transpose{<: Number , <: AbstractVector }
595613
614+ has_adjoint (:: AdjointedOperator ) = true
615+
616+ Base. transpose (L:: AdjointedOperator ) = conj (L. L)
617+ Base. adjoint (L:: TransposedOperator ) = conj (L. L)
618+
596619for (op, LType, VType) in (
597620 (:adjoint , :AdjointedOperator , :AbstractAdjointedVector ),
598621 (:transpose , :TransposedOperator , :AbstractTransposedVector ),
@@ -606,12 +629,10 @@ for (op, LType, VType) in (
606629 @eval Base. size (L:: $LType ) = size (L. L) |> reverse
607630 @eval Base.$ op (L:: $LType ) = L. L
608631
609- @eval has_adjoint (L:: $LType ) = true
610632 @eval getops (L:: $LType ) = (L. L,)
611633
612634 @eval @forward $ LType. L (
613635 # LinearAlgebra
614- LinearAlgebra. isreal,
615636 LinearAlgebra. issymmetric,
616637 LinearAlgebra. ishermitian,
617638 LinearAlgebra. isposdef,
@@ -690,7 +711,6 @@ has_ldiv!(L::InvertedOperator) = has_mul!(L.L)
690711
691712@forward InvertedOperator. L (
692713 # LinearAlgebra
693- LinearAlgebra. isreal,
694714 LinearAlgebra. issymmetric,
695715 LinearAlgebra. ishermitian,
696716 LinearAlgebra. isposdef,
0 commit comments