Skip to main content

peak_error_during_impulse

Function peak_error_during_impulse 

Source
pub fn peak_error_during_impulse(
    results: &[SimStep],
    impulse_start: usize,
    impulse_duration: usize,
    get_error: impl Fn(&SimStep) -> f64,
) -> f64
Expand description

Calculate peak error during impulse

Examples found in repository?
examples/drift_impulse.rs (lines 110-115)
55fn main() -> std::io::Result<()> {
56    println!("Running DSFB Drift-Impulse Simulation...\n");
57
58    let base_outdir =
59        std::env::var("DSFB_OUTPUT_BASE").unwrap_or_else(|_| "output-dsfb".to_string());
60    let run_outdir = create_run_output_dir(&base_outdir)?;
61
62    // Configure simulation
63    let config = SimConfig {
64        dt: 0.01,
65        steps: 1000,
66        sigma_noise: 0.05,
67        sigma_alpha: 0.01,
68        drift_beta: 0.1,
69        impulse_start: 300,
70        impulse_duration: 100,
71        impulse_amplitude: 1.0,
72        seed: 42,
73    };
74
75    // Configure DSFB parameters
76    let dsfb_params = DsfbParams::new(
77        0.5,  // k_phi
78        0.1,  // k_omega
79        0.01, // k_alpha
80        0.95, // rho
81        0.1,  // sigma0
82    );
83
84    // Run simulation
85    println!("Configuration:");
86    println!("  Time step: {}", config.dt);
87    println!("  Total steps: {}", config.steps);
88    println!("  Noise sigma: {}", config.sigma_noise);
89    println!(
90        "  Impulse start: {} (t={:.2})",
91        config.impulse_start,
92        config.impulse_start as f64 * config.dt
93    );
94    println!("  Impulse duration: {} steps", config.impulse_duration);
95    println!("  Impulse amplitude: {}", config.impulse_amplitude);
96    println!("  Output directory: {}", run_outdir.display());
97    println!();
98
99    let results = run_simulation(config.clone(), dsfb_params);
100
101    // Calculate metrics
102    let errors_mean: Vec<f64> = results.iter().map(|r| r.err_mean).collect();
103    let errors_freqonly: Vec<f64> = results.iter().map(|r| r.err_freqonly).collect();
104    let errors_dsfb: Vec<f64> = results.iter().map(|r| r.err_dsfb).collect();
105
106    let rms_mean = rms_error(&errors_mean);
107    let rms_freqonly = rms_error(&errors_freqonly);
108    let rms_dsfb = rms_error(&errors_dsfb);
109
110    let peak_mean = peak_error_during_impulse(
111        &results,
112        config.impulse_start,
113        config.impulse_duration,
114        |s| s.err_mean,
115    );
116    let peak_freqonly = peak_error_during_impulse(
117        &results,
118        config.impulse_start,
119        config.impulse_duration,
120        |s| s.err_freqonly,
121    );
122    let peak_dsfb = peak_error_during_impulse(
123        &results,
124        config.impulse_start,
125        config.impulse_duration,
126        |s| s.err_dsfb,
127    );
128
129    let impulse_end = config.impulse_start + config.impulse_duration;
130    let recovery_threshold = 0.05;
131    let recovery_mean = recovery_time(&results, impulse_end, recovery_threshold, |s| s.err_mean);
132    let recovery_freqonly = recovery_time(&results, impulse_end, recovery_threshold, |s| {
133        s.err_freqonly
134    });
135    let recovery_dsfb = recovery_time(&results, impulse_end, recovery_threshold, |s| s.err_dsfb);
136
137    // Print metrics
138    println!("METRICS SUMMARY");
139    println!("===============");
140    println!("\nRMS Errors:");
141    println!("  Mean Fusion:    {:.6}", rms_mean);
142    println!("  Freq-Only:      {:.6}", rms_freqonly);
143    println!("  DSFB:           {:.6}", rms_dsfb);
144
145    println!("\nPeak Error During Impulse:");
146    println!("  Mean Fusion:    {:.6}", peak_mean);
147    println!("  Freq-Only:      {:.6}", peak_freqonly);
148    println!("  DSFB:           {:.6}", peak_dsfb);
149
150    println!(
151        "\nRecovery Time (steps after impulse, threshold={}):",
152        recovery_threshold
153    );
154    println!("  Mean Fusion:    {}", recovery_mean);
155    println!("  Freq-Only:      {}", recovery_freqonly);
156    println!("  DSFB:           {}", recovery_dsfb);
157
158    // Write CSV
159    let csv_path = run_outdir.join("sim-dsfb.csv");
160    let mut file = File::create(&csv_path)?;
161
162    writeln!(
163        file,
164        "t,phi_true,phi_mean,phi_freqonly,phi_dsfb,err_mean,err_freqonly,err_dsfb,w2,s2"
165    )?;
166
167    for step in &results {
168        writeln!(
169            file,
170            "{:.6},{:.6},{:.6},{:.6},{:.6},{:.6},{:.6},{:.6},{:.6},{:.6}",
171            step.t,
172            step.phi_true,
173            step.phi_mean,
174            step.phi_freqonly,
175            step.phi_dsfb,
176            step.err_mean,
177            step.err_freqonly,
178            step.err_dsfb,
179            step.w2,
180            step.s2
181        )?;
182    }
183
184    println!("\nCSV output written to: {}", csv_path.display());
185    println!("Done!");
186
187    Ok(())
188}