Skip to content

Commit

Permalink
Improve stride copying in generalize a bit
Browse files Browse the repository at this point in the history
While still not perfect - that should be solved in upstream ndarray, the
new version is an improvement since it checks the compatibility before
attempting to construct the array.

`.into_raw_vec()` is very hard to use correctly (this is inherent, it's
an access to the raw memory model), so the new version will actually
fail to convert in some cases that were passing as silent errors before
(related to internally sliced arrays, rather uncommon).
  • Loading branch information
bluss committed May 17, 2021
1 parent a561e5a commit 831ecbe
Showing 1 changed file with 13 additions and 10 deletions.
23 changes: 13 additions & 10 deletions ndarray-linalg/src/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,18 +102,21 @@ where
{
// FIXME
// https:/bluss/rust-ndarray/issues/325
let strides: Vec<isize> = a.strides().to_vec();
let new = if a.is_standard_layout() {
ArrayBase::from_shape_vec(a.dim(), a.into_raw_vec()).unwrap()
} else {
ArrayBase::from_shape_vec(a.dim().f(), a.into_raw_vec()).unwrap()
};
//
// copy strides
let mut strides = D::zeros(a.ndim());
for (index, &s) in a.strides().iter().enumerate() {
strides[index] = s as usize;
}
let a_dim = a.raw_dim();
let a_len = a.len();
let data = a.into_raw_vec();
assert_eq!(
new.strides(),
strides.as_slice(),
"Custom stride is not supported"
a_len,
data.len(),
"generalize: non-contig arrays are not supported"
);
new
ArrayBase::from_shape_vec(a_dim.strides(strides), data).unwrap()
}

/// Fills in the remainder of a Hermitian matrix that's represented by only one
Expand Down

0 comments on commit 831ecbe

Please sign in to comment.