This commit is contained in:
Horldsence
2026-09-11 03:32:05 +08:00
parent 846b45e420
commit fc70d6edfd
14 changed files with 46032 additions and 65 deletions
+15 -5
View File
@@ -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):