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 831dda2
Showing 1 changed file with 11 additions and 12 deletions.
23 changes: 11 additions & 12 deletions ndarray-linalg/src/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,18 +102,17 @@ where
{
// FIXME
// https://github.com/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()
};
assert_eq!(
new.strides(),
strides.as_slice(),
"Custom stride is not supported"
);
new
//
// 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!(a_len, data.len(), "generalize: non-contig arrays are not supported");
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 831dda2

Please sign in to comment.