Skip to main content

fpm_rs/diagnostics/
history.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, Serialize, Deserialize)]
4pub struct IterationRecord {
5    pub iteration: usize,
6    pub loss: f64,
7    pub elapsed_seconds: f64,
8    /// RMS ADMM consensus residual `A x - z`; absent for other algorithms.
9    #[serde(default, skip_serializing_if = "Option::is_none")]
10    pub admm_primal_residual_rms: Option<f64>,
11    /// RMS ADMM dual residual `rho (z_k - z_{k-1})`; absent for other algorithms.
12    #[serde(default, skip_serializing_if = "Option::is_none")]
13    pub admm_dual_residual_rms: Option<f64>,
14}
15
16#[derive(Clone, Debug, Default, Serialize, Deserialize)]
17pub struct ReconstructionHistory {
18    pub iterations: Vec<IterationRecord>,
19}
20
21impl ReconstructionHistory {
22    pub fn final_loss(&self) -> Option<f64> {
23        self.iterations.last().map(|record| record.loss)
24    }
25}