quantrs2_device/dynamical_decoupling/
analysis.rs

1//! Analysis utilities for dynamical decoupling
2
3use scirs2_core::ndarray::{Array1, Array2};
4use std::collections::HashMap;
5
6use super::{config::NoiseType, performance::DDPerformanceAnalysis, sequences::DDSequence};
7use crate::DeviceResult;
8
9// SciRS2 dependencies with fallbacks
10#[cfg(feature = "scirs2")]
11use scirs2_stats::{mean, std};
12
13#[cfg(not(feature = "scirs2"))]
14use super::fallback_scirs2::{inv, mean, std, trace};
15use scirs2_core::random::prelude::*;
16
17/// Statistical analysis results for DD sequences
18#[derive(Debug, Clone)]
19pub struct DDStatisticalAnalysis {
20    /// Basic statistical measures
21    pub basic_statistics: BasicStatistics,
22    /// Advanced statistical analysis
23    pub advanced_statistics: AdvancedStatistics,
24    /// Machine learning insights
25    pub ml_insights: Option<MLInsights>,
26    /// Uncertainty quantification
27    pub uncertainty_analysis: UncertaintyAnalysis,
28}
29
30/// Basic statistical measures
31#[derive(Debug, Clone)]
32pub struct BasicStatistics {
33    /// Sample mean
34    pub mean: f64,
35    /// Sample standard deviation
36    pub std_deviation: f64,
37    /// Sample variance
38    pub variance: f64,
39    /// Skewness
40    pub skewness: f64,
41    /// Kurtosis
42    pub kurtosis: f64,
43    /// Median
44    pub median: f64,
45    /// Interquartile range
46    pub iqr: f64,
47}
48
49/// Advanced statistical analysis
50#[derive(Debug, Clone)]
51pub struct AdvancedStatistics {
52    /// Multivariate analysis
53    pub multivariate_analysis: MultivariateAnalysis,
54    /// Time series analysis
55    pub time_series_analysis: Option<TimeSeriesAnalysis>,
56    /// Bayesian analysis
57    pub bayesian_analysis: Option<BayesianAnalysis>,
58    /// Non-parametric analysis
59    pub non_parametric_analysis: NonParametricAnalysis,
60}
61
62/// Multivariate statistical analysis
63#[derive(Debug, Clone)]
64pub struct MultivariateAnalysis {
65    /// Principal component analysis
66    pub pca_results: PCAResults,
67    /// Factor analysis
68    pub factor_analysis: FactorAnalysisResults,
69    /// Cluster analysis
70    pub cluster_analysis: ClusterAnalysisResults,
71    /// Discriminant analysis
72    pub discriminant_analysis: DiscriminantAnalysisResults,
73}
74
75/// Principal Component Analysis results
76#[derive(Debug, Clone)]
77pub struct PCAResults {
78    /// Principal components
79    pub components: Array2<f64>,
80    /// Explained variance ratio
81    pub explained_variance_ratio: Array1<f64>,
82    /// Cumulative explained variance
83    pub cumulative_variance: Array1<f64>,
84    /// Number of components to retain
85    pub n_components_retain: usize,
86}
87
88/// Factor analysis results
89#[derive(Debug, Clone)]
90pub struct FactorAnalysisResults {
91    /// Factor loadings
92    pub loadings: Array2<f64>,
93    /// Communalities
94    pub communalities: Array1<f64>,
95    /// Specific variances
96    pub specific_variances: Array1<f64>,
97    /// Factor scores
98    pub factor_scores: Array2<f64>,
99}
100
101/// Cluster analysis results
102#[derive(Debug, Clone)]
103pub struct ClusterAnalysisResults {
104    /// Cluster labels
105    pub cluster_labels: Array1<i32>,
106    /// Cluster centers
107    pub cluster_centers: Array2<f64>,
108    /// Silhouette scores
109    pub silhouette_scores: Array1<f64>,
110    /// Inertia (within-cluster sum of squares)
111    pub inertia: f64,
112}
113
114/// Discriminant analysis results
115#[derive(Debug, Clone)]
116pub struct DiscriminantAnalysisResults {
117    /// Linear discriminants
118    pub linear_discriminants: Array2<f64>,
119    /// Classification accuracy
120    pub classification_accuracy: f64,
121    /// Cross-validation score
122    pub cv_score: f64,
123    /// Feature importance
124    pub feature_importance: Array1<f64>,
125}
126
127/// Time series analysis
128#[derive(Debug, Clone)]
129pub struct TimeSeriesAnalysis {
130    /// Trend analysis
131    pub trend_analysis: TrendAnalysis,
132    /// Seasonality analysis
133    pub seasonality_analysis: SeasonalityAnalysis,
134    /// Stationarity test results
135    pub stationarity_tests: StationarityTests,
136    /// Autocorrelation analysis
137    pub autocorrelation: AutocorrelationAnalysis,
138}
139
140/// Trend analysis results
141#[derive(Debug, Clone)]
142pub struct TrendAnalysis {
143    /// Linear trend slope
144    pub linear_slope: f64,
145    /// Trend significance
146    pub trend_p_value: f64,
147    /// R-squared
148    pub r_squared: f64,
149    /// Trend direction
150    pub trend_direction: TrendDirection,
151}
152
153/// Trend direction
154#[derive(Debug, Clone, PartialEq)]
155pub enum TrendDirection {
156    Increasing,
157    Decreasing,
158    Stable,
159    NonLinear,
160}
161
162/// Seasonality analysis
163#[derive(Debug, Clone)]
164pub struct SeasonalityAnalysis {
165    /// Seasonal period
166    pub seasonal_period: Option<usize>,
167    /// Seasonal strength
168    pub seasonal_strength: f64,
169    /// Seasonal decomposition
170    pub seasonal_decomposition: SeasonalDecomposition,
171}
172
173/// Seasonal decomposition
174#[derive(Debug, Clone)]
175pub struct SeasonalDecomposition {
176    /// Trend component
177    pub trend: Array1<f64>,
178    /// Seasonal component
179    pub seasonal: Array1<f64>,
180    /// Residual component
181    pub residual: Array1<f64>,
182}
183
184/// Stationarity test results
185#[derive(Debug, Clone)]
186pub struct StationarityTests {
187    /// Augmented Dickey-Fuller test
188    pub adf_test: StationarityTest,
189    /// KPSS test
190    pub kpss_test: StationarityTest,
191    /// Phillips-Perron test
192    pub pp_test: StationarityTest,
193}
194
195/// Individual stationarity test
196#[derive(Debug, Clone)]
197pub struct StationarityTest {
198    /// Test statistic
199    pub statistic: f64,
200    /// p-value
201    pub p_value: f64,
202    /// Critical values
203    pub critical_values: HashMap<String, f64>,
204    /// Is stationary
205    pub is_stationary: bool,
206}
207
208/// Autocorrelation analysis
209#[derive(Debug, Clone)]
210pub struct AutocorrelationAnalysis {
211    /// Autocorrelation function
212    pub acf: Array1<f64>,
213    /// Partial autocorrelation function
214    pub pacf: Array1<f64>,
215    /// Significant lags
216    pub significant_lags: Vec<usize>,
217    /// Ljung-Box test result
218    pub ljung_box_test: LjungBoxTest,
219}
220
221/// Ljung-Box test for autocorrelation
222#[derive(Debug, Clone)]
223pub struct LjungBoxTest {
224    /// Test statistic
225    pub statistic: f64,
226    /// p-value
227    pub p_value: f64,
228    /// Degrees of freedom
229    pub df: usize,
230    /// Has significant autocorrelation
231    pub has_autocorrelation: bool,
232}
233
234/// Bayesian analysis results
235#[derive(Debug, Clone)]
236pub struct BayesianAnalysis {
237    /// Posterior distributions
238    pub posterior_distributions: HashMap<String, PosteriorDistribution>,
239    /// Credible intervals
240    pub credible_intervals: HashMap<String, (f64, f64)>,
241    /// Bayes factors
242    pub bayes_factors: HashMap<String, f64>,
243    /// Model evidence
244    pub model_evidence: f64,
245}
246
247/// Posterior distribution
248#[derive(Debug, Clone)]
249pub struct PosteriorDistribution {
250    /// Sample values
251    pub samples: Array1<f64>,
252    /// Mean
253    pub mean: f64,
254    /// Standard deviation
255    pub std: f64,
256    /// Highest density interval
257    pub hdi: (f64, f64),
258}
259
260/// Non-parametric analysis
261#[derive(Debug, Clone)]
262pub struct NonParametricAnalysis {
263    /// Rank-based statistics
264    pub rank_statistics: RankStatistics,
265    /// Permutation test results
266    pub permutation_tests: PermutationTests,
267    /// Bootstrap analysis
268    pub bootstrap_analysis: BootstrapAnalysis,
269    /// Kernel density estimation
270    pub kde_analysis: KDEAnalysis,
271}
272
273/// Rank-based statistics
274#[derive(Debug, Clone)]
275pub struct RankStatistics {
276    /// Spearman rank correlation
277    pub spearman_correlation: f64,
278    /// Kendall's tau
279    pub kendall_tau: f64,
280    /// Mann-Whitney U test
281    pub mann_whitney_u: MannWhitneyTest,
282    /// Wilcoxon signed-rank test
283    pub wilcoxon_test: WilcoxonTest,
284}
285
286/// Mann-Whitney U test
287#[derive(Debug, Clone)]
288pub struct MannWhitneyTest {
289    /// U statistic
290    pub u_statistic: f64,
291    /// p-value
292    pub p_value: f64,
293    /// Effect size
294    pub effect_size: f64,
295}
296
297/// Wilcoxon signed-rank test
298#[derive(Debug, Clone)]
299pub struct WilcoxonTest {
300    /// Test statistic
301    pub statistic: f64,
302    /// p-value
303    pub p_value: f64,
304    /// Effect size
305    pub effect_size: f64,
306}
307
308/// Permutation test results
309#[derive(Debug, Clone)]
310pub struct PermutationTests {
311    /// Permutation p-values
312    pub p_values: HashMap<String, f64>,
313    /// Effect sizes
314    pub effect_sizes: HashMap<String, f64>,
315    /// Number of permutations
316    pub n_permutations: usize,
317}
318
319/// Bootstrap analysis
320#[derive(Debug, Clone)]
321pub struct BootstrapAnalysis {
322    /// Bootstrap confidence intervals
323    pub confidence_intervals: HashMap<String, (f64, f64)>,
324    /// Bootstrap bias
325    pub bias: HashMap<String, f64>,
326    /// Bootstrap standard errors
327    pub standard_errors: HashMap<String, f64>,
328    /// Number of bootstrap samples
329    pub n_bootstrap: usize,
330}
331
332/// Kernel density estimation analysis
333#[derive(Debug, Clone)]
334pub struct KDEAnalysis {
335    /// Density estimates
336    pub density_estimates: Array1<f64>,
337    /// Bandwidth
338    pub bandwidth: f64,
339    /// Grid points
340    pub grid_points: Array1<f64>,
341    /// Kernel type
342    pub kernel_type: String,
343}
344
345/// Machine learning insights
346#[derive(Debug, Clone)]
347pub struct MLInsights {
348    /// Feature importance from random forest
349    pub feature_importance: Array1<f64>,
350    /// Anomaly detection results
351    pub anomaly_detection: AnomalyDetectionResults,
352    /// Predictive modeling results
353    pub predictive_modeling: PredictiveModelingResults,
354    /// Dimensionality reduction
355    pub dimensionality_reduction: DimensionalityReduction,
356}
357
358/// Anomaly detection results
359#[derive(Debug, Clone)]
360pub struct AnomalyDetectionResults {
361    /// Anomaly scores
362    pub anomaly_scores: Array1<f64>,
363    /// Anomaly threshold
364    pub threshold: f64,
365    /// Detected anomalies
366    pub anomalies: Vec<usize>,
367    /// Isolation forest results
368    pub isolation_forest: IsolationForestResults,
369}
370
371/// Isolation forest results
372#[derive(Debug, Clone)]
373pub struct IsolationForestResults {
374    /// Anomaly scores
375    pub scores: Array1<f64>,
376    /// Path lengths
377    pub path_lengths: Array1<f64>,
378    /// Contamination rate
379    pub contamination: f64,
380}
381
382/// Predictive modeling results
383#[derive(Debug, Clone)]
384pub struct PredictiveModelingResults {
385    /// Model performance metrics
386    pub performance_metrics: HashMap<String, f64>,
387    /// Cross-validation scores
388    pub cv_scores: Array1<f64>,
389    /// Learning curves
390    pub learning_curves: LearningCurves,
391    /// Model interpretability
392    pub interpretability: ModelInterpretability,
393}
394
395/// Learning curves
396#[derive(Debug, Clone)]
397pub struct LearningCurves {
398    /// Training sizes
399    pub training_sizes: Array1<f64>,
400    /// Training scores
401    pub training_scores: Array1<f64>,
402    /// Validation scores
403    pub validation_scores: Array1<f64>,
404}
405
406/// Model interpretability
407#[derive(Debug, Clone)]
408pub struct ModelInterpretability {
409    /// SHAP values
410    pub shap_values: Array2<f64>,
411    /// Feature attributions
412    pub feature_attributions: Array1<f64>,
413    /// Partial dependence plots
414    pub partial_dependence: HashMap<String, (Array1<f64>, Array1<f64>)>,
415}
416
417/// Dimensionality reduction results
418#[derive(Debug, Clone)]
419pub struct DimensionalityReduction {
420    /// t-SNE results
421    pub tsne_results: TSNEResults,
422    /// UMAP results
423    pub umap_results: UMAPResults,
424    /// Manifold learning
425    pub manifold_learning: ManifoldLearningResults,
426}
427
428/// t-SNE results
429#[derive(Debug, Clone)]
430pub struct TSNEResults {
431    /// Embedded coordinates
432    pub embedding: Array2<f64>,
433    /// Perplexity
434    pub perplexity: f64,
435    /// KL divergence
436    pub kl_divergence: f64,
437}
438
439/// UMAP results
440#[derive(Debug, Clone)]
441pub struct UMAPResults {
442    /// Embedded coordinates
443    pub embedding: Array2<f64>,
444    /// Number of neighbors
445    pub n_neighbors: usize,
446    /// Minimum distance
447    pub min_dist: f64,
448}
449
450/// Manifold learning results
451#[derive(Debug, Clone)]
452pub struct ManifoldLearningResults {
453    /// Intrinsic dimensionality estimate
454    pub intrinsic_dimension: usize,
455    /// Local linearity scores
456    pub local_linearity: Array1<f64>,
457    /// Manifold embedding
458    pub embedding: Array2<f64>,
459}
460
461/// Uncertainty quantification
462#[derive(Debug, Clone)]
463pub struct UncertaintyAnalysis {
464    /// Aleatory uncertainty (inherent randomness)
465    pub aleatory_uncertainty: f64,
466    /// Epistemic uncertainty (model uncertainty)
467    pub epistemic_uncertainty: f64,
468    /// Total uncertainty
469    pub total_uncertainty: f64,
470    /// Uncertainty sources
471    pub uncertainty_sources: HashMap<String, f64>,
472    /// Sensitivity analysis
473    pub sensitivity_analysis: SensitivityAnalysis,
474}
475
476/// Sensitivity analysis
477#[derive(Debug, Clone)]
478pub struct SensitivityAnalysis {
479    /// First-order sensitivity indices
480    pub first_order_indices: Array1<f64>,
481    /// Total sensitivity indices
482    pub total_indices: Array1<f64>,
483    /// Interaction effects
484    pub interaction_effects: Array2<f64>,
485    /// Morris screening results
486    pub morris_screening: MorrisScreeningResults,
487}
488
489/// Morris screening results
490#[derive(Debug, Clone)]
491pub struct MorrisScreeningResults {
492    /// Elementary effects
493    pub elementary_effects: Array2<f64>,
494    /// Means of elementary effects
495    pub mu: Array1<f64>,
496    /// Standard deviations of elementary effects
497    pub sigma: Array1<f64>,
498    /// Modified means
499    pub mu_star: Array1<f64>,
500}
501
502/// DD statistical analyzer
503pub struct DDStatisticalAnalyzer;
504
505impl DDStatisticalAnalyzer {
506    /// Perform comprehensive statistical analysis
507    pub fn perform_statistical_analysis(
508        sequence: &DDSequence,
509        performance_analysis: &DDPerformanceAnalysis,
510    ) -> DeviceResult<DDStatisticalAnalysis> {
511        // Create sample data for analysis
512        let sample_data = Self::generate_sample_data(sequence, performance_analysis)?;
513
514        let basic_statistics = Self::calculate_basic_statistics(&sample_data)?;
515        let advanced_statistics = Self::perform_advanced_analysis(&sample_data)?;
516        let ml_insights = Self::extract_ml_insights(&sample_data)?;
517        let uncertainty_analysis = Self::quantify_uncertainty(&sample_data)?;
518
519        Ok(DDStatisticalAnalysis {
520            basic_statistics,
521            advanced_statistics,
522            ml_insights: Some(ml_insights),
523            uncertainty_analysis,
524        })
525    }
526
527    /// Generate sample data for analysis
528    fn generate_sample_data(
529        _sequence: &DDSequence,
530        performance_analysis: &DDPerformanceAnalysis,
531    ) -> DeviceResult<Array2<f64>> {
532        // Create synthetic dataset based on performance metrics
533        let n_samples = 100;
534        let n_features = performance_analysis.metrics.len();
535        let mut data = Array2::zeros((n_samples, n_features));
536
537        // Fill with simulated data
538        for i in 0..n_samples {
539            for j in 0..n_features {
540                data[[i, j]] = thread_rng().gen::<f64>();
541            }
542        }
543
544        Ok(data)
545    }
546
547    /// Calculate basic statistics
548    fn calculate_basic_statistics(data: &Array2<f64>) -> DeviceResult<BasicStatistics> {
549        let flat_data = data.iter().cloned().collect::<Vec<f64>>();
550        let n = flat_data.len() as f64;
551
552        let mean = flat_data.iter().sum::<f64>() / n;
553        let variance = flat_data.iter().map(|x| (x - mean).powi(2)).sum::<f64>() / (n - 1.0);
554        let std_deviation = variance.sqrt();
555
556        // Calculate higher moments
557        let skewness = flat_data
558            .iter()
559            .map(|x| ((x - mean) / std_deviation).powi(3))
560            .sum::<f64>()
561            / n;
562
563        let kurtosis = flat_data
564            .iter()
565            .map(|x| ((x - mean) / std_deviation).powi(4))
566            .sum::<f64>()
567            / n
568            - 3.0;
569
570        // Calculate median and IQR
571        let mut sorted_data = flat_data.clone();
572        sorted_data.sort_by(|a, b| a.partial_cmp(b).unwrap());
573
574        let median = if sorted_data.len() % 2 == 0 {
575            (sorted_data[sorted_data.len() / 2 - 1] + sorted_data[sorted_data.len() / 2]) / 2.0
576        } else {
577            sorted_data[sorted_data.len() / 2]
578        };
579
580        let q1 = sorted_data[sorted_data.len() / 4];
581        let q3 = sorted_data[3 * sorted_data.len() / 4];
582        let iqr = q3 - q1;
583
584        Ok(BasicStatistics {
585            mean,
586            std_deviation,
587            variance,
588            skewness,
589            kurtosis,
590            median,
591            iqr,
592        })
593    }
594
595    /// Perform advanced statistical analysis (simplified)
596    fn perform_advanced_analysis(_data: &Array2<f64>) -> DeviceResult<AdvancedStatistics> {
597        // Simplified implementations
598        let multivariate_analysis = MultivariateAnalysis {
599            pca_results: PCAResults {
600                components: Array2::eye(2),
601                explained_variance_ratio: Array1::from_vec(vec![0.8, 0.2]),
602                cumulative_variance: Array1::from_vec(vec![0.8, 1.0]),
603                n_components_retain: 2,
604            },
605            factor_analysis: FactorAnalysisResults {
606                loadings: Array2::eye(2),
607                communalities: Array1::from_vec(vec![0.8, 0.9]),
608                specific_variances: Array1::from_vec(vec![0.2, 0.1]),
609                factor_scores: Array2::zeros((10, 2)),
610            },
611            cluster_analysis: ClusterAnalysisResults {
612                cluster_labels: Array1::zeros(10),
613                cluster_centers: Array2::zeros((3, 2)),
614                silhouette_scores: Array1::from_vec(vec![0.8, 0.7, 0.9]),
615                inertia: 10.0,
616            },
617            discriminant_analysis: DiscriminantAnalysisResults {
618                linear_discriminants: Array2::eye(2),
619                classification_accuracy: 0.95,
620                cv_score: 0.93,
621                feature_importance: Array1::from_vec(vec![0.7, 0.3]),
622            },
623        };
624
625        Ok(AdvancedStatistics {
626            multivariate_analysis,
627            time_series_analysis: None,
628            bayesian_analysis: None,
629            non_parametric_analysis: NonParametricAnalysis {
630                rank_statistics: RankStatistics {
631                    spearman_correlation: 0.8,
632                    kendall_tau: 0.7,
633                    mann_whitney_u: MannWhitneyTest {
634                        u_statistic: 50.0,
635                        p_value: 0.05,
636                        effect_size: 0.5,
637                    },
638                    wilcoxon_test: WilcoxonTest {
639                        statistic: 25.0,
640                        p_value: 0.03,
641                        effect_size: 0.6,
642                    },
643                },
644                permutation_tests: PermutationTests {
645                    p_values: HashMap::new(),
646                    effect_sizes: HashMap::new(),
647                    n_permutations: 1000,
648                },
649                bootstrap_analysis: BootstrapAnalysis {
650                    confidence_intervals: HashMap::new(),
651                    bias: HashMap::new(),
652                    standard_errors: HashMap::new(),
653                    n_bootstrap: 1000,
654                },
655                kde_analysis: KDEAnalysis {
656                    density_estimates: Array1::zeros(100),
657                    bandwidth: 0.1,
658                    grid_points: Array1::zeros(100),
659                    kernel_type: "gaussian".to_string(),
660                },
661            },
662        })
663    }
664
665    /// Extract ML insights (simplified)
666    fn extract_ml_insights(_data: &Array2<f64>) -> DeviceResult<MLInsights> {
667        Ok(MLInsights {
668            feature_importance: Array1::from_vec(vec![0.5, 0.3, 0.2]),
669            anomaly_detection: AnomalyDetectionResults {
670                anomaly_scores: Array1::zeros(100),
671                threshold: 0.5,
672                anomalies: vec![5, 15, 87],
673                isolation_forest: IsolationForestResults {
674                    scores: Array1::zeros(100),
675                    path_lengths: Array1::zeros(100),
676                    contamination: 0.1,
677                },
678            },
679            predictive_modeling: PredictiveModelingResults {
680                performance_metrics: HashMap::new(),
681                cv_scores: Array1::from_vec(vec![0.9, 0.85, 0.92, 0.88, 0.90]),
682                learning_curves: LearningCurves {
683                    training_sizes: Array1::from_vec(vec![10.0, 25.0, 50.0, 75.0, 100.0]),
684                    training_scores: Array1::from_vec(vec![0.8, 0.85, 0.9, 0.92, 0.93]),
685                    validation_scores: Array1::from_vec(vec![0.75, 0.82, 0.87, 0.89, 0.90]),
686                },
687                interpretability: ModelInterpretability {
688                    shap_values: Array2::zeros((100, 3)),
689                    feature_attributions: Array1::from_vec(vec![0.4, 0.35, 0.25]),
690                    partial_dependence: HashMap::new(),
691                },
692            },
693            dimensionality_reduction: DimensionalityReduction {
694                tsne_results: TSNEResults {
695                    embedding: Array2::zeros((100, 2)),
696                    perplexity: 30.0,
697                    kl_divergence: 1.5,
698                },
699                umap_results: UMAPResults {
700                    embedding: Array2::zeros((100, 2)),
701                    n_neighbors: 15,
702                    min_dist: 0.1,
703                },
704                manifold_learning: ManifoldLearningResults {
705                    intrinsic_dimension: 2,
706                    local_linearity: Array1::zeros(100),
707                    embedding: Array2::zeros((100, 2)),
708                },
709            },
710        })
711    }
712
713    /// Quantify uncertainty (simplified)
714    fn quantify_uncertainty(_data: &Array2<f64>) -> DeviceResult<UncertaintyAnalysis> {
715        let mut uncertainty_sources = HashMap::new();
716        uncertainty_sources.insert("measurement_noise".to_string(), 0.3);
717        uncertainty_sources.insert("model_uncertainty".to_string(), 0.2);
718        uncertainty_sources.insert("parameter_uncertainty".to_string(), 0.1);
719
720        Ok(UncertaintyAnalysis {
721            aleatory_uncertainty: 0.3,
722            epistemic_uncertainty: 0.2,
723            total_uncertainty: 0.5,
724            uncertainty_sources,
725            sensitivity_analysis: SensitivityAnalysis {
726                first_order_indices: Array1::from_vec(vec![0.4, 0.3, 0.2, 0.1]),
727                total_indices: Array1::from_vec(vec![0.5, 0.4, 0.25, 0.15]),
728                interaction_effects: Array2::zeros((4, 4)),
729                morris_screening: MorrisScreeningResults {
730                    elementary_effects: Array2::zeros((100, 4)),
731                    mu: Array1::from_vec(vec![0.2, 0.15, 0.1, 0.05]),
732                    sigma: Array1::from_vec(vec![0.1, 0.08, 0.06, 0.04]),
733                    mu_star: Array1::from_vec(vec![0.25, 0.18, 0.12, 0.08]),
734                },
735            },
736        })
737    }
738}