Skip to content

Commit d31bda3

Browse files
authored
blockbandwidths in InterlaceOperator (#410)
* blockbandwidths in InterlaceOperator * version bump to v0.8.7 * accept blockbandwidths in inner constructor
1 parent 19fb052 commit d31bda3

File tree

5 files changed

+52
-26
lines changed

5 files changed

+52
-26
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "ApproxFunBase"
22
uuid = "fbd15aa5-315a-5a7d-a8a4-24992e37be05"
3-
version = "0.8.6"
3+
version = "0.8.7"
44

55
[deps]
66
AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c"

src/Operators/Operator.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,9 @@ Base.ndims(::Operator) = 2
137137

138138

139139
## bandrange and indexrange
140-
isbandedbelow(A::Operator) = isfinite(bandwidth(A,1))
141-
isbandedabove(A::Operator) = isfinite(bandwidth(A,2))
142-
isbanded(A::Operator) = isbandedbelow(A) && isbandedabove(A)
140+
isbandedbelow(A::Operator) = isfinite(bandwidth(A,1))::Bool
141+
isbandedabove(A::Operator) = isfinite(bandwidth(A,2))::Bool
142+
isbanded(A::Operator) = all(isfinite, bandwidths(A))::Bool
143143

144144

145145
isbandedblockbandedbelow(_) = false
@@ -178,11 +178,11 @@ end
178178
# assume dense blocks
179179
subblockbandwidths(K::Operator) = maximum(blocklengths(rangespace(K)))-1, maximum(blocklengths(domainspace(K)))-1
180180

181-
isblockbandedbelow(A) = isfinite(blockbandwidth(A,1))
182-
isblockbandedabove(A) = isfinite(blockbandwidth(A,2))
183-
isblockbanded(A::Operator) = isblockbandedbelow(A) && isblockbandedabove(A)
181+
isblockbandedbelow(A::Operator) = isfinite(blockbandwidth(A,1))::Bool
182+
isblockbandedabove(A::Operator) = isfinite(blockbandwidth(A,2))::Bool
183+
isblockbanded(A::Operator) = all(isfinite, blockbandwidths(A))::Bool
184184

185-
israggedbelow(A::Operator) = isbandedbelow(A) || isbandedblockbanded(A) || isblockbandedbelow(A)
185+
israggedbelow(A::Operator) = isbandedbelow(A)::Bool || isbandedblockbanded(A)::Bool || isblockbandedbelow(A)::Bool
186186

187187

188188
blockbandwidth(K::Operator, k::Integer) = blockbandwidths(K)[k]

src/Operators/general/InterlaceOperator.jl

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,22 @@ end
6969

7070
## Interlace operator
7171

72-
struct InterlaceOperator{T,p,DS,RS,DI,RI,BI} <: Operator{T}
72+
struct InterlaceOperator{T,p,DS,RS,DI,RI,BI,BBW} <: Operator{T}
7373
ops::Array{Operator{T},p}
7474
domainspace::DS
7575
rangespace::RS
7676
domaininterlacer::DI
7777
rangeinterlacer::RI
7878
bandwidths::BI
79+
blockbandwidths::BBW
80+
israggedbelow::Bool
81+
82+
function InterlaceOperator(ops::Array{Operator{T},p}, ds::DS, rs::RS, dsi::DI, rsi::RI, bw::BI,
83+
blockbandwidths::BBW = bandwidthsmax(ops, blockbandwidths),
84+
israggedbelow::Bool = all(israggedbelow, ops)) where {T,p,DS,RS,DI,RI,BI,BBW}
85+
86+
new{T,p,DS,RS,DI,RI,BI,BBW}(ops, ds, rs, dsi, rsi, bw, blockbandwidths, israggedbelow)
87+
end
7988
end
8089

8190
const VectorInterlaceOperator = InterlaceOperator{T,1,DS,RS} where {T,DS,RS<:Space{D,R}} where {D,R<:AbstractVector}
@@ -133,7 +142,9 @@ end
133142

134143
function InterlaceOperator(ops::AbstractMatrix{<:Operator},ds::Space,rs::Space;
135144
# calculate bandwidths TODO: generalize
136-
bandwidths = interlace_bandwidths(ops, ds, rs))
145+
bandwidths = interlace_bandwidths(ops, ds, rs),
146+
blockbandwidths = bandwidthsmax(ops, blockbandwidths),
147+
israggedbelow = all(israggedbelow, ops))
137148

138149
dsi = interlacer(ds)
139150
rsi = interlacer(rs)
@@ -143,7 +154,9 @@ function InterlaceOperator(ops::AbstractMatrix{<:Operator},ds::Space,rs::Space;
143154
InterlaceOperator(opsm,ds,rs,
144155
cache(dsi),
145156
cache(rsi),
146-
bandwidths)
157+
bandwidths,
158+
blockbandwidths,
159+
israggedbelow)
147160
end
148161

149162
@inline function _interlace_bandwidths(ops::VectorOrTupleOfOp, ds, rs, allbanded = all(isbanded, ops))
@@ -165,14 +178,18 @@ end
165178

