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>
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}