@@ -70,7 +70,7 @@ function mul!(C::StridedVecOrMat, A::ThreadedSparseMatrixCSC, B::Union{StridedVe
70
70
C
71
71
end
72
72
73
- function mul! (C:: StridedVecOrMat , adjA:: Adjoint{<:Any,<:ThreadedSparseMatrixCSC} , B:: Union{StridedVector, AdjOrTransStridedOrTriangularMatrix} , α:: Number , β:: Number )
73
+ function mul! (C:: StridedVecOrMat , adjA:: Adjoint{<:Any,<:ThreadedSparseMatrixCSC} , B:: AdjOrTransStridedOrTriangularMatrix , α:: Number , β:: Number )
74
74
A = adjA. parent
75
75
size (A, 2 ) == size (C, 1 ) || throw (DimensionMismatch ())
76
76
size (A, 1 ) == size (B, 1 ) || throw (DimensionMismatch ())
@@ -94,8 +94,31 @@ function mul!(C::StridedVecOrMat, adjA::Adjoint{<:Any,<:ThreadedSparseMatrixCSC}
94
94
end
95
95
C
96
96
end
97
+ function mul! (C:: StridedVecOrMat , adjA:: Adjoint{<:Any,<:ThreadedSparseMatrixCSC} , B:: StridedVector , α:: Number , β:: Number )
98
+ A = adjA. parent
99
+ size (A, 2 ) == size (C, 1 ) || throw (DimensionMismatch ())
100
+ size (A, 1 ) == size (B, 1 ) || throw (DimensionMismatch ())
101
+ size (B, 2 ) == size (C, 2 ) || throw (DimensionMismatch ())
102
+ @assert size (B,2 )== 1
103
+ colptrA = getcolptr (A)
104
+ nzv = nonzeros (A)
105
+ rv = rowvals (A)
106
+ if β != 1
107
+ β != 0 ? rmul! (C, β) : fill! (C, zero (eltype (C)))
108
+ end
109
+ @sync for r in RangeIterator (size (A,2 ), Threads. nthreads ())
110
+ Threads. @spawn @inbounds for col = r
111
+ tmp = zero (eltype (C))
112
+ for j = getcolptr (A)[col]: (getcolptr (A)[col + 1 ] - 1 )
113
+ tmp += adjoint (nzv[j])* B[rv[j]]
114
+ end
115
+ C[col] += tmp * α
116
+ end
117
+ end
118
+ C
119
+ end
97
120
98
- function mul! (C:: StridedVecOrMat , transA:: Transpose{<:Any,<:ThreadedSparseMatrixCSC} , B:: Union{StridedVector, AdjOrTransStridedOrTriangularMatrix} , α:: Number , β:: Number )
121
+ function mul! (C:: StridedVecOrMat , transA:: Transpose{<:Any,<:ThreadedSparseMatrixCSC} , B:: AdjOrTransStridedOrTriangularMatrix , α:: Number , β:: Number )
99
122
A = transA. parent
100
123
size (A, 2 ) == size (C, 1 ) || throw (DimensionMismatch ())
101
124
size (A, 1 ) == size (B, 1 ) || throw (DimensionMismatch ())
@@ -118,6 +141,28 @@ function mul!(C::StridedVecOrMat, transA::Transpose{<:Any,<:ThreadedSparseMatrix
118
141
end
119
142
C
120
143
end
144
+ function mul! (C:: StridedVecOrMat , transA:: Transpose{<:Any,<:ThreadedSparseMatrixCSC} , B:: StridedVector , α:: Number , β:: Number )
145
+ A = transA. parent
146
+ size (A, 2 ) == size (C, 1 ) || throw (DimensionMismatch ())
147
+ size (A, 1 ) == size (B, 1 ) || throw (DimensionMismatch ())
148
+ size (B, 2 ) == size (C, 2 ) || throw (DimensionMismatch ())
149
+ @assert size (B,2 )== 1
150
+ nzv = nonzeros (A)
151
+ rv = rowvals (A)
152
+ if β != 1
153
+ β != 0 ? rmul! (C, β) : fill! (C, zero (eltype (C)))
154
+ end
155
+ @sync for r in RangeIterator (size (A,2 ), Threads. nthreads ())
156
+ Threads. @spawn @inbounds for col = r
157
+ tmp = zero (eltype (C))
158
+ for j = getcolptr (A)[col]: (getcolptr (A)[col + 1 ] - 1 )
159
+ tmp += transpose (nzv[j])* B[rv[j]]
160
+ end
161
+ C[col] += tmp * α
162
+ end
163
+ end
164
+ C
165
+ end
121
166
122
167
function mul! (C:: StridedVecOrMat , X:: AdjOrTransStridedOrTriangularMatrix , A:: ThreadedSparseMatrixCSC , α:: Number , β:: Number )
123
168
mX, nX = size (X)
0 commit comments