Skip to content

Commit 7ff2f2b

Browse files
authored
parameterize almostbandedmatrix (#412)
* parameterize almostbandedmatrix * Add test * Update tests to use size * convert AbstractArray conversion
1 parent d31bda3 commit 7ff2f2b

File tree

3 files changed

+25
-20
lines changed

3 files changed

+25
-20
lines changed

src/Caching/almostbanded.jl

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ end
176176

177177
# Grow cached interlace operator
178178

179-
function resizedata!(co::CachedOperator{T,AlmostBandedMatrix{T},<:InterlaceOperator{T,1}},
179+
function resizedata!(co::CachedOperator{T,<:AlmostBandedMatrix{T},<:InterlaceOperator{T,1}},
180180
n::Integer,::Colon) where {T<:Number}
181181
if n co.datasize[1]
182182
return co
@@ -210,7 +210,7 @@ end
210210

211211

212212

213-
function resizedata!(co::CachedOperator{T,AlmostBandedMatrix{T},<:InterlaceOperator{T,2}},
213+
function resizedata!(co::CachedOperator{T,<:AlmostBandedMatrix{T},<:InterlaceOperator{T,2}},
214214
n::Integer,::Colon) where {T<:Number}
215215
if n co.datasize[1]
216216
return co
@@ -257,11 +257,11 @@ function resizedata!(co::CachedOperator{T,AlmostBandedMatrix{T},<:InterlaceOpera
257257
end
258258

259259

260-
resizedata!(co::CachedOperator{T,AlmostBandedMatrix{T},<:InterlaceOperator{T,1}},
260+
resizedata!(co::CachedOperator{T,<:AlmostBandedMatrix{T},<:InterlaceOperator{T,1}},
261261
n::Integer,m::Integer) where {T<:Number} = resizedata!(co,max(n,m+bandwidth(co.data.bands,1)),:)
262262

263263

264-
resizedata!(co::CachedOperator{T,AlmostBandedMatrix{T},<:InterlaceOperator{T,2}},
264+
resizedata!(co::CachedOperator{T,<:AlmostBandedMatrix{T},<:InterlaceOperator{T,2}},
265265
n::Integer,m::Integer) where {T<:Number} = resizedata!(co,max(n,m+bandwidth(co.data.bands,1)),:)
266266

267267

@@ -273,16 +273,14 @@ resizedata!(co::CachedOperator{T,AlmostBandedMatrix{T},<:InterlaceOperator{T,2}}
273273
## QR
274274

275275

276-
function QROperator(R::CachedOperator{T,AlmostBandedMatrix{T}}) where T
276+
function QROperator(R::CachedOperator{T,<:AlmostBandedMatrix{T}}) where T
277277
M = R.data.bands.l+1 # number of diag+subdiagonal bands
278278
H = Matrix{T}(undef,M,100)
279279
QROperator(R,H,0)
280280
end
281281

282282

283-
function resizedata!(QR::QROperator{CachedOperator{T,AlmostBandedMatrix{T},
284-
MM,DS,RS,BI}},
285-
::Colon,col) where {T,MM,DS,RS,BI}
283+
function resizedata!(QR::QROperator{<:CachedOperator{T,<:AlmostBandedMatrix{T}}}, ::Colon, col) where {T}
286284
if col QR.ncols
287285
return QR
288286
end
@@ -346,9 +344,7 @@ end
346344

347345
# BLAS versions, requires BlasFloat
348346

349-
function resizedata!(QR::QROperator{CachedOperator{T,AlmostBandedMatrix{T},
350-
MM,DS,RS,BI}},
351-
::Colon,col) where {T<:BlasFloat,MM,DS,RS,BI}
347+
function resizedata!(QR::QROperator{<:CachedOperator{T,<:AlmostBandedMatrix{T}}}, ::Colon, col) where {T<:BlasFloat}
352348
if col QR.ncols
353349
return QR
354350
end
@@ -417,8 +413,9 @@ end
417413
## back substitution
418414
# loop to avoid ambiguity with AbstractTRiangular
419415
for ArrTyp in (:AbstractVector, :AbstractMatrix)
420-
@eval function ldiv!(U::UpperTriangular{T, SubArray{T, 2, AlmostBandedMatrix{T}, Tuple{UnitRange{Int}, UnitRange{Int}}, false}},
421-
u::$ArrTyp{T}) where T
416+
@eval function ldiv!(U::UpperTriangular{T,<:SubArray{T, 2, <:AlmostBandedMatrix{T}, NTuple{2,UnitRange{Int}}, false}},
417+
u::$ArrTyp{T}) where T
418+
422419
n = size(u,1)
423420
n == size(U,1) || throw(DimensionMismatch())
424421

src/LinearAlgebra/AlmostBandedMatrix.jl

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33

44

5-
struct AlmostBandedMatrix{T} <: AbstractMatrix{T}
6-
bands::BandedMatrix{T}
5+
struct AlmostBandedMatrix{T,B<:BandedMatrix{T}} <: AbstractMatrix{T}
6+
bands::B
77
fill::LowRankMatrix{T}
88
function AlmostBandedMatrix{T}(bands::BandedMatrix{T}, fill::LowRankMatrix{T}) where T
99
if size(bands) size(fill)
1010
error("Data and fill must be compatible size")
1111
end
12-
new{T}(bands,fill)
12+
new{T,typeof(bands)}(bands,fill)
1313
end
1414
end
1515

@@ -26,15 +26,13 @@ AlmostBandedMatrix{T}(Z::Zeros, lu::NTuple{2,Integer}, r::Integer) where {T} =
2626
AlmostBandedMatrix(Z::AbstractMatrix, lu::NTuple{2,Integer}, r::Integer) =
2727
AlmostBandedMatrix{eltype(Z)}(Z, lu, r)
2828

29-
for MAT in (:AlmostBandedMatrix, :AbstractMatrix, :AbstractArray)
29+
for MAT in (:AlmostBandedMatrix, :AbstractMatrix)
3030
@eval convert(::Type{$MAT{T}}, A::AlmostBandedMatrix) where {T} =
31-
AlmostBandedMatrix(AbstractMatrix{T}(A.bands),AbstractMatrix{T}(A.fill))
31+
AlmostBandedMatrix(convert(AbstractMatrix{T}, A.bands), convert(AbstractMatrix{T}, A.fill))
3232
end
3333

3434

3535
size(A::AlmostBandedMatrix) = size(A.bands)
36-
Base.IndexStyle(::Type{ABM}) where {ABM<:AlmostBandedMatrix} =
37-
IndexCartesian()
3836

3937

4038
function getindex(B::AlmostBandedMatrix,k::Integer,j::Integer)

test/runtests.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,16 @@ end
159159
@test ApproxFunBase.blockbandwidths(FiniteOperator([1 2; 3 4],S,S)) == (0,0)
160160
end
161161

162+
@testset "AlmostBandedMatrix" begin
163+
A = ApproxFunBase.AlmostBandedMatrix{Float64}(Zeros(4,4), (1,1), 2)
164+
sz = @inferred size(A)
165+
@test sz == (4,4)
166+
@test convert(AbstractArray{Float64}, A) == A
167+
AInt = convert(AbstractArray{Int}, A)
168+
@test AInt isa AbstractArray{Int}
169+
@test AInt == A
170+
end
171+
162172
@testset "DiracDelta sampling" begin
163173
δ = 0.3DiracDelta(0.1) + 3DiracDelta(2.3)
164174
Random.seed!(0)

0 commit comments

Comments
 (0)