Files
rustytorch/demos/server
Omar Sobh 16161bb9df deps: align all 56 per-crate Cargo.toml files to thiserror v2
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.
2026-04-26 11:45:14 -07:00
..
2026-03-04 00:08:42 +00:00
2026-03-04 00:08:42 +00:00

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