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