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;
11pub 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
32pub 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
53pub 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
74pub 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
97pub 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
113pub 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
130pub 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
148pub 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}