1use super::config::SciRS2ProcessTomographyConfig;
4use scirs2_core::ndarray::{Array1, Array2, Array3, Array4};
5use scirs2_core::Complex64;
6use std::collections::HashMap;
7use std::time::{Duration, SystemTime};
8
9pub type DistributionType = String;
11
12#[derive(Debug, Clone)]
14pub struct SciRS2ProcessTomographyResult {
15 pub device_id: String,
17 pub config: SciRS2ProcessTomographyConfig,
19 pub process_matrix: Array4<Complex64>,
21 pub pauli_transfer_matrix: Array2<f64>,
23 pub statistical_analysis: ProcessStatisticalAnalysis,
25 pub process_metrics: ProcessMetrics,
27 pub validation_results: ProcessValidationResults,
29 pub structure_analysis: Option<ProcessStructureAnalysis>,
31 pub uncertainty_quantification: ProcessUncertaintyQuantification,
33 pub process_comparisons: ProcessComparisons,
35}
36
37#[derive(Debug, Clone)]
39pub struct ProcessStatisticalAnalysis {
40 pub reconstruction_quality: ReconstructionQuality,
42 pub statistical_tests: HashMap<String, StatisticalTest>,
44 pub distribution_analysis: DistributionAnalysis,
46 pub correlation_analysis: CorrelationAnalysis,
48}
49
50#[derive(Debug, Clone)]
52pub struct ProcessMetrics {
53 pub process_fidelity: f64,
55 pub average_gate_fidelity: f64,
57 pub unitarity: f64,
59 pub entangling_power: f64,
61 pub non_unitality: f64,
63 pub channel_capacity: f64,
65 pub coherent_information: f64,
67 pub diamond_norm_distance: f64,
69 pub process_spectrum: Array1<f64>,
71}
72
73#[derive(Debug, Clone)]
75pub struct ProcessValidationResults {
76 pub cross_validation: Option<CrossValidationResults>,
78 pub bootstrap_results: Option<BootstrapResults>,
80 pub benchmark_results: Option<BenchmarkResults>,
82 pub model_selection: ModelSelectionResults,
84}
85
86#[derive(Debug, Clone)]
88pub struct ProcessStructureAnalysis {
89 pub kraus_decomposition: KrausDecomposition,
91 pub noise_decomposition: NoiseDecomposition,
93 pub coherence_analysis: CoherenceAnalysis,
95 pub symmetry_analysis: SymmetryAnalysis,
97 pub process_graph: ProcessGraph,
99}
100
101#[derive(Debug, Clone)]
103pub struct ProcessUncertaintyQuantification {
104 pub confidence_intervals: Array4<(f64, f64)>,
106 pub bootstrap_uncertainty: Array4<f64>,
108 pub fisher_information: Array2<f64>,
110}
111
112#[derive(Debug, Clone)]
114pub struct ProcessComparisons {
115 pub standard_process_fidelities: HashMap<String, f64>,
117 pub process_distances: HashMap<String, f64>,
119 pub model_selection_scores: HashMap<String, f64>,
121}
122
123#[derive(Debug, Clone)]
125pub struct ReconstructionQuality {
126 pub log_likelihood: f64,
128 pub physical_validity: PhysicalValidityMetrics,
130 pub condition_number: f64,
132}
133
134#[derive(Debug, Clone)]
136pub struct PhysicalValidityMetrics {
137 pub is_completely_positive: bool,
139 pub is_trace_preserving: bool,
141 pub positivity_measure: f64,
143 pub trace_preservation_measure: f64,
145}
146
147#[derive(Debug, Clone)]
149pub struct StatisticalTest {
150 pub statistic: f64,
152 pub p_value: f64,
154 pub critical_value: f64,
156 pub is_significant: bool,
158 pub effect_size: Option<f64>,
160}
161
162#[derive(Debug, Clone)]
164pub struct DistributionAnalysis {
165 pub element_distributions: HashMap<String, ElementDistribution>,
167 pub global_properties: GlobalDistributionProperties,
169}
170
171#[derive(Debug, Clone)]
173pub struct ElementDistribution {
174 pub distribution_type: DistributionType,
176 pub parameters: Vec<f64>,
178 pub goodness_of_fit: f64,
180 pub confidence_interval: (f64, f64),
182}
183
184#[derive(Debug, Clone)]
186pub struct GlobalDistributionProperties {
187 pub skewness: f64,
189 pub kurtosis: f64,
191 pub entropy: f64,
193}
194
195#[derive(Debug, Clone)]
197pub struct CorrelationAnalysis {
198 pub element_correlations: HashMap<String, f64>,
200 pub principal_components: Array2<f64>,
202 pub correlation_network: CorrelationNetwork,
204}
205
206#[derive(Debug, Clone)]
208pub struct CorrelationNetwork {
209 pub adjacency_matrix: Array2<f64>,
211 pub centrality_measures: HashMap<String, f64>,
213}
214
215#[derive(Debug, Clone)]
217pub struct CrossValidationResults {
218 pub fold_scores: Vec<f64>,
220 pub mean_score: f64,
222 pub std_score: f64,
224 pub confidence_interval: (f64, f64),
226}
227
228#[derive(Debug, Clone)]
230pub struct BootstrapResults {
231 pub bootstrap_samples: Vec<ProcessMetrics>,
233 pub confidence_intervals: HashMap<String, (f64, f64)>,
235 pub bias_estimates: HashMap<String, f64>,
237}
238
239#[derive(Debug, Clone)]
241pub struct BenchmarkResults {
242 pub benchmark_scores: HashMap<String, f64>,
244 pub rankings: HashMap<String, usize>,
246}
247
248#[derive(Debug, Clone)]
250pub struct ModelSelectionResults {
251 pub aic_scores: HashMap<String, f64>,
253 pub bic_scores: HashMap<String, f64>,
255 pub cross_validation_scores: HashMap<String, f64>,
257 pub best_model: String,
259 pub model_weights: HashMap<String, f64>,
261}
262
263#[derive(Debug, Clone)]
265pub struct KrausDecomposition {
266 pub kraus_operators: Vec<Array2<Complex64>>,
268 pub decomposition_fidelity: f64,
270 pub rank: usize,
272}
273
274#[derive(Debug, Clone)]
276pub struct NoiseDecomposition {
277 pub coherent_error: Array2<Complex64>,
279 pub incoherent_errors: HashMap<String, f64>,
281 pub total_error_strength: f64,
283}
284
285#[derive(Debug, Clone)]
287pub struct CoherenceAnalysis {
288 pub coherence_measures: HashMap<String, f64>,
290 pub decoherence_times: HashMap<String, f64>,
292 pub coherence_matrix: Array2<f64>,
294}
295
296#[derive(Debug, Clone)]
298pub struct SymmetryAnalysis {
299 pub symmetries: Vec<String>,
301 pub symmetry_violations: HashMap<String, f64>,
303 pub preservation_scores: HashMap<String, f64>,
305}
306
307#[derive(Debug, Clone)]
309pub struct ProcessGraph {
310 pub adjacency_matrix: Array2<f64>,
312 pub node_properties: Vec<NodeProperties>,
314 pub graph_metrics: GraphMetrics,
316}
317
318#[derive(Debug, Clone)]
320pub struct NodeProperties {
321 pub index: usize,
323 pub strength: f64,
325 pub clustering_coefficient: f64,
327 pub betweenness_centrality: f64,
329}
330
331#[derive(Debug, Clone)]
333pub struct GraphMetrics {
334 pub num_nodes: usize,
336 pub num_edges: usize,
338 pub density: f64,
340 pub average_clustering: f64,
342 pub average_path_length: f64,
344}
345
346#[derive(Debug, Clone)]
348pub struct ExperimentalData {
349 pub input_states: Vec<Array2<Complex64>>,
351 pub measurement_operators: Vec<Array2<Complex64>>,
353 pub measurement_results: Vec<f64>,
355 pub measurement_uncertainties: Vec<f64>,
357}
358
359#[derive(Debug, Clone)]
361pub struct ProcessAnomalyDetector {
362 pub historical_data: Vec<ProcessMetrics>,
364 pub threshold: f64,
366 pub algorithm: AnomalyDetectionAlgorithm,
368}
369
370#[derive(Debug, Clone)]
372pub enum AnomalyDetectionAlgorithm {
373 StatisticalThreshold,
374 IsolationForest,
375 OneClassSVM,
376 LocalOutlierFactor,
377}
378
379#[derive(Debug, Clone)]
381pub struct ProcessDriftDetector {
382 pub reference_metrics: ProcessMetrics,
384 pub sensitivity: f64,
386 pub method: DriftDetectionMethod,
388}
389
390#[derive(Debug, Clone)]
392pub enum DriftDetectionMethod {
393 StatisticalTest,
394 ChangePointDetection,
395 KLDivergence,
396 WassersteinDistance,
397}
398
399#[derive(Debug, Clone)]
401pub struct ProcessMonitoringResult {
402 pub current_metrics: ProcessMetrics,
404 pub experimental_conditions: ExperimentalConditions,
406 pub anomaly_score: f64,
408 pub drift_indicator: f64,
410 pub alert_level: AlertLevel,
412}
413
414#[derive(Debug, Clone)]
416pub struct ExperimentalConditions {
417 pub temperature: Option<f64>,
419 pub noise_level: f64,
421 pub calibration_age: Duration,
423 pub gate_count: usize,
425 pub circuit_depth: usize,
427}
428
429#[derive(Debug, Clone, PartialEq, Eq)]
431pub enum AlertLevel {
432 Normal,
433 Warning,
434 Critical,
435}
436
437impl Default for ProcessMetrics {
438 fn default() -> Self {
439 Self {
440 process_fidelity: 1.0,
441 average_gate_fidelity: 1.0,
442 unitarity: 1.0,
443 entangling_power: 0.0,
444 non_unitality: 0.0,
445 channel_capacity: 1.0,
446 coherent_information: 1.0,
447 diamond_norm_distance: 0.0,
448 process_spectrum: Array1::ones(2),
449 }
450 }
451}
452
453impl Default for StatisticalTest {
454 fn default() -> Self {
455 Self {
456 statistic: 0.0,
457 p_value: 1.0,
458 critical_value: 0.0,
459 is_significant: false,
460 effect_size: None,
461 }
462 }
463}
464
465impl Default for ElementDistribution {
466 fn default() -> Self {
467 Self {
468 distribution_type: "normal".to_string(),
469 parameters: vec![0.0, 1.0],
470 goodness_of_fit: 1.0,
471 confidence_interval: (0.0, 1.0),
472 }
473 }
474}
475
476impl Default for GlobalDistributionProperties {
477 fn default() -> Self {
478 Self {
479 skewness: 0.0,
480 kurtosis: 0.0,
481 entropy: 1.0,
482 }
483 }
484}
485
486impl Default for CorrelationNetwork {
487 fn default() -> Self {
488 Self {
489 adjacency_matrix: Array2::zeros((2, 2)),
490 centrality_measures: HashMap::new(),
491 }
492 }
493}
494
495impl Default for GraphMetrics {
496 fn default() -> Self {
497 Self {
498 num_nodes: 0,
499 num_edges: 0,
500 density: 0.0,
501 average_clustering: 0.0,
502 average_path_length: 0.0,
503 }
504 }
505}