B1: СП(лес)=1.0 — НормС трактуется как скорость смещения по среднему лесу

Решение Виктора: СП(лес) 0.5→1.0. Прежняя таблица учитывала лес дважды
(в НормС и в СП) — подросток 14 лет за 3 часа получал 2.55 км вместо
реалистичных 5.1. Согласуется с априором ПСО (94% находок в 3 км):
радиусы стали верхне-перцентилями, не медианой.

- terrain_map пересчитан относительно среднего леса: лес/простой лес/поле/
  луг/город = 1.0; сложный/густой лес 0.5; болото 0.4; горы/овраг 0.6;
  дорога/тропа 0.8; дефолт 1.0.
- Контрольные точки тестов пересчитаны (6 шт: 1.92→3.84, 0.33→0.665,
  2.43→2.7, 5.4→10.8, 13.5→15.0, stats 0.5→1.0) + операционный тест
  подростка 5.1 км.
- settlement_score пока НЕ тронут — на обдумывание (Виктор).

193 passed.
This commit is contained in:
2026-09-09 19:51:05 +03:00
parent 61308ed444
commit 2aa45e8932
3 changed files with 56 additions and 39 deletions
+16 -4
View File
@@ -53,15 +53,27 @@ def _base_input(**overrides: Any) -> SearchInput:
async def test_build_search_model_bike_8yo_matches_old_contract():
"""Регресс из B14: bike 8yo 2h лес день → max_distance 5.4 км
(Time 2 × НормС 1.2 × СП 0.5 × СУТ 0.9 × СУ-bike 5.0)."""
"""bike 8yo 2h лес день → max_distance.
B1-ревью 2026-09-09 (Виктор): СП(лес) 0.5→1.0 (НормС — уже скорость
смещения по среднему лесу; 0.5 учитывал лес дважды).
Было 5.4 (2 × 1.2 × 0.5 × 0.9 × 5.0), стало 10.8 (2 × 1.2 × 1.0 × 0.9 × 5.0)."""
model = await build_search_model(_base_input(), analyzer=_fake_analyzer())
assert model.max_distance_km == pytest.approx(5.4, abs=1e-6)
assert model.max_distance_km == pytest.approx(10.8, abs=1e-6)
assert model.coefficients['base_speed'] == 1.2
assert model.coefficients['terrain'] == 0.5
assert model.coefficients['terrain'] == 1.0
assert model.coefficients['urgency'] == 5.0 # bike
async def test_teen_3h_forest_realistic_distance():
"""Операционная проверка Виктора: здоровый подросток за 3 часа проходит
заметно больше 2.5 км. При СП(лес)=1.0: 3 × 2.0 × 1.0 × 0.85 = 5.1 км."""
model = await build_search_model(
_base_input(age=14, has_transport=None, elapsed_hours=3.0),
analyzer=_fake_analyzer(),
)
assert model.max_distance_km == pytest.approx(5.1, abs=1e-6)
async def test_profiles_derived_from_diagnosis_and_transport():
analyzer = _fake_analyzer()
model = await build_search_model(