Skip to main content

fpm_rs/diagnostics/
serialization.rs

1use std::{
2    fs::File,
3    io::{BufReader, BufWriter},
4    path::Path,
5};
6
7use serde::{Deserialize, Serialize};
8
9use super::{FrameDiagnosticRecord, IterationDiagnostics, RawFrameStatisticsRecord};
10
11/// Serializable diagnostic collections emitted by [`super::DiagnosticRecorder`].
12#[derive(Clone, Debug, Default, Serialize, Deserialize)]
13pub struct ReconstructionDiagnostics {
14    /// Convergence summaries in completed-iteration order.
15    pub iteration_diagnostics: Vec<IterationDiagnostics>,
16
17    /// Per-frame comparison records in capture order.
18    pub frame_diagnostics: Vec<FrameDiagnosticRecord>,
19
20    /// Raw measured-frame statistics in acquisition order.
21    pub raw_frame_statistics: Vec<RawFrameStatisticsRecord>,
22
23    /// Optional compiled-model Fourier coverage summary.
24    pub coverage: Option<super::FourierCoverageDiagnostics>,
25
26    /// Optional ground-truth complex-object metrics.
27    pub ground_truth_metrics: Option<crate::metrics::complex_field::ComplexFieldComparisonMetrics>,
28}
29
30impl ReconstructionDiagnostics {
31    /// Serializes diagnostics as pretty-printed JSON.
32    pub fn to_json_file<P: AsRef<Path>>(&self, path: P) -> crate::Result<()> {
33        let writer = BufWriter::new(File::create(path)?);
34        serde_json::to_writer_pretty(writer, self)?;
35        Ok(())
36    }
37
38    /// Deserializes reconstruction diagnostics from JSON.
39    pub fn from_json_file<P: AsRef<Path>>(path: P) -> crate::Result<Self> {
40        let reader = BufReader::new(File::open(path)?);
41        Ok(serde_json::from_reader(reader)?)
42    }
43}