| 322 | |
| 323 | template<typename T, bool conjugate> |
| 324 | void mtv(Array<T> output, const Array<T> values, const Array<int> rowIdx, |
| 325 | const Array<int> colIdx, const Array<T> right, int M) { |
| 326 | mapped_ptr<T> oPtr = output.getMappedPtr(); |
| 327 | mapped_ptr<T> rhtPtr = right.getMappedPtr(); |
| 328 | mapped_ptr<T> vPtr = values.getMappedPtr(); |
| 329 | mapped_ptr<int> rPtr = rowIdx.getMappedPtr(); |
| 330 | mapped_ptr<int> cPtr = colIdx.getMappedPtr(); |
| 331 | |
| 332 | T const *const valPtr = vPtr.get(); |
| 333 | int const *const rowPtr = rPtr.get(); |
| 334 | int const *const colPtr = cPtr.get(); |
| 335 | T const *const rhsPtr = rhtPtr.get(); |
| 336 | T *const outPtr = oPtr.get(); |
| 337 | |
| 338 | for (int i = 0; i < M; ++i) { outPtr[i] = scalar<T>(0); } |
| 339 | |
| 340 | for (int i = 0; i < rowIdx.dims()[0] - 1; ++i) { |
| 341 | for (int j = rowPtr[i]; j < rowPtr[i + 1]; ++j) { |
| 342 | // If stride[0] of right is not 1 then rhsPtr[i*stride] |
| 343 | if (conjugate) { |
| 344 | outPtr[colPtr[j]] = |
| 345 | outPtr[colPtr[j]] + getConjugate(valPtr[j]) * rhsPtr[i]; |
| 346 | } else { |
| 347 | outPtr[colPtr[j]] = outPtr[colPtr[j]] + valPtr[j] * rhsPtr[i]; |
| 348 | } |
| 349 | } |
| 350 | } |
| 351 | } |
| 352 | |
| 353 | template<typename T, bool conjugate> |
| 354 | void mm(Array<T> output, const Array<T> values, const Array<int> rowIdx, |
nothing calls this directly
no test coverage detected