faer 0.20.2

Linear algebra routines
Documentation
use crate::{
    linop::{BiLinOp, BiPrecond, LinOp, Precond},
    sparse::SparseRowMatRef,
    ComplexField, Conjugate, Index, MatMut, MatRef, Parallelism,
};
use dyn_stack::{PodStack, SizeOverflow, StackReq};

impl<E: ComplexField, I: Index, ViewE: Conjugate<Canonical = E>> LinOp<E>
    for SparseRowMatRef<'_, I, ViewE>
{
    #[inline]
    fn nrows(&self) -> usize {
        (*self).nrows()
    }
    #[inline]
    fn ncols(&self) -> usize {
        (*self).ncols()
    }

    #[inline]
    fn apply_req(
        &self,
        rhs_ncols: usize,
        parallelism: Parallelism,
    ) -> Result<StackReq, SizeOverflow> {
        _ = (rhs_ncols, parallelism);
        Ok(StackReq::empty())
    }

    #[inline]
    #[track_caller]
    fn apply(
        &self,
        out: MatMut<'_, E>,
        rhs: MatRef<'_, E>,
        parallelism: Parallelism,
        stack: &mut PodStack,
    ) {
        _ = stack;
        crate::sparse::linalg::matmul::dense_sparse_matmul(
            out.transpose_mut(),
            rhs.transpose(),
            self.transpose(),
            None,
            E::faer_one(),
            parallelism,
        );
    }

    #[inline]
    #[track_caller]
    fn conj_apply(
        &self,
        out: MatMut<'_, E>,
        rhs: MatRef<'_, E>,
        parallelism: Parallelism,
        stack: &mut PodStack,
    ) {
        _ = stack;
        let this = self.conjugate();
        crate::sparse::linalg::matmul::dense_sparse_matmul(
            out.transpose_mut(),
            rhs.transpose(),
            this.transpose(),
            None,
            E::faer_one(),
            parallelism,
        );
    }
}

impl<E: ComplexField, I: Index, ViewE: Conjugate<Canonical = E>> BiLinOp<E>
    for SparseRowMatRef<'_, I, ViewE>
{
    #[inline]
    fn transpose_apply_req(
        &self,
        rhs_ncols: usize,
        parallelism: Parallelism,
    ) -> Result<StackReq, SizeOverflow> {
        _ = (rhs_ncols, parallelism);
        Ok(StackReq::empty())
    }

    #[inline]
    #[track_caller]
    fn transpose_apply(
        &self,
        out: MatMut<'_, E>,
        rhs: MatRef<'_, E>,
        parallelism: Parallelism,
        stack: &mut PodStack,
    ) {
        _ = stack;
        let this = self.transpose();
        crate::sparse::linalg::matmul::sparse_dense_matmul(
            out,
            this,
            rhs,
            None,
            E::faer_one(),
            parallelism,
        );
    }

    #[inline]
    #[track_caller]
    fn adjoint_apply(
        &self,
        out: MatMut<'_, E>,
        rhs: MatRef<'_, E>,
        parallelism: Parallelism,
        stack: &mut PodStack,
    ) {
        _ = stack;
        let this = self.adjoint();
        crate::sparse::linalg::matmul::sparse_dense_matmul(
            out,
            this,
            rhs,
            None,
            E::faer_one(),
            parallelism,
        );
    }
}

impl<E: ComplexField, I: Index, ViewE: Conjugate<Canonical = E>> Precond<E>
    for SparseRowMatRef<'_, I, ViewE>
{
}
impl<E: ComplexField, I: Index, ViewE: Conjugate<Canonical = E>> BiPrecond<E>
    for SparseRowMatRef<'_, I, ViewE>
{
}