Skip to content

Commit

Permalink
Drop unsafe from vec_uninit definition
Browse files Browse the repository at this point in the history
  • Loading branch information
termoshtt committed Sep 8, 2022
1 parent ecd09eb commit 4737b9c
Show file tree
Hide file tree
Showing 13 changed files with 56 additions and 54 deletions.
6 changes: 4 additions & 2 deletions lax/src/alloc.rs
Expand Up @@ -53,8 +53,10 @@ impl<T> VecAssumeInit for Vec<MaybeUninit<T>> {
/// ------
/// - Memory is not initialized. Do not read the memory before write.
///
pub(crate) unsafe fn vec_uninit<T: Sized>(n: usize) -> Vec<MaybeUninit<T>> {
pub(crate) fn vec_uninit<T: Sized>(n: usize) -> Vec<MaybeUninit<T>> {
let mut v = Vec::with_capacity(n);
v.set_len(n);
unsafe {
v.set_len(n);
}
v
}
22 changes: 11 additions & 11 deletions lax/src/eig.rs
Expand Up @@ -48,13 +48,13 @@ macro_rules! impl_eig_complex {
} else {
(JobEv::None, JobEv::None)
};
let mut eigs: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(n as usize) };
let mut rwork: Vec<MaybeUninit<Self::Real>> = unsafe { vec_uninit(2 * n as usize) };
let mut eigs: Vec<MaybeUninit<Self>> = vec_uninit(n as usize);
let mut rwork: Vec<MaybeUninit<Self::Real>> = vec_uninit(2 * n as usize);

let mut vl: Option<Vec<MaybeUninit<Self>>> =
jobvl.then(|| unsafe { vec_uninit((n * n) as usize) });
jobvl.then(|| vec_uninit((n * n) as usize));
let mut vr: Option<Vec<MaybeUninit<Self>>> =
jobvr.then(|| unsafe { vec_uninit((n * n) as usize) });
jobvr.then(|| vec_uninit((n * n) as usize));

// calc work size
let mut info = 0;
Expand All @@ -81,7 +81,7 @@ macro_rules! impl_eig_complex {

// actal ev
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
let lwork = lwork as i32;
unsafe {
$ev(
Expand Down Expand Up @@ -156,13 +156,13 @@ macro_rules! impl_eig_real {
} else {
(JobEv::None, JobEv::None)
};
let mut eig_re: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(n as usize) };
let mut eig_im: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(n as usize) };
let mut eig_re: Vec<MaybeUninit<Self>> = vec_uninit(n as usize);
let mut eig_im: Vec<MaybeUninit<Self>> = vec_uninit(n as usize);

let mut vl: Option<Vec<MaybeUninit<Self>>> =
jobvl.then(|| unsafe { vec_uninit((n * n) as usize) });
jobvl.then(|| vec_uninit((n * n) as usize));
let mut vr: Option<Vec<MaybeUninit<Self>>> =
jobvr.then(|| unsafe { vec_uninit((n * n) as usize) });
jobvr.then(|| vec_uninit((n * n) as usize));

// calc work size
let mut info = 0;
Expand All @@ -189,7 +189,7 @@ macro_rules! impl_eig_real {

// actual ev
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
let lwork = lwork as i32;
unsafe {
$ev(
Expand Down Expand Up @@ -244,7 +244,7 @@ macro_rules! impl_eig_real {

let n = n as usize;
let v = vr.or(vl).unwrap();
let mut eigvecs: Vec<MaybeUninit<Self::Complex>> = unsafe { vec_uninit(n * n) };
let mut eigvecs: Vec<MaybeUninit<Self::Complex>> = vec_uninit(n * n);
let mut col = 0;
while col < n {
if eig_im[col] == 0. {
Expand Down
12 changes: 6 additions & 6 deletions lax/src/eigh.rs
Expand Up @@ -58,10 +58,10 @@ macro_rules! impl_eigh {
assert_eq!(layout.len(), layout.lda());
let n = layout.len();
let jobz = if calc_v { JobEv::All } else { JobEv::None };
let mut eigs: Vec<MaybeUninit<Self::Real>> = unsafe { vec_uninit(n as usize) };
let mut eigs: Vec<MaybeUninit<Self::Real>> = vec_uninit(n as usize);

$(
let mut $rwork_ident: Vec<MaybeUninit<Self::Real>> = unsafe { vec_uninit(3 * n as usize - 2 as usize) };
let mut $rwork_ident: Vec<MaybeUninit<Self::Real>> = vec_uninit(3 * n as usize - 2 as usize);
)*

// calc work size
Expand All @@ -85,7 +85,7 @@ macro_rules! impl_eigh {

// actual ev
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
let lwork = lwork as i32;
unsafe {
$ev(
Expand Down Expand Up @@ -117,10 +117,10 @@ macro_rules! impl_eigh {
assert_eq!(layout.len(), layout.lda());
let n = layout.len();
let jobz = if calc_v { JobEv::All } else { JobEv::None };
let mut eigs: Vec<MaybeUninit<Self::Real>> = unsafe { vec_uninit(n as usize) };
let mut eigs: Vec<MaybeUninit<Self::Real>> = vec_uninit(n as usize);

$(
let mut $rwork_ident: Vec<MaybeUninit<Self::Real>> = unsafe { vec_uninit(3 * n as usize - 2) };
let mut $rwork_ident: Vec<MaybeUninit<Self::Real>> = vec_uninit(3 * n as usize - 2);
)*

// calc work size
Expand All @@ -147,7 +147,7 @@ macro_rules! impl_eigh {

// actual evg
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
let lwork = lwork as i32;
unsafe {
$evg(
Expand Down
2 changes: 1 addition & 1 deletion lax/src/layout.rs
Expand Up @@ -202,7 +202,7 @@ pub fn transpose<T: Copy>(layout: MatrixLayout, input: &[T]) -> (MatrixLayout, V
let n = n as usize;
assert_eq!(input.len(), m * n);

let mut out: Vec<MaybeUninit<T>> = unsafe { vec_uninit(m * n) };
let mut out: Vec<MaybeUninit<T>> = vec_uninit(m * n);

match layout {
MatrixLayout::C { .. } => {
Expand Down
8 changes: 4 additions & 4 deletions lax/src/least_squares.rs
Expand Up @@ -91,7 +91,7 @@ macro_rules! impl_least_squares {
};

let rcond: Self::Real = -1.;
let mut singular_values: Vec<MaybeUninit<Self::Real>> = unsafe { vec_uninit( k as usize) };
let mut singular_values: Vec<MaybeUninit<Self::Real>> = vec_uninit( k as usize);
let mut rank: i32 = 0;

// eval work size
Expand Down Expand Up @@ -124,12 +124,12 @@ macro_rules! impl_least_squares {

// calc
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
let liwork = iwork_size[0].to_usize().unwrap();
let mut iwork: Vec<MaybeUninit<i32>> = unsafe { vec_uninit(liwork) };
let mut iwork: Vec<MaybeUninit<i32>> = vec_uninit(liwork);
$(
let lrwork = $rwork[0].to_usize().unwrap();
let mut $rwork: Vec<MaybeUninit<Self::Real>> = unsafe { vec_uninit(lrwork) };
let mut $rwork: Vec<MaybeUninit<Self::Real>> = vec_uninit(lrwork);
)*
unsafe {
$gelsd(
Expand Down
2 changes: 1 addition & 1 deletion lax/src/opnorm.rs
Expand Up @@ -19,7 +19,7 @@ macro_rules! impl_opnorm {
MatrixLayout::C { .. } => t.transpose(),
};
let mut work: Vec<MaybeUninit<Self::Real>> = if matches!(t, NormType::Infinity) {
unsafe { vec_uninit(m as usize) }
vec_uninit(m as usize)
} else {
Vec::new()
};
Expand Down
6 changes: 3 additions & 3 deletions lax/src/qr.rs
Expand Up @@ -25,7 +25,7 @@ macro_rules! impl_qr {
let m = l.lda();
let n = l.len();
let k = m.min(n);
let mut tau = unsafe { vec_uninit(k as usize) };
let mut tau = vec_uninit(k as usize);

// eval work size
let mut info = 0;
Expand Down Expand Up @@ -62,7 +62,7 @@ macro_rules! impl_qr {

// calc
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
unsafe {
match l {
MatrixLayout::F { .. } => {
Expand Down Expand Up @@ -136,7 +136,7 @@ macro_rules! impl_qr {

// calc
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
unsafe {
match l {
MatrixLayout::F { .. } => $gqr(
Expand Down
8 changes: 4 additions & 4 deletions lax/src/rcond.rs
Expand Up @@ -17,8 +17,8 @@ macro_rules! impl_rcond_real {
let mut rcond = Self::Real::zero();
let mut info = 0;

let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(4 * n as usize) };
let mut iwork: Vec<MaybeUninit<i32>> = unsafe { vec_uninit(n as usize) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(4 * n as usize);
let mut iwork: Vec<MaybeUninit<i32>> = vec_uninit(n as usize);
let norm_type = match l {
MatrixLayout::C { .. } => NormType::Infinity,
MatrixLayout::F { .. } => NormType::One,
Expand Down Expand Up @@ -54,8 +54,8 @@ macro_rules! impl_rcond_complex {
let (n, _) = l.size();
let mut rcond = Self::Real::zero();
let mut info = 0;
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(2 * n as usize) };
let mut rwork: Vec<MaybeUninit<Self::Real>> = unsafe { vec_uninit(2 * n as usize) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(2 * n as usize);
let mut rwork: Vec<MaybeUninit<Self::Real>> = vec_uninit(2 * n as usize);
let norm_type = match l {
MatrixLayout::C { .. } => NormType::Infinity,
MatrixLayout::F { .. } => NormType::One,
Expand Down
4 changes: 2 additions & 2 deletions lax/src/solve.rs
Expand Up @@ -75,7 +75,7 @@ macro_rules! impl_solve {
return Ok(Vec::new());
}
let k = ::std::cmp::min(row, col);
let mut ipiv = unsafe { vec_uninit(k as usize) };
let mut ipiv = vec_uninit(k as usize);
let mut info = 0;
unsafe {
$getrf(
Expand Down Expand Up @@ -117,7 +117,7 @@ macro_rules! impl_solve {

// actual
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
unsafe {
$getri(
&l.len(),
Expand Down
6 changes: 3 additions & 3 deletions lax/src/solveh.rs
Expand Up @@ -58,7 +58,7 @@ macro_rules! impl_solveh {
impl Solveh_ for $scalar {
fn bk(l: MatrixLayout, uplo: UPLO, a: &mut [Self]) -> Result<Pivot> {
let (n, _) = l.size();
let mut ipiv = unsafe { vec_uninit(n as usize) };
let mut ipiv = vec_uninit(n as usize);
if n == 0 {
return Ok(Vec::new());
}
Expand All @@ -82,7 +82,7 @@ macro_rules! impl_solveh {

// actual
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
unsafe {
$trf(
uplo.as_ptr(),
Expand All @@ -103,7 +103,7 @@ macro_rules! impl_solveh {
fn invh(l: MatrixLayout, uplo: UPLO, a: &mut [Self], ipiv: &Pivot) -> Result<()> {
let (n, _) = l.size();
let mut info = 0;
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit(n as usize) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(n as usize);
unsafe {
$tri(
uplo.as_ptr(),
Expand Down
10 changes: 5 additions & 5 deletions lax/src/svd.rs
Expand Up @@ -51,23 +51,23 @@ macro_rules! impl_svd {

let m = l.lda();
let mut u = match ju {
JobSvd::All => Some(unsafe { vec_uninit( (m * m) as usize) }),
JobSvd::All => Some(vec_uninit( (m * m) as usize)),
JobSvd::None => None,
_ => unimplemented!("SVD with partial vector output is not supported yet")
};

let n = l.len();
let mut vt = match jvt {
JobSvd::All => Some(unsafe { vec_uninit( (n * n) as usize) }),
JobSvd::All => Some(vec_uninit( (n * n) as usize)),
JobSvd::None => None,
_ => unimplemented!("SVD with partial vector output is not supported yet")
};

let k = std::cmp::min(m, n);
let mut s = unsafe { vec_uninit( k as usize) };
let mut s = vec_uninit( k as usize);

$(
let mut $rwork_ident: Vec<MaybeUninit<Self::Real>> = unsafe { vec_uninit( 5 * k as usize) };
let mut $rwork_ident: Vec<MaybeUninit<Self::Real>> = vec_uninit(5 * k as usize);
)*

// eval work size
Expand Down Expand Up @@ -96,7 +96,7 @@ macro_rules! impl_svd {

// calc
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit( lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
unsafe {
$gesvd(
ju.as_ptr(),
Expand Down
16 changes: 8 additions & 8 deletions lax/src/svddc.rs
Expand Up @@ -30,20 +30,20 @@ macro_rules! impl_svddc {
let m = l.lda();
let n = l.len();
let k = m.min(n);
let mut s = unsafe { vec_uninit( k as usize) };
let mut s = vec_uninit(k as usize);

let (u_col, vt_row) = match jobz {
JobSvd::All | JobSvd::None => (m, n),
JobSvd::Some => (k, k),
};
let (mut u, mut vt) = match jobz {
JobSvd::All => (
Some(unsafe { vec_uninit( (m * m) as usize) }),
Some(unsafe { vec_uninit( (n * n) as usize) }),
Some(vec_uninit((m * m) as usize)),
Some(vec_uninit((n * n) as usize)),
),
JobSvd::Some => (
Some(unsafe { vec_uninit( (m * u_col) as usize) }),
Some(unsafe { vec_uninit( (n * vt_row) as usize) }),
Some(vec_uninit((m * u_col) as usize)),
Some(vec_uninit((n * vt_row) as usize)),
),
JobSvd::None => (None, None),
};
Expand All @@ -55,12 +55,12 @@ macro_rules! impl_svddc {
JobSvd::None => 7 * mn,
_ => std::cmp::max(5*mn*mn + 5*mn, 2*mx*mn + 2*mn*mn + mn),
};
let mut $rwork_ident: Vec<MaybeUninit<Self::Real>> = unsafe { vec_uninit( lrwork) };
let mut $rwork_ident: Vec<MaybeUninit<Self::Real>> = vec_uninit(lrwork);
)*

// eval work size
let mut info = 0;
let mut iwork: Vec<MaybeUninit<i32>> = unsafe { vec_uninit( 8 * k as usize) };
let mut iwork: Vec<MaybeUninit<i32>> = vec_uninit(8 * k as usize);
let mut work_size = [Self::zero()];
unsafe {
$gesdd(
Expand All @@ -85,7 +85,7 @@ macro_rules! impl_svddc {

// do svd
let lwork = work_size[0].to_usize().unwrap();
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit( lwork) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(lwork);
unsafe {
$gesdd(
jobz.as_ptr(),
Expand Down
8 changes: 4 additions & 4 deletions lax/src/tridiagonal.rs
Expand Up @@ -152,8 +152,8 @@ macro_rules! impl_tridiagonal {
impl Tridiagonal_ for $scalar {
fn lu_tridiagonal(mut a: Tridiagonal<Self>) -> Result<LUFactorizedTridiagonal<Self>> {
let (n, _) = a.l.size();
let mut du2 = unsafe { vec_uninit( (n - 2) as usize) };
let mut ipiv = unsafe { vec_uninit( n as usize) };
let mut du2 = vec_uninit( (n - 2) as usize);
let mut ipiv = vec_uninit( n as usize);
// We have to calc one-norm before LU factorization
let a_opnorm_one = a.opnorm_one();
let mut info = 0;
Expand Down Expand Up @@ -182,9 +182,9 @@ macro_rules! impl_tridiagonal {
fn rcond_tridiagonal(lu: &LUFactorizedTridiagonal<Self>) -> Result<Self::Real> {
let (n, _) = lu.a.l.size();
let ipiv = &lu.ipiv;
let mut work: Vec<MaybeUninit<Self>> = unsafe { vec_uninit( 2 * n as usize) };
let mut work: Vec<MaybeUninit<Self>> = vec_uninit(2 * n as usize);
$(
let mut $iwork: Vec<MaybeUninit<i32>> = unsafe { vec_uninit( n as usize) };
let mut $iwork: Vec<MaybeUninit<i32>> = vec_uninit(n as usize);
)*
let mut rcond = Self::Real::zero();
let mut info = 0;
Expand Down

0 comments on commit 4737b9c

Please sign in to comment.