//! RustyTorch++ Medical Demos - Tauri Backend //! //! This crate provides the Tauri backend for RustyTorch++ medical PINN demos. //! It exposes IPC commands that connect the React frontend to the hemodynamics, //! MRE elastography, and SlideScope pathology engines. //! //! # Architecture //! //! ```text //! ┌─────────────────────┐ ┌──────────────────────┐ //! │ React Frontend │ │ Tauri Backend │ //! │ (Canvas/WebGL) │────▶│ (This crate) │ //! └─────────────────────┘ └──────────┬───────────┘ //! │ //! ┌───────────────────────────┼───────────────────────────┐ //! │ │ │ //! │ ┌───────────┴───────────┐ │ //! ┌──────────▼───────────┐ │ │ ┌──────────▼───────────┐ //! │ rtx-hemodynamics │ │ ┌──────────────┐ │ │ rtx-slidescope │ //! │ (Navier-Stokes) │ │ │ │ │ │ (NMF Pathology) │ //! └──────────────────────┘ │ ▼ ▼ │ └──────────────────────┘ //! ┌─────────────▼────────┐ ┌──────▼───────────┐ //! │ rtx-mre │ │ rtx-bioheat │ //! │ (Inv. Helmholtz) │ │ (Pennes Bioheat) │ //! └──────────────────────┘ └──────────────────┘ //! ``` //! //! # IPC Commands //! //! ## Hemodynamics Commands //! //! - `initialize` - Initialize simulation with vessel parameters //! - `reset` - Reset simulation state //! - `get_status` - Get current simulation status //! - `query_fields` - Query velocity/pressure at specific points //! - `query_grid` - Query fields on a regular grid (for visualization) //! - `modify_geometry` - Modify vessel geometry (add stenosis, etc.) //! - `get_metrics` - Get performance metrics //! - `get_simulation_state` - Get detailed simulation state //! - `sample_interior` - Sample interior points from geometry //! - `sample_boundary` - Sample boundary points from geometry //! //! ## MRE Elastography Commands //! //! - `mre_initialize_phantom` - Initialize with synthetic phantom data //! - `mre_step` - Run single training step //! - `mre_train` - Run multiple training steps //! - `mre_snapshot` - Get visualization snapshot //! - `mre_reset` - Reset solver state //! - `mre_status` - Get current solver status //! //! ## Thermal Ablation Bioheat Commands //! //! - `bioheat_initialize` - Initialize with simulation parameters //! - `bioheat_initialize_default` - Initialize with default liver parameters //! - `bioheat_step` - Run single training step //! - `bioheat_train` - Run multiple training steps //! - `bioheat_snapshot` - Get 3D visualization snapshot //! - `bioheat_get_slice` - Get 2D slice at position //! - `bioheat_update_probe` - Update probe geometry //! - `bioheat_update_power` - Update probe power //! - `bioheat_advance_time` - Advance simulation time //! - `bioheat_set_time` - Set simulation time directly //! - `bioheat_status` - Get current solver status //! - `bioheat_loss_history` - Get loss history //! - `bioheat_reset` - Reset solver state //! //! ## SlideScope Pathology Commands //! //! - `slidescope_initialize` - Initialize with workspace directory //! - `slidescope_import_slide` - Import a pathology slide //! - `slidescope_list_slides` - List all slides with optional filter //! - `slidescope_get_slide` - Get slide metadata by ID //! - `slidescope_get_tile` - Get a tile from a slide pyramid //! - `slidescope_queue_processing` - Queue NMF stain separation //! - `slidescope_job_status` - Get job processing status //! - `slidescope_get_result` - Get NMF processing result //! - `slidescope_status` - Get service status //! - `slidescope_reset` - Reset service state //! - `slidescope_delete_slide` - Delete a slide //! //! ## Neural Operator Demo Commands //! //! - `neural_operator_initialize` - Initialize FNO model with PDE type and resolution //! - `neural_operator_solve` - Solve PDE with given input field //! - `neural_operator_get_metrics` - Get performance metrics //! - `neural_operator_get_model_info` - Get model information //! - `neural_operator_reset` - Reset demo state //! - `neural_operator_is_initialized` - Check if model is initialized //! - `neural_operator_start_training` - Start FNO training in background //! - `neural_operator_training_progress` - Get current training progress //! - `neural_operator_cancel_training` - Cancel ongoing training //! - `neural_operator_is_training` - Check if training is active //! //! ## PIDDM (Physics-Informed Diffusion) Demo Commands //! //! - `piddm_initialize` - Initialize PIDDM model with PDE type and scheduler //! - `piddm_reset` - Reset PIDDM model //! - `piddm_start_training` - Start PIDDM training //! - `piddm_training_progress` - Get training progress //! - `piddm_training_result` - Get training result //! - `piddm_cancel_training` - Cancel training //! - `piddm_start_sampling` - Start generating samples //! - `piddm_sampling_progress` - Get sampling progress //! - `piddm_sampling_result` - Get generated samples //! //! ## Digital Twin Demo Commands //! //! - `digital_twin_initialize` - Initialize digital twin with geometry preset //! - `digital_twin_reset` - Reset digital twin //! - `digital_twin_start_simulation` - Start thermal simulation //! - `digital_twin_simulation_progress` - Get simulation progress //! - `digital_twin_simulation_result` - Get simulation result //! - `digital_twin_what_if` - Run what-if analysis //! - `digital_twin_get_slice` - Get slice data for visualization //! //! ## Image Classifier Commands //! //! - `image_classifier_initialize` - Initialize classifier with model architecture //! - `image_classifier_reset` - Reset classifier state //! - `image_classifier_classify` - Classify a base64-encoded image //! - `image_classifier_status` - Get classifier status //! - `image_classifier_metrics` - Get performance metrics //! - `image_classifier_is_initialized` - Check if classifier is ready //! //! ## Time Series Forecast Commands //! //! - `timeseries_initialize` - Initialize time series forecaster //! - `timeseries_reset` - Reset forecaster state //! - `timeseries_fit` - Fit model to time series data //! - `timeseries_forecast` - Generate forecasts from fitted model //! - `timeseries_status` - Get forecaster status //! - `timeseries_is_initialized` - Check if forecaster is ready //! - `timeseries_generate_sample` - Generate sample dataset //! - `timeseries_get_sample_datasets` - Get available sample datasets //! - `timeseries_get_model_types` - Get available model types //! //! ## FNO Benchmark Commands //! //! - `benchmark_run_classical` - Run FDM/FEM benchmarks for comparison //! - `benchmark_run_all` - Run all benchmarks including FNO (if model trained) //! - `benchmark_run_with_stats` - Run benchmarks with statistical analysis //! - `benchmark_quick` - Quick single-resolution benchmark //! //! ## RustyNeuro MEG/EEG Commands //! //! ### File I/O //! - `neuro_load_edf` - Load an EDF/BDF recording file //! - `neuro_load_brainvision` - Load a BrainVision recording (.vhdr) //! - `neuro_load_fif` - Load an Elekta/Neuromag FIF file (.fif) //! - `neuro_get_recording_info` - Get metadata about a recording //! - `neuro_get_data_chunk` - Get time-series data for visualization //! - `neuro_get_events` - Get event markers from recording //! - `neuro_list_recordings` - List all loaded recordings //! - `neuro_close_recording` - Close a specific recording //! //! ### Signal Processing //! - `neuro_apply_filter` - Apply bandpass/notch filters //! - `neuro_create_epochs` - Create epochs from events //! - `neuro_compute_average` - Compute evoked response (average) //! //! ### Time-Frequency Analysis //! - `neuro_compute_tfr` - Compute time-frequency representation (Morlet/STFT) //! - `neuro_compute_psd` - Compute power spectral density (Welch/Multitaper) //! - `neuro_compute_tfr_epochs` - Compute TFR averaged over epochs //! //! ### Forward Modeling //! - `neuro_create_forward_model` - Create spherical MEG/EEG forward model //! - `neuro_get_forward_model` - Get forward model info //! - `neuro_list_forward_models` - List all forward models //! //! ### Inverse Solutions //! - `neuro_create_inverse_operator` - Create MNE/dSPM/sLORETA inverse operator //! - `neuro_apply_inverse` - Apply inverse to get source estimates //! - `neuro_create_beamformer` - Create LCMV beamformer (planned for future release) //! - `neuro_gnn_predict` - Run GNN prediction on brain connectivity graph //! - `neuro_gnn_explain` - Explain GNN predictions with gradient attribution //! - `neuro_list_inverse_operators` - List all inverse operators //! //! ### Connectivity Analysis //! - `neuro_compute_connectivity` - Compute coherence/PLV/wPLI/dwPLI //! - `neuro_compute_pac` - Compute phase-amplitude coupling //! //! ### Artifact Removal (SSP/ICA) //! - `neuro_compute_ssp` - Compute SSP projectors from artifact epochs //! - `neuro_apply_ssp` - Apply SSP projectors to recording //! - `neuro_fit_ica` - Fit FastICA model to recording //! - `neuro_get_ica_sources` - Get ICA independent components //! - `neuro_apply_ica` - Remove ICA components from recording //! - `neuro_list_ica_models` - List all ICA models //! //! ### Statistical Analysis //! - `neuro_permutation_test` - Perform permutation test on epochs //! - `neuro_ttest` - Perform t-test on epochs //! - `neuro_correct_pvalues` - Apply multiple comparison correction (FDR/Bonferroni) //! - `neuro_effect_size` - Compute effect size (Cohen's d) //! //! ### Service Management //! - `neuro_status` - Get service status //! - `neuro_reset` - Clear all loaded data //! //! ## System Commands //! //! - `get_compute_backend` - Get active compute backend (CUDA/Metal/CPU) #![warn(missing_docs)] mod commands; mod neuro_commands; mod state; pub use commands::*; pub use neuro_commands::{BciState, DatabaseState, LslState, NeuroService, NeuroState}; pub use state::AppState; /// Runs the Tauri application /// /// This is the main entry point for the Tauri backend. It: /// 1. Creates the application state with the hemodynamics service /// 2. Registers all IPC command handlers /// 3. Starts the Tauri runtime /// /// # Panics /// /// Panics if the application state cannot be created or if Tauri fails to start. #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { use std::sync::Arc; use tokio::sync::RwLock; // Create application state let app_state = AppState::new(); // Create neuro state let neuro_state: NeuroState = Arc::new(RwLock::new(NeuroService::new())); // Create database state let db_state: neuro_commands::DatabaseState = Arc::new(RwLock::new(None)); // Create LSL state let lsl_state: neuro_commands::LslState = Arc::new(RwLock::new(rtx_neuro_lsl::LslService::new())); // Create BCI pipeline state let bci_state: neuro_commands::BciState = Arc::new(RwLock::new(None)); tauri::Builder::default() .setup(|app| { // Add logging plugin in debug builds if cfg!(debug_assertions) { app.handle().plugin( tauri_plugin_log::Builder::default() .level(log::LevelFilter::Info) .build(), )?; } // Log startup log::info!("RustyTorch++ Medical Demos started"); log::info!("Hemodynamics PINN engine initialized"); log::info!("MRE Elastography solver initialized"); log::info!("Thermal Ablation Bioheat solver initialized"); log::info!("SlideScope Pathology engine initialized"); log::info!("Neural Operator demo ready"); log::info!("PIDDM (Physics-Informed Diffusion) demo ready"); log::info!("Medical Digital Twin demo ready"); log::info!("Image Classifier demo ready"); log::info!("Time Series Forecast demo ready"); log::info!("RustyNeuro MEG/EEG engine initialized"); Ok(()) }) .manage(app_state) .manage(neuro_state) .manage(db_state) .manage(lsl_state) .manage(bci_state) .invoke_handler(tauri::generate_handler![ // Hemodynamics commands commands::initialize, commands::reset, commands::get_status, commands::query_fields, commands::query_grid, commands::modify_geometry, commands::get_metrics, commands::get_simulation_state, commands::sample_interior, commands::sample_boundary, // MRE elastography commands commands::mre_initialize_phantom, commands::mre_step, commands::mre_train, commands::mre_snapshot, commands::mre_reset, commands::mre_status, // Thermal ablation bioheat commands commands::bioheat_initialize, commands::bioheat_initialize_default, commands::bioheat_step, commands::bioheat_train, commands::bioheat_snapshot, commands::bioheat_get_slice, commands::bioheat_update_probe, commands::bioheat_update_power, commands::bioheat_advance_time, commands::bioheat_set_time, commands::bioheat_status, commands::bioheat_loss_history, commands::bioheat_reset, // SlideScope pathology commands commands::slidescope_initialize, commands::slidescope_import_slide, commands::slidescope_list_slides, commands::slidescope_get_slide, commands::slidescope_get_tile, commands::slidescope_queue_processing, commands::slidescope_job_status, commands::slidescope_get_result, commands::slidescope_status, commands::slidescope_reset, commands::slidescope_delete_slide, // Neural Operator demo commands commands::neural_operator_initialize, commands::neural_operator_solve, commands::neural_operator_get_metrics, commands::neural_operator_get_model_info, commands::neural_operator_reset, commands::neural_operator_is_initialized, // Neural Operator training commands commands::neural_operator_start_training, commands::neural_operator_training_progress, commands::neural_operator_cancel_training, commands::neural_operator_is_training, // PIDDM demo commands commands::piddm_initialize, commands::piddm_reset, commands::piddm_start_training, commands::piddm_training_progress, commands::piddm_training_result, commands::piddm_cancel_training, commands::piddm_start_sampling, commands::piddm_sampling_progress, commands::piddm_sampling_result, // Digital Twin demo commands commands::digital_twin_initialize, commands::digital_twin_reset, commands::digital_twin_start_simulation, commands::digital_twin_simulation_progress, commands::digital_twin_simulation_result, commands::digital_twin_what_if, commands::digital_twin_get_slice, // Image Classifier demo commands commands::image_classifier_initialize, commands::image_classifier_reset, commands::image_classifier_classify, commands::image_classifier_status, commands::image_classifier_metrics, commands::image_classifier_is_initialized, // Time Series Forecast demo commands commands::timeseries_initialize, commands::timeseries_reset, commands::timeseries_fit, commands::timeseries_forecast, commands::timeseries_status, commands::timeseries_is_initialized, commands::timeseries_generate_sample, commands::timeseries_get_sample_datasets, commands::timeseries_get_model_types, // Portfolio Optimizer demo commands commands::portfolio_initialize, commands::portfolio_reset, commands::portfolio_configure, commands::portfolio_optimize, commands::portfolio_efficient_frontier, commands::portfolio_status, commands::portfolio_is_initialized, commands::portfolio_generate_sample, commands::portfolio_get_presets, // Risk Analyzer demo commands commands::risk_analyzer_initialize, commands::risk_analyzer_reset, commands::risk_analyzer_analyze, commands::risk_analyzer_status, commands::risk_analyzer_is_initialized, // PINN Benchmark demo commands commands::pinn_benchmark_initialize, commands::pinn_benchmark_start_training, commands::pinn_benchmark_get_status, commands::pinn_benchmark_compare, commands::pinn_benchmark_reset, // FNO Benchmark commands commands::benchmark_run_classical, commands::benchmark_run_all, commands::benchmark_run_with_stats, commands::benchmark_quick, // Compute backend detection commands::get_compute_backend, // Neuro MEG/EEG commands - File I/O neuro_commands::neuro_load_edf, neuro_commands::neuro_load_brainvision, neuro_commands::neuro_load_fif, neuro_commands::neuro_load_ctf, // Neuro MEG/EEG commands - BIDS neuro_commands::neuro_load_bids, neuro_commands::neuro_get_bids_subject, neuro_commands::neuro_get_bids_files, neuro_commands::neuro_list_bids_datasets, neuro_commands::neuro_close_bids, neuro_commands::neuro_get_recording_info, neuro_commands::neuro_get_data_chunk, neuro_commands::neuro_get_events, neuro_commands::neuro_list_recordings, neuro_commands::neuro_close_recording, // Neuro MEG/EEG commands - Signal Processing neuro_commands::neuro_apply_filter, neuro_commands::neuro_create_epochs, neuro_commands::neuro_compute_average, // Neuro MEG/EEG commands - Time-Frequency Analysis neuro_commands::neuro_compute_tfr, neuro_commands::neuro_compute_psd, neuro_commands::neuro_compute_tfr_epochs, // Neuro MEG/EEG commands - Forward Modeling neuro_commands::neuro_create_forward_model, neuro_commands::neuro_get_forward_model, neuro_commands::neuro_list_forward_models, // Neuro MEG/EEG commands - Inverse Solutions neuro_commands::neuro_create_inverse_operator, neuro_commands::neuro_apply_inverse, // neuro_commands::neuro_create_beamformer, // Planned for future release neuro_commands::neuro_list_inverse_operators, // Neuro MEG/EEG commands - Connectivity neuro_commands::neuro_compute_connectivity, neuro_commands::neuro_compute_pac, // Neuro MEG/EEG commands - SSP/ICA Artifact Removal neuro_commands::neuro_compute_ssp, neuro_commands::neuro_apply_ssp, neuro_commands::neuro_fit_ica, neuro_commands::neuro_get_ica_sources, neuro_commands::neuro_apply_ica, neuro_commands::neuro_list_ica_models, // Neuro MEG/EEG commands - Statistical Analysis neuro_commands::neuro_permutation_test, neuro_commands::neuro_ttest, neuro_commands::neuro_correct_pvalues, neuro_commands::neuro_effect_size, // Neuro MEG/EEG commands - Service Management neuro_commands::neuro_status, neuro_commands::neuro_reset, // Neuro MEG/EEG commands - FreeSurfer Anatomy neuro_commands::neuro_load_freesurfer_subject, neuro_commands::neuro_get_surface, neuro_commands::neuro_get_annotation, neuro_commands::neuro_get_curvature, neuro_commands::neuro_list_freesurfer_subjects, neuro_commands::neuro_close_freesurfer_subject, // Neuro MEG/EEG commands - Database/Protocol Management neuro_commands::neuro_open_protocol, neuro_commands::neuro_create_protocol, neuro_commands::neuro_get_protocol, neuro_commands::neuro_list_protocols, neuro_commands::neuro_delete_protocol, neuro_commands::neuro_close_database, // Neuro MEG/EEG commands - Subject Management neuro_commands::neuro_create_subject, neuro_commands::neuro_get_subject, neuro_commands::neuro_list_subjects, neuro_commands::neuro_delete_subject, neuro_commands::neuro_set_subject_anatomy, // Neuro MEG/EEG commands - LSL Streaming neuro_commands::neuro_lsl_discover, neuro_commands::neuro_lsl_connect, neuro_commands::neuro_lsl_disconnect, neuro_commands::neuro_lsl_get_data, neuro_commands::neuro_lsl_list_active, neuro_commands::neuro_lsl_is_connected, neuro_commands::neuro_lsl_get_sample_count, neuro_commands::neuro_lsl_clear_buffer, // Neuro MEG/EEG commands - Real-Time BCI Pipeline neuro_commands::neuro_bci_create, neuro_commands::neuro_bci_start, neuro_commands::neuro_bci_stop, neuro_commands::neuro_bci_push_sample, neuro_commands::neuro_bci_get_control_signal, neuro_commands::neuro_bci_start_calibration, neuro_commands::neuro_bci_is_calibrated, neuro_commands::neuro_bci_set_threshold, neuro_commands::neuro_bci_set_smoothing, neuro_commands::neuro_bci_latency_stats, neuro_commands::neuro_bci_status, neuro_commands::neuro_bci_destroy, // Neuro MEG/EEG commands - Artifact Detection neuro_commands::neuro_artifact_types, neuro_commands::neuro_artifact_detector_create, neuro_commands::neuro_artifact_detect, neuro_commands::neuro_artifact_detect_batch, neuro_commands::neuro_artifact_get_summary, // Neuro MEG/EEG commands - GNN Brain Graph Analysis neuro_commands::neuro_build_brain_graph, neuro_commands::neuro_gnn_create_model, neuro_commands::neuro_gnn_destroy_model, neuro_commands::neuro_gnn_predict, neuro_commands::neuro_gnn_explain, ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } #[cfg(test)] mod tests { use super::*; use std::sync::Arc; #[test] fn test_app_state_creation() { let state = AppState::new(); // AppState should have a service with at least one strong reference assert!(Arc::strong_count(state.service()) >= 1); } }