Skip to content

Commit 1c1a55c

Browse files
authored
Dl/layoutmatrix (#66)
* Support new ArrayLayouts * layoutmatrix macro * Update BlockBandedMatrices.jl * Update .travis.yml * _qr * Update Project.toml * Update Project.toml * Move code to BlockArrays * update for new blockarrays * updates
1 parent c53e190 commit 1c1a55c

16 files changed

+130
-408
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11

22
.DS_Store
3+
Manifest.toml

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ os:
55
- osx
66
julia:
77
- 1.2
8-
- 1.3
98
- 1.4
109
- nightly
1110
matrix:

Project.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "BlockBandedMatrices"
22
uuid = "ffab5731-97b5-5995-9138-79e8c1846df0"
3-
version = "0.7.2"
3+
version = "0.8"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -18,9 +18,9 @@ Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
1818
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1919

2020
[compat]
21-
ArrayLayouts = "0.1"
22-
BandedMatrices = "0.14"
23-
BlockArrays = "0.11"
21+
ArrayLayouts = "0.2.3"
22+
BandedMatrices = "0.15.2"
23+
BlockArrays = "0.12"
2424
FillArrays = "0.8"
25-
MatrixFactorizations = "0.2, 0.3"
25+
MatrixFactorizations = "0.3.1"
2626
julia = "1.2"

examples/sharedarrays_setup.jl

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

33
Pkg.activate(homedir() * "/Documents/Coding/gpublockbanded")
44
using BandedMatrices, BlockBandedMatrices, SharedArrays, ArrayLayouts, BlockArrays, FillArrays
5-
import BlockBandedMatrices: _BandedBlockBandedMatrix, BandedBlockBandedSizes, BlockSizes, blockcolrange
5+
import BlockBandedMatrices: _BandedBlockBandedMatrix, BandedBlockBandedSizes, BlockSizes, blockcolsupport
66
import BandedMatrices: AbstractBandedMatrix, bandwidths, BandedStyle
77
import Base: getindex, size
88

@@ -28,7 +28,7 @@ Base.BroadcastStyle(::Type{<:Eye}) = BandedStyle()
2828

2929

3030
function blockcolbuild!(ret, A, JR)
31-
for J in JR, K in blockcolrange(A,J)
31+
for J in JR, K in blockcolsupport(A,J)
3232
view(ret,K,J) .= view(A,K,J)
3333
end
3434
end

src/AbstractBlockBandedMatrix.jl

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
# in addition to the banded matrix interface
77
####
88

9-
abstract type AbstractBlockBandedLayout <: MemoryLayout end
9+
abstract type AbstractBlockBandedLayout <: AbstractBlockLayout end
10+
abstract type AbstractBandedBlockBandedLayout <: AbstractBlockBandedLayout end
1011

11-
struct BandedBlockBandedColumns{LAY} <: AbstractBlockBandedLayout end
12-
struct BandedBlockBandedRows{LAY} <: AbstractBlockBandedLayout end
12+
struct BandedBlockBandedColumns{LAY} <: AbstractBandedBlockBandedLayout end
13+
struct BandedBlockBandedRows{LAY} <: AbstractBandedBlockBandedLayout end
1314
struct BlockBandedColumns{LAY} <: AbstractBlockBandedLayout end
1415
struct BlockBandedRows{LAY} <: AbstractBlockBandedLayout end
1516

@@ -22,7 +23,6 @@ transposelayout(::BandedBlockBandedColumnMajor) = BandedBlockBandedRowMajor()
2223
transposelayout(::BandedBlockBandedRowMajor) = BandedBlockBandedColumnMajor()
2324
transposelayout(::BlockBandedColumnMajor) = BlockBandedRowMajor()
2425
transposelayout(::BlockBandedRowMajor) = BlockBandedColumnMajor()
25-
conjlayout(::Type{<:Complex}, M::AbstractBlockBandedLayout) = ConjLayout(M)
2626

2727

2828

@@ -56,22 +56,21 @@ blockbandrange(A::AbstractMatrix) = -blockbandwidth(A,1):blockbandwidth(A,2)
5656

5757

5858
# start/stop indices of the i-th column/row, bounded by actual matrix size
59-
@inline blockcolstart(A::AbstractVecOrMat, i::Integer) = Block(max(i-colblockbandwidth(A,2)[i], 1))
60-
@inline blockcolstop(A::AbstractVecOrMat, i::Integer) = Block(max(min(i+colblockbandwidth(A,1)[i], blocksize(A, 1)), 0))
61-
@inline blockrowstart(A::AbstractVecOrMat, i::Integer) = Block(max(i-rowblockbandwidth(A,1)[i], 1))
62-
@inline blockrowstop(A::AbstractVecOrMat, i::Integer) = Block(max(min(i+rowblockbandwidth(A,2)[i], blocksize(A, 2)), 0))
63-
64-
for Func in (:blockcolstart, :blockcolstop, :blockrowstart, :blockrowstop)
59+
@inline blockbanded_blockcolstart(A, i::Integer) = Block(max(i-colblockbandwidth(A,2)[i], 1))
60+
@inline blockbanded_blockcolstop(A, i::Integer) = Block(max(min(i+colblockbandwidth(A,1)[i], blocksize(A, 1)), 0))
61+
@inline blockbanded_blockrowstart(A, i::Integer) = Block(max(i-rowblockbandwidth(A,1)[i], 1))
62+
@inline blockbanded_blockrowstop(A, i::Integer) = Block(max(min(i+rowblockbandwidth(A,2)[i], blocksize(A, 2)), 0))
63+
for Func in (:blockbanded_blockcolstart, :blockbanded_blockcolstop, :blockbanded_blockrowstart, :blockbanded_blockrowstop)
6564
@eval $Func(A, i::Block{1}) = $Func(A, Int(i))
6665
end
6766

68-
@inline blockcolrange(A::AbstractVecOrMat, i) = blockcolstart(A,i):blockcolstop(A,i)
69-
@inline blockrowrange(A::AbstractVecOrMat, i) = blockrowstart(A,i):blockrowstop(A,i)
67+
@inline blockcolsupport(::AbstractBlockBandedLayout, A, i) = blockbanded_blockcolstart(A,i):blockbanded_blockcolstop(A,i)
68+
@inline blockrowsupport(::AbstractBlockBandedLayout, A, i) = blockbanded_blockrowstart(A,i):blockbanded_blockrowstop(A,i)
7069

7170

7271
# length of i-the column/row
73-
@inline blockcollength(A::AbstractVecOrMat, i) = max(Int(blockcolstop(A, i)) - Int(blockcolstart(A, i)) + 1, 0)
74-
@inline blockrowlength(A::AbstractVecOrMat, i) = max(Int(blockrowstop(A, i)) - Int(blockrowstart(A, i)) + 1, 0)
72+
@inline blockcollength(A, i) = max(Int(blockcolstop(A, i)) - Int(blockcolstart(A, i)) + 1, 0)
73+
@inline blockrowlength(A, i) = max(Int(blockrowstop(A, i)) - Int(blockrowstart(A, i)) + 1, 0)
7574

7675
# this gives the block bandwidth in each block column/row
7776
@inline colblockbandwidths(A::AbstractMatrix) = Fill.(blockbandwidths(A), blocksize(A,2))
@@ -107,17 +106,22 @@ function _firstblockdiagcol(A::AbstractMatrix, j::Int)
107106
end
108107

109108

110-
## BlockSlice1 is a conveneience for views
111-
112-
const BlockSlice1 = BlockSlice{Block{1,Int}}
113109

114110

115111
######################################
116112
# RaggedMatrix interface
117113
######################################
118114

119-
@inline colstart(A::AbstractBlockBandedMatrix, i::Integer) =
120-
isempty(axes(A,1)) ? 1 : first(axes(A,1)[blockcolstart(A,findblock(axes(A,2),i))])
115+
@inline function colstart(A::AbstractBlockBandedMatrix, i::Integer)
116+
bs = blockcolstart(A,findblock(axes(A,2),i))
117+
if isempty(axes(A,1))
118+
1
119+
elseif Int(bs)  blocksize(A, 2)
120+
first(axes(A,1)[bs])
121+
else
122+
size(A,1)+1
123+
end
124+
end
121125

122126
@inline function colstop(A::AbstractBlockBandedMatrix, i::Integer)
123127
CS = blockcolstop(A,findblock(axes(A,2),i))

src/BandedBlockBandedMatrix.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ BandedBlockBandedMatrix(A::Union{AbstractMatrix,UniformScaling},
153153
function BandedBlockBandedMatrix{T,Blocks,RR}(A::AbstractMatrix, axes::NTuple{2,AbstractUnitRange{Int}}, lu::NTuple{2,Int}, λμ::NTuple{2,Int}) where {T,Blocks,RR<:AbstractUnitRange{Int}}
154154
ret = BandedBlockBandedMatrix{T,Blocks,RR}(Zeros{T}(size(A)), axes, lu, λμ)
155155
L,M = λμ
156-
for J = Block.(1:blocksize(ret, 2)), K = blockcolrange(ret, Int(J))
156+
for J = blockaxes(ret,2), K = blockcolsupport(ret, J)
157157
kr, jr = axes[1][K], axes[2][J]
158158

159159
# We have the correct block - now we need to only add the entries from
@@ -202,7 +202,7 @@ function sparse(A::BandedBlockBandedMatrix)
202202
i = Vector{Int}()
203203
j = Vector{Int}()
204204
z = Vector{eltype(A)}()
205-
for J = blockaxes(A,2), K = blockcolrange(A, J)
205+
for J = blockaxes(A,2), K = blockcolsupport(A, J)
206206
B = view(A, K, J)
207207
= _banded_rowval(B)
208208
= _banded_colval(B)
@@ -221,7 +221,7 @@ end
221221
################################
222222

223223
bandedblockbandedcolumns(L::AbstractColumnMajor) = BandedBlockBandedColumnMajor()
224-
bandedblockbandedcolumns(_) = UnknownLayout()
224+
bandedblockbandedcolumns(_) = BandedBlockBandedColumns{UnknownLayout}()
225225

226226
MemoryLayout(::Type{<:BandedBlockBandedMatrix{<:Any,BLOCKS}}) where BLOCKS =
227227
bandedblockbandedcolumns(MemoryLayout(BLOCKS))

src/BlockBandedMatrices.jl

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,21 @@ import LinearAlgebra: UniformScaling, isdiag, rmul!, lmul!, ldiv!, rdiv!,
1818
import LinearAlgebra.BLAS: BlasInt, BlasFloat, @blasfunc, libblas, BlasComplex, BlasReal
1919
import LinearAlgebra.LAPACK: chktrans, chkdiag, liblapack, chklapackerror, checksquare, chkstride1,
2020
chkuplo
21-
import MatrixFactorizations: ql, ql!, QLPackedQ
21+
import MatrixFactorizations: ql, ql!, _ql, QLPackedQ
2222
import SparseArrays: sparse
2323

24-
import ArrayLayouts: @lazymul, MatMulMatAdd, MatMulVecAdd, BlasMatLmulVec,
24+
import ArrayLayouts: BlasMatLmulVec,
2525
triangularlayout, UpperTriangularLayout, TriangularLayout, MatLdivVec,
26-
triangulardata, sublayout, @lazyldiv, @lazylmul,
26+
triangulardata, sublayout,
2727
AbstractColumnMajor, DenseColumnMajor, ColumnMajor,
28-
DiagonalLayout, materialize!, MulAdd, mul, colsupport, rowsupport
28+
DiagonalLayout, MulAdd, mul, colsupport, rowsupport,
29+
_qr, _factorize, _copyto!
2930

3031
import BlockArrays: blocksize, blockcheckbounds, BlockedUnitRange, blockisequal, DefaultBlockAxis,
3132
Block, BlockSlice, getblock, unblock, setblock!, block, blockindex,
32-
_blocklengths2blocklasts, BlockIndexRange, sizes_from_blocks
33+
_blocklengths2blocklasts, BlockIndexRange, sizes_from_blocks, BlockSlice1,
34+
blockcolsupport, blockrowsupport, blockcolstart, blockcolstop, blockrowstart, blockrowstop,
35+
AbstractBlockLayout
3336

3437
import BandedMatrices: isbanded, bandwidths, bandwidth, banded_getindex, colrange,
3538
inbands_setindex!, inbands_getindex, banded_setindex!,
@@ -47,7 +50,10 @@ export BandedBlockBandedMatrix, BlockBandedMatrix, BlockSkylineMatrix, blockband
4750

4851
const Block1 = Block{1,Int}
4952
const BlockRange1 = BlockRange{1,Tuple{UnitRange{Int}}}
50-
const BlockIndexRange1 = BlockIndexRange{1,Tuple{UnitRange{Int}}}
53+
const BlockIndexRange1 = BlockIndexRange{1,Tuple{UnitRange{Int}}}
54+
55+
blockcolrange(A...) = blockcolsupport(A...)
56+
blockrowrange(A...) = blockrowsupport(A...)
5157

5258
include("AbstractBlockBandedMatrix.jl")
5359
include("broadcast.jl")

src/BlockSkylineMatrix.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ BlockSkylineMatrix
160160

161161
function BlockSkylineMatrix{T}(A::AbstractMatrix, block_sizes::BlockSkylineSizes) where T
162162
ret = BlockSkylineMatrix(Zeros{T}(size(A)), block_sizes)
163-
for J = Block.(1:blocksize(ret, 2)), K = blockcolrange(ret, Int(J))
163+
for J = blockaxes(ret,2), K = blockcolsupport(ret, Int(J))
164164
kr, jr = getindex.(block_sizes.axes, (K, J))
165165
view(ret, K, J) .= view(A, kr, jr)
166166
end
@@ -170,7 +170,7 @@ end
170170
function BlockSkylineMatrix{T}(A::AbstractBlockBandedMatrix, block_sizes::BlockSkylineSizes) where T
171171
ret = BlockSkylineMatrix(Zeros{T}(size(A)), block_sizes)
172172
blockisequal(axes(A), block_sizes.axes) || throw(ArgumentError())
173-
for J = blockaxes(ret,2), K = blockcolrange(ret, Int(J))
173+
for J = blockaxes(ret,2), K = blockcolsupport(ret, J)
174174
view(ret, K, J) .= view(A, K, J)
175175
end
176176
ret
@@ -234,7 +234,7 @@ function convert(::Type{BlockSkylineMatrix}, A::AbstractMatrix)
234234
block_sizes = BlockSkylineSizes(axes(A), colblockbandwidths(A)...)
235235

236236
ret = BlockSkylineMatrix{eltype(A)}(undef, block_sizes)
237-
for J = blockaxes(ret,2), K = blockcolrange(ret, J)
237+
for J = blockaxes(ret,2), K = blockcolsupport(ret, J)
238238
view(ret, K, J) .= view(A, K, J)
239239
end
240240
ret

src/blockskylineqr.jl

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,9 @@ function ql!(A::BlockBandedMatrix{T}) where T
5757
QL(A,τ.blocks)
5858
end
5959

60-
qr(A::BlockBandedMatrix) = qr!(BlockBandedMatrix(A, (blockbandwidth(A,1), blockbandwidth(A,1)+blockbandwidth(A,2))))
61-
ql(A::BlockBandedMatrix) = ql!(BlockBandedMatrix(A, (blockbandwidth(A,1)+blockbandwidth(A,2),blockbandwidth(A,2))))
62-
63-
qr(A::BandedBlockBandedMatrix) = qr(BlockBandedMatrix(A))
64-
ql(A::BandedBlockBandedMatrix) = ql(BlockBandedMatrix(A))
60+
_qr(::AbstractBlockBandedLayout, _, A) = qr!(BlockBandedMatrix(A, (blockbandwidth(A,1), blockbandwidth(A,1)+blockbandwidth(A,2))))
61+
_ql(::AbstractBlockBandedLayout, _, A) = ql!(BlockBandedMatrix(A, (blockbandwidth(A,1)+blockbandwidth(A,2),blockbandwidth(A,2))))
62+
_factorize(::AbstractBlockBandedLayout, _, A) = qr(A)
6563

6664
function lmul!(adjQ::Adjoint{<:Any,<:QRPackedQ{<:Any,<:BlockSkylineMatrix}}, Bin::AbstractVector)
6765
Q = parent(adjQ)
@@ -123,5 +121,3 @@ function ldiv!(A::QL{<:Any,<:BlockSkylineMatrix}, B::AbstractMatrix)
123121
lmul!(adjoint(A.Q), B)
124122
materialize!(Ldiv(LowerTriangular(A.factors), B))
125123
end
126-
127-
\(A::AbstractBlockBandedMatrix, b::AbstractVecOrMat) = qr(A)\b # use QR because LU would be a _mess_ to implement

src/broadcast.jl

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ function blockbanded_copyto!(dest::AbstractMatrix, src::AbstractMatrix)
7979
end
8080

8181

82-
copyto!(dest::AbstractMatrix, src::AbstractBlockBandedMatrix) = blockbanded_copyto!(dest, src)
82+
_copyto!(_, ::AbstractBlockBandedLayout, dest::AbstractMatrix, src::AbstractMatrix) = blockbanded_copyto!(dest, src)
8383

8484

8585
function copyto!(dest::AbstractArray, bc::Broadcasted{<:AbstractBlockBandedStyle, <:Any, typeof(identity)})
@@ -100,9 +100,8 @@ end
100100
function blockbanded_fill!(B::AbstractMatrix{T}, x) where T
101101
x == zero(T) || throw(BandError(B))
102102

103-
M,N = blocksize(B)
104-
for J = 1:N, K = blockcolrange(B,J)
105-
fill!(view(B,K,Block(J)), x)
103+
for J = blockaxes(B,2), K = blockcolsupport(B,J)
104+
fill!(view(B,K,J), x)
106105
end
107106
B
108107
end
@@ -111,19 +110,17 @@ end
111110
function blockbanded_rmul!(B::AbstractMatrix{T}, x::Number) where T
112111
x == zero(T) || throw(BandError(B))
113112

114-
M,N = blocksize(B)
115-
for J = 1:N, K = blockcolrange(B,J)
116-
rmul!(view(B,K,Block(J)), x)
113+
for J = blockaxes(B,2), K = blockcolsupport(B,J)
114+
rmul!(view(B,K,J), x)
117115
end
118116
B
119117
end
120118

121119
function blockbanded_lmul!(x::Number, B::AbstractMatrix{T}) where T
122120
x == zero(T) || throw(BandError(B))
123121

124-
M,N = blocksize(B)
125-
for J = 1:N, K = blockcolrange(B,J)
126-
lmul!(x, view(B,K,Block(J)))
122+
for J = blockaxes(B,2), K = blockcolsupport(B,J)
123+
lmul!(x, view(B,K,J))
127124
end
128125
B
129126
end
@@ -205,7 +202,7 @@ similar(bc::Broadcasted{<:AbstractBlockBandedStyle, <:Any, typeof(\), <:Tuple{<:
205202
function blockbanded_axpy!(a, X::AbstractMatrix, Y::AbstractMatrix)
206203
size(X) == size(Y) || throw(DimensionMismatch())
207204

208-
for J=Block(1):Block(blocksize(X,2)), K=blockcolrange(X,J)
205+
for J = blockaxes(X,2), K = blockcolsupport(X,J)
209206
view(Y,K,J) .= a .* view(X,K,J) .+ view(Y,K,J)
210207
end
211208
Y

0 commit comments

Comments
 (0)