72 """Test COPV minimum pressure constraint."""
77 constraints = constraint_values(x, eng_est, self.
config)
78 self.assertLess(constraints[
"copv_min"], 0)
79 self.assertGreater(constraints[
"copv_margin"], 0)
81 self.assertTrue(is_safe(x, eng_est, self.
config))
85 constraints = constraint_values(x, eng_est, self.
config)
86 self.assertGreater(constraints[
"copv_min"], 0)
87 self.assertLess(constraints[
"copv_margin"], 0)
89 self.assertFalse(is_safe(x, eng_est, self.
config))
92 """Test ullage maximum pressure constraints."""
94 x = self.
create_state(**{IDX_P_U_F: 5e6, IDX_P_U_O: 6e6})
97 constraints = constraint_values(x, eng_est, self.
config)
98 self.assertLess(constraints[
"ullage_max_F"], 0)
99 self.assertLess(constraints[
"ullage_max_O"], 0)
100 self.assertGreater(constraints[
"ullage_margin_F"], 0)
101 self.assertGreater(constraints[
"ullage_margin_O"], 0)
103 self.assertTrue(is_safe(x, eng_est, self.
config))
106 x = self.
create_state(**{IDX_P_U_F: 12e6, IDX_P_U_O: 11e6})
107 constraints = constraint_values(x, eng_est, self.
config)
108 self.assertGreater(constraints[
"ullage_max_F"], 0)
109 self.assertGreater(constraints[
"ullage_max_O"], 0)
110 self.assertLess(constraints[
"ullage_margin_F"], 0)
111 self.assertLess(constraints[
"ullage_margin_O"], 0)
113 self.assertFalse(is_safe(x, eng_est, self.
config))
116 """Test mixture ratio constraints."""
121 constraints = constraint_values(x, eng_est, self.
config)
122 self.assertLess(constraints[
"MR_min"], 0)
123 self.assertLess(constraints[
"MR_max"], 0)
124 self.assertGreater(constraints[
"MR_margin_low"], 0)
125 self.assertGreater(constraints[
"MR_margin_high"], 0)
127 self.assertTrue(is_safe(x, eng_est, self.
config))
131 constraints = constraint_values(x, eng_est, self.
config)
132 self.assertGreater(constraints[
"MR_min"], 0)
133 self.assertLess(constraints[
"MR_margin_low"], 0)
135 self.assertFalse(is_safe(x, eng_est, self.
config))
139 constraints = constraint_values(x, eng_est, self.
config)
140 self.assertGreater(constraints[
"MR_max"], 0)
141 self.assertLess(constraints[
"MR_margin_high"], 0)
143 self.assertFalse(is_safe(x, eng_est, self.
config))
146 """Test injector stiffness constraints."""
151 x = self.
create_state(**{IDX_P_D_F: 2.5e6, IDX_P_D_O: 3e6})
158 constraints = constraint_values(x, eng_est, self.
config)
159 self.assertLess(constraints[
"injector_stiffness_F"], 0)
160 self.assertLess(constraints[
"injector_stiffness_O"], 0)
161 self.assertGreater(constraints[
"injector_stiffness_margin_F"], 0)
162 self.assertGreater(constraints[
"injector_stiffness_margin_O"], 0)
164 self.assertTrue(is_safe(x, eng_est, self.
config))
172 constraints = constraint_values(x, eng_est, self.
config)
173 self.assertGreater(constraints[
"injector_stiffness_F"], 0)
174 self.assertGreater(constraints[
"injector_stiffness_O"], 0)
175 self.assertLess(constraints[
"injector_stiffness_margin_F"], 0)
176 self.assertLess(constraints[
"injector_stiffness_margin_O"], 0)
178 self.assertFalse(is_safe(x, eng_est, self.
config))
181 """Test headroom constraints for actuation effectiveness."""
186 **{IDX_P_REG: 5e6, IDX_P_U_F: 4e6, IDX_P_U_O: 4.5e6}
190 constraints = constraint_values(x, eng_est, self.
config)
191 self.assertEqual(constraints[
"headroom_insufficient_F"], 0.0)
192 self.assertEqual(constraints[
"headroom_insufficient_O"], 0.0)
193 self.assertGreater(constraints[
"headroom_margin_F"], 0)
194 self.assertGreater(constraints[
"headroom_margin_O"], 0)
198 **{IDX_P_REG: 3.01e6, IDX_P_U_F: 3e6, IDX_P_U_O: 3e6}
200 constraints = constraint_values(x, eng_est, self.
config)
201 self.assertEqual(constraints[
"headroom_insufficient_F"], 1.0)
202 self.assertEqual(constraints[
"headroom_insufficient_O"], 1.0)
203 self.assertLess(constraints[
"headroom_margin_F"], 0)
204 self.assertLess(constraints[
"headroom_margin_O"], 0)
207 """Test that all constraints can be satisfied simultaneously."""
225 self.assertTrue(is_safe(x, eng_est, self.
config))
227 constraints = constraint_values(x, eng_est, self.
config)
228 summary = get_constraint_summary(constraints)
229 self.assertTrue(summary[
"safe"])
230 self.assertEqual(len(summary[
"violations"]), 0)
233 """Test detection of multiple constraint violations."""
246 self.assertFalse(is_safe(x, eng_est, self.
config))
248 constraints = constraint_values(x, eng_est, self.
config)
249 summary = get_constraint_summary(constraints)
250 self.assertFalse(summary[
"safe"])
251 self.assertGreater(len(summary[
"violations"]), 1)
254 """Test handling of NaN values in engine estimate."""
259 injector_dp_F=np.nan,
260 injector_dp_O=np.nan,
263 constraints = constraint_values(x, eng_est, self.
config)
266 self.assertTrue(np.isinf(constraints[
"MR_min"]))
267 self.assertTrue(np.isinf(constraints[
"MR_max"]))
270 self.assertTrue(np.isinf(constraints[
"injector_stiffness_F"]))
271 self.assertTrue(np.isinf(constraints[
"injector_stiffness_O"]))
273 self.assertFalse(is_safe(x, eng_est, self.
config))
276 """Test constraint summary generation."""
281 constraints = constraint_values(x, eng_est, self.
config)
282 summary = get_constraint_summary(constraints)
284 self.assertTrue(summary[
"safe"])
285 self.assertEqual(len(summary[
"violations"]), 0)
286 self.assertIn(
"margins", summary)
287 self.assertIn(
"headroom_flags", summary)
288 self.assertFalse(summary[
"headroom_flags"][
"insufficient_F"])
289 self.assertFalse(summary[
"headroom_flags"][
"insufficient_O"])
293 constraints = constraint_values(x, eng_est, self.
config)
294 summary = get_constraint_summary(constraints)
296 self.assertFalse(summary[
"safe"])
297 self.assertIn(
"copv_min", summary[
"violations"])
300 """Test edge cases (boundary conditions)."""
304 constraints = constraint_values(x, eng_est, self.
config)
305 self.assertAlmostEqual(constraints[
"copv_min"], 0.0, places=3)
306 self.assertAlmostEqual(constraints[
"copv_margin"], 0.0, places=3)
307 self.assertTrue(is_safe(x, eng_est, self.
config))
311 constraints = constraint_values(x, eng_est, self.
config)
312 self.assertAlmostEqual(constraints[
"ullage_max_F"], 0.0, places=3)
313 self.assertAlmostEqual(constraints[
"ullage_margin_F"], 0.0, places=3)
314 self.assertTrue(is_safe(x, eng_est, self.
config))
318 constraints = constraint_values(x, eng_est, self.
config)
319 self.assertAlmostEqual(constraints[
"MR_min"], 0.0, places=3)
320 self.assertAlmostEqual(constraints[
"MR_margin_low"], 0.0, places=3)
321 self.assertTrue(is_safe(x, eng_est, self.
config))
324 constraints = constraint_values(x, eng_est, self.
config)
325 self.assertAlmostEqual(constraints[
"MR_max"], 0.0, places=3)
326 self.assertAlmostEqual(constraints[
"MR_margin_high"], 0.0, places=3)
327 self.assertTrue(is_safe(x, eng_est, self.
config))
331 **{IDX_P_REG: 3.05e6, IDX_P_U_F: 3e6}
333 constraints = constraint_values(x, eng_est, self.
config)
334 self.assertAlmostEqual(constraints[
"headroom_margin_F"], 0.0, places=3)
335 self.assertEqual(constraints[
"headroom_insufficient_F"], 0.0)