|
1 | 1 | import Base: *, Ac_mul_B, A_mul_Bc, Ac_mul_Bc, At_mul_B, A_mul_Bt, At_mul_Bt
|
2 | 2 | import Base: A_mul_B!, Ac_mul_B!, A_mul_Bc!, Ac_mul_Bc!, At_mul_B!, A_mul_Bt!, At_mul_Bt!
|
3 | 3 |
|
4 |
| -import Base.LinAlg: BlasFloat |
| 4 | +import Base.LinAlg: BlasFloat, matprod |
5 | 5 |
|
6 | 6 | const StaticVecOrMat{T} = Union{StaticVector{<:Any, T}, StaticMatrix{<:Any, <:Any, T}}
|
7 | 7 |
|
8 |
| -# Idea inspired by https://github.com/JuliaLang/julia/pull/18218 |
9 |
| -promote_matprod{T1,T2}(::Type{T1}, ::Type{T2}) = typeof(zero(T1)*zero(T2) + zero(T1)*zero(T2)) |
10 |
| - |
11 | 8 | # TODO Potentially a loop version for rather large arrays? Or try and figure out inference problems?
|
12 | 9 |
|
13 | 10 | # Deal with A_mul_Bc, etc...
|
@@ -60,7 +57,7 @@ promote_matprod{T1,T2}(::Type{T1}, ::Type{T2}) = typeof(zero(T1)*zero(T2) + zero
|
60 | 57 | if length(b) != sa[2]
|
61 | 58 | throw(DimensionMismatch("Tried to multiply arrays of size $sa and $(size(b))"))
|
62 | 59 | end
|
63 |
| - T = promote_matprod(Ta, Tb) |
| 60 | + T = promote_op(matprod,Ta,Tb) |
64 | 61 | @inbounds return similar_type(b, T, Size(sa[1]))(tuple($(exprs...)))
|
65 | 62 | end
|
66 | 63 | end
|
|
78 | 75 |
|
79 | 76 | return quote
|
80 | 77 | @_inline_meta
|
81 |
| - T = promote_matprod(Ta, Tb) |
| 78 | + T = promote_op(matprod,Ta,Tb) |
82 | 79 | @inbounds return similar_type(b, T, Size(sa[1]))(tuple($(exprs...)))
|
83 | 80 | end
|
84 | 81 | end
|
|
171 | 168 |
|
172 | 169 | return quote
|
173 | 170 | @_inline_meta
|
174 |
| - T = promote_matprod(Ta, Tb) |
| 171 | + T = promote_op(matprod,Ta,Tb) |
175 | 172 | @inbounds return similar_type(a, T, $S)(tuple($(exprs...)))
|
176 | 173 | end
|
177 | 174 | end
|
|
190 | 187 |
|
191 | 188 | return quote
|
192 | 189 | @_inline_meta
|
193 |
| - T = promote_matprod(Ta, Tb) |
| 190 | + T = promote_op(matprod,Ta,Tb) |
194 | 191 |
|
195 | 192 | @inbounds $(Expr(:block, exprs_init...))
|
196 | 193 | for j = 2:$(sa[2])
|
|
218 | 215 |
|
219 | 216 | return quote
|
220 | 217 | @_inline_meta
|
221 |
| - T = promote_matprod(Ta, Tb) |
| 218 | + T = promote_op(matprod,Ta,Tb) |
222 | 219 | $(Expr(:block,
|
223 | 220 | vect_exprs...,
|
224 | 221 | :(@inbounds return similar_type(a, T, $S)(tuple($(exprs...))))
|
|
234 | 231 | if sa[2] != 0
|
235 | 232 | exprs = [reduce((ex1,ex2) -> :(+($ex1,$ex2)), [:(a[$(sub2ind(sa, k, j))]*b[$j]) for j = 1:sa[2]]) for k = 1:sa[1]]
|
236 | 233 | else
|
237 |
| - exprs = [:(zero(promote_matprod(Ta,Tb))) for k = 1:sa[1]] |
| 234 | + exprs = [:(zero(promote_op(matprod,Ta,Tb))) for k = 1:sa[1]] |
238 | 235 | end
|
239 | 236 |
|
240 | 237 | return quote
|
|
0 commit comments