conspire/math/integrate/dae/
mod.rs

1use crate::math::{
2    Banded, Scalar, Tensor, TensorVec, Vector,
3    integrate::IntegrationError,
4    optimize::{
5        EqualityConstraint, FirstOrderOptimization, FirstOrderRootFinding, SecondOrderOptimization,
6        ZerothOrderRootFinding,
7    },
8};
9
10pub mod explicit;
11// pub mod implicit;
12
13/// Integrators for explicit differential-algebraic equations using zeroth-order root-finding.
14pub trait ExplicitDaeZerothOrderRoot<Y, Z, U, V>
15where
16    Y: Tensor,
17    Z: Tensor,
18    U: TensorVec<Item = Y>,
19    V: TensorVec<Item = Z>,
20{
21    fn integrate(
22        &self,
23        evolution: impl FnMut(Scalar, &Y, &Z) -> Result<Y, String>,
24        function: impl FnMut(Scalar, &Y, &Z) -> Result<Z, String>,
25        solver: impl ZerothOrderRootFinding<Z>,
26        time: &[Scalar],
27        initial_condition: (Y, Z),
28        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
29    ) -> Result<(Vector, U, U, V), IntegrationError>;
30}
31
32/// Integrators for explicit differential-algebraic equations using first-order root-finding.
33pub trait ExplicitDaeFirstOrderRoot<F, J, Y, Z, U, V>
34where
35    Y: Tensor,
36    Z: Tensor,
37    U: TensorVec<Item = Y>,
38    V: TensorVec<Item = Z>,
39{
40    #[allow(clippy::too_many_arguments)]
41    fn integrate(
42        &self,
43        evolution: impl FnMut(Scalar, &Y, &Z) -> Result<Y, String>,
44        function: impl FnMut(Scalar, &Y, &Z) -> Result<F, String>,
45        jacobian: impl FnMut(Scalar, &Y, &Z) -> Result<J, String>,
46        solver: impl FirstOrderRootFinding<F, J, Z>,
47        time: &[Scalar],
48        initial_condition: (Y, Z),
49        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
50    ) -> Result<(Vector, U, U, V), IntegrationError>;
51}
52
53/// Integrators for explicit differential-algebraic equations using first-order minimization.
54pub trait ExplicitDaeFirstOrderMinimize<F, Y, Z, U, V>
55where
56    Y: Tensor,
57    Z: Tensor,
58    U: TensorVec<Item = Y>,
59    V: TensorVec<Item = Z>,
60{
61    #[allow(clippy::too_many_arguments)]
62    fn integrate(
63        &self,
64        evolution: impl FnMut(Scalar, &Y, &Z) -> Result<Y, String>,
65        function: impl FnMut(Scalar, &Y, &Z) -> Result<F, String>,
66        jacobian: impl FnMut(Scalar, &Y, &Z) -> Result<Z, String>,
67        solver: impl FirstOrderOptimization<F, Z>,
68        time: &[Scalar],
69        initial_condition: (Y, Z),
70        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
71    ) -> Result<(Vector, U, U, V), IntegrationError>;
72}
73
74/// Integrators for explicit differential-algebraic equations using second-order minimization.
75pub trait ExplicitDaeSecondOrderMinimize<F, J, H, Y, Z, U, V>
76where
77    Y: Tensor,
78    Z: Tensor,
79    U: TensorVec<Item = Y>,
80    V: TensorVec<Item = Z>,
81{
82    #[allow(clippy::too_many_arguments)]
83    fn integrate(
84        &self,
85        evolution: impl FnMut(Scalar, &Y, &Z) -> Result<Y, String>,
86        function: impl FnMut(Scalar, &Y, &Z) -> Result<F, String>,
87        jacobian: impl FnMut(Scalar, &Y, &Z) -> Result<J, String>,
88        hessian: impl FnMut(Scalar, &Y, &Z) -> Result<H, String>,
89        solver: impl SecondOrderOptimization<F, J, H, Z>,
90        time: &[Scalar],
91        initial_condition: (Y, Z),
92        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
93        banded: Option<Banded>,
94    ) -> Result<(Vector, U, U, V), IntegrationError>;
95}
96
97/// Integrators for implicit differential-algebraic equations using zeroth-order root-finding.
98pub trait ImplicitDaeZerothOrderRoot<Y, U>
99where
100    Y: Tensor,
101    U: TensorVec<Item = Y>,
102{
103    fn integrate(
104        &self,
105        function: impl FnMut(Scalar, &Y, &Y) -> Result<Y, String>,
106        solver: impl ZerothOrderRootFinding<Y>,
107        time: &[Scalar],
108        initial_condition: Y,
109        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
110    ) -> Result<(Vector, U, U), IntegrationError>;
111}
112
113/// Integrators for implicit differential-algebraic equations using first-order root-finding.
114pub trait ImplicitDaeFirstOrderRoot<F, J, Y, U>
115where
116    Y: Tensor,
117    U: TensorVec<Item = Y>,
118{
119    fn integrate(
120        &self,
121        function: impl FnMut(Scalar, &Y, &Y) -> Result<F, String>,
122        jacobian: impl FnMut(Scalar, &Y, &Y) -> Result<J, String>,
123        solver: impl FirstOrderRootFinding<F, J, Y>,
124        time: &[Scalar],
125        initial_condition: Y,
126        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
127    ) -> Result<(Vector, U, U), IntegrationError>;
128}
129
130/// Integrators for implicit differential-algebraic equations using first-order minimization.
131pub trait ImplicitDaeFirstOrderMinimize<F, Y, U>
132where
133    Y: Tensor,
134    U: TensorVec<Item = Y>,
135{
136    #[allow(clippy::too_many_arguments)]
137    fn integrate(
138        &self,
139        function: impl FnMut(Scalar, &Y, &Y) -> Result<F, String>,
140        jacobian: impl FnMut(Scalar, &Y, &Y) -> Result<Y, String>,
141        solver: impl FirstOrderOptimization<F, Y>,
142        time: &[Scalar],
143        initial_condition: Y,
144        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
145    ) -> Result<(Vector, U, U), IntegrationError>;
146}
147
148/// Integrators for implicit differential-algebraic equations using second-order minimization.
149pub trait ImplicitDaeSecondOrderMinimize<F, J, H, Y, U>
150where
151    Y: Tensor,
152    U: TensorVec<Item = Y>,
153{
154    #[allow(clippy::too_many_arguments)]
155    fn integrate(
156        &self,
157        function: impl FnMut(Scalar, &Y, &Y) -> Result<F, String>,
158        jacobian: impl FnMut(Scalar, &Y, &Y) -> Result<J, String>,
159        hessian: impl FnMut(Scalar, &Y, &Y) -> Result<H, String>,
160        solver: impl SecondOrderOptimization<F, J, H, Y>,
161        time: &[Scalar],
162        initial_condition: Y,
163        equality_constraint: impl FnMut(Scalar) -> EqualityConstraint,
164        banded: Option<Banded>,
165    ) -> Result<(Vector, U, U), IntegrationError>;
166}