83 lines
2.8 KiB
Python
83 lines
2.8 KiB
Python
"""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()
|