"""自检场景生成(测试端专用):委托 referee.scenes,映射本队配置。 真值只进入测试与 CLI ``--self-test`` 入口,策略端仅见模拟器响应; 默认采用满足题面范围的自建随机场景:源总数 10~16 随机、位置在目标圆域内 均匀分布、频道互异(1..20 抽样)、有效接收半径 [1000,1500] 均匀。 均匀分布是测试假设,题面并未规定官方场景的概率分布。 """ from __future__ import annotations from referee import scenes as _referee_scenes from ..config import ProblemConfig def referee_spec(config: ProblemConfig = ProblemConfig(), *, max_real_duration_s: float | None = None): """把本队 ProblemConfig 的题面常量映射为 referee 的 Spec。 max_real_duration_s 仅用于 --self-test 的实机预算覆盖(默认 1800s); 正式对接以服务器 /enter 返回为准,评测机默认保持题面 1200s。 """ from referee import CostSpec, FieldSpec, Spec field, cost = config.field, config.cost return Spec( field=FieldSpec( omega_radius_m=field.omega_radius_m, channel_min=field.channel_min, channel_max=field.channel_max, source_count_min=field.source_count_min, source_count_max=field.source_count_max, r_eff_min_m=field.r_eff_min_m, r_eff_max_m=field.r_eff_max_m, near_radius_m=field.near_radius_m, clear_radius_m=field.clear_radius_m, bearing_error_half_deg=field.bearing_error_half_deg, bearing_decimals=field.bearing_decimals, coord_abs_limit_m=field.coord_abs_limit_m, directional_half_angle_deg=field.directional_half_angle_deg, max_virtual_duration_s=field.max_virtual_duration_s, max_real_duration_s=(field.max_real_duration_s if max_real_duration_s is None else max_real_duration_s), test_window_s=field.test_window_s), cost=CostSpec(speed_mps=cost.speed_mps, measure_s=cost.measure_s, switch_s=cost.switch_s, clear_success_s=cost.clear_success_s, clear_fail_s=cost.clear_fail_s)) def random_omni_scene(seed: int = 20260910, count: int | None = None, config: ProblemConfig = ProblemConfig()): """全向源场景 [题面 问题3];签名沿用重构前 mcm26b.sim.scenes。""" return _referee_scenes.random_omni_scene(seed, count, referee_spec(config)) def mixed_scene(seed: int = 20260910, count: int | None = None, directional: int = 3, config: ProblemConfig = ProblemConfig()): """问题4混合场景:count 个源中 directional 个为定向源。""" return _referee_scenes.mixed_scene(seed, count, directional, referee_spec(config))