quantrs2_anneal/solution_clustering/types.rs
1//! Core data structures for solution clustering
2
3use std::collections::HashMap;
4use std::time::{Duration, Instant};
5
6/// Solution representation for clustering
7#[derive(Debug, Clone)]
8pub struct SolutionPoint {
9 /// Solution vector (spin configuration)
10 pub solution: Vec<i8>,
11 /// Energy of the solution
12 pub energy: f64,
13 /// Additional metrics
14 pub metrics: HashMap<String, f64>,
15 /// Solution metadata
16 pub metadata: SolutionMetadata,
17 /// Feature vector for clustering
18 pub features: Option<Vec<f64>>,
19}
20
21/// Solution metadata
22#[derive(Debug, Clone)]
23pub struct SolutionMetadata {
24 /// Solution ID
25 pub id: usize,
26 /// Source algorithm or run
27 pub source: String,
28 /// Timestamp when solution was found
29 pub timestamp: Instant,
30 /// Number of iterations to find this solution
31 pub iterations: usize,
32 /// Quality rank among all solutions
33 pub quality_rank: Option<usize>,
34 /// Feasibility status
35 pub is_feasible: bool,
36}
37
38/// Cluster representation
39#[derive(Debug, Clone)]
40pub struct SolutionCluster {
41 /// Cluster ID
42 pub id: usize,
43 /// Solutions in this cluster
44 pub solutions: Vec<SolutionPoint>,
45 /// Cluster centroid
46 pub centroid: Vec<f64>,
47 /// Representative solution (closest to centroid)
48 pub representative: Option<SolutionPoint>,
49 /// Cluster statistics
50 pub statistics: ClusterStatistics,
51 /// Cluster quality metrics
52 pub quality_metrics: ClusterQualityMetrics,
53}
54
55/// Cluster statistics
56#[derive(Debug, Clone)]
57pub struct ClusterStatistics {
58 /// Number of solutions in cluster
59 pub size: usize,
60 /// Mean energy
61 pub mean_energy: f64,
62 /// Energy standard deviation
63 pub energy_std: f64,
64 /// Minimum energy in cluster
65 pub min_energy: f64,
66 /// Maximum energy in cluster
67 pub max_energy: f64,
68 /// Intra-cluster distance (compactness)
69 pub intra_cluster_distance: f64,
70 /// Cluster diameter (maximum distance between any two points)
71 pub diameter: f64,
72 /// Cluster density
73 pub density: f64,
74}
75
76/// Cluster quality metrics
77#[derive(Debug, Clone)]
78pub struct ClusterQualityMetrics {
79 /// Silhouette coefficient
80 pub silhouette_coefficient: f64,
81 /// Inertia (within-cluster sum of squares)
82 pub inertia: f64,
83 /// Calinski-Harabasz index
84 pub calinski_harabasz_index: f64,
85 /// Davies-Bouldin index
86 pub davies_bouldin_index: f64,
87 /// Cluster stability measure
88 pub stability: f64,
89}
90
91/// Clustering results containing all clusters and analysis
92#[derive(Debug, Clone)]
93pub struct ClusteringResults {
94 /// All clusters found
95 pub clusters: Vec<SolutionCluster>,
96 /// Clustering algorithm used
97 pub algorithm: super::algorithms::ClusteringAlgorithm,
98 /// Distance metric used
99 pub distance_metric: super::algorithms::DistanceMetric,
100 /// Overall clustering quality
101 pub overall_quality: OverallClusteringQuality,
102 /// Landscape analysis
103 pub landscape_analysis: LandscapeAnalysis,
104 /// Statistical summary
105 pub statistical_summary: StatisticalSummary,
106 /// Clustering performance metrics
107 pub performance_metrics: ClusteringPerformanceMetrics,
108 /// Recommendations for optimization
109 pub recommendations: Vec<OptimizationRecommendation>,
110}
111
112/// Overall clustering quality assessment
113#[derive(Debug, Clone)]
114pub struct OverallClusteringQuality {
115 /// Overall silhouette score
116 pub silhouette_score: f64,
117 /// Adjusted Rand Index (if ground truth available)
118 pub adjusted_rand_index: Option<f64>,
119 /// Normalized Mutual Information
120 pub normalized_mutual_information: Option<f64>,
121 /// Inter-cluster separation
122 pub inter_cluster_separation: f64,
123 /// Cluster cohesion
124 pub cluster_cohesion: f64,
125 /// Number of clusters found
126 pub num_clusters: usize,
127 /// Optimal number of clusters estimate
128 pub optimal_num_clusters: usize,
129}
130
131/// Landscape analysis results
132#[derive(Debug, Clone)]
133pub struct LandscapeAnalysis {
134 /// Energy landscape statistics
135 pub energy_statistics: EnergyStatistics,
136 /// Basin detection results
137 pub basins: Vec<EnergyBasin>,
138 /// Connectivity analysis
139 pub connectivity: ConnectivityAnalysis,
140 /// Multi-modality assessment
141 pub multi_modality: MultiModalityAnalysis,
142 /// Ruggedness measures
143 pub ruggedness: RuggednessMetrics,
144 /// Funnel structure analysis
145 pub funnel_analysis: FunnelAnalysis,
146}
147
148/// Energy statistics across the solution set
149#[derive(Debug, Clone)]
150pub struct EnergyStatistics {
151 /// Mean energy
152 pub mean: f64,
153 /// Energy standard deviation
154 pub std_dev: f64,
155 /// Minimum energy found
156 pub min: f64,
157 /// Maximum energy found
158 pub max: f64,
159 /// Energy distribution percentiles
160 pub percentiles: Vec<f64>,
161 /// Skewness of energy distribution
162 pub skewness: f64,
163 /// Kurtosis of energy distribution
164 pub kurtosis: f64,
165 /// Number of distinct energy levels
166 pub num_distinct_energies: usize,
167}
168
169/// Energy basin in the landscape
170#[derive(Debug, Clone)]
171pub struct EnergyBasin {
172 /// Basin ID
173 pub id: usize,
174 /// Solutions in this basin
175 pub solutions: Vec<usize>,
176 /// Basin minimum energy
177 pub min_energy: f64,
178 /// Basin size (number of solutions)
179 pub size: usize,
180 /// Basin depth (relative to global minimum)
181 pub depth: f64,
182 /// Basin width (energy range)
183 pub width: f64,
184 /// Escape barrier height
185 pub escape_barrier: f64,
186}
187
188/// Connectivity analysis of the solution landscape
189#[derive(Debug, Clone)]
190pub struct ConnectivityAnalysis {
191 /// Number of connected components
192 pub num_components: usize,
193 /// Largest connected component size
194 pub largest_component_size: usize,
195 /// Average path length between solutions
196 pub average_path_length: f64,
197 /// Clustering coefficient
198 pub clustering_coefficient: f64,
199 /// Network diameter
200 pub diameter: usize,
201}
202
203/// Multi-modality analysis
204#[derive(Debug, Clone)]
205pub struct MultiModalityAnalysis {
206 /// Number of modes detected
207 pub num_modes: usize,
208 /// Mode locations (energy values)
209 pub mode_energies: Vec<f64>,
210 /// Mode strengths (relative populations)
211 pub mode_strengths: Vec<f64>,
212 /// Inter-mode distances
213 pub inter_mode_distances: Vec<Vec<f64>>,
214 /// Multi-modality index
215 pub multi_modality_index: f64,
216}
217
218/// Ruggedness metrics for the landscape
219#[derive(Debug, Clone)]
220pub struct RuggednessMetrics {
221 /// Autocorrelation function
222 pub autocorrelation: Vec<f64>,
223 /// Ruggedness coefficient
224 pub ruggedness_coefficient: f64,
225 /// Number of local optima
226 pub num_local_optima: usize,
227 /// Epistasis measure
228 pub epistasis: f64,
229 /// Neutrality measure
230 pub neutrality: f64,
231}
232
233/// Funnel structure analysis
234#[derive(Debug, Clone)]
235pub struct FunnelAnalysis {
236 /// Number of funnels detected
237 pub num_funnels: usize,
238 /// Funnel depths
239 pub funnel_depths: Vec<f64>,
240 /// Funnel widths
241 pub funnel_widths: Vec<f64>,
242 /// Global funnel identification
243 pub global_funnel: Option<usize>,
244 /// Funnel competition index
245 pub competition_index: f64,
246}
247
248/// Statistical summary of clustering results
249#[derive(Debug, Clone)]
250pub struct StatisticalSummary {
251 /// Distribution of cluster sizes
252 pub cluster_size_distribution: Vec<usize>,
253 /// Energy distribution analysis
254 pub energy_distribution: DistributionAnalysis,
255 /// Convergence analysis
256 pub convergence_analysis: ConvergenceAnalysis,
257 /// Correlation analysis
258 pub correlation_analysis: CorrelationAnalysis,
259 /// Outlier detection results
260 pub outliers: Vec<OutlierInfo>,
261}
262
263/// Distribution analysis results
264#[derive(Debug, Clone)]
265pub struct DistributionAnalysis {
266 /// Distribution type detected
267 pub distribution_type: DistributionType,
268 /// Distribution parameters
269 pub parameters: HashMap<String, f64>,
270 /// Goodness of fit score
271 pub goodness_of_fit: f64,
272 /// Confidence intervals
273 pub confidence_intervals: Vec<(f64, f64)>,
274}
275
276/// Distribution types
277#[derive(Debug, Clone, PartialEq, Eq)]
278pub enum DistributionType {
279 /// Normal distribution
280 Normal,
281 /// Exponential distribution
282 Exponential,
283 /// Gamma distribution
284 Gamma,
285 /// Beta distribution
286 Beta,
287 /// Weibull distribution
288 Weibull,
289 /// Log-normal distribution
290 LogNormal,
291 /// Uniform distribution
292 Uniform,
293 /// Multimodal distribution
294 Multimodal,
295 /// Unknown/custom distribution
296 Unknown,
297}
298
299/// Convergence analysis results
300#[derive(Debug, Clone)]
301pub struct ConvergenceAnalysis {
302 /// Convergence trajectory clusters
303 pub trajectory_clusters: Vec<TrajectoryCluster>,
304 /// Convergence rates by cluster
305 pub convergence_rates: Vec<f64>,
306 /// Plateau analysis
307 pub plateau_analysis: PlateauAnalysis,
308 /// Premature convergence detection
309 pub premature_convergence: bool,
310 /// Diversity evolution
311 pub diversity_evolution: Vec<f64>,
312}
313
314/// Trajectory cluster for convergence analysis
315#[derive(Debug, Clone)]
316pub struct TrajectoryCluster {
317 /// Cluster ID
318 pub id: usize,
319 /// Trajectory patterns in this cluster
320 pub trajectories: Vec<Vec<f64>>,
321 /// Representative trajectory
322 pub representative_trajectory: Vec<f64>,
323 /// Convergence characteristics
324 pub convergence_characteristics: ConvergenceCharacteristics,
325}
326
327/// Convergence characteristics
328#[derive(Debug, Clone)]
329pub struct ConvergenceCharacteristics {
330 /// Convergence speed
331 pub speed: f64,
332 /// Final convergence quality
333 pub final_quality: f64,
334 /// Stability measure
335 pub stability: f64,
336 /// Exploration vs exploitation balance
337 pub exploration_exploitation_ratio: f64,
338}
339
340/// Plateau analysis in convergence trajectories
341#[derive(Debug, Clone)]
342pub struct PlateauAnalysis {
343 /// Number of plateaus detected
344 pub num_plateaus: usize,
345 /// Plateau durations
346 pub plateau_durations: Vec<usize>,
347 /// Plateau energy levels
348 pub plateau_energies: Vec<f64>,
349 /// Escape probabilities from plateaus
350 pub escape_probabilities: Vec<f64>,
351}
352
353/// Correlation analysis results
354#[derive(Debug, Clone)]
355pub struct CorrelationAnalysis {
356 /// Variable correlation matrix
357 pub variable_correlations: Vec<Vec<f64>>,
358 /// Energy-variable correlations
359 pub energy_correlations: Vec<f64>,
360 /// Significant correlations
361 pub significant_correlations: Vec<(usize, usize, f64)>,
362 /// Correlation patterns
363 pub correlation_patterns: Vec<CorrelationPattern>,
364}
365
366/// Correlation patterns
367#[derive(Debug, Clone)]
368pub struct CorrelationPattern {
369 /// Pattern description
370 pub description: String,
371 /// Variables involved
372 pub variables: Vec<usize>,
373 /// Pattern strength
374 pub strength: f64,
375 /// Pattern type
376 pub pattern_type: PatternType,
377}
378
379/// Types of correlation patterns
380#[derive(Debug, Clone, PartialEq, Eq)]
381pub enum PatternType {
382 /// Positive correlation
383 Positive,
384 /// Negative correlation
385 Negative,
386 /// Non-linear correlation
387 NonLinear,
388 /// Conditional correlation
389 Conditional,
390 /// Cluster-specific correlation
391 ClusterSpecific,
392}
393
394/// Outlier information
395#[derive(Debug, Clone)]
396pub struct OutlierInfo {
397 /// Solution ID
398 pub solution_id: usize,
399 /// Outlier score
400 pub outlier_score: f64,
401 /// Outlier type
402 pub outlier_type: OutlierType,
403 /// Distance to nearest cluster
404 pub distance_to_cluster: f64,
405}
406
407/// Types of outliers
408#[derive(Debug, Clone, PartialEq, Eq)]
409pub enum OutlierType {
410 /// Energy outlier (unusually high/low energy)
411 Energy,
412 /// Structural outlier (unusual solution structure)
413 Structural,
414 /// Performance outlier (unusual algorithm performance)
415 Performance,
416 /// Global outlier (outlier in multiple dimensions)
417 Global,
418}
419
420/// Clustering performance metrics
421#[derive(Debug, Clone)]
422pub struct ClusteringPerformanceMetrics {
423 /// Clustering time
424 pub clustering_time: Duration,
425 /// Analysis time
426 pub analysis_time: Duration,
427 /// Memory usage
428 pub memory_usage: usize,
429 /// Scalability metrics
430 pub scalability_metrics: ScalabilityMetrics,
431 /// Algorithm efficiency
432 pub efficiency_metrics: EfficiencyMetrics,
433}
434
435/// Scalability metrics
436#[derive(Debug, Clone)]
437pub struct ScalabilityMetrics {
438 /// Time complexity estimate
439 pub time_complexity: String,
440 /// Space complexity estimate
441 pub space_complexity: String,
442 /// Performance vs data size relationship
443 pub scaling_factor: f64,
444 /// Parallelization efficiency
445 pub parallelization_efficiency: f64,
446}
447
448/// Algorithm efficiency metrics
449#[derive(Debug, Clone)]
450pub struct EfficiencyMetrics {
451 /// Convergence efficiency
452 pub convergence_efficiency: f64,
453 /// Resource utilization
454 pub resource_utilization: f64,
455 /// Quality vs time trade-off
456 pub quality_time_ratio: f64,
457 /// Robustness measure
458 pub robustness: f64,
459}
460
461/// Optimization recommendations based on clustering analysis
462#[derive(Debug, Clone)]
463pub struct OptimizationRecommendation {
464 /// Recommendation type
465 pub recommendation_type: RecommendationType,
466 /// Recommendation description
467 pub description: String,
468 /// Expected improvement
469 pub expected_improvement: f64,
470 /// Implementation difficulty
471 pub difficulty: DifficultyLevel,
472 /// Priority level
473 pub priority: PriorityLevel,
474 /// Supporting evidence
475 pub evidence: Vec<String>,
476}
477
478/// Types of optimization recommendations
479#[derive(Debug, Clone, PartialEq, Eq)]
480pub enum RecommendationType {
481 /// Parameter tuning recommendation
482 ParameterTuning,
483 /// Algorithm modification
484 AlgorithmModification,
485 /// Problem reformulation
486 ProblemReformulation,
487 /// Initialization strategy
488 InitializationStrategy,
489 /// Termination criteria
490 TerminationCriteria,
491 /// Hybrid approach
492 HybridApproach,
493 /// Multi-start strategy
494 MultiStart,
495 /// Constraint handling
496 ConstraintHandling,
497}
498
499/// Difficulty levels for implementing recommendations
500#[derive(Debug, Clone, PartialEq, Eq)]
501pub enum DifficultyLevel {
502 /// Easy to implement
503 Easy,
504 /// Moderate implementation effort
505 Moderate,
506 /// Difficult implementation
507 Difficult,
508 /// Very difficult, requires significant changes
509 VeryDifficult,
510}
511
512/// Priority levels for recommendations
513#[derive(Debug, Clone, PartialEq, Eq)]
514pub enum PriorityLevel {
515 /// Low priority
516 Low,
517 /// Medium priority
518 Medium,
519 /// High priority
520 High,
521 /// Critical priority
522 Critical,
523}
524
525/// Analysis statistics
526#[derive(Debug, Clone)]
527pub struct AnalysisStatistics {
528 /// Total solutions analyzed
529 pub total_solutions: usize,
530 /// Total analysis time
531 pub total_time: Duration,
532 /// Cache hit rate
533 pub cache_hit_rate: f64,
534 /// Memory usage peak
535 pub peak_memory: usize,
536}