Skip to content

Commit

Permalink
Merge pull request #287 from rust-ndarray/use-build-uninit
Browse files Browse the repository at this point in the history
Port usage of uninitialized to build_uninit
  • Loading branch information
jturner314 authored May 27, 2021
2 parents a561e5a + b0d8529 commit 6de9acc
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 30 deletions.
2 changes: 1 addition & 1 deletion ndarray-linalg/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ rand = "0.8.3"
thiserror = "1.0.24"

[dependencies.ndarray]
version = "0.15.1"
version = "0.15.2"
features = ["blas", "approx", "std"]
default-features = false

Expand Down
37 changes: 16 additions & 21 deletions ndarray-linalg/src/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,31 +46,19 @@ where
}
}

fn uninitialized<A, S>(l: MatrixLayout) -> ArrayBase<S, Ix2>
where
A: Copy,
S: DataOwned<Elem = A>,
{
match l {
MatrixLayout::C { row, lda } => unsafe {
ArrayBase::uninitialized((row as usize, lda as usize))
},
MatrixLayout::F { col, lda } => unsafe {
ArrayBase::uninitialized((lda as usize, col as usize).f())
},
}
}

pub fn replicate<A, Sv, So, D>(a: &ArrayBase<Sv, D>) -> ArrayBase<So, D>
where
A: Copy,
Sv: Data<Elem = A>,
So: DataOwned<Elem = A> + DataMut,
D: Dimension,
{
let mut b = unsafe { ArrayBase::uninitialized(a.dim()) };
b.assign(a);
b
unsafe {
let ret = ArrayBase::<So, D>::build_uninit(a.dim(), |view| {
a.assign_to(view);
});
ret.assume_init()
}
}

fn clone_with_layout<A, Si, So>(l: MatrixLayout, a: &ArrayBase<Si, Ix2>) -> ArrayBase<So, Ix2>
Expand All @@ -79,9 +67,16 @@ where
Si: Data<Elem = A>,
So: DataOwned<Elem = A> + DataMut,
{
let mut b = uninitialized(l);
b.assign(a);
b
let shape_builder = match l {
MatrixLayout::C { row, lda } => (row as usize, lda as usize).set_f(false),
MatrixLayout::F { col, lda } => (lda as usize, col as usize).set_f(true),
};
unsafe {
let ret = ArrayBase::<So, _>::build_uninit(shape_builder, |view| {
a.assign_to(view);
});
ret.assume_init()
}
}

pub fn transpose_data<A, S>(a: &mut ArrayBase<S, Ix2>) -> Result<&mut ArrayBase<S, Ix2>>
Expand Down
16 changes: 8 additions & 8 deletions ndarray-linalg/src/qr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,7 @@ where
S2: DataMut<Elem = A> + DataOwned,
{
let av = a.slice(s![..n as isize, ..m as isize]);
let mut a = unsafe { ArrayBase::uninitialized((n, m)) };
a.assign(&av);
a
replicate(&av)
}

fn take_slice_upper<A, S1, S2>(a: &ArrayBase<S1, Ix2>, n: usize, m: usize) -> ArrayBase<S2, Ix2>
Expand All @@ -146,10 +144,12 @@ where
S1: Data<Elem = A>,
S2: DataMut<Elem = A> + DataOwned,
{
let av = a.slice(s![..n as isize, ..m as isize]);
let mut a = unsafe { ArrayBase::uninitialized((n, m)) };
for ((i, j), val) in a.indexed_iter_mut() {
*val = if i <= j { av[(i, j)] } else { A::zero() };
}
let av = a.slice(s![..n, ..m]);
let mut a = replicate(&av);
Zip::indexed(&mut a).for_each(|(i, j), elt| {
if i > j {
*elt = A::zero()
}
});
a
}

0 comments on commit 6de9acc

Please sign in to comment.