test: DFG Re20 steady rule per review (1 % band, range and slope, 0.5 s samples)

Samples every 0.5 s at synchronized root steps; trailing 5 s window (11
samples); range and |slope*window| each at most 1 % of the official band
width. States the fluid-on-cylinder force sign, reports cd_positive,
defaults to the refined case and uses the review's label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 71221837f9)
This commit is contained in:
Claude authored and Codex committed 2026-10-20 21:59:15 +08:00
1 parent 46dc6ba086
commit 6a03f463bc
3 files changed
+47 -28

No files matched your search

+10 -5
View File
@@ -21,8 +21,8 @@ class Re20Contract(unittest.TestCase):
root, uniform = v.lattice_parameters(40), v.lattice_parameters(80)
self.assertAlmostEqual(root["tau"], 0.56, places=12)
self.assertAlmostEqual(uniform["tau"], 0.62, places=12)
self.assertEqual((root["steps"], root["interval"]), (240000, 2000))
self.assertEqual((uniform["steps"], uniform["interval"]), (480000, 4000))
self.assertEqual((root["steps"], root["interval"]), (240000, 4000))
self.assertEqual((uniform["steps"], uniform["interval"]), (480000, 8000))
self.assertAlmostEqual(v.plan()["refined_fine_tau"], 0.62, places=12)
def test_config_only_changes_viscosity(self):
@@ -47,17 +47,22 @@ class Re20Contract(unittest.TestCase):
def test_steady_and_verdict(self):
inside = dict(cd=5.58, cl=0.0106, p_diff=0.1174)
out = v.summarize(rows(lambda i: inside))
self.assertEqual((out["status"], out["steady"]), ("WITHIN_INTERVALS", True))
self.assertEqual((out["status"], out["steady"], out["window_samples"]),
("WITHIN_INTERVALS", True, 11))
self.assertTrue(out["cd_positive"])
self.assertTrue(all(out["verdict"].values()))
low = v.summarize(rows(lambda i: dict(inside, cl=0.0100)))
self.assertEqual(low["status"], "OUTSIDE_INTERVALS")
self.assertFalse(low["verdict"]["cl"])
def test_drift_gives_no_verdict(self):
# Cl drifts by more than a tenth of its interval width inside the window.
out = v.summarize(rows(lambda i: dict(cd=5.58, cl=0.0106 + 1e-5 * i, p_diff=0.1174)))
# Cl drifts by more than 1 % of its interval width (6e-6) inside the window.
out = v.summarize(rows(lambda i: dict(cd=5.58, cl=0.0106 + 1e-6 * i, p_diff=0.1174)))
self.assertEqual((out["status"], out["verdict"]), ("NOT_STEADY", None))
self.assertGreater(out["ranges"]["cl"], out["steady_limits"]["cl"])
self.assertGreater(out["drifts"]["cl"], out["steady_limits"]["cl"])
small = v.summarize(rows(lambda i: dict(cd=5.58, cl=0.0106 + 2e-6 * (i % 2), p_diff=0.1174)))
self.assertTrue(small["steady"]) # 2e-6 alternation, no trend: within both limits
def test_incomplete_run_gives_no_verdict(self):
out = v.summarize(rows(lambda i: dict(cd=5.58, cl=0.0106, p_diff=0.1174), tstar_end=30))