Skip to content

Commit 6e2a3a1

Browse files
authored
Use gbmv in banded*dense (#351)
* Use gbmv in banded*dense * check array dimensions * version bump to v0.17.22 * Add tests * tests for rowmajor * deterministic banded matrix * relax type-signature to accept AbstractColumnMajor matrices * short-circuit zero alpha * non-contiguous tests * aliasing tests for matrices * don't unalias as mul! demands no aliasing
1 parent 11132b1 commit 6e2a3a1

File tree

3 files changed

+66
-16
lines changed

3 files changed

+66
-16
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "BandedMatrices"
22
uuid = "aae01518-5342-5314-be14-df237901396f"
3-
version = "0.17.21"
3+
version = "0.17.22"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

src/generic/matmul.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,3 +236,25 @@ function materialize!(M::MatMulMatAdd{<:AbstractBandedLayout,<:DiagonalLayout{<:
236236
M.C .= (M.α * getindex_value(M.B.diag)) .* M.A .+ M.β .* M.C
237237
M.C
238238
end
239+
240+
### BandedMatrix * dense matrix
241+
242+
function materialize!(M::MulAdd{BandedColumns{DenseColumnMajor}, <:AbstractColumnMajor, <:AbstractColumnMajor,
243+
T, <:AbstractMatrix, <:AbstractMatrix, <:AbstractMatrix}) where {T}
244+
α, β, A, B, C = M.α, M.β, M.A, M.B, M.C
245+
246+
mA, nA = size(A)
247+
mB, nB = size(B)
248+
mC, nC = size(C)
249+
(nA == mB && mC == mA && nC == nB) || throw(DimensionMismatch("A has size ($mA, $nA), B has size ($mB, $nB), C has size ($mC, $nC)"))
250+
251+
if iszero(α)
252+
lmul!(β, C)
253+
else
254+
for (colC, colB) in zip(eachcol(C), eachcol(B))
255+
mul!(colC, A, colB, α, β)
256+
end
257+
end
258+
259+
return C
260+
end

test/test_linalg.jl

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,51 @@ import BandedMatrices: BandedColumns, _BandedMatrix
4242
end
4343

4444
@testset "BandedMatrix * dense" begin
45-
for T in [Float64, Int]
45+
@testset for T in [Float64, Int]
4646
cmp = T <: Integer ? (==) : ()
47-
B = brand(T, 10,10,2,2)
47+
B = BandedMatrix(Symmetric(BandedMatrix{T}(0=>1:10, 1=>11:19, 2=>21:28)))
4848
M = Matrix(B)
49-
v = rand(T, 10)
50-
Bv = M * v
51-
@test cmp(B * v, Bv)
52-
w = similar(v)
53-
@test cmp(mul!(w, B, v), Bv)
54-
@test cmp(mul!(w, B, v, true, false), Bv)
55-
56-
X = rand(T, 10, 10)
57-
BX = M * X
58-
@test cmp(B * X, BX)
59-
Y = similar(X)
60-
@test cmp(mul!(Y, B, X), BX)
61-
@test cmp(mul!(Y, B, X, true, false), BX)
49+
50+
_v = T[1:10;]
51+
_v2 = T[1:20;]
52+
for v in Any[_v, view(_v, :), view(_v, axes(_v)...), view(_v2, axes(_v)...)]
53+
Bv = M * _v
54+
@test cmp(B * v, Bv)
55+
w = similar(Bv)
56+
@test cmp(mul!(w, B, v), Bv)
57+
@test cmp(mul!(w, B, v, true, false), Bv)
58+
w .= 1
59+
mul!(w, B, v, true, true)
60+
@test cmp(w, Bv + ones(T, size(w)))
61+
w .= 2
62+
mul!(w, B, v, false, true)
63+
@test cmp(w, fill(T(2), size(w)))
64+
w .= 1
65+
mul!(w, B, v, oneunit(T), oneunit(T))
66+
@test cmp(w, Bv + ones(T, size(w)))
67+
end
68+
69+
_X = reshape(T[1:100;], 10, 10)
70+
_X2 = reshape(T[1:15^2;], 15, 15)
71+
for X in Any[_X, view(_X, :, :), view(_X, axes(_X)...), view(_X, :, axes(_X,2)), view(_X, axes(_X,1), :),
72+
view(_X2, axes(_X)...),
73+
_X', view(_X', :, :), view(_X', axes(_X')...),
74+
view(_X2', axes(_X)...)]
75+
BX = M * X
76+
@test cmp(B * X, BX)
77+
Y = similar(BX)
78+
@test cmp(mul!(Y, B, X), BX)
79+
@test cmp(mul!(Y, B, X, true, false), BX)
80+
Y .= 1
81+
mul!(Y, B, X, true, true)
82+
@test cmp(Y, BX + ones(T, size(Y)))
83+
Y .= 2
84+
mul!(Y, B, X, false, true)
85+
@test cmp(Y, fill(T(2), size(Y)))
86+
Y .= 1
87+
mul!(Y, B, X, oneunit(T), oneunit(T))
88+
@test cmp(Y, BX + ones(T, size(Y)))
89+
end
6290
end
6391
end
6492

0 commit comments

Comments
 (0)