feat: 3
This commit is contained in:
+15
-5
@@ -26,6 +26,9 @@ from mcm26b.sim.scenes import mixed_scene
|
||||
CONFIG = replace(ProblemConfig(),
|
||||
search=replace(ProblemConfig().search,
|
||||
bearing_rounding_margin_deg=0.005))
|
||||
# 持续复扫扫到虚拟上限为止 [用户决策];SMALL_CAP 压到 60k 秒缩短复扫轮数。
|
||||
SMALL_CAP = replace(CONFIG,
|
||||
field=replace(CONFIG.field, max_virtual_duration_s=60_000.0))
|
||||
|
||||
|
||||
def _run_scene(sources, config=CONFIG, clock=None):
|
||||
@@ -124,9 +127,10 @@ class MixedLoopAcceptanceTests(unittest.TestCase):
|
||||
summary, report, simulator, _, loop = _run_scene(sources)
|
||||
truth = sorted(s.channel for s in sources)
|
||||
self.assertTrue(summary["completed"])
|
||||
self.assertEqual(summary["stop_reason"], "all_resolved")
|
||||
self.assertEqual(summary["stop_reason"], "virtual_time_cap")
|
||||
self.assertEqual(sorted(summary["cleared_channels"]), truth)
|
||||
self.assertEqual(summary["unresolved_channels"], [])
|
||||
self.assertIsNotNone(summary["accounted_virtual_time_s"])
|
||||
self.assertEqual(summary["anomalies"], [], "守恒性或证书不应被打破")
|
||||
self.assertEqual(report["mismatches"], [])
|
||||
self.assertEqual(summary["virtual_recompute_mismatches"], 0)
|
||||
@@ -152,7 +156,7 @@ class MixedLoopAcceptanceTests(unittest.TestCase):
|
||||
"""朝向背离圆心、r_eff=1000 的近边界源:覆盖保证仍发现并清除。"""
|
||||
source = Source(channel=7, x=1790.0, y=0.0, r_eff_m=1000.0,
|
||||
directional=True, heading_deg=0.0)
|
||||
summary, _, simulator, _, _ = _run_scene([source])
|
||||
summary, _, simulator, _, _ = _run_scene([source], config=SMALL_CAP)
|
||||
self.assertTrue(summary["completed"])
|
||||
self.assertEqual(summary["cleared_channels"], [7])
|
||||
self.assertEqual(sorted(simulator.cleared), [7])
|
||||
@@ -162,7 +166,8 @@ class MixedLoopAcceptanceTests(unittest.TestCase):
|
||||
"""固定批量种子回归:任何种子下不得全清失败或破坏守恒性。"""
|
||||
for seed in range(5, 10):
|
||||
sources = mixed_scene(seed=seed, count=10, directional=4)
|
||||
summary, report, simulator, _, _ = _run_scene(sources)
|
||||
summary, report, simulator, _, _ = _run_scene(sources,
|
||||
config=SMALL_CAP)
|
||||
truth = sorted(s.channel for s in sources)
|
||||
self.assertTrue(summary["completed"], f"seed={seed}")
|
||||
self.assertEqual(sorted(summary["cleared_channels"]), truth,
|
||||
@@ -190,7 +195,7 @@ class JointConstraintBaselineTests(unittest.TestCase):
|
||||
"""端到端保留性:定向源被遮挡若干次后仍被清除,不因 no_signal 误删。"""
|
||||
source = Source(channel=3, x=600.0, y=800.0, r_eff_m=1500.0,
|
||||
directional=True, heading_deg=200.0)
|
||||
summary, _, simulator, _, _ = _run_scene([source])
|
||||
summary, _, simulator, _, _ = _run_scene([source], config=SMALL_CAP)
|
||||
self.assertTrue(summary["completed"])
|
||||
self.assertEqual(summary["cleared_channels"], [3])
|
||||
self.assertEqual(sorted(simulator.cleared), [3])
|
||||
@@ -198,11 +203,16 @@ class JointConstraintBaselineTests(unittest.TestCase):
|
||||
|
||||
class FallbackDisciplineTests(unittest.TestCase):
|
||||
def _stall_config(self, **search_updates):
|
||||
"""迫使定位立即停滞进入后备清除的最小配置。"""
|
||||
"""迫使定位立即停滞进入后备清除的最小配置。
|
||||
|
||||
persistent_search=False:本组验证的是后备清除纪律(格数/预算门槛),
|
||||
与持续复扫无关,维持"证明找全即退出"的基线收尾便于断言。
|
||||
"""
|
||||
return replace(CONFIG,
|
||||
search=replace(CONFIG.search,
|
||||
max_localize_steps=1,
|
||||
max_blocked_probes=0,
|
||||
persistent_search=False,
|
||||
**search_updates))
|
||||
|
||||
def test_cell_cap_skips_instead_of_blind_scan(self):
|
||||
|
||||
Reference in New Issue
Block a user