diff --git a/lax/src/alloc.rs b/lax/src/alloc.rs index 62116f85..5872bab4 100644 --- a/lax/src/alloc.rs +++ b/lax/src/alloc.rs @@ -53,8 +53,10 @@ impl VecAssumeInit for Vec> { /// ------ /// - Memory is not initialized. Do not read the memory before write. /// -pub(crate) unsafe fn vec_uninit(n: usize) -> Vec> { +pub(crate) fn vec_uninit(n: usize) -> Vec> { let mut v = Vec::with_capacity(n); - v.set_len(n); + unsafe { + v.set_len(n); + } v } diff --git a/lax/src/eig.rs b/lax/src/eig.rs index deafba2f..6fcbc26a 100644 --- a/lax/src/eig.rs +++ b/lax/src/eig.rs @@ -48,13 +48,13 @@ macro_rules! impl_eig_complex { } else { (JobEv::None, JobEv::None) }; - let mut eigs: Vec> = unsafe { vec_uninit(n as usize) }; - let mut rwork: Vec> = unsafe { vec_uninit(2 * n as usize) }; + let mut eigs: Vec> = vec_uninit(n as usize); + let mut rwork: Vec> = vec_uninit(2 * n as usize); let mut vl: Option>> = - jobvl.then(|| unsafe { vec_uninit((n * n) as usize) }); + jobvl.then(|| vec_uninit((n * n) as usize)); let mut vr: Option>> = - jobvr.then(|| unsafe { vec_uninit((n * n) as usize) }); + jobvr.then(|| vec_uninit((n * n) as usize)); // calc work size let mut info = 0; @@ -81,7 +81,7 @@ macro_rules! impl_eig_complex { // actal ev let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit(lwork) }; + let mut work: Vec> = vec_uninit(lwork); let lwork = lwork as i32; unsafe { $ev( @@ -156,13 +156,13 @@ macro_rules! impl_eig_real { } else { (JobEv::None, JobEv::None) }; - let mut eig_re: Vec> = unsafe { vec_uninit(n as usize) }; - let mut eig_im: Vec> = unsafe { vec_uninit(n as usize) }; + let mut eig_re: Vec> = vec_uninit(n as usize); + let mut eig_im: Vec> = vec_uninit(n as usize); let mut vl: Option>> = - jobvl.then(|| unsafe { vec_uninit((n * n) as usize) }); + jobvl.then(|| vec_uninit((n * n) as usize)); let mut vr: Option>> = - jobvr.then(|| unsafe { vec_uninit((n * n) as usize) }); + jobvr.then(|| vec_uninit((n * n) as usize)); // calc work size let mut info = 0; @@ -189,7 +189,7 @@ macro_rules! impl_eig_real { // actual ev let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit(lwork) }; + let mut work: Vec> = vec_uninit(lwork); let lwork = lwork as i32; unsafe { $ev( @@ -244,7 +244,7 @@ macro_rules! impl_eig_real { let n = n as usize; let v = vr.or(vl).unwrap(); - let mut eigvecs: Vec> = unsafe { vec_uninit(n * n) }; + let mut eigvecs: Vec> = vec_uninit(n * n); let mut col = 0; while col < n { if eig_im[col] == 0. { diff --git a/lax/src/eigh.rs b/lax/src/eigh.rs index 055b2f47..54af63f7 100644 --- a/lax/src/eigh.rs +++ b/lax/src/eigh.rs @@ -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> = unsafe { vec_uninit(n as usize) }; + let mut eigs: Vec> = vec_uninit(n as usize); $( - let mut $rwork_ident: Vec> = unsafe { vec_uninit(3 * n as usize - 2 as usize) }; + let mut $rwork_ident: Vec> = vec_uninit(3 * n as usize - 2 as usize); )* // calc work size @@ -85,7 +85,7 @@ macro_rules! impl_eigh { // actual ev let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit(lwork) }; + let mut work: Vec> = vec_uninit(lwork); let lwork = lwork as i32; unsafe { $ev( @@ -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> = unsafe { vec_uninit(n as usize) }; + let mut eigs: Vec> = vec_uninit(n as usize); $( - let mut $rwork_ident: Vec> = unsafe { vec_uninit(3 * n as usize - 2) }; + let mut $rwork_ident: Vec> = vec_uninit(3 * n as usize - 2); )* // calc work size @@ -147,7 +147,7 @@ macro_rules! impl_eigh { // actual evg let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit(lwork) }; + let mut work: Vec> = vec_uninit(lwork); let lwork = lwork as i32; unsafe { $evg( diff --git a/lax/src/layout.rs b/lax/src/layout.rs index e695d8e7..28b35122 100644 --- a/lax/src/layout.rs +++ b/lax/src/layout.rs @@ -202,7 +202,7 @@ pub fn transpose(layout: MatrixLayout, input: &[T]) -> (MatrixLayout, V let n = n as usize; assert_eq!(input.len(), m * n); - let mut out: Vec> = unsafe { vec_uninit(m * n) }; + let mut out: Vec> = vec_uninit(m * n); match layout { MatrixLayout::C { .. } => { diff --git a/lax/src/least_squares.rs b/lax/src/least_squares.rs index 5699257d..1bfd4d37 100644 --- a/lax/src/least_squares.rs +++ b/lax/src/least_squares.rs @@ -91,7 +91,7 @@ macro_rules! impl_least_squares { }; let rcond: Self::Real = -1.; - let mut singular_values: Vec> = unsafe { vec_uninit( k as usize) }; + let mut singular_values: Vec> = vec_uninit( k as usize); let mut rank: i32 = 0; // eval work size @@ -124,12 +124,12 @@ macro_rules! impl_least_squares { // calc let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit(lwork) }; + let mut work: Vec> = vec_uninit(lwork); let liwork = iwork_size[0].to_usize().unwrap(); - let mut iwork: Vec> = unsafe { vec_uninit(liwork) }; + let mut iwork: Vec> = vec_uninit(liwork); $( let lrwork = $rwork[0].to_usize().unwrap(); - let mut $rwork: Vec> = unsafe { vec_uninit(lrwork) }; + let mut $rwork: Vec> = vec_uninit(lrwork); )* unsafe { $gelsd( diff --git a/lax/src/opnorm.rs b/lax/src/opnorm.rs index fca7704c..60933489 100644 --- a/lax/src/opnorm.rs +++ b/lax/src/opnorm.rs @@ -19,7 +19,7 @@ macro_rules! impl_opnorm { MatrixLayout::C { .. } => t.transpose(), }; let mut work: Vec> = if matches!(t, NormType::Infinity) { - unsafe { vec_uninit(m as usize) } + vec_uninit(m as usize) } else { Vec::new() }; diff --git a/lax/src/qr.rs b/lax/src/qr.rs index 553bb606..bdfb7571 100644 --- a/lax/src/qr.rs +++ b/lax/src/qr.rs @@ -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; @@ -62,7 +62,7 @@ macro_rules! impl_qr { // calc let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit(lwork) }; + let mut work: Vec> = vec_uninit(lwork); unsafe { match l { MatrixLayout::F { .. } => { @@ -136,7 +136,7 @@ macro_rules! impl_qr { // calc let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit(lwork) }; + let mut work: Vec> = vec_uninit(lwork); unsafe { match l { MatrixLayout::F { .. } => $gqr( diff --git a/lax/src/rcond.rs b/lax/src/rcond.rs index dfc8a941..6cc72749 100644 --- a/lax/src/rcond.rs +++ b/lax/src/rcond.rs @@ -17,8 +17,8 @@ macro_rules! impl_rcond_real { let mut rcond = Self::Real::zero(); let mut info = 0; - let mut work: Vec> = unsafe { vec_uninit(4 * n as usize) }; - let mut iwork: Vec> = unsafe { vec_uninit(n as usize) }; + let mut work: Vec> = vec_uninit(4 * n as usize); + let mut iwork: Vec> = vec_uninit(n as usize); let norm_type = match l { MatrixLayout::C { .. } => NormType::Infinity, MatrixLayout::F { .. } => NormType::One, @@ -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> = unsafe { vec_uninit(2 * n as usize) }; - let mut rwork: Vec> = unsafe { vec_uninit(2 * n as usize) }; + let mut work: Vec> = vec_uninit(2 * n as usize); + let mut rwork: Vec> = vec_uninit(2 * n as usize); let norm_type = match l { MatrixLayout::C { .. } => NormType::Infinity, MatrixLayout::F { .. } => NormType::One, diff --git a/lax/src/solve.rs b/lax/src/solve.rs index 9f25c9bf..d0f764fd 100644 --- a/lax/src/solve.rs +++ b/lax/src/solve.rs @@ -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( @@ -117,7 +117,7 @@ macro_rules! impl_solve { // actual let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit(lwork) }; + let mut work: Vec> = vec_uninit(lwork); unsafe { $getri( &l.len(), diff --git a/lax/src/solveh.rs b/lax/src/solveh.rs index 5d1a3d02..bbc6f363 100644 --- a/lax/src/solveh.rs +++ b/lax/src/solveh.rs @@ -58,7 +58,7 @@ macro_rules! impl_solveh { impl Solveh_ for $scalar { fn bk(l: MatrixLayout, uplo: UPLO, a: &mut [Self]) -> Result { 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()); } @@ -82,7 +82,7 @@ macro_rules! impl_solveh { // actual let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit(lwork) }; + let mut work: Vec> = vec_uninit(lwork); unsafe { $trf( uplo.as_ptr(), @@ -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> = unsafe { vec_uninit(n as usize) }; + let mut work: Vec> = vec_uninit(n as usize); unsafe { $tri( uplo.as_ptr(), diff --git a/lax/src/svd.rs b/lax/src/svd.rs index 0f0f81ab..0d9bd353 100644 --- a/lax/src/svd.rs +++ b/lax/src/svd.rs @@ -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> = unsafe { vec_uninit( 5 * k as usize) }; + let mut $rwork_ident: Vec> = vec_uninit(5 * k as usize); )* // eval work size @@ -96,7 +96,7 @@ macro_rules! impl_svd { // calc let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit( lwork) }; + let mut work: Vec> = vec_uninit(lwork); unsafe { $gesvd( ju.as_ptr(), diff --git a/lax/src/svddc.rs b/lax/src/svddc.rs index 55ddfd46..928fd44c 100644 --- a/lax/src/svddc.rs +++ b/lax/src/svddc.rs @@ -30,7 +30,7 @@ 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), @@ -38,12 +38,12 @@ macro_rules! impl_svddc { }; 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), }; @@ -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> = unsafe { vec_uninit( lrwork) }; + let mut $rwork_ident: Vec> = vec_uninit(lrwork); )* // eval work size let mut info = 0; - let mut iwork: Vec> = unsafe { vec_uninit( 8 * k as usize) }; + let mut iwork: Vec> = vec_uninit(8 * k as usize); let mut work_size = [Self::zero()]; unsafe { $gesdd( @@ -85,7 +85,7 @@ macro_rules! impl_svddc { // do svd let lwork = work_size[0].to_usize().unwrap(); - let mut work: Vec> = unsafe { vec_uninit( lwork) }; + let mut work: Vec> = vec_uninit(lwork); unsafe { $gesdd( jobz.as_ptr(), diff --git a/lax/src/tridiagonal.rs b/lax/src/tridiagonal.rs index ef8dfdf6..3d28c63a 100644 --- a/lax/src/tridiagonal.rs +++ b/lax/src/tridiagonal.rs @@ -152,8 +152,8 @@ macro_rules! impl_tridiagonal { impl Tridiagonal_ for $scalar { fn lu_tridiagonal(mut a: Tridiagonal) -> Result> { 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; @@ -182,9 +182,9 @@ macro_rules! impl_tridiagonal { fn rcond_tridiagonal(lu: &LUFactorizedTridiagonal) -> Result { let (n, _) = lu.a.l.size(); let ipiv = &lu.ipiv; - let mut work: Vec> = unsafe { vec_uninit( 2 * n as usize) }; + let mut work: Vec> = vec_uninit(2 * n as usize); $( - let mut $iwork: Vec> = unsafe { vec_uninit( n as usize) }; + let mut $iwork: Vec> = vec_uninit(n as usize); )* let mut rcond = Self::Real::zero(); let mut info = 0;