The workspace root was upgraded to thiserror = "2" in an earlier commit, but 56 per-crate Cargo.toml files still independently declared "1.0". These crates do not use workspace.dependencies inheritance for thiserror. All updated to thiserror = "2" for complete fleet alignment. Includes: rtx-backend, rtx-tensor, rtx-losses, rtx-backend-cuda/rocm/metal, all training crates (rtx-auto, rtx-rl, rtx-distributed, rtx-federated, etc.), specialized crates (rtx-science, rtx-platform, rtx-nmf, rtx-neuro-*), production crates (rtx-streaming, rtx-serving-api), and all demo crates. cargo check --workspace: PASSES.
rtx-hemodynamics-server
Server layer for the RustyTorch++ hemodynamics demo.
Overview
This crate provides the API layer between the Tauri frontend and the hemodynamics PINN backend. It manages simulation state, handles inference requests, and provides a clean interface for IPC commands.
Architecture
Tauri IPC
↓
HemodynamicsService ← ServiceConfig
↓
SimulationHandle ← manages state
↓
rtx-hemodynamics ← PINN backend
Modules
| Module | Description |
|---|---|
service |
Main API: HemodynamicsService |
state |
Simulation state: SimulationHandle, SimulationStatus |
error |
Error types: ServerError, ServerResult |
Usage
use rtx_hemodynamics_server::{HemodynamicsService, ServiceConfig};
use rtx_hemodynamics_shared::params::VesselParams;
// Create service
let service = HemodynamicsService::new(ServiceConfig::default()).unwrap();
// Initialize simulation
service.initialize(VesselParams::default()).await.unwrap();
// Query fields at points
let fields = service.query_fields(&points, 0.0).await.unwrap();
// Query on a grid
let grid = service.query_grid(100, 40, 0.0).await.unwrap();
// Modify geometry
service.add_stenosis(stenosis_params).await.unwrap();
// Get status
let status = service.get_status().await.unwrap();
// Get metrics
let metrics = service.get_metrics().await.unwrap();
API Methods
Initialization
| Method | Description |
|---|---|
initialize(params) |
Initialize simulation with vessel parameters |
reset() |
Reset simulation to initial state |
Inference
| Method | Description |
|---|---|
query_fields(points, time) |
Query (u, v, p) at specific points |
query_grid(nx, ny, time) |
Query fields on a regular grid |
Geometry
| Method | Description |
|---|---|
add_stenosis(params) |
Add stenosis to vessel |
add_aneurysm(params) |
Add aneurysm to vessel |
place_stent(params) |
Place virtual stent |
reset_geometry() |
Reset to original geometry |
Status
| Method | Description |
|---|---|
get_status() |
Get simulation status |
get_metrics() |
Get performance metrics |
State Management
The service maintains:
- SimulationHandle: Wraps the PINN model and manages GPU resources
- SimulationStatus: Tracks initialization, training progress, inference count
- Metrics: FPS, inference latency, GPU utilization
Error Handling
pub enum ServerError {
NotInitialized,
InvalidParameters(String),
InferenceError(String),
GeometryError(String),
InternalError(String),
}
All public methods return ServerResult<T>.
Thread Safety
HemodynamicsService is Send + Sync and can be shared across async tasks using Arc. Internal state is protected by appropriate synchronization primitives.
Configuration
pub struct ServiceConfig {
pub max_query_points: usize, // Default: 50000
pub default_grid_nx: usize, // Default: 100
pub default_grid_ny: usize, // Default: 40
pub enable_cuda_graphs: bool, // Default: true
pub cache_inference: bool, // Default: true
}
Tests
cargo test
Integration tests verify:
- Service lifecycle (init → query → reset)
- Geometry modification flow
- Error handling for invalid states
- Concurrent access safety