message: corrected my misunderstanding of `mul_acc_mat_vec_csc` and
  `mul_acc_mat_vec_csr`
diff: @@ -65,7 +65,6 @@ pub fn mul_acc_mat_vec_csc<N, I, Iptr, V>(
  panic!("Storage mismatch");
  }
  - res_vec.iter_mut().for_each(|v| *v = N::zero());
  for (col_ind, vec) in mat.outer_iterator().enumerate() {
  let multiplier = in_vec.index(col_ind);
  for (row_ind, &value) in vec.iter() {
  @@ -95,8 +94,10 @@ pub fn mul_acc_mat_vec_csr<N, I, Iptr, V>(
  }
  for (row_ind, vec) in mat.outer_iterator().enumerate() {
  - let tv = res_vec.get_mut(row_ind).unwrap(); // this unwrap is ok because we did the check
  - *tv = N::zero();
  + // this unwrap is ok because we did the check before to ensure
  + // mat.row() == res_vec.len() and now the row_ind is within the
  + // range of [0, mat.row). So it should be safe.
  + let tv = res_vec.get_mut(row_ind).unwrap();
  for (col_ind, &value) in vec.iter() {
  // TODO: unsafe access to value? needs bench
  *tv = *tv + *in_vec.index(col_ind) * value;
  