166179
function InterlaceOperator(ops::VectorOrTupleOfOp, ds::Space, rs::Space;
167180
# calculate bandwidths
168-
bandwidths = interlace_bandwidths(ops, ds, rs))
181+
bandwidths = interlace_bandwidths(ops, ds, rs),
182+
blockbandwidths = bandwidthsmax(ops, blockbandwidths),
183+
israggedbelow = all(israggedbelow, ops))
169184

170185
VT = Vector{Operator{promote_eltypeof(ops)}}
171186
opsv = strictconvert(VT, convert_vector(ops))
172187
InterlaceOperator(opsv,ds,rs,
173188
cache(BlockInterlacer(tuple(blocklengths(ds)))),
174189
cache(interlacer(rs)),
175-
bandwidths)
190+
bandwidths,
191+
blockbandwidths,
192+
israggedbelow)
176193
end
177194

178195
interlace_domainspace(ops::AbstractMatrix, ::Type{NoSpace}) = domainspace(ops)
@@ -217,7 +234,8 @@ function convert(::Type{Operator{T}},S::InterlaceOperator) where T
217234
else
218235
ops = convert(AbstractArray{Operator{T}}, S.ops)
219236
InterlaceOperator(ops,domainspace(S),rangespace(S),
220-
S.domaininterlacer,S.rangeinterlacer,S.bandwidths)
237+
S.domaininterlacer,S.rangeinterlacer,S.bandwidths,
238+
S.blockbandwidths, S.israggedbelow)
221239
end
222240
end
223241

@@ -226,11 +244,7 @@ end
226244
#TODO: More efficient to save bandwidth
227245
bandwidths(M::InterlaceOperator) = M.bandwidths
228246

229-
blockbandwidths(M::InterlaceOperator) =
230-
(mapreduce(op->blockbandwidth(op,1),max,M.ops),
231-
mapreduce(op->blockbandwidth(op,2),max,M.ops))
232-
233-
isblockbanded(M::InterlaceOperator) = all(isblockbanded,M.ops)
247+
blockbandwidths(M::InterlaceOperator) = M.blockbandwidths
234248

235249
function blockcolstop(M::InterlaceOperator,J::Integer)
236250
if isblockbandedbelow(M)
@@ -262,7 +276,7 @@ function colstop(M::InterlaceOperator, j::Integer)
262276
end
263277
end
264278

265-
israggedbelow(M::InterlaceOperator) = all(israggedbelow,M.ops)
279+
israggedbelow(M::InterlaceOperator) = M.israggedbelow
266280

267281
getindex(op::InterlaceOperator,k::Integer,j::Integer) =
268282
error("Higher tensor InterlaceOperators not supported")

src/Operators/general/algebra.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ struct PlusOperator{T,BW,SZ,O<:Operator{T},BBW,SBBW} <: Operator{T}
2121
end
2222
end
2323

24-
bandwidthsmax(ops, f=bandwidths) = mapreduce(f, (t1, t2) -> max.(t1, t2), ops, init=(-720, -720)) #= approximate (-∞,-∞) =#
24+
bandwidthsmax(ops, f=bandwidths) = mapfoldl(f, (t1, t2) -> max.(t1, t2), ops, init=(-720, -720)) #= approximate (-∞,-∞) =#
2525

2626
function PlusOperator(ops::Vector{O}, args...) where {O<:Operator}
2727
PlusOperator{eltype(O)}(ops, args...)

src/Spaces/ProductSpaceOperators.jl

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,19 @@ function Conversion(a::SumSpace, b::Space)
162162
end
163163

164164
m=zeros(Operator{promote_type(prectype(a), prectype(b))},1,length(a.spaces))
165-
for n=1:length(a.spaces)
166-
m[1,n]=Conversion(a.spaces[n],b)
167-
end
168-
return ConversionWrapper(InterlaceOperator(m, a, b, cache(interlacer(a)), cache(BlockInterlacer((Fill(1,∞),))), (1-dimension(b),dimension(a)-1)))
165+
ops = map(x -> Conversion(x,b), a.spaces)
166+
copyto!(m, ops)
167+
bbw = bandwidthsmax(ops, blockbandwidths)
168+
irb = any(israggedbelow, ops)
169+
return ConversionWrapper(
170+
InterlaceOperator(m, a, b,
171+
cache(interlacer(a)),
172+
cache(BlockInterlacer((Fill(1,∞),))),
173+
(1-dimension(b),dimension(a)-1),
174+
bbw,
175+
irb,
176+
)
177+
)
169178
end
170179

171180

@@ -229,7 +238,10 @@ _spacename(::PiecewiseSpace) = PiecewiseSpace
229238
opbw = map(bandwidths, t)
230239
D = Diagonal(convert_vector_or_svector(t))
231240
iopbw = interlace_bandwidths(D, ds, rs, allbanded, opbw)
232-
InterlaceOperator(D, ds, rs, bandwidths = iopbw)
241+
iopbbw = bandwidthsmax(t, blockbandwidths)
242+
irb = all(israggedbelow, t)
243+
InterlaceOperator(D, ds, rs,
244+
bandwidths = iopbw, blockbandwidths = iopbbw, israggedbelow = irb)
233245
end
234246

235247
for (Op,OpWrap) in ((:Derivative,:DerivativeWrapper),(:Integral,:IntegralWrapper))

0 commit comments

Comments
 (0)