use scirs2_core::ndarray::Array2;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct TuningConfig {
pub strategy: SearchStrategy,
pub metric: EvaluationMetric,
pub cv_config: CrossValidationConfig,
pub max_evaluations: usize,
pub early_stopping: Option<EarlyStoppingConfig>,
pub random_seed: Option<u64>,
pub parallel_config: Option<ParallelConfig>,
pub resource_constraints: ResourceConstraints,
}
impl Default for TuningConfig {
fn default() -> Self {
Self {
strategy: SearchStrategy::RandomSearch { n_trials: 50 },
metric: EvaluationMetric::SilhouetteScore,
cv_config: CrossValidationConfig::default(),
max_evaluations: 100,
early_stopping: None,
random_seed: Some(42),
parallel_config: None,
resource_constraints: ResourceConstraints::default(),
}
}
}
#[derive(Debug, Clone)]
pub enum SearchStrategy {
GridSearch,
RandomSearch { n_trials: usize },
BayesianOptimization {
n_initial_points: usize,
acquisition_function: AcquisitionFunction,
},
AdaptiveSearch {
initial_strategy: Box<SearchStrategy>,
adaptation_frequency: usize,
},
MultiObjective {
objectives: Vec<EvaluationMetric>,
strategy: Box<SearchStrategy>,
},
EnsembleSearch {
strategies: Vec<SearchStrategy>,
weights: Vec<f64>,
},
EvolutionarySearch {
population_size: usize,
n_generations: usize,
mutation_rate: f64,
crossover_rate: f64,
},
SMBO {
surrogate_model: SurrogateModel,
acquisition_function: AcquisitionFunction,
},
}
#[derive(Debug, Clone)]
pub enum AcquisitionFunction {
ExpectedImprovement,
UpperConfidenceBound { beta: f64 },
ProbabilityOfImprovement,
EntropySearch,
KnowledgeGradient,
ThompsonSampling,
}
#[derive(Debug, Clone)]
pub enum SurrogateModel {
GaussianProcess { kernel: KernelType, noise: f64 },
RandomForest {
n_trees: usize,
max_depth: Option<usize>,
},
GradientBoosting {
n_estimators: usize,
learning_rate: f64,
},
}
#[derive(Debug, Clone)]
pub enum KernelType {
RBF { length_scale: f64 },
Matern { length_scale: f64, nu: f64 },
Linear,
Polynomial { degree: usize },
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum EvaluationMetric {
SilhouetteScore,
DaviesBouldinIndex,
CalinskiHarabaszIndex,
Inertia,
AdjustedRandIndex,
Custom(String),
EnsembleConsensus,
Stability,
MutualInformation,
}
#[derive(Debug, Clone)]
pub struct CrossValidationConfig {
pub n_folds: usize,
pub validation_ratio: f64,
pub strategy: CVStrategy,
pub shuffle: bool,
}
impl Default for CrossValidationConfig {
fn default() -> Self {
Self {
n_folds: 5,
validation_ratio: 0.2,
strategy: CVStrategy::KFold,
shuffle: true,
}
}
}
#[derive(Debug, Clone)]
pub enum CVStrategy {
KFold,
StratifiedKFold,
TimeSeriesSplit,
Bootstrap { n_bootstrap: usize },
EnsembleCV { strategies: Vec<CVStrategy> },
MonteCarlo { n_splits: usize, test_size: f64 },
NestedCV {
outer_folds: usize,
inner_folds: usize,
},
}
#[derive(Debug, Clone)]
pub struct EarlyStoppingConfig {
pub patience: usize,
pub min_improvement: f64,
pub evaluation_frequency: usize,
}
#[derive(Debug, Clone)]
pub struct ParallelConfig {
pub n_workers: usize,
pub batch_size: usize,
pub load_balancing: LoadBalancingStrategy,
}
#[derive(Debug, Clone)]
pub enum LoadBalancingStrategy {
RoundRobin,
WorkStealing,
Dynamic,
}
#[derive(Debug, Clone, Default)]
pub struct ResourceConstraints {
pub max_memory_per_evaluation: Option<usize>,
pub max_time_per_evaluation: Option<f64>,
pub max_total_time: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum HyperParameter {
Integer { min: i64, max: i64 },
Float { min: f64, max: f64 },
Categorical { choices: Vec<String> },
Boolean,
LogUniform { min: f64, max: f64 },
IntegerChoices { choices: Vec<i64> },
}
#[derive(Debug, Clone)]
pub struct SearchSpace {
pub parameters: HashMap<String, HyperParameter>,
pub constraints: Vec<ParameterConstraint>,
}
#[derive(Debug, Clone)]
pub enum ParameterConstraint {
Conditional {
condition: String,
constraint: Box<ParameterConstraint>,
},
Range {
parameter: String,
min: f64,
max: f64,
},
Dependency {
dependent: String,
dependency: String,
relationship: DependencyRelationship,
},
}
#[derive(Debug, Clone)]
pub enum DependencyRelationship {
Linear { k: f64, c: f64 },
Proportional { ratio: f64 },
Custom(String),
}
#[derive(Debug, Clone)]
pub struct EvaluationResult {
pub parameters: HashMap<String, f64>,
pub score: f64,
pub additional_metrics: HashMap<String, f64>,
pub evaluation_time: f64,
pub memory_usage: Option<usize>,
pub cv_scores: Vec<f64>,
pub cv_std: f64,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone)]
pub struct TuningResult {
pub best_parameters: HashMap<String, f64>,
pub best_score: f64,
pub evaluation_history: Vec<EvaluationResult>,
pub convergence_info: ConvergenceInfo,
pub exploration_stats: ExplorationStats,
pub total_time: f64,
pub ensemble_results: Option<EnsembleResults>,
pub pareto_front: Option<Vec<HashMap<String, f64>>>,
}
#[derive(Debug, Clone)]
pub struct EnsembleResults {
pub member_results: Vec<TuningResult>,
pub consensus_parameters: HashMap<String, f64>,
pub agreement_score: f64,
pub diversity_metrics: HashMap<String, f64>,
}
#[derive(Debug, Clone)]
pub struct BayesianState {
pub observations: Vec<(HashMap<String, f64>, f64)>,
pub gp_mean: Option<f64>,
pub gp_covariance: Option<Array2<f64>>,
pub acquisition_values: Vec<f64>,
pub parameter_names: Vec<String>,
pub gp_hyperparameters: GpHyperparameters,
pub noise_level: f64,
pub currentbest: f64,
}
#[derive(Debug, Clone)]
pub struct GpHyperparameters {
pub length_scales: Vec<f64>,
pub signal_variance: f64,
pub noise_variance: f64,
pub kernel_type: KernelType,
}
#[derive(Debug, Clone)]
pub struct ConvergenceInfo {
pub converged: bool,
pub convergence_iteration: Option<usize>,
pub stopping_reason: StoppingReason,
}
#[derive(Debug, Clone)]
pub enum StoppingReason {
MaxEvaluations,
EarlyStopping,
TimeLimit,
Convergence,
UserInterruption,
ResourceConstraints,
}
#[derive(Debug, Clone)]
pub struct ExplorationStats {
pub coverage: f64,
pub parameter_distributions: HashMap<String, Vec<f64>>,
pub parameter_importance: HashMap<String, f64>,
}