quantrs2_ml/automl/config/
search_space.rs

1//! Search Space Configuration
2//!
3//! This module defines search spaces for algorithms, preprocessing, hyperparameters,
4//! architectures, and ensembles.
5
6use std::collections::HashMap;
7
8/// Search space configuration
9#[derive(Debug, Clone)]
10pub struct SearchSpaceConfig {
11    /// Algorithm search space
12    pub algorithms: AlgorithmSearchSpace,
13
14    /// Preprocessing search space
15    pub preprocessing: PreprocessingSearchSpace,
16
17    /// Hyperparameter search space
18    pub hyperparameters: HyperparameterSearchSpace,
19
20    /// Architecture search space
21    pub architectures: ArchitectureSearchSpace,
22
23    /// Ensemble search space
24    pub ensembles: EnsembleSearchSpace,
25}
26
27/// Algorithm search space
28#[derive(Debug, Clone)]
29pub struct AlgorithmSearchSpace {
30    /// Quantum neural networks
31    pub quantum_neural_networks: bool,
32
33    /// Quantum support vector machines
34    pub quantum_svm: bool,
35
36    /// Quantum clustering algorithms
37    pub quantum_clustering: bool,
38
39    /// Quantum dimensionality reduction
40    pub quantum_dim_reduction: bool,
41
42    /// Quantum time series models
43    pub quantum_time_series: bool,
44
45    /// Quantum anomaly detection
46    pub quantum_anomaly_detection: bool,
47
48    /// Classical algorithms for comparison
49    pub classical_algorithms: bool,
50}
51
52/// Preprocessing search space
53#[derive(Debug, Clone)]
54pub struct PreprocessingSearchSpace {
55    /// Feature scaling methods
56    pub scaling_methods: Vec<ScalingMethod>,
57
58    /// Feature selection methods
59    pub feature_selection: Vec<FeatureSelectionMethod>,
60
61    /// Quantum encoding methods
62    pub quantum_encodings: Vec<QuantumEncodingMethod>,
63
64    /// Data augmentation
65    pub data_augmentation: bool,
66
67    /// Missing value handling
68    pub missing_value_handling: Vec<MissingValueMethod>,
69}
70
71/// Feature scaling methods
72#[derive(Debug, Clone)]
73pub enum ScalingMethod {
74    StandardScaler,
75    MinMaxScaler,
76    RobustScaler,
77    QuantileScaler,
78    QuantumScaler,
79    NoScaling,
80}
81
82/// Feature selection methods
83#[derive(Debug, Clone)]
84pub enum FeatureSelectionMethod {
85    VarianceThreshold { threshold: f64 },
86    UnivariateSelection { k: usize },
87    RecursiveFeatureElimination { n_features: usize },
88    QuantumFeatureSelection { method: String },
89    PrincipalComponentAnalysis { n_components: usize },
90    QuantumPCA { n_components: usize },
91}
92
93/// Quantum encoding methods
94#[derive(Debug, Clone)]
95pub enum QuantumEncodingMethod {
96    AmplitudeEncoding,
97    AngleEncoding,
98    BasisEncoding,
99    QuantumFeatureMap { map_type: String },
100    VariationalEncoding { layers: usize },
101    AutomaticEncoding,
102}
103
104/// Missing value handling methods
105#[derive(Debug, Clone)]
106pub enum MissingValueMethod {
107    DropRows,
108    DropColumns,
109    MeanImputation,
110    MedianImputation,
111    ModeImputation,
112    QuantumImputation,
113    KNNImputation { k: usize },
114}
115
116/// Hyperparameter search space
117#[derive(Debug, Clone)]
118pub struct HyperparameterSearchSpace {
119    /// Learning rates
120    pub learning_rates: (f64, f64),
121
122    /// Regularization strengths
123    pub regularization: (f64, f64),
124
125    /// Batch sizes
126    pub batch_sizes: Vec<usize>,
127
128    /// Number of epochs
129    pub epochs: (usize, usize),
130
131    /// Quantum-specific parameters
132    pub quantum_params: QuantumHyperparameterSpace,
133}
134
135/// Quantum hyperparameter search space
136#[derive(Debug, Clone)]
137pub struct QuantumHyperparameterSpace {
138    /// Number of qubits range
139    pub num_qubits: (usize, usize),
140
141    /// Circuit depth range
142    pub circuit_depth: (usize, usize),
143
144    /// Entanglement strengths
145    pub entanglement_strength: (f64, f64),
146
147    /// Variational parameters
148    pub variational_params: (f64, f64),
149
150    /// Measurement strategies
151    pub measurement_strategies: Vec<String>,
152}
153
154/// Architecture search space
155#[derive(Debug, Clone)]
156pub struct ArchitectureSearchSpace {
157    /// Network architectures
158    pub network_architectures: Vec<NetworkArchitecture>,
159
160    /// Quantum circuit architectures
161    pub quantum_architectures: Vec<QuantumArchitecture>,
162
163    /// Hybrid architectures
164    pub hybrid_architectures: bool,
165
166    /// Architecture generation strategy
167    pub generation_strategy: ArchitectureGenerationStrategy,
168}
169
170/// Network architecture templates
171#[derive(Debug, Clone)]
172pub enum NetworkArchitecture {
173    MLP {
174        hidden_layers: Vec<usize>,
175    },
176    CNN {
177        conv_layers: Vec<ConvLayer>,
178        fc_layers: Vec<usize>,
179    },
180    RNN {
181        rnn_type: String,
182        hidden_size: usize,
183        num_layers: usize,
184    },
185    Transformer {
186        num_heads: usize,
187        hidden_dim: usize,
188        num_layers: usize,
189    },
190    Autoencoder {
191        encoder_layers: Vec<usize>,
192        decoder_layers: Vec<usize>,
193    },
194}
195
196/// Convolutional layer configuration
197#[derive(Debug, Clone)]
198pub struct ConvLayer {
199    pub filters: usize,
200    pub kernel_size: usize,
201    pub stride: usize,
202    pub padding: usize,
203}
204
205/// Quantum architecture templates
206#[derive(Debug, Clone)]
207pub enum QuantumArchitecture {
208    VariationalCircuit {
209        layers: Vec<String>,
210        depth: usize,
211    },
212    QuantumConvolutional {
213        pooling: String,
214        layers: usize,
215    },
216    QuantumRNN {
217        quantum_cells: usize,
218        classical_layers: usize,
219    },
220    HardwareEfficient {
221        connectivity: String,
222        repetitions: usize,
223    },
224    ProblemInspired {
225        problem_type: String,
226        ansatz: String,
227    },
228}
229
230/// Architecture generation strategy
231#[derive(Debug, Clone)]
232pub enum ArchitectureGenerationStrategy {
233    Random,
234    Evolutionary,
235    GradientBased,
236    BayesianOptimization,
237    QuantumInspired,
238    Reinforcement,
239}
240
241/// Ensemble search space
242#[derive(Debug, Clone)]
243pub struct EnsembleSearchSpace {
244    /// Enable ensemble methods
245    pub enabled: bool,
246
247    /// Maximum ensemble size
248    pub max_ensemble_size: usize,
249
250    /// Ensemble combination methods
251    pub combination_methods: Vec<EnsembleCombinationMethod>,
252
253    /// Diversity strategies
254    pub diversity_strategies: Vec<EnsembleDiversityStrategy>,
255}
256
257/// Ensemble combination methods
258#[derive(Debug, Clone)]
259pub enum EnsembleCombinationMethod {
260    Voting,
261    Averaging,
262    WeightedAveraging,
263    Stacking,
264    Blending,
265    QuantumSuperposition,
266    BayesianModelAveraging,
267}
268
269/// Ensemble diversity strategies
270#[derive(Debug, Clone)]
271pub enum EnsembleDiversityStrategy {
272    Bagging,
273    Boosting,
274    RandomSubspaces,
275    QuantumDiversity,
276    DifferentAlgorithms,
277    DifferentHyperparameters,
278}
279
280// Default implementations
281impl Default for SearchSpaceConfig {
282    fn default() -> Self {
283        Self {
284            algorithms: AlgorithmSearchSpace::default(),
285            preprocessing: PreprocessingSearchSpace::default(),
286            hyperparameters: HyperparameterSearchSpace::default(),
287            architectures: ArchitectureSearchSpace::default(),
288            ensembles: EnsembleSearchSpace::default(),
289        }
290    }
291}
292
293impl Default for AlgorithmSearchSpace {
294    fn default() -> Self {
295        Self {
296            quantum_neural_networks: true,
297            quantum_svm: true,
298            quantum_clustering: false,
299            quantum_dim_reduction: false,
300            quantum_time_series: false,
301            quantum_anomaly_detection: false,
302            classical_algorithms: true,
303        }
304    }
305}
306
307impl Default for PreprocessingSearchSpace {
308    fn default() -> Self {
309        Self {
310            scaling_methods: vec![
311                ScalingMethod::StandardScaler,
312                ScalingMethod::MinMaxScaler,
313                ScalingMethod::NoScaling,
314            ],
315            feature_selection: vec![
316                FeatureSelectionMethod::VarianceThreshold { threshold: 0.01 },
317                FeatureSelectionMethod::UnivariateSelection { k: 10 },
318            ],
319            quantum_encodings: vec![
320                QuantumEncodingMethod::AngleEncoding,
321                QuantumEncodingMethod::AmplitudeEncoding,
322            ],
323            data_augmentation: false,
324            missing_value_handling: vec![
325                MissingValueMethod::MeanImputation,
326                MissingValueMethod::DropRows,
327            ],
328        }
329    }
330}
331
332impl Default for HyperparameterSearchSpace {
333    fn default() -> Self {
334        Self {
335            learning_rates: (0.001, 0.1),
336            regularization: (0.0, 0.1),
337            batch_sizes: vec![16, 32, 64, 128],
338            epochs: (10, 100),
339            quantum_params: QuantumHyperparameterSpace::default(),
340        }
341    }
342}
343
344impl Default for QuantumHyperparameterSpace {
345    fn default() -> Self {
346        Self {
347            num_qubits: (4, 16),
348            circuit_depth: (2, 10),
349            entanglement_strength: (0.0, 1.0),
350            variational_params: (-std::f64::consts::PI, std::f64::consts::PI),
351            measurement_strategies: vec!["all_qubits".to_string(), "partial".to_string()],
352        }
353    }
354}
355
356impl Default for ArchitectureSearchSpace {
357    fn default() -> Self {
358        Self {
359            network_architectures: vec![
360                NetworkArchitecture::MLP {
361                    hidden_layers: vec![64, 32],
362                },
363                NetworkArchitecture::MLP {
364                    hidden_layers: vec![128, 64, 32],
365                },
366            ],
367            quantum_architectures: vec![
368                QuantumArchitecture::VariationalCircuit {
369                    layers: vec!["RY".to_string(), "CNOT".to_string()],
370                    depth: 3,
371                },
372                QuantumArchitecture::HardwareEfficient {
373                    connectivity: "linear".to_string(),
374                    repetitions: 2,
375                },
376            ],
377            hybrid_architectures: true,
378            generation_strategy: ArchitectureGenerationStrategy::Random,
379        }
380    }
381}
382
383impl Default for EnsembleSearchSpace {
384    fn default() -> Self {
385        Self {
386            enabled: true,
387            max_ensemble_size: 5,
388            combination_methods: vec![
389                EnsembleCombinationMethod::Voting,
390                EnsembleCombinationMethod::Averaging,
391            ],
392            diversity_strategies: vec![
393                EnsembleDiversityStrategy::DifferentAlgorithms,
394                EnsembleDiversityStrategy::DifferentHyperparameters,
395            ],
396        }
397    }
398}
399
400// Convenient configuration builders
401impl SearchSpaceConfig {
402    /// Comprehensive search space for maximum exploration
403    pub fn comprehensive() -> Self {
404        Self {
405            algorithms: AlgorithmSearchSpace {
406                quantum_neural_networks: true,
407                quantum_svm: true,
408                quantum_clustering: true,
409                quantum_dim_reduction: true,
410                quantum_time_series: true,
411                quantum_anomaly_detection: true,
412                classical_algorithms: true,
413            },
414            preprocessing: PreprocessingSearchSpace {
415                scaling_methods: vec![
416                    ScalingMethod::StandardScaler,
417                    ScalingMethod::MinMaxScaler,
418                    ScalingMethod::RobustScaler,
419                    ScalingMethod::QuantileScaler,
420                    ScalingMethod::QuantumScaler,
421                    ScalingMethod::NoScaling,
422                ],
423                feature_selection: vec![
424                    FeatureSelectionMethod::VarianceThreshold { threshold: 0.01 },
425                    FeatureSelectionMethod::UnivariateSelection { k: 10 },
426                    FeatureSelectionMethod::RecursiveFeatureElimination { n_features: 20 },
427                    FeatureSelectionMethod::QuantumFeatureSelection {
428                        method: "qpca".to_string(),
429                    },
430                    FeatureSelectionMethod::PrincipalComponentAnalysis { n_components: 10 },
431                    FeatureSelectionMethod::QuantumPCA { n_components: 10 },
432                ],
433                quantum_encodings: vec![
434                    QuantumEncodingMethod::AmplitudeEncoding,
435                    QuantumEncodingMethod::AngleEncoding,
436                    QuantumEncodingMethod::BasisEncoding,
437                    QuantumEncodingMethod::VariationalEncoding { layers: 3 },
438                    QuantumEncodingMethod::AutomaticEncoding,
439                ],
440                data_augmentation: true,
441                missing_value_handling: vec![
442                    MissingValueMethod::MeanImputation,
443                    MissingValueMethod::MedianImputation,
444                    MissingValueMethod::QuantumImputation,
445                    MissingValueMethod::KNNImputation { k: 5 },
446                ],
447            },
448            hyperparameters: HyperparameterSearchSpace {
449                learning_rates: (0.0001, 0.5),
450                regularization: (0.0, 0.5),
451                batch_sizes: vec![8, 16, 32, 64, 128, 256],
452                epochs: (5, 200),
453                quantum_params: QuantumHyperparameterSpace {
454                    num_qubits: (2, 32),
455                    circuit_depth: (1, 20),
456                    entanglement_strength: (0.0, 1.0),
457                    variational_params: (-2.0 * std::f64::consts::PI, 2.0 * std::f64::consts::PI),
458                    measurement_strategies: vec![
459                        "all_qubits".to_string(),
460                        "partial".to_string(),
461                        "adaptive".to_string(),
462                    ],
463                },
464            },
465            architectures: ArchitectureSearchSpace {
466                network_architectures: vec![
467                    NetworkArchitecture::MLP {
468                        hidden_layers: vec![32],
469                    },
470                    NetworkArchitecture::MLP {
471                        hidden_layers: vec![64, 32],
472                    },
473                    NetworkArchitecture::MLP {
474                        hidden_layers: vec![128, 64, 32],
475                    },
476                    NetworkArchitecture::MLP {
477                        hidden_layers: vec![256, 128, 64],
478                    },
479                ],
480                quantum_architectures: vec![
481                    QuantumArchitecture::VariationalCircuit {
482                        layers: vec!["RY".to_string(), "CNOT".to_string()],
483                        depth: 2,
484                    },
485                    QuantumArchitecture::VariationalCircuit {
486                        layers: vec!["RX".to_string(), "RZ".to_string(), "CNOT".to_string()],
487                        depth: 4,
488                    },
489                    QuantumArchitecture::HardwareEfficient {
490                        connectivity: "linear".to_string(),
491                        repetitions: 3,
492                    },
493                    QuantumArchitecture::HardwareEfficient {
494                        connectivity: "circular".to_string(),
495                        repetitions: 2,
496                    },
497                ],
498                hybrid_architectures: true,
499                generation_strategy: ArchitectureGenerationStrategy::BayesianOptimization,
500            },
501            ensembles: EnsembleSearchSpace {
502                enabled: true,
503                max_ensemble_size: 10,
504                combination_methods: vec![
505                    EnsembleCombinationMethod::Voting,
506                    EnsembleCombinationMethod::Averaging,
507                    EnsembleCombinationMethod::WeightedAveraging,
508                    EnsembleCombinationMethod::Stacking,
509                    EnsembleCombinationMethod::QuantumSuperposition,
510                ],
511                diversity_strategies: vec![
512                    EnsembleDiversityStrategy::Bagging,
513                    EnsembleDiversityStrategy::DifferentAlgorithms,
514                    EnsembleDiversityStrategy::DifferentHyperparameters,
515                    EnsembleDiversityStrategy::QuantumDiversity,
516                ],
517            },
518        }
519    }
520
521    /// Production search space with balanced exploration
522    pub fn production() -> Self {
523        Self {
524            algorithms: AlgorithmSearchSpace {
525                quantum_neural_networks: true,
526                quantum_svm: true,
527                quantum_clustering: false,
528                quantum_dim_reduction: false,
529                quantum_time_series: false,
530                quantum_anomaly_detection: false,
531                classical_algorithms: true,
532            },
533            preprocessing: PreprocessingSearchSpace {
534                scaling_methods: vec![
535                    ScalingMethod::StandardScaler,
536                    ScalingMethod::MinMaxScaler,
537                    ScalingMethod::RobustScaler,
538                ],
539                feature_selection: vec![
540                    FeatureSelectionMethod::VarianceThreshold { threshold: 0.01 },
541                    FeatureSelectionMethod::UnivariateSelection { k: 15 },
542                ],
543                quantum_encodings: vec![
544                    QuantumEncodingMethod::AngleEncoding,
545                    QuantumEncodingMethod::AmplitudeEncoding,
546                ],
547                data_augmentation: false,
548                missing_value_handling: vec![
549                    MissingValueMethod::MeanImputation,
550                    MissingValueMethod::MedianImputation,
551                ],
552            },
553            hyperparameters: HyperparameterSearchSpace {
554                learning_rates: (0.001, 0.1),
555                regularization: (0.0, 0.1),
556                batch_sizes: vec![32, 64, 128],
557                epochs: (20, 100),
558                quantum_params: QuantumHyperparameterSpace {
559                    num_qubits: (4, 20),
560                    circuit_depth: (2, 8),
561                    entanglement_strength: (0.1, 0.9),
562                    variational_params: (-std::f64::consts::PI, std::f64::consts::PI),
563                    measurement_strategies: vec!["all_qubits".to_string(), "partial".to_string()],
564                },
565            },
566            architectures: ArchitectureSearchSpace {
567                network_architectures: vec![
568                    NetworkArchitecture::MLP {
569                        hidden_layers: vec![64, 32],
570                    },
571                    NetworkArchitecture::MLP {
572                        hidden_layers: vec![128, 64],
573                    },
574                ],
575                quantum_architectures: vec![
576                    QuantumArchitecture::VariationalCircuit {
577                        layers: vec!["RY".to_string(), "CNOT".to_string()],
578                        depth: 3,
579                    },
580                    QuantumArchitecture::HardwareEfficient {
581                        connectivity: "linear".to_string(),
582                        repetitions: 2,
583                    },
584                ],
585                hybrid_architectures: true,
586                generation_strategy: ArchitectureGenerationStrategy::BayesianOptimization,
587            },
588            ensembles: EnsembleSearchSpace {
589                enabled: true,
590                max_ensemble_size: 5,
591                combination_methods: vec![
592                    EnsembleCombinationMethod::Voting,
593                    EnsembleCombinationMethod::WeightedAveraging,
594                ],
595                diversity_strategies: vec![
596                    EnsembleDiversityStrategy::DifferentAlgorithms,
597                    EnsembleDiversityStrategy::DifferentHyperparameters,
598                ],
599            },
600        }
601    }
602}