pub struct SparseLu { /* private fields */ }Expand description
A sparse LU that analyzes a pattern once and refactors it on every solve,
with its backend picked by a LuBackend.
Starts empty. analyze builds the symbolic factorization;
the solves reuse it until reset. The same
precondition as LinearSolver holds: every solve must present the
pattern that was analyzed, in the same order.
Implementations§
Source§impl SparseLu
impl SparseLu
pub fn new(backend: LuBackend) -> Self
pub fn backend(&self) -> LuBackend
Sourcepub fn is_analyzed(&self) -> bool
pub fn is_analyzed(&self) -> bool
Whether a symbolic factorization is cached.
Sourcepub fn analyze(&mut self, n: usize, entries: &[(usize, usize, f64)]) -> bool
pub fn analyze(&mut self, n: usize, entries: &[(usize, usize, f64)]) -> bool
Analyzes entries’ pattern and factors it, replacing anything cached.
false if the pattern is structurally invalid or the matrix singular,
in which case nothing is cached.
Sourcepub fn adopt_storage_order(&mut self) -> Option<Vec<usize>>
pub fn adopt_storage_order(&mut self) -> Option<Vec<usize>>
Asks the analyzed backend to take values in its own storage order
from now on, so a caller that can write them that way spares it a
copy per solve. Returns order, where order[k] is the index, in the
entries analyze was given, of the value position
k takes; the caller reorders its values to match, once, and every
later factor_and_solve_values and
factor_and_solve presents them so.
None, changing nothing, for a backend without one fixed layout
(faer, PARDISO), for duplicate positions, or before analyze. The
two KLUs say yes: copying the values into their column-compressed
layout cost a tenth of a warm Newton solve.
Sourcepub fn storage_order(&self) -> Option<&[usize]>
pub fn storage_order(&self) -> Option<&[usize]>
The order adopted by adopt_storage_order,
if one is in force.
Sourcepub fn reset(&mut self)
pub fn reset(&mut self)
Discards the cached factorization, so the next solve needs a fresh
analyze.
Sourcepub fn factor_and_solve(
&mut self,
entries: &[(usize, usize, f64)],
rhs: &[f64],
) -> Option<Vec<f64>>
pub fn factor_and_solve( &mut self, entries: &[(usize, usize, f64)], rhs: &[f64], ) -> Option<Vec<f64>>
See LinearSolver::factor_and_solve. None if nothing is analyzed.
Sourcepub fn factor_and_solve_values(
&mut self,
values: &[f64],
rhs: &[f64],
) -> Option<Vec<f64>>
pub fn factor_and_solve_values( &mut self, values: &[f64], rhs: &[f64], ) -> Option<Vec<f64>>
See LinearSolver::factor_and_solve_values. None if nothing is
analyzed.
Auto Trait Implementations§
impl Freeze for SparseLu
impl RefUnwindSafe for SparseLu
impl Send for SparseLu
impl Sync for SparseLu
impl Unpin for SparseLu
impl UnsafeUnpin for SparseLu
impl UnwindSafe for SparseLu
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T, U> Imply<T> for U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more