src/linsolve.rs

changeset 94
1f19c6bbf07b
parent 93
123f7f38e161
equal deleted inserted replaced
93:123f7f38e161 94:1f19c6bbf07b
1 /*! 1 /*!
2 Linear equation solvers for small problems stored in Rust arrays. 2 Linear equation solvers for small problems stored in Rust arrays.
3 */ 3 */
4 4
5 use crate::types::Float; 5 use crate::types::Float;
6 #[cfg(feature = "nightly")] 6 #[cfg(nightly)]
7 use std::mem::MaybeUninit; 7 use std::mem::MaybeUninit;
8 8
9 /// Gaussian elimination for $AX=B$, where $A$ and $B$ are both stored in `ab`, 9 /// Gaussian elimination for $AX=B$, where $A$ and $B$ are both stored in `ab`,
10 /// $A \in \mathbb{R}^{M \times M}$ and $X, B \in \mathbb{R}^{M \times K}$. 10 /// $A \in \mathbb{R}^{M \times M}$ and $X, B \in \mathbb{R}^{M \times K}$.
11 pub fn linsolve0<F: Float, const M: usize, const N: usize, const K: usize>( 11 pub fn linsolve0<F: Float, const M: usize, const N: usize, const K: usize>(
48 // upper triangular matrix. 48 // upper triangular matrix.
49 // 49 //
50 // If the "nightly" feature is enabled, we will use an uninitialised array for a 50 // If the "nightly" feature is enabled, we will use an uninitialised array for a
51 // little bit of efficiency. 51 // little bit of efficiency.
52 // This use of MaybeUninit assumes F : Copy. Otherwise undefined behaviour may occur. 52 // This use of MaybeUninit assumes F : Copy. Otherwise undefined behaviour may occur.
53 #[cfg(feature = "nightly")] 53 #[cfg(nightly)]
54 { 54 {
55 let mut x: [[MaybeUninit<F>; K]; M] = [[const { MaybeUninit::uninit() }; K]; M]; 55 let mut x: [[MaybeUninit<F>; K]; M] = [[const { MaybeUninit::uninit() }; K]; M];
56 //unsafe { std::mem::MaybeUninit::uninit().assume_init() }; 56 //unsafe { std::mem::MaybeUninit::uninit().assume_init() };
57 for i in (0..M).rev() { 57 for i in (0..M).rev() {
58 for 𝓁 in 0..K { 58 for 𝓁 in 0..K {
67 unsafe { 67 unsafe {
68 //core::intrinsics::assert_inhabited::<[[F; K]; M]>(); 68 //core::intrinsics::assert_inhabited::<[[F; K]; M]>();
69 (&x as *const _ as *const [[F; K]; M]).read() 69 (&x as *const _ as *const [[F; K]; M]).read()
70 } 70 }
71 } 71 }
72 #[cfg(not(feature = "nightly"))] 72 #[cfg(not(nightly))]
73 { 73 {
74 let mut x: [[F; K]; M] = [[F::ZERO; K]; M]; 74 let mut x: [[F; K]; M] = [[F::ZERO; K]; M];
75 for i in (0..M).rev() { 75 for i in (0..M).rev() {
76 for 𝓁 in 0..K { 76 for 𝓁 in 0..K {
77 let mut tmp = ab[i][M + 𝓁]; 77 let mut tmp = ab[i][M + 𝓁];

mercurial