5757# call sqrt/inv on it, and the ΣBB block separately as ΣB. This type
5858# is generic with regards to the field type, F.
5959struct BlockDiagIEB{T,F} <: ImplicitOp{T}
60- ΣTE :: SMatrix {2,2,Diagonal{T,F},4 }
60+ ΣTE :: SizedMatrix {2,2,Diagonal{T,F},2,Matrix{Diagonal{T,F}} }
6161 ΣB :: Diagonal{T,F}
6262end
63+ BlockDiagIEB (ΣTE:: AbstractMatrix{Diagonal{T,F}} , ΣB:: Diagonal{T,F} ) where {T,F} = BlockDiagIEB {T,F} (ΣTE, ΣB)
6364# applying
6465* (L:: BlockDiagIEB , f:: BaseS02 ) = L * IEBFourier (f)
6566\ (L:: BlockDiagIEB , f:: BaseS02 ) = pinv (L) * IEBFourier (f)
@@ -77,13 +78,13 @@ similar(L::BlockDiagIEB) = BlockDiagIEB(similar.(L.ΣTE), similar(L.ΣB))
7778get_storage (L:: BlockDiagIEB ) = get_storage (L. ΣB)
7879adapt_structure (storage, L:: BlockDiagIEB ) = BlockDiagIEB (adapt .(Ref (storage), L. ΣTE), adapt (storage, L. ΣB))
7980simulate (rng:: AbstractRNG , L:: BlockDiagIEB ; Nbatch= ()) = sqrt (L) * randn! (rng, similar (diag (L), Nbatch... ))
80- logdet (L:: BlockDiagIEB ) = logdet (L. ΣTE[ 1 , 1 ] * L . ΣTE[ 2 , 2 ] - L . ΣTE[ 1 , 2 ] * L . ΣTE[ 2 , 1 ] ) + logdet (L. ΣB)
81+ logdet (L:: BlockDiagIEB ) = logdet (det ( L. ΣTE) ) + logdet (L. ΣB)
8182# arithmetic
82- * (L:: BlockDiagIEB , D:: DiagOp{<:BaseIEBFourier} ) = BlockDiagIEB (SMatrix {2,2} ( L. ΣTE * [[D[:I ]] [0 ]; [0 ] [D[:E ]]]) , L. ΣB * D[:B ])
83- + (L:: BlockDiagIEB , D:: DiagOp{<:BaseIEBFourier} ) = BlockDiagIEB (@SMatrix [L. ΣTE[1 ,1 ]+ D[:I ] L. ΣTE[1 ,2 ]; L. ΣTE[2 ,1 ] L. ΣTE[2 ,2 ]+ D[:E ]], L. ΣB + D[:B ])
83+ * (L:: BlockDiagIEB , D:: DiagOp{<:BaseIEBFourier} ) = BlockDiagIEB (L. ΣTE * [[D[:I ]] [0 ]; [0 ] [D[:E ]]], L. ΣB * D[:B ])
84+ + (L:: BlockDiagIEB , D:: DiagOp{<:BaseIEBFourier} ) = BlockDiagIEB ([L. ΣTE[1 ,1 ]+ D[:I ] L. ΣTE[1 ,2 ]; L. ΣTE[2 ,1 ] L. ΣTE[2 ,2 ]+ D[:E ]], L. ΣB + D[:B ])
8485* (La:: F , Lb:: F ) where {F<: BlockDiagIEB } = F (La. ΣTE * Lb. ΣTE, La. ΣB * Lb. ΣB)
8586+ (La:: F , Lb:: F ) where {F<: BlockDiagIEB } = F (La. ΣTE + Lb. ΣTE, La. ΣB + Lb. ΣB)
86- + (L:: BlockDiagIEB , U:: UniformScaling{<:Scalar} ) = BlockDiagIEB (@SMatrix [(L. ΣTE[1 ,1 ]+ U) L. ΣTE[1 ,2 ]; L. ΣTE[2 ,1 ] (L. ΣTE[2 ,2 ]+ U)], L. ΣB+ U)
87+ + (L:: BlockDiagIEB , U:: UniformScaling{<:Scalar} ) = BlockDiagIEB ([(L. ΣTE[1 ,1 ]+ U) L. ΣTE[1 ,2 ]; L. ΣTE[2 ,1 ] (L. ΣTE[2 ,2 ]+ U)], L. ΣB+ U)
8788* (L:: BlockDiagIEB , λ:: Scalar ) = BlockDiagIEB (L. ΣTE * λ, L. ΣB * λ)
8889* (D:: DiagOp{<:BaseIEBFourier} , L:: BlockDiagIEB ) = L * D
8990+ (U:: UniformScaling{<:Scalar} , L:: BlockDiagIEB ) = L + U
0 commit comments