CI / Test suite (push) Successful in 1m2s
CI / Format & lint (push) Successful in 22s
Rust / fmt, clippy, test, build (push) Successful in 9m53s
Security / Dependency vulnerabilities (push) Successful in 1m52s
Security / Static analysis (push) Successful in 20s
Security / License report (push) Successful in 1m41s
Phase 2a of docs/RUST_REWRITE.md. rust/forecast (ping-forecast) ports the serving half of src/ml: the HII mirror gap fill, the hourly grid, every feature (pandas' Kahan rolling sums included), the Mae Ngat dam frame, HistGradientBoosting tree inference, the heuristic fallback, stale-threshold handling and the P.1 flood-stage probabilities. Hand-over from Python (src/ml/export.py): - models/flood_<station>.json.gz next to each joblib bundle; train_all() writes it, retrain.sh promotes it, `python -m src.ml.export` exports existing ones. - rust/forecast/flood_config.json: thresholds, stages, leads and notify constants, compiled in. tests/test_model_export.py fails while it differs from the Python source. Parity (rust/forecast/tests/parity.rs, fixtures from testdata/gen_forecast_fixtures.py on the production code path): four scenarios incl. the 2024 flood with RID lagging behind HII. Merged readings, all features and all levels identical; with all 15 local models 377/384 probabilities bit-identical, the rest within 2 ulp (exp). Python refactor without behaviour change: predict.forecasts_from_long, and get_latest_forecasts/load_latest/serving_frame take now/rain for reproducible comparisons; the HII query orders its rows.
34 lines
1.3 KiB
TOML
34 lines
1.3 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = ["collector", "forecast"]
|
|
|
|
[workspace.package]
|
|
# 1.88: edition 2024 let-chains, and dependencies (home, icu_*) need it. Distro
|
|
# cargo packages are older: install the toolchain with rustup (rust/README.md).
|
|
edition = "2024"
|
|
rust-version = "1.88"
|
|
license = "MIT"
|
|
publish = false
|
|
repository = "https://git.b4l.co.th/B4L/Northern-Thailand-Ping-River-Monitor"
|
|
|
|
[workspace.dependencies]
|
|
anyhow = "1"
|
|
chrono = { version = "0.4", default-features = false, features = ["std", "clock", "serde"] }
|
|
clap = { version = "4", features = ["derive"] }
|
|
flate2 = "1"
|
|
log = "0.4"
|
|
# native-tls (OpenSSL on Linux, SChannel on Windows), not rustls: app.rid.go.th (dams)
|
|
# offers only TLS 1.2 CBC suites (ECDHE-RSA-AES256-SHA384), which rustls refuses.
|
|
reqwest = { version = "0.12", default-features = false, features = ["native-tls", "json"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = { version = "1", features = ["float_roundtrip"] }
|
|
sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio", "tls-rustls", "postgres", "chrono", "macros"] }
|
|
tokio = { version = "1", features = ["rt-multi-thread", "macros", "time", "signal"] }
|
|
tracing = "0.1"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
|
|
[profile.release]
|
|
lto = "thin"
|
|
codegen-units = 1
|
|
strip = true
|