conspire 0.6.0

The Rust interface to conspire.
Documentation
use crate::math::{
    Banded, Scalar, Tensor, TensorVec, Vector,
    integrate::IntegrationError,
    optimize::{
        EqualityConstraint, FirstOrderOptimization, FirstOrderRootFinding, SecondOrderOptimization,
        ZerothOrderRootFinding,
    },
};

pub mod explicit;
// pub mod implicit;

/// Integrators for explicit differential-algebraic equations using zeroth-order root-finding.
pub trait ExplicitDaeZerothOrderRoot<Y, Z, U, V>
where
    Y: Tensor,
    Z: Tensor,
    U: TensorVec<Item = Y>,
    V: TensorVec<Item = Z>,
{
    fn integrate(
        &self,
        evolution: impl FnMut(Scalar, &Y, &Z) -> Result<Y, String>,
        function: impl FnMut(Scalar, &Y, &Z) -> Result<Z, String>,
        solver: impl ZerothOrderRootFinding<Z>,
        time: &[Scalar],
        initial_condition: (Y, Z),
        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
    ) -> Result<(Vector, U, U, V), IntegrationError>;
}

/// Integrators for explicit differential-algebraic equations using first-order root-finding.
pub trait ExplicitDaeFirstOrderRoot<F, J, Y, Z, U, V>
where
    Y: Tensor,
    Z: Tensor,
    U: TensorVec<Item = Y>,
    V: TensorVec<Item = Z>,
{
    #[allow(clippy::too_many_arguments)]
    fn integrate(
        &self,
        evolution: impl FnMut(Scalar, &Y, &Z) -> Result<Y, String>,
        function: impl FnMut(Scalar, &Y, &Z) -> Result<F, String>,
        jacobian: impl FnMut(Scalar, &Y, &Z) -> Result<J, String>,
        solver: impl FirstOrderRootFinding<F, J, Z>,
        time: &[Scalar],
        initial_condition: (Y, Z),
        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
    ) -> Result<(Vector, U, U, V), IntegrationError>;
}

/// Integrators for explicit differential-algebraic equations using first-order minimization.
pub trait ExplicitDaeFirstOrderMinimize<F, Y, Z, U, V>
where
    Y: Tensor,
    Z: Tensor,
    U: TensorVec<Item = Y>,
    V: TensorVec<Item = Z>,
{
    #[allow(clippy::too_many_arguments)]
    fn integrate(
        &self,
        evolution: impl FnMut(Scalar, &Y, &Z) -> Result<Y, String>,
        function: impl FnMut(Scalar, &Y, &Z) -> Result<F, String>,
        jacobian: impl FnMut(Scalar, &Y, &Z) -> Result<Z, String>,
        solver: impl FirstOrderOptimization<F, Z>,
        time: &[Scalar],
        initial_condition: (Y, Z),
        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
    ) -> Result<(Vector, U, U, V), IntegrationError>;
}

/// Integrators for explicit differential-algebraic equations using second-order minimization.
pub trait ExplicitDaeSecondOrderMinimize<F, J, H, Y, Z, U, V>
where
    Y: Tensor,
    Z: Tensor,
    U: TensorVec<Item = Y>,
    V: TensorVec<Item = Z>,
{
    #[allow(clippy::too_many_arguments)]
    fn integrate(
        &self,
        evolution: impl FnMut(Scalar, &Y, &Z) -> Result<Y, String>,
        function: impl FnMut(Scalar, &Y, &Z) -> Result<F, String>,
        jacobian: impl FnMut(Scalar, &Y, &Z) -> Result<J, String>,
        hessian: impl FnMut(Scalar, &Y, &Z) -> Result<H, String>,
        solver: impl SecondOrderOptimization<F, J, H, Z>,
        time: &[Scalar],
        initial_condition: (Y, Z),
        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
        banded: Option<Banded>,
    ) -> Result<(Vector, U, U, V), IntegrationError>;
}

/// Integrators for implicit differential-algebraic equations using zeroth-order root-finding.
pub trait ImplicitDaeZerothOrderRoot<Y, U>
where
    Y: Tensor,
    U: TensorVec<Item = Y>,
{
    fn integrate(
        &self,
        function: impl FnMut(Scalar, &Y, &Y) -> Result<Y, String>,
        solver: impl ZerothOrderRootFinding<Y>,
        time: &[Scalar],
        initial_condition: Y,
        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
    ) -> Result<(Vector, U, U), IntegrationError>;
}

/// Integrators for implicit differential-algebraic equations using first-order root-finding.
pub trait ImplicitDaeFirstOrderRoot<F, J, Y, U>
where
    Y: Tensor,
    U: TensorVec<Item = Y>,
{
    fn integrate(
        &self,
        function: impl FnMut(Scalar, &Y, &Y) -> Result<F, String>,
        jacobian: impl FnMut(Scalar, &Y, &Y) -> Result<J, String>,
        solver: impl FirstOrderRootFinding<F, J, Y>,
        time: &[Scalar],
        initial_condition: Y,
        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
    ) -> Result<(Vector, U, U), IntegrationError>;
}

/// Integrators for implicit differential-algebraic equations using first-order minimization.
pub trait ImplicitDaeFirstOrderMinimize<F, Y, U>
where
    Y: Tensor,
    U: TensorVec<Item = Y>,
{
    #[allow(clippy::too_many_arguments)]
    fn integrate(
        &self,
        function: impl FnMut(Scalar, &Y, &Y) -> Result<F, String>,
        jacobian: impl FnMut(Scalar, &Y, &Y) -> Result<Y, String>,
        solver: impl FirstOrderOptimization<F, Y>,
        time: &[Scalar],
        initial_condition: Y,
        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
    ) -> Result<(Vector, U, U), IntegrationError>;
}

/// Integrators for implicit differential-algebraic equations using second-order minimization.
pub trait ImplicitDaeSecondOrderMinimize<F, J, H, Y, U>
where
    Y: Tensor,
    U: TensorVec<Item = Y>,
{
    #[allow(clippy::too_many_arguments)]
    fn integrate(
        &self,
        function: impl FnMut(Scalar, &Y, &Y) -> Result<F, String>,
        jacobian: impl FnMut(Scalar, &Y, &Y) -> Result<J, String>,
        hessian: impl FnMut(Scalar, &Y, &Y) -> Result<H, String>,
        solver: impl SecondOrderOptimization<F, J, H, Y>,
        time: &[Scalar],
        initial_condition: Y,
        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
        banded: Option<Banded>,
    ) -> Result<(Vector, U, U), IntegrationError>;
}