fdars_core/spm/mod.rs
1//! Statistical Process Monitoring (SPM) for functional data.
2//!
3//! This module implements a complete framework for monitoring functional data
4//! processes using FPCA-based control charts. It supports both univariate and
5//! multivariate functional settings.
6//!
7//! # Overview
8//!
9//! The SPM workflow follows two phases:
10//!
11//! - **Phase I** (training): Builds a monitoring chart from historical in-control
12//! data. The data is split into a tuning set (for FPCA) and a calibration set
13//! (for establishing control limits).
14//!
15//! - **Phase II** (monitoring): Projects new observations through the trained
16//! model and checks whether monitoring statistics exceed control limits.
17//!
18//! # Monitoring Statistics
19//!
20//! - **Hotelling T-squared**: Measures variation in the principal component
21//! subspace. Sensitive to shifts in the major modes of variation.
22//!
23//! - **SPE (Squared Prediction Error)**: Measures residual variation outside
24//! the PC subspace. Sensitive to new types of variation not captured by FPCA.
25//!
26//! # Modules
27//!
28//! - [`phase`]: Core Phase I/II framework for univariate and multivariate SPM
29//! - [`ewma`]: EWMA smoothing for enhanced sensitivity to small persistent shifts
30//! - [`frcc`]: Functional Regression Control Chart (adjusts for known covariates)
31//! - [`mod@mfpca`]: Multivariate FPCA for multi-response monitoring
32//! - [`stats`]: T-squared and SPE computation
33//! - [`control`]: Control limit estimation
34//! - [`contrib`]: Contribution diagnostics for fault identification
35//! - [`partial`]: Partial-domain monitoring (incomplete observations)
36//!
37//! # Example
38//!
39//! ```rust,no_run
40//! use fdars_core::matrix::FdMatrix;
41//! use fdars_core::spm::phase::{spm_phase1, spm_monitor, SpmConfig};
42//!
43//! // Phase I: build chart from in-control data
44//! # let data = FdMatrix::zeros(40, 30);
45//! # let argvals: Vec<f64> = (0..30).map(|i| i as f64 / 29.0).collect();
46//! let config = SpmConfig { ncomp: 3, alpha: 0.05, ..SpmConfig::default() };
47//! let chart = spm_phase1(&data, &argvals, &config).unwrap();
48//!
49//! // Phase II: monitor new data
50//! # let new_data = FdMatrix::zeros(10, 30);
51//! let result = spm_monitor(&chart, &new_data, &argvals).unwrap();
52//! // Check result.t2_alarm and result.spe_alarm for out-of-control signals
53//! ```
54
55pub mod amewma;
56pub mod arl;
57pub mod bootstrap;
58pub(super) mod chi_squared;
59pub mod contrib;
60pub mod control;
61pub mod cusum;
62pub mod elastic_spm;
63pub mod ewma;
64pub mod frcc;
65pub mod iterative;
66pub mod mewma;
67pub mod mfpca;
68pub mod ncomp;
69pub mod partial;
70pub mod phase;
71pub mod profile;
72pub mod rules;
73pub mod stats;
74
75#[cfg(test)]
76mod tests;
77
78// Re-export primary types and functions for convenience
79pub use amewma::{spm_amewma_monitor, AmewmaConfig, AmewmaMonitorResult};
80pub use arl::{arl0_ewma_t2, arl0_spe, arl0_t2, arl1_t2, ArlConfig, ArlResult};
81pub use bootstrap::{spe_limit_robust, t2_limit_robust, ControlLimitMethod};
82pub use contrib::{
83 spe_contributions, t2_contributions, t2_contributions_mfpca, t2_pc_contributions,
84 t2_pc_significance,
85};
86pub use control::{spe_control_limit, spe_moment_match_diagnostic, t2_control_limit, ControlLimit};
87pub use cusum::{
88 spm_cusum_monitor, spm_cusum_monitor_with_restart, CusumConfig, CusumMonitorResult,
89};
90pub use elastic_spm::{
91 elastic_spm_monitor, elastic_spm_phase1, ElasticSpmChart, ElasticSpmConfig,
92 ElasticSpmMonitorResult,
93};
94pub use ewma::{ewma_scores, spm_ewma_monitor, EwmaConfig, EwmaMonitorResult};
95pub use frcc::{frcc_monitor, frcc_phase1, FrccChart, FrccConfig, FrccMonitorResult};
96pub use iterative::{spm_phase1_iterative, IterativePhase1Config, IterativePhase1Result};
97pub use mewma::{spm_mewma_monitor, MewmaConfig, MewmaMonitorResult};
98pub use mfpca::{mfpca, MfpcaConfig, MfpcaResult};
99pub use ncomp::{select_ncomp, NcompMethod};
100pub use partial::{
101 spm_monitor_partial, spm_monitor_partial_batch, DomainCompletion, PartialDomainConfig,
102 PartialMonitorResult,
103};
104pub use phase::{
105 mf_spm_monitor, mf_spm_phase1, spm_monitor, spm_phase1, MfSpmChart, SpmChart, SpmConfig,
106 SpmMonitorResult,
107};
108pub use profile::{
109 profile_monitor, profile_phase1, ProfileChart, ProfileMonitorConfig, ProfileMonitorResult,
110};
111pub use rules::{evaluate_rules, nelson_rules, western_electric_rules, ChartRule, RuleViolation};
112pub use stats::{hotelling_t2, hotelling_t2_regularized, spe_multivariate, spe_univariate};