mirror of
https://github.com/ruvnet/RuView
synced 2026-07-24 17:43:20 +00:00
7ed57f0415
Root cause (investigated, not assumed): the heavy deps in a [mat] wheel were NOT on the survivor-detection/triage path the Python binding uses. `wifi-densepose-mat` pulled `wifi-densepose-nn` as a NON-optional dep, and nn's default `onnx` feature drags in `ort` (ONNX Runtime) + its download/reqwest/hyper stack. But nn is used ONLY by mat's `src/ml/` module (debris + vital-signs ONNX classifiers), which is an OPTIONAL runtime enhancement: `DetectionPipeline.ml_pipeline` is `Option<_>`, created only when `DetectionConfig::enable_ml` is set, and `from_disaster_config` (the DisasterResponse path) never enables it. So the ONNX stack was compiled-and-linked but never executed by the binding. Fix = feature-gating (not a hoist — a hoist was unnecessary): - `wifi-densepose-nn` made optional; new `ml` Cargo feature gates it. - `default = [..., "ml"]` so existing consumers are unchanged; `api` implies `ml` (the REST surface exposes `ml_ready`). - `#[cfg(feature = "ml")]` on the `ml` module, its crate-root + prelude re-exports, the `MatError::Ml` variant, and every ml touchpoint in detection/pipeline.rs (ml_config/ml_pipeline fields, constructor, process_zone enhancement block, enhance_with_ml/get_ml_results/ initialize_ml/ml_ready/ml_pipeline accessors, update_config). - Fixed a latent feature-unification bug surfaced by dropping nn: integration/hardware_adapter.rs uses `tokio::select!`, which needs `tokio/macros`. That was only satisfied transitively via nn; now declared explicitly on mat's own tokio dep so --no-default-features builds compile. The ADR-185 [mat] wheel already depended on mat with `default-features = false, features = ["std"]`, so no python/ change was needed — dropping `ml` from the default now actually removes ort. Measured (maturin build --release --features mat --strip): BEFORE (ml/ort in wheel): 8.4 MB (over the ADR-117 §5.4 <=5 MB budget) AFTER (ml gated off): 2.0 MB (under budget) — 76% smaller Verified: cargo build -p wifi-densepose-mat (default+ml) OK cargo build -p wifi-densepose-mat --no-default-features --features std OK cargo test --features mat --test mat_parity 2/2 pass maturin develop --features mat + pytest tests/test_mat.py 7/7 pass (same detection result: 1 survivor, triage Delayed — behavior-transparent)
wifi-densepose-mat
Mass Casualty Assessment Tool for WiFi-based disaster survivor detection and localization.
Overview
wifi-densepose-mat uses WiFi Channel State Information (CSI) to detect and locate survivors
trapped in rubble, debris, or collapsed structures. The crate follows Domain-Driven Design (DDD)
with event sourcing, organized into three bounded contexts -- detection, localization, and
alerting -- plus a machine learning layer for debris penetration modeling and vital signs
classification.
Use cases include earthquake search and rescue, building collapse response, avalanche victim location, flood rescue operations, and mine collapse detection.
Features
- Vital signs detection -- Breathing patterns, heartbeat signatures, and movement classification with ensemble classifier combining all three modalities.
- Survivor localization -- 3D position estimation through debris via triangulation, depth estimation, and position fusion.
- Triage classification -- Automatic START protocol-compatible triage with priority-based alert generation and dispatch.
- Event sourcing -- All state changes emitted as domain events (
DetectionEvent,AlertEvent,ZoneEvent) stored in a pluggableEventStore. - ML debris model -- Debris material classification, signal attenuation prediction, and uncertainty-aware vital signs classification.
- REST + WebSocket API --
axum-based HTTP API for real-time monitoring dashboards. - ruvector integration --
ruvector-solverfor triangulation math,ruvector-temporal-tensorfor compressed CSI buffering.
Feature flags
| Flag | Default | Description |
|---|---|---|
std |
yes | Standard library support |
api |
yes | REST + WebSocket API (enables serde for all types) |
ruvector |
yes | ruvector-solver and ruvector-temporal-tensor |
serde |
no | Serialization (also enabled by api) |
portable |
no | Low-power mode for field-deployable devices |
distributed |
no | Multi-node distributed scanning |
drone |
no | Drone-mounted scanning (implies distributed) |
Quick Start
use wifi_densepose_mat::{
DisasterResponse, DisasterConfig, DisasterType,
ScanZone, ZoneBounds,
};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let config = DisasterConfig::builder()
.disaster_type(DisasterType::Earthquake)
.sensitivity(0.8)
.build();
let mut response = DisasterResponse::new(config);
// Define scan zone
let zone = ScanZone::new(
"Building A - North Wing",
ZoneBounds::rectangle(0.0, 0.0, 50.0, 30.0),
);
response.add_zone(zone)?;
// Start scanning
response.start_scanning().await?;
Ok(())
}
Architecture
wifi-densepose-mat/src/
lib.rs -- DisasterResponse coordinator, config builder, MatError
domain/
survivor.rs -- Survivor aggregate root
disaster_event.rs -- DisasterEvent, DisasterType
scan_zone.rs -- ScanZone, ZoneBounds
alert.rs -- Alert, Priority
vital_signs.rs -- VitalSignsReading, BreathingPattern, HeartbeatSignature
triage.rs -- TriageStatus, TriageCalculator (START protocol)
coordinates.rs -- Coordinates3D, LocationUncertainty
events.rs -- DomainEvent, EventStore, InMemoryEventStore
detection/ -- BreathingDetector, HeartbeatDetector, MovementClassifier, EnsembleClassifier
localization/ -- Triangulator, DepthEstimator, PositionFuser
alerting/ -- AlertGenerator, AlertDispatcher, TriageService
ml/ -- DebrisPenetrationModel, VitalSignsClassifier, UncertaintyEstimate
api/ -- axum REST + WebSocket router
integration/ -- SignalAdapter, NeuralAdapter, HardwareAdapter
Related Crates
| Crate | Role |
|---|---|
wifi-densepose-core |
Foundation types and traits |
wifi-densepose-signal |
CSI preprocessing for detection pipeline |
wifi-densepose-nn |
Neural inference for ML models |
wifi-densepose-hardware |
Hardware sensor data ingestion |
ruvector-solver |
Triangulation and position math |
ruvector-temporal-tensor |
Compressed CSI buffering |
License
MIT OR Apache-2.0