fpm_rs/diagnostics/
history.rs1use 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 #[serde(default, skip_serializing_if = "Option::is_none")]
10 pub admm_primal_residual_rms: Option<f64>,
11 #[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}