Skip to content

Commit 1982118

Browse files
committed
Fix dispatch on sparse multiplication
1 parent 03c2ef6 commit 1982118

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

base/sparse.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ using Base.Sort: Forward
77
using Base.LinAlg: AbstractTriangular, PosDefException
88

99
import Base: +, -, *, \, &, |, $, .+, .-, .*, ./, .\, .^, .<, .!=, ==
10-
import Base: A_mul_B!, Ac_mul_B, Ac_mul_B!, At_mul_B, At_mul_B!, At_ldiv_B, Ac_ldiv_B, A_ldiv_B!
10+
import Base: A_mul_B!, Ac_mul_B, Ac_mul_B!, At_mul_B, At_mul_B!
11+
import Base: A_mul_Bc, A_mul_Bt, Ac_mul_Bc, At_mul_Bt
12+
import Base: At_ldiv_B, Ac_ldiv_B, A_ldiv_B!
1113
import Base.LinAlg: At_ldiv_B!, Ac_ldiv_B!
1214

1315
import Base: @get!, acos, acosd, acot, acotd, acsch, asech, asin, asind, asinh,

base/sparse/linalg.jl

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,24 @@ increment{T<:Integer}(A::AbstractArray{T}) = increment!(copy(A))
2626
## sparse matrix multiplication
2727

2828
function (*){TvA,TiA,TvB,TiB}(A::SparseMatrixCSC{TvA,TiA}, B::SparseMatrixCSC{TvB,TiB})
29+
(*)(sppromote(A, B)...)
30+
end
31+
for f in (:A_mul_Bt, :A_mul_Bc,
32+
:At_mul_B, :Ac_mul_B,
33+
:At_mul_Bt, :Ac_mul_Bc)
34+
@eval begin
35+
function ($f){TvA,TiA,TvB,TiB}(A::SparseMatrixCSC{TvA,TiA}, B::SparseMatrixCSC{TvB,TiB})
36+
($f)(sppromote(A, B)...)
37+
end
38+
end
39+
end
40+
41+
function sppromote{TvA,TiA,TvB,TiB}(A::SparseMatrixCSC{TvA,TiA}, B::SparseMatrixCSC{TvB,TiB})
2942
Tv = promote_type(TvA, TvB)
3043
Ti = promote_type(TiA, TiB)
3144
A = convert(SparseMatrixCSC{Tv,Ti}, A)
3245
B = convert(SparseMatrixCSC{Tv,Ti}, B)
33-
A * B
46+
A, B
3447
end
3548

3649
# In matrix-vector multiplication, the correct orientation of the vector is assumed.
@@ -109,6 +122,18 @@ end
109122
# http://dl.acm.org/citation.cfm?id=355796
110123

111124
(*){Tv,Ti}(A::SparseMatrixCSC{Tv,Ti}, B::SparseMatrixCSC{Tv,Ti}) = spmatmul(A,B)
125+
for (f, opA, opB) in ((:A_mul_Bt, :identity, :transpose),
126+
(:A_mul_Bc, :identity, :ctranspose),
127+
(:At_mul_B, :transpose, :identity),
128+
(:Ac_mul_B, :ctranspose, :identity),
129+
(:At_mul_Bt, :transpose, :transpose),
130+
(:Ac_mul_Bc, :ctranspose, :ctranspose))
131+
@eval begin
132+
function ($f){Tv,Ti}(A::SparseMatrixCSC{Tv,Ti}, B::SparseMatrixCSC{Tv,Ti})
133+
spmatmul(($opA)(A), ($opB)(B))
134+
end
135+
end
136+
end
112137

113138
function spmatmul{Tv,Ti}(A::SparseMatrixCSC{Tv,Ti}, B::SparseMatrixCSC{Tv,Ti};
114139
sortindices::Symbol = :sortcols)

0 commit comments

Comments
 (0)