MCPcopy Create free account
hub / github.com/SingleRust/SingleRust / _calculate_dispersion_stats

Function _calculate_dispersion_stats

src/shared/processing/mod.rs:353–394  ·  view source on GitHub ↗
(
    log_dispersions: &[f64],
    bin_indices: &[usize],
    mean_bins: &[usize],
)

Source from the content-addressed store, hash-verified

351}
352
353pub fn _calculate_dispersion_stats(
354 log_dispersions: &[f64],
355 bin_indices: &[usize],
356 mean_bins: &[usize],
357) -> anyhow::Result<(Vec<f64>, Vec<f64>)> {
358 let n_bins = mean_bins.len();
359 let mut bin_means = vec![0.0; n_bins];
360 let mut bin_stds = vec![0.0; n_bins];
361 let mut bin_sums = vec![0.0; n_bins];
362 let mut bin_sum_squares = vec![0.0; n_bins];
363
364 for (i, &bin_idx) in bin_indices.iter().enumerate() {
365 let disp = log_dispersions[i];
366 if !disp.is_nan() {
367 bin_sums[bin_idx] += disp;
368 bin_sum_squares[bin_idx] += disp * disp;
369 }
370 }
371
372 for bin_idx in 0..n_bins {
373 let count = mean_bins[bin_idx] as f64;
374 if count > 0.0 {
375 bin_means[bin_idx] = bin_sums[bin_idx] / count;
376
377 if count > 1.0 {
378 let variance =
379 (bin_sum_squares[bin_idx] - bin_sums[bin_idx].powi(2) / count) / (count - 1.0);
380
381 // Add small epsilon to prevent zero standard deviation
382 let min_variance = 1e-12;
383 bin_stds[bin_idx] = (variance.max(min_variance)).sqrt();
384 } else {
385 bin_stds[bin_idx] = f64::NAN;
386 }
387 } else {
388 bin_means[bin_idx] = f64::NAN;
389 bin_stds[bin_idx] = f64::NAN;
390 }
391 }
392
393 Ok((bin_means, bin_stds))
394}

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected