1use scirs2_core::ndarray::{Array1, Array2};
7use sklears_core::error::Result;
8use sklears_core::traits::Transform;
9use std::collections::{HashMap, VecDeque};
10use std::fmt::Debug;
11use std::time::{Duration, Instant};
12
13#[derive(Debug, Clone)]
18pub struct QuantumTransformer {
19 pub n_qubits: usize,
21 pub gate_sequence: Vec<QuantumGate>,
23 pub backend: QuantumBackend,
25}
26
27#[derive(Debug, Clone)]
29pub enum QuantumGate {
30 Hadamard(usize),
32 PauliX(usize),
34 PauliY(usize),
36 PauliZ(usize),
38 RotationX(usize, f64),
40 RotationY(usize, f64),
42 RotationZ(usize, f64),
44 CNOT(usize, usize),
46}
47
48#[derive(Debug, Clone)]
50pub enum QuantumBackend {
51 Simulator,
53 Qiskit,
55 Cirq,
57 Forest,
59 Azure,
61}
62
63impl Default for QuantumTransformer {
64 fn default() -> Self {
65 Self {
66 n_qubits: 4,
67 gate_sequence: vec![
68 QuantumGate::Hadamard(0),
69 QuantumGate::CNOT(0, 1),
70 QuantumGate::RotationY(1, std::f64::consts::PI / 4.0),
71 ],
72 backend: QuantumBackend::Simulator,
73 }
74 }
75}
76
77impl QuantumTransformer {
78 #[must_use]
80 pub fn new(n_qubits: usize) -> Self {
81 Self {
82 n_qubits,
83 ..Default::default()
84 }
85 }
86
87 pub fn add_gate(&mut self, gate: QuantumGate) -> &mut Self {
89 self.gate_sequence.push(gate);
90 self
91 }
92
93 #[must_use]
95 pub fn with_backend(mut self, backend: QuantumBackend) -> Self {
96 self.backend = backend;
97 self
98 }
99
100 fn apply_quantum_transform(&self, data: &Array2<f64>) -> Result<Array2<f64>> {
102 let mut transformed = data.clone();
104
105 for gate in &self.gate_sequence {
107 match gate {
108 QuantumGate::Hadamard(qubit) => {
109 if *qubit < transformed.ncols() {
111 for mut row in transformed.rows_mut() {
112 let val = row[*qubit];
113 row[*qubit] = val / std::f64::consts::SQRT_2;
114 }
115 }
116 }
117 QuantumGate::RotationY(qubit, angle) => {
118 if *qubit < transformed.ncols() {
120 for mut row in transformed.rows_mut() {
121 let val = row[*qubit];
122 row[*qubit] = val * angle.cos();
123 }
124 }
125 }
126 QuantumGate::CNOT(control, target) => {
127 if *control < transformed.ncols() && *target < transformed.ncols() {
129 for mut row in transformed.rows_mut() {
130 if row[*control] > 0.0 {
131 row[*target] = -row[*target];
132 }
133 }
134 }
135 }
136 _ => {
137 }
139 }
140 }
141
142 Ok(transformed)
143 }
144}
145
146impl<T: Clone + Into<f64> + Debug> Transform<Array2<T>, Array2<f64>> for QuantumTransformer {
147 fn transform(&self, input: &Array2<T>) -> Result<Array2<f64>> {
148 let data = input.mapv(std::convert::Into::into);
150 self.apply_quantum_transform(&data)
151 }
152}
153
154#[derive(Debug, Clone)]
156pub struct QuantumEnsemble<T> {
157 pub classical_models: Vec<T>,
159 pub quantum_transformers: Vec<QuantumTransformer>,
161 pub weights: Array1<f64>,
163}
164
165impl<T> QuantumEnsemble<T> {
166 #[must_use]
168 pub fn new() -> Self {
169 Self {
170 classical_models: Vec::new(),
171 quantum_transformers: Vec::new(),
172 weights: Array1::zeros(0),
173 }
174 }
175
176 pub fn add_classical_model(mut self, model: T) -> Self {
178 self.classical_models.push(model);
179 self
180 }
181
182 #[must_use]
184 pub fn add_quantum_transformer(mut self, transformer: QuantumTransformer) -> Self {
185 self.quantum_transformers.push(transformer);
186 self
187 }
188
189 #[must_use]
191 pub fn with_weights(mut self, weights: Array1<f64>) -> Self {
192 self.weights = weights;
193 self
194 }
195}
196
197impl<T> Default for QuantumEnsemble<T> {
198 fn default() -> Self {
199 Self::new()
200 }
201}
202
203#[derive(Debug)]
205pub struct QuantumPipelineBuilder {
206 steps: Vec<QuantumPipelineStep>,
207}
208
209#[derive(Debug)]
211pub enum QuantumPipelineStep {
212 ClassicalPreprocess(String),
214 QuantumTransform(QuantumTransformer),
216 ClassicalModel(String),
218 QuantumMeasurement,
220}
221
222impl QuantumPipelineBuilder {
223 #[must_use]
225 pub fn new() -> Self {
226 Self { steps: Vec::new() }
227 }
228
229 #[must_use]
231 pub fn add_classical_preprocess(mut self, name: String) -> Self {
232 self.steps
233 .push(QuantumPipelineStep::ClassicalPreprocess(name));
234 self
235 }
236
237 #[must_use]
239 pub fn add_quantum_transform(mut self, transformer: QuantumTransformer) -> Self {
240 self.steps
241 .push(QuantumPipelineStep::QuantumTransform(transformer));
242 self
243 }
244
245 #[must_use]
247 pub fn add_classical_model(mut self, name: String) -> Self {
248 self.steps.push(QuantumPipelineStep::ClassicalModel(name));
249 self
250 }
251
252 #[must_use]
254 pub fn add_quantum_measurement(mut self) -> Self {
255 self.steps.push(QuantumPipelineStep::QuantumMeasurement);
256 self
257 }
258
259 #[must_use]
261 pub fn build(self) -> QuantumPipeline {
262 QuantumPipeline { steps: self.steps }
263 }
264}
265
266impl Default for QuantumPipelineBuilder {
267 fn default() -> Self {
268 Self::new()
269 }
270}
271
272#[derive(Debug)]
274pub struct QuantumPipeline {
275 steps: Vec<QuantumPipelineStep>,
276}
277
278impl QuantumPipeline {
279 pub fn execute(&self, input: &Array2<f64>) -> Result<Array2<f64>> {
281 let mut data = input.clone();
282
283 for step in &self.steps {
284 match step {
285 QuantumPipelineStep::QuantumTransform(transformer) => {
286 data = transformer.apply_quantum_transform(&data)?;
287 }
288 QuantumPipelineStep::QuantumMeasurement => {
289 data = data.mapv(|x| if x.abs() > 0.5 { 1.0 } else { 0.0 });
291 }
292 _ => {
293 }
295 }
296 }
297
298 Ok(data)
299 }
300}
301
302#[derive(Debug, Clone)]
304pub struct HybridQuantumClassicalWorkflow {
305 pub quantum_circuits: Vec<QuantumCircuit>,
307 pub classical_processors: Vec<ClassicalProcessor>,
309 pub orchestrator: WorkflowOrchestrator,
311 pub optimization_strategy: QuantumClassicalOptimization,
313}
314
315#[derive(Debug, Clone)]
317pub struct QuantumCircuit {
318 pub id: String,
320 pub n_qubits: usize,
322 pub depth: usize,
324 pub gates: Vec<QuantumGate>,
326 pub parameters: Vec<f64>,
328}
329
330#[derive(Debug, Clone)]
332pub struct ClassicalProcessor {
333 pub id: String,
335 pub processor_type: ClassicalProcessorType,
337 pub config: HashMap<String, f64>,
339}
340
341#[derive(Debug, Clone)]
343pub enum ClassicalProcessorType {
344 Optimizer(OptimizerType),
346 Preprocessor(PreprocessorType),
348 Evaluator(EvaluatorType),
350 Encoder(EncoderType),
352}
353
354#[derive(Debug, Clone)]
356pub enum OptimizerType {
357 VQE,
359 QAOA,
361 Classical(String),
363 Hybrid,
365}
366
367#[derive(Debug, Clone)]
369pub enum PreprocessorType {
370 QuantumFeatureEncoding,
372 AmplitudeEncoding,
374 AngleEncoding,
376 BasisEncoding,
378}
379
380#[derive(Debug, Clone)]
382pub enum EvaluatorType {
383 CostFunction,
385 ExpectationValue,
387 Fidelity,
389 Entanglement,
391}
392
393#[derive(Debug, Clone)]
395pub enum EncoderType {
396 Classical2Quantum,
398 Quantum2Classical,
400 Parameter,
402}
403
404#[derive(Debug, Clone)]
406pub struct WorkflowOrchestrator {
407 pub schedule: WorkflowSchedule,
409 pub resources: QuantumResourceManager,
411 pub sync_points: Vec<SynchronizationPoint>,
413}
414
415#[derive(Debug, Clone)]
417pub enum WorkflowSchedule {
418 Sequential,
420 Parallel,
422 Adaptive,
424 TimeSliced { slice_duration: Duration },
426}
427
428#[derive(Debug, Clone)]
430pub struct QuantumResourceManager {
431 pub backends: Vec<QuantumBackend>,
433 pub allocation_strategy: ResourceAllocationStrategy,
435 pub usage: ResourceUsage,
437}
438
439#[derive(Debug, Clone)]
441pub enum ResourceAllocationStrategy {
442 FirstAvailable,
444 LoadBalanced,
446 OptimizationAware,
448 CostBased,
450}
451
452#[derive(Debug, Clone)]
454pub struct ResourceUsage {
455 pub qpu_usage: HashMap<String, f64>,
457 pub memory_usage: HashMap<String, u64>,
459 pub network_usage: HashMap<String, f64>,
461}
462
463#[derive(Debug, Clone)]
465pub struct SynchronizationPoint {
466 pub id: String,
468 pub components: Vec<String>,
470 pub sync_type: SynchronizationType,
472 pub timeout: Option<Duration>,
474}
475
476#[derive(Debug, Clone)]
478pub enum SynchronizationType {
479 BarrierSync,
481 AnySync,
483 ConditionalSync(String),
485 DataExchange,
487}
488
489#[derive(Debug, Clone)]
491pub enum QuantumClassicalOptimization {
492 Variational {
494 classical_optimizer: String,
495 quantum_ansatz: String,
496 max_iterations: usize,
497 },
498 Adiabatic {
500 evolution_time: f64,
501 schedule_function: String,
502 },
503 Hybrid {
505 quantum_steps: usize,
506 classical_steps: usize,
507 convergence_threshold: f64,
508 },
509 MLGuided {
511 model_type: String,
512 training_iterations: usize,
513 },
514}
515
516#[derive(Debug)]
518pub struct QuantumAdvantageAnalyzer {
519 pub benchmarks: Vec<QuantumBenchmark>,
521 pub classical_baselines: Vec<ClassicalBaseline>,
523 pub metrics: AdvantageMetrics,
525 pub results: Option<AdvantageAnalysisResult>,
527}
528
529#[derive(Debug, Clone)]
531pub struct QuantumBenchmark {
532 pub name: String,
534 pub problem_size: usize,
536 pub quantum_algorithm: QuantumAlgorithm,
538 pub complexity: AlgorithmComplexity,
540}
541
542#[derive(Debug, Clone)]
544pub enum QuantumAlgorithm {
545 Shor,
547 Grover,
549 VQE,
551 QAOA,
553 QML(String),
555 Custom(String),
557}
558
559#[derive(Debug, Clone)]
561pub struct ClassicalBaseline {
562 pub name: String,
564 pub implementation: String,
566 pub performance: PerformanceProfile,
568}
569
570#[derive(Debug, Clone)]
572pub struct PerformanceProfile {
573 pub time_complexity: String,
575 pub space_complexity: String,
577 pub runtime: Duration,
579 pub memory_usage: u64,
581}
582
583#[derive(Debug, Clone)]
585pub struct AlgorithmComplexity {
586 pub classical: String,
588 pub quantum: String,
590 pub speedup_factor: Option<f64>,
592}
593
594#[derive(Debug, Clone)]
596pub struct AdvantageMetrics {
597 pub speed_advantage: f64,
599 pub memory_advantage: f64,
601 pub energy_efficiency: f64,
603 pub accuracy_improvement: f64,
605 pub noise_resilience: f64,
607}
608
609#[derive(Debug, Clone)]
611pub struct AdvantageAnalysisResult {
612 pub advantage_score: f64,
614 pub breakdown: HashMap<String, f64>,
616 pub recommendations: Vec<String>,
618 pub confidence_interval: (f64, f64),
620}
621
622#[derive(Debug)]
624pub struct QuantumWorkflowScheduler {
625 pub queue: VecDeque<ScheduledWorkflow>,
627 pub resource_manager: QuantumResourceManager,
629 pub strategy: SchedulingStrategy,
631 pub monitor: PerformanceMonitor,
633}
634
635#[derive(Debug, Clone)]
637pub struct ScheduledWorkflow {
638 pub id: String,
640 pub workflow: HybridQuantumClassicalWorkflow,
642 pub priority: SchedulingPriority,
644 pub requirements: ResourceRequirements,
646 pub deadline: Option<Instant>,
648 pub dependencies: Vec<String>,
650}
651
652#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
654pub enum SchedulingPriority {
655 Low,
657 Normal,
659 High,
661 Critical,
663}
664
665#[derive(Debug, Clone)]
667pub struct ResourceRequirements {
668 pub qubits: usize,
670 pub max_depth: usize,
672 pub memory: u64,
674 pub estimated_time: Duration,
676 pub quality: QualityRequirements,
678}
679
680#[derive(Debug, Clone)]
682pub struct QualityRequirements {
683 pub max_error_rate: f64,
685 pub min_fidelity: f64,
687 pub min_coherence_time: Duration,
689}
690
691#[derive(Debug, Clone)]
693pub enum SchedulingStrategy {
694 FCFS,
696 SJF,
698 Priority,
700 DeadlineAware,
702 ResourceAware,
704 MLGuided,
706}
707
708#[derive(Debug)]
710pub struct PerformanceMonitor {
711 pub metrics: HashMap<String, PerformanceMetric>,
713 pub history: VecDeque<PerformanceSnapshot>,
715 pub thresholds: AlertingThresholds,
717}
718
719#[derive(Debug, Clone)]
721pub struct PerformanceMetric {
722 pub name: String,
724 pub value: f64,
726 pub unit: String,
728 pub trend: TrendDirection,
730}
731
732#[derive(Debug, Clone)]
734pub enum TrendDirection {
735 Improving,
737 Stable,
739 Degrading,
741 Unknown,
743}
744
745#[derive(Debug, Clone)]
747pub struct PerformanceSnapshot {
748 pub timestamp: Instant,
750 pub metrics: HashMap<String, f64>,
752 pub system_state: SystemState,
754}
755
756#[derive(Debug, Clone)]
758pub struct SystemState {
759 pub active_workflows: usize,
761 pub queue_length: usize,
763 pub resource_utilization: f64,
765 pub error_rate: f64,
767}
768
769#[derive(Debug, Clone)]
771pub struct AlertingThresholds {
772 pub high_utilization: f64,
774 pub high_error_rate: f64,
776 pub long_queue: usize,
778 pub deadline_miss_rate: f64,
780}
781
782#[allow(non_snake_case)]
783#[cfg(test)]
784mod tests {
785 use super::*;
786 use scirs2_core::ndarray::Array2;
787
788 #[test]
789 fn test_quantum_transformer_creation() {
790 let transformer = QuantumTransformer::new(4);
791 assert_eq!(transformer.n_qubits, 4);
792 }
793
794 #[test]
795 fn test_quantum_transformer_with_gates() {
796 let mut transformer = QuantumTransformer::new(2);
797 transformer.add_gate(QuantumGate::Hadamard(0));
798 transformer.add_gate(QuantumGate::CNOT(0, 1));
799
800 assert_eq!(transformer.gate_sequence.len(), 5); }
802
803 #[test]
804 fn test_quantum_transform() {
805 let transformer = QuantumTransformer::default();
806 let input = Array2::from_shape_vec((2, 2), vec![1.0, 2.0, 3.0, 4.0]).unwrap();
807
808 let result = transformer.transform(&input);
809 assert!(result.is_ok());
810
811 let transformed = result.unwrap();
812 assert_eq!(transformed.shape(), input.shape());
813 }
814
815 #[test]
816 fn test_quantum_ensemble_creation() {
817 let ensemble: QuantumEnsemble<String> = QuantumEnsemble::new()
818 .add_classical_model("linear_regression".to_string())
819 .add_quantum_transformer(QuantumTransformer::default());
820
821 assert_eq!(ensemble.classical_models.len(), 1);
822 assert_eq!(ensemble.quantum_transformers.len(), 1);
823 }
824
825 #[test]
826 fn test_quantum_pipeline_builder() {
827 let pipeline = QuantumPipelineBuilder::new()
828 .add_classical_preprocess("normalize".to_string())
829 .add_quantum_transform(QuantumTransformer::default())
830 .add_quantum_measurement()
831 .add_classical_model("svm".to_string())
832 .build();
833
834 assert_eq!(pipeline.steps.len(), 4);
835 }
836
837 #[test]
838 fn test_quantum_pipeline_execution() {
839 let pipeline = QuantumPipelineBuilder::new()
840 .add_quantum_transform(QuantumTransformer::default())
841 .add_quantum_measurement()
842 .build();
843
844 let input = Array2::from_shape_vec((2, 2), vec![0.1, 0.2, 0.8, 0.9]).unwrap();
845 let result = pipeline.execute(&input);
846
847 assert!(result.is_ok());
848 let output = result.unwrap();
849 assert_eq!(output.shape(), input.shape());
850 }
851
852 #[test]
853 fn test_quantum_backend_types() {
854 let transformer = QuantumTransformer::default().with_backend(QuantumBackend::Qiskit);
855
856 matches!(transformer.backend, QuantumBackend::Qiskit);
857 }
858
859 #[test]
860 fn test_hybrid_quantum_classical_workflow() {
861 let quantum_circuit = QuantumCircuit {
862 id: "test_circuit".to_string(),
863 n_qubits: 4,
864 depth: 10,
865 gates: vec![QuantumGate::Hadamard(0), QuantumGate::CNOT(0, 1)],
866 parameters: vec![0.5, 1.0],
867 };
868
869 let classical_processor = ClassicalProcessor {
870 id: "optimizer".to_string(),
871 processor_type: ClassicalProcessorType::Optimizer(OptimizerType::VQE),
872 config: HashMap::new(),
873 };
874
875 let workflow = HybridQuantumClassicalWorkflow {
876 quantum_circuits: vec![quantum_circuit],
877 classical_processors: vec![classical_processor],
878 orchestrator: WorkflowOrchestrator {
879 schedule: WorkflowSchedule::Sequential,
880 resources: QuantumResourceManager {
881 backends: vec![QuantumBackend::Simulator],
882 allocation_strategy: ResourceAllocationStrategy::FirstAvailable,
883 usage: ResourceUsage {
884 qpu_usage: HashMap::new(),
885 memory_usage: HashMap::new(),
886 network_usage: HashMap::new(),
887 },
888 },
889 sync_points: vec![],
890 },
891 optimization_strategy: QuantumClassicalOptimization::Variational {
892 classical_optimizer: "ADAM".to_string(),
893 quantum_ansatz: "Hardware Efficient".to_string(),
894 max_iterations: 100,
895 },
896 };
897
898 assert_eq!(workflow.quantum_circuits.len(), 1);
899 assert_eq!(workflow.classical_processors.len(), 1);
900 }
901
902 #[test]
903 fn test_quantum_advantage_analyzer() {
904 let benchmark = QuantumBenchmark {
905 name: "VQE H2 molecule".to_string(),
906 problem_size: 4,
907 quantum_algorithm: QuantumAlgorithm::VQE,
908 complexity: AlgorithmComplexity {
909 classical: "O(4^n)".to_string(),
910 quantum: "O(n^3)".to_string(),
911 speedup_factor: Some(16.0),
912 },
913 };
914
915 let baseline = ClassicalBaseline {
916 name: "Full Configuration Interaction".to_string(),
917 implementation: "SciPy sparse eigenvalue solver".to_string(),
918 performance: PerformanceProfile {
919 time_complexity: "O(4^n)".to_string(),
920 space_complexity: "O(4^n)".to_string(),
921 runtime: Duration::from_secs(3600),
922 memory_usage: 1_000_000_000,
923 },
924 };
925
926 let analyzer = QuantumAdvantageAnalyzer {
927 benchmarks: vec![benchmark],
928 classical_baselines: vec![baseline],
929 metrics: AdvantageMetrics {
930 speed_advantage: 16.0,
931 memory_advantage: 8.0,
932 energy_efficiency: 2.0,
933 accuracy_improvement: 1.1,
934 noise_resilience: 0.8,
935 },
936 results: None,
937 };
938
939 assert_eq!(analyzer.benchmarks.len(), 1);
940 assert_eq!(analyzer.classical_baselines.len(), 1);
941 assert_eq!(analyzer.metrics.speed_advantage, 16.0);
942 }
943
944 #[test]
945 fn test_quantum_workflow_scheduler() {
946 let workflow = HybridQuantumClassicalWorkflow {
947 quantum_circuits: vec![],
948 classical_processors: vec![],
949 orchestrator: WorkflowOrchestrator {
950 schedule: WorkflowSchedule::Sequential,
951 resources: QuantumResourceManager {
952 backends: vec![QuantumBackend::Simulator],
953 allocation_strategy: ResourceAllocationStrategy::FirstAvailable,
954 usage: ResourceUsage {
955 qpu_usage: HashMap::new(),
956 memory_usage: HashMap::new(),
957 network_usage: HashMap::new(),
958 },
959 },
960 sync_points: vec![],
961 },
962 optimization_strategy: QuantumClassicalOptimization::Hybrid {
963 quantum_steps: 10,
964 classical_steps: 5,
965 convergence_threshold: 1e-6,
966 },
967 };
968
969 let scheduled_workflow = ScheduledWorkflow {
970 id: "test_workflow".to_string(),
971 workflow,
972 priority: SchedulingPriority::Normal,
973 requirements: ResourceRequirements {
974 qubits: 8,
975 max_depth: 100,
976 memory: 1_000_000,
977 estimated_time: Duration::from_secs(300),
978 quality: QualityRequirements {
979 max_error_rate: 0.01,
980 min_fidelity: 0.95,
981 min_coherence_time: Duration::from_micros(100),
982 },
983 },
984 deadline: None,
985 dependencies: vec![],
986 };
987
988 let scheduler = QuantumWorkflowScheduler {
989 queue: VecDeque::from([scheduled_workflow]),
990 resource_manager: QuantumResourceManager {
991 backends: vec![QuantumBackend::Simulator, QuantumBackend::Qiskit],
992 allocation_strategy: ResourceAllocationStrategy::LoadBalanced,
993 usage: ResourceUsage {
994 qpu_usage: HashMap::new(),
995 memory_usage: HashMap::new(),
996 network_usage: HashMap::new(),
997 },
998 },
999 strategy: SchedulingStrategy::Priority,
1000 monitor: PerformanceMonitor {
1001 metrics: HashMap::new(),
1002 history: VecDeque::new(),
1003 thresholds: AlertingThresholds {
1004 high_utilization: 0.8,
1005 high_error_rate: 0.05,
1006 long_queue: 10,
1007 deadline_miss_rate: 0.1,
1008 },
1009 },
1010 };
1011
1012 assert_eq!(scheduler.queue.len(), 1);
1013 assert_eq!(scheduler.resource_manager.backends.len(), 2);
1014 assert!(matches!(scheduler.strategy, SchedulingStrategy::Priority));
1015 }
1016
1017 #[test]
1018 fn test_scheduling_priority_ordering() {
1019 let mut priorities = vec![
1020 SchedulingPriority::Low,
1021 SchedulingPriority::Critical,
1022 SchedulingPriority::Normal,
1023 SchedulingPriority::High,
1024 ];
1025
1026 priorities.sort();
1027
1028 assert_eq!(priorities[0], SchedulingPriority::Low);
1029 assert_eq!(priorities[1], SchedulingPriority::Normal);
1030 assert_eq!(priorities[2], SchedulingPriority::High);
1031 assert_eq!(priorities[3], SchedulingPriority::Critical);
1032 }
1033
1034 #[test]
1035 fn test_quantum_classical_optimization_strategies() {
1036 let variational = QuantumClassicalOptimization::Variational {
1037 classical_optimizer: "L-BFGS-B".to_string(),
1038 quantum_ansatz: "UCCSD".to_string(),
1039 max_iterations: 200,
1040 };
1041
1042 let adiabatic = QuantumClassicalOptimization::Adiabatic {
1043 evolution_time: 1000.0,
1044 schedule_function: "linear".to_string(),
1045 };
1046
1047 let hybrid = QuantumClassicalOptimization::Hybrid {
1048 quantum_steps: 50,
1049 classical_steps: 25,
1050 convergence_threshold: 1e-8,
1051 };
1052
1053 match variational {
1054 QuantumClassicalOptimization::Variational { max_iterations, .. } => {
1055 assert_eq!(max_iterations, 200)
1056 }
1057 _ => panic!("Wrong optimization type"),
1058 }
1059
1060 match adiabatic {
1061 QuantumClassicalOptimization::Adiabatic { evolution_time, .. } => {
1062 assert_eq!(evolution_time, 1000.0)
1063 }
1064 _ => panic!("Wrong optimization type"),
1065 }
1066
1067 match hybrid {
1068 QuantumClassicalOptimization::Hybrid {
1069 quantum_steps,
1070 classical_steps,
1071 ..
1072 } => {
1073 assert_eq!(quantum_steps, 50);
1074 assert_eq!(classical_steps, 25);
1075 }
1076 _ => panic!("Wrong optimization type"),
1077 }
1078 }
1079}