rlu 0.7.0

Sparse LU Decomposition (Gilbert-Peierls)
Documentation
use anyhow::{format_err, Result};

use num_traits::NumAssignOps;
use spsolve::Solver;

use crate::{solve, Int, Scalar};

#[derive(Default)]
pub struct RLU {
    pub control: amd::Control,
}

impl<I, S> Solver<I, S> for RLU
where
    I: Int + NumAssignOps,
    S: Scalar,
{
    fn solve(
        &self,
        n: usize,
        a_i: &[I],
        a_p: &[I],
        a_x: &[S],
        b: &mut [S],
        trans: bool,
    ) -> Result<()> {
        let (p, _p_inv, _info) = amd::order::<I>(I::from_usize(n), &a_p, &a_i, &self.control)
            .map_err(|st| format_err!("amd status: {:?}", st))?;

        solve(n, &a_i, &a_p, &a_x, Some(&p), b, trans)
    }
}