"""Generate one reproducible Fengxian water-quality monitoring-point dataset.""" from __future__ import annotations import argparse import json from pathlib import Path import sys ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT)) from app.native.wndb.core.connection import project_connection from app.services.sensor_placement import optimize_sensor_placement_by_sensitivity def find_existing_run( project: str, *, sensor_count: int, min_diameter: int, ) -> dict[str, object] | None: with project_connection(project) as conn: return conn.execute( """ SELECT run.run_id::text AS run_id, run.name, run.created_at, result.payload FROM analysis.runs AS run JOIN LATERAL ( SELECT stored.payload FROM analysis.results AS stored WHERE stored.run_id = run.run_id AND stored.result_type = 'sensor_placement' ORDER BY stored.created_at DESC, stored.result_id DESC LIMIT 1 ) AS result ON true WHERE run.run_type = 'sensor_placement' AND run.status = 'completed' AND result.payload->>'sensor_type' = 'water_quality' AND result.payload->>'method' = 'sensitivity' AND (result.payload->>'sensor_number')::integer = %s AND (result.payload->>'minimum_diameter')::integer = %s ORDER BY run.created_at DESC, run.run_id DESC LIMIT 1 """, (sensor_count, min_diameter), ).fetchone() def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--project", default="tjwater_v2") parser.add_argument("--sensor-count", type=int, default=50) parser.add_argument("--min-diameter", type=int, default=100) parser.add_argument("--run-name", default="奉贤水质监测点灵敏度分析(50点)") parser.add_argument("--created-by", default="tjwater") parser.add_argument("--force", action="store_true") args = parser.parse_args() existing = find_existing_run( args.project, sensor_count=args.sensor_count, min_diameter=args.min_diameter, ) if existing is not None and not args.force: print(json.dumps(dict(existing), ensure_ascii=False, default=str, indent=2)) return created = optimize_sensor_placement_by_sensitivity( project_code=args.project, run_name=args.run_name, sensor_count=args.sensor_count, min_diameter=args.min_diameter, created_by=args.created_by, sensor_type="water_quality", ) print(json.dumps(created, ensure_ascii=False, default=str, indent=2)) if __name__ == "__main__": main()