"""342-3 · 347-1 배수유역 빠른 길 실측 — 검증_sub3 도엽 · 노선으로 preview_stages 를 돌려 시간과 결과(적색 · 흐름 방향 · 도로 귀속 · 강도)를 tmp/342/<이름>.npz 에 남기고 기준과 대조한다. ./venv/Scripts/python.exe resources/tester/bench_342_watershed.py base # 기준 저장 ./venv/Scripts/python.exe resources/tester/bench_342_watershed.py new base # 새로 돌려 대조 ./venv/Scripts/python.exe resources/tester/bench_342_watershed.py s1 base store # 흐름 방향 저장본 pytest 대상 아님(DB · 프로젝트 파일이 있어야 돎). 분석 결과는 저장 안 함 — 도엽 좌표 저장본 (drainage/00_sheet_metric.pkl)만 프로젝트에 남고 · 흐름 방향 저장본은 tmp/342/descent 에 둠. """ import asyncio import json import logging import sys import time from pathlib import Path from uuid import UUID import numpy as np ROOT = Path(__file__).resolve().parents[2] sys.path.insert(0, str(ROOT)) PID = UUID("1f93a515-df0a-4975-a8ba-daaa7672b123") # 검증_sub3 OUT_DIR = ROOT / "tmp" / "342" async def _prepare(): from config.config_db import close_db_pool, init_db_pool await init_db_pool() try: from B04_PreProcess.B04_PreProcess_Router_Watershed import _prepare as prepare started = time.perf_counter() prepared = await prepare(PID) return prepared, time.perf_counter() - started finally: await close_db_pool() def main() -> None: name = sys.argv[1] base = sys.argv[2] if len(sys.argv) > 2 and sys.argv[2] != "-" else None store = len(sys.argv) > 3 and sys.argv[3] == "store" OUT_DIR.mkdir(parents=True, exist_ok=True) logging.basicConfig( level=logging.INFO, format="%(asctime)s %(name)s:%(message)s", handlers=[logging.FileHandler(OUT_DIR / f"{name}.log", "w", encoding="utf-8")], ) prepared, prepare_s = asyncio.run(_prepare()) from B04_PreProcess.B04_PreProcess_Engine_Watershed_Analyze import preview_stages started = time.perf_counter() pv = preview_stages( prepared["vertices"], prepared["contours"], prepared["streams"], (OUT_DIR / "descent", prepared["contour_key"]) if store else None, ) preview_s = time.perf_counter() - started spec = pv.spec red = pv.flow.reaches_road & pv.flow.analyzed result = { "spec": np.array([spec.x_min, spec.y_max, spec.cell_m, spec.n_rows, spec.n_cols]), "domain": pv.domain, "red": red, "direction": pv.flow.direction, "road_slot": pv.routing.road_slot, "strength": np.array(pv.strength_profile), "pipes": np.array([p.chainage_m for p in pv.pipes]), } np.savez_compressed(OUT_DIR / f"{name}.npz", **result) report = { "prepare_s": round(prepare_s, 2), "preview_s": round(preview_s, 2), "total_s": round(prepare_s + preview_s, 2), "rounds": pv.expand_rounds, "grid": [spec.n_rows, spec.n_cols], "red_cells": int(red.sum()), } if base: ref = np.load(OUT_DIR / f"{base}.npz") same_spec = bool(np.array_equal(ref["spec"], result["spec"])) report["same_spec"] = same_spec if same_spec: for key in ("domain", "red", "direction", "road_slot"): report[f"diff_{key}"] = int((ref[key] != result[key]).sum()) else: report["base_spec"] = ref["spec"].tolist() report["new_spec"] = result["spec"].tolist() report["red_cells_base"] = int(ref["red"].sum()) report["same_strength"] = bool(np.array_equal(ref["strength"], result["strength"])) report["same_pipes"] = bool(np.array_equal(ref["pipes"], result["pipes"])) print(json.dumps(report, ensure_ascii=False)) (OUT_DIR / f"{name}.json").write_text(json.dumps(report, ensure_ascii=False, indent=1), "utf-8") if __name__ == "__main__": main()