|
83 | 83 | Compute the direct sum of two operators. The result is an operator on the |
84 | 84 | corresponding [`SumBasis`](@ref). |
85 | 85 | """ |
86 | | -directsum(a::DataOperator, b::DataOperator) = Operator(directsum(a.basis_l, b.basis_l), directsum(a.basis_r, b.basis_r), hcat([a.data; zeros(size(b))], [zeros(size(a)); b.data])) |
| 86 | +function directsum(a::DataOperator, b::DataOperator) |
| 87 | + dType = promote_type(eltype(a),eltype(b)) |
| 88 | + data = zeros(dType, size(a,1)+size(b,1), size(a,2)+size(b,2)) |
| 89 | + data[1:size(a,1),1:size(a,2)] = a.data |
| 90 | + data[size(a,1)+1:end, size(a,2)+1:end] = b.data |
| 91 | + return Operator(directsum(a.basis_l, b.basis_l), directsum(a.basis_r, b.basis_r), data) |
| 92 | +end |
| 93 | +function directsum(a::SparseOpType, b::SparseOpType) |
| 94 | + dType = promote_type(eltype(a),eltype(b)) |
| 95 | + data = spzeros(dType, size(a,1)+size(b,1), size(a,2)+size(b,2)) |
| 96 | + data[1:size(a,1),1:size(a,2)] = a.data |
| 97 | + data[size(a,1)+1:end, size(a,2)+1:end] = b.data |
| 98 | + return Operator(directsum(a.basis_l, b.basis_l), directsum(a.basis_r, b.basis_r), data) |
| 99 | +end |
87 | 100 | directsum(a::AbstractOperator...) = reduce(directsum, a) |
88 | 101 |
|
89 | 102 | """ |
@@ -124,12 +137,24 @@ mutable struct LazyDirectSum{BL<:SumBasis, BR<:SumBasis, T<:Tuple{Vararg{Abstrac |
124 | 137 | basis_r::BR |
125 | 138 | operators::T |
126 | 139 | end |
| 140 | + |
| 141 | +# Methods |
127 | 142 | LazyDirectSum(op1::AbstractOperator, op2::AbstractOperator) = LazyDirectSum(directsum(op1.basis_l,op2.basis_l),directsum(op1.basis_r,op2.basis_r),(op1,op2)) |
| 143 | +LazyDirectSum(op1::LazyDirectSum, op2::AbstractOperator) = LazyDirectSum(directsum(op1.basis_l,op2.basis_l),directsum(op1.basis_r,op2.basis_r),(op1.operators...,op2)) |
| 144 | +LazyDirectSum(op1::AbstractOperator, op2::LazyDirectSum) = LazyDirectSum(directsum(op1.basis_l,op2.basis_l),directsum(op1.basis_r,op2.basis_r),(op1,op2.operators...)) |
| 145 | +LazyDirectSum(op1::LazyDirectSum, op2::LazyDirectSum) = LazyDirectSum(directsum(op1.basis_l,op2.basis_l),directsum(op1.basis_r,op2.basis_r),(op1.operators...,op2.operators...)) |
128 | 146 | LazyDirectSum(op::AbstractOperator...) = reduce(LazyDirectSum, op) |
| 147 | + |
| 148 | +# Algebra |
129 | 149 | dense(x::LazyDirectSum) = directsum(dense.(x.operators)...) |
130 | 150 | *(op1::LazyDirectSum{B1,B2},op2::LazyDirectSum{B2,B3}) where {B1<:Basis,B2<:Basis,B3<:Basis}= LazyDirectSum(op1.basis_l,op2.basis_r,Tuple(op1.operators[i]*op2.operators[i] for i=1:length(op1.operators))) |
131 | 151 | -(op::LazyDirectSum) = LazyDirectSum([-op.operators[1];op.operators[2:end]]...) |
132 | 152 | +(op1::LazyDirectSum{B1,B2},op2::LazyDirectSum{B1,B2}) where {B1<:Basis,B2<:Basis} = LazyDirectSum((op1.operators .+ op2.operators)...) |
| 153 | +dagger(op::LazyDirectSum) = LazyDirectSum(op.basis_r, op.basis_l, dagger.(op.operators)) |
| 154 | + |
| 155 | +directsum(op1::AbstractOperator,op2::LazyDirectSum) = LazyDirectSum(op1,op2) |
| 156 | +directsum(op1::LazyDirectSum,op2::AbstractOperator) = LazyDirectSum(op1,op2) |
| 157 | +directsum(op1::LazyDirectSum,op2::LazyDirectSum) = LazyDirectSum(op1,op2) |
133 | 158 |
|
134 | 159 | # Use lazy sum for FFTOperator |
135 | 160 | transform(b1::SumBasis,b2::SumBasis; kwargs...) = LazyDirectSum([transform(b1.bases[i],b2.bases[i];kwargs...) for i=1:length(b1.bases)]...) |
|
0 commit comments