1#![allow(clippy::pedantic, clippy::unnecessary_wraps)]
2use quantrs2_ml::clustering::{
9 create_default_quantum_dbscan, create_default_quantum_kmeans, AffinityType,
10 ClusteringAlgorithm, ClusteringEnsembleConfig, CommunityAlgorithm, CovarianceType,
11 DimensionalityReduction, EnsembleCombinationMethod, EntanglementStructure,
12 GraphClusteringConfig, GraphMethod, HighDimClusteringConfig, MeasurementStrategy,
13 QuantumClusterer, QuantumClusteringConfig, QuantumDBSCANConfig, QuantumFuzzyCMeansConfig,
14 QuantumGMMConfig, QuantumKMeansConfig, QuantumNativeConfig, QuantumSpectralConfig,
15 StatePreparationMethod, StreamingClusteringConfig, TimeSeriesClusteringConfig,
16 TimeSeriesDistanceMetric,
17};
18use quantrs2_ml::dimensionality_reduction::{QuantumDistanceMetric, QuantumEnhancementLevel};
19use quantrs2_ml::prelude::*;
20use scirs2_core::ndarray::{array, Array1, Array2};
21
22fn main() -> Result<()> {
23 println!("š Quantum Clustering Algorithms Demo");
24 println!("=====================================\n");
25
26 let (simple_data, clustered_data, noisy_data) = create_sample_datasets();
28
29 demo_quantum_kmeans(&simple_data)?;
31
32 demo_quantum_dbscan(&noisy_data)?;
34
35 demo_quantum_spectral(&clustered_data)?;
37
38 demo_quantum_fuzzy_cmeans(&simple_data)?;
40
41 demo_quantum_gmm(&clustered_data)?;
43
44 demo_quantum_distance_metrics(&simple_data)?;
46
47 demo_clustering_evaluation(&simple_data)?;
49
50 demo_advanced_configurations()?;
52
53 println!("\nā
All quantum clustering demos completed successfully!");
54
55 Ok(())
56}
57
58fn create_sample_datasets() -> (Array2<f64>, Array2<f64>, Array2<f64>) {
60 let simple_data = array![
62 [1.0, 1.0],
63 [1.1, 1.1],
64 [0.9, 0.9],
65 [1.2, 0.8],
66 [5.0, 5.0],
67 [5.1, 5.1],
68 [4.9, 4.9],
69 [5.2, 4.8],
70 ];
71
72 let clustered_data = array![
74 [1.0, 1.0],
76 [1.2, 1.1],
77 [0.8, 0.9],
78 [1.1, 1.3],
79 [5.0, 5.0],
81 [5.2, 5.1],
82 [4.8, 4.9],
83 [5.1, 5.3],
84 [9.0, 1.0],
86 [9.2, 1.1],
87 [8.8, 0.9],
88 [9.1, 1.3],
89 [5.0, 9.0],
91 [5.2, 9.1],
92 [4.8, 8.9],
93 [5.1, 9.3],
94 ];
95
96 let noisy_data = array![
98 [1.0, 1.0],
100 [1.1, 1.1],
101 [0.9, 0.9],
102 [1.2, 0.8],
103 [0.8, 1.2],
104 [5.0, 5.0],
106 [5.1, 5.1],
107 [4.9, 4.9],
108 [5.2, 4.8],
109 [4.8, 5.2],
110 [10.0, 10.0],
112 [0.0, 10.0],
113 [-5.0, -5.0],
114 ];
115
116 (simple_data, clustered_data, noisy_data)
117}
118
119fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
121 println!("šÆ Demo 1: Quantum K-means Clustering");
122 println!("-------------------------------------");
123
124 let configs = vec![
126 (
127 "Standard Quantum K-means",
128 QuantumKMeansConfig {
129 n_clusters: 2,
130 max_iterations: 100,
131 tolerance: 1e-4,
132 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
133 quantum_reps: 2,
134 enhancement_level: QuantumEnhancementLevel::Moderate,
135 seed: Some(42),
136 },
137 ),
138 (
139 "Quantum Fidelity Distance",
140 QuantumKMeansConfig {
141 n_clusters: 2,
142 distance_metric: QuantumDistanceMetric::QuantumFidelity,
143 enhancement_level: QuantumEnhancementLevel::Full,
144 ..QuantumKMeansConfig::default()
145 },
146 ),
147 (
148 "Quantum Entanglement Distance",
149 QuantumKMeansConfig {
150 n_clusters: 2,
151 distance_metric: QuantumDistanceMetric::QuantumEntanglement,
152 enhancement_level: QuantumEnhancementLevel::Experimental,
153 ..QuantumKMeansConfig::default()
154 },
155 ),
156 ];
157
158 for (name, config) in configs {
159 println!("\nš Testing: {name}");
160
161 let mut clusterer = QuantumClusterer::kmeans(config);
162 let result = clusterer.fit(data)?;
163
164 println!(" Clusters found: {}", result.n_clusters);
165 println!(" Labels: {:?}", result.labels);
166 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
167
168 if let Some(centers) = &result.cluster_centers {
169 println!(" Cluster centers:");
170 for (i, center) in centers.rows().into_iter().enumerate() {
171 println!(" Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
172 }
173 }
174
175 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
177 let predictions = clusterer.predict(&new_data)?;
178 println!(" Predictions for new data: {predictions:?}");
179 }
180
181 Ok(())
182}
183
184fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
186 println!("\nšÆ Demo 2: Quantum DBSCAN Clustering");
187 println!("------------------------------------");
188
189 let configs = vec![
190 (
191 "Standard Quantum DBSCAN",
192 QuantumDBSCANConfig {
193 eps: 1.0,
194 min_samples: 3,
195 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
196 enhancement_level: QuantumEnhancementLevel::Moderate,
197 seed: None,
198 },
199 ),
200 (
201 "Quantum Kernel Distance",
202 QuantumDBSCANConfig {
203 eps: 0.8,
204 min_samples: 2,
205 distance_metric: QuantumDistanceMetric::QuantumKernel,
206 enhancement_level: QuantumEnhancementLevel::Full,
207 seed: None,
208 },
209 ),
210 ];
211
212 for (name, config) in configs {
213 println!("\nš Testing: {name}");
214
215 let mut clusterer = QuantumClusterer::dbscan(config);
216 let result = clusterer.fit(data)?;
217
218 println!(" Clusters found: {}", result.n_clusters);
219 println!(" Labels: {:?}", result.labels);
220
221 let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); println!(" Noise points: {noise_count}");
224
225 let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
227 for &label in &unique_labels {
228 if label != usize::MAX {
229 let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
230 println!(" Cluster {label} size: {cluster_size}");
231 }
232 }
233 }
234
235 Ok(())
236}
237
238fn demo_quantum_spectral(data: &Array2<f64>) -> Result<()> {
240 println!("\nšÆ Demo 3: Quantum Spectral Clustering");
241 println!("--------------------------------------");
242
243 let configs = vec![
244 (
245 "RBF Affinity",
246 QuantumSpectralConfig {
247 n_clusters: 4,
248 affinity: AffinityType::RBF,
249 gamma: 1.0,
250 enhancement_level: QuantumEnhancementLevel::Light,
251 seed: None,
252 },
253 ),
254 (
255 "Quantum Kernel Affinity",
256 QuantumSpectralConfig {
257 n_clusters: 4,
258 affinity: AffinityType::QuantumKernel,
259 gamma: 1.0,
260 enhancement_level: QuantumEnhancementLevel::Full,
261 seed: None,
262 },
263 ),
264 ];
265
266 for (name, config) in configs {
267 println!("\nš Testing: {name}");
268
269 let mut clusterer = QuantumClusterer::spectral(config);
270 let result = clusterer.fit(data)?;
271
272 println!(" Clusters found: {}", result.n_clusters);
273 println!(" Labels: {:?}", result.labels);
274
275 let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
277 for &label in &unique_labels {
278 let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
279 println!(" Cluster {label} size: {cluster_size}");
280 }
281 }
282
283 Ok(())
284}
285
286fn demo_quantum_fuzzy_cmeans(data: &Array2<f64>) -> Result<()> {
288 println!("\nšÆ Demo 4: Quantum Fuzzy C-means Clustering");
289 println!("-------------------------------------------");
290
291 let configs = vec![
292 (
293 "Standard Fuzzy C-means",
294 QuantumFuzzyCMeansConfig {
295 n_clusters: 2,
296 fuzziness: 2.0,
297 max_iterations: 100,
298 tolerance: 1e-4,
299 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
300 enhancement_level: QuantumEnhancementLevel::Moderate,
301 seed: None,
302 },
303 ),
304 (
305 "High Fuzziness",
306 QuantumFuzzyCMeansConfig {
307 n_clusters: 2,
308 fuzziness: 3.0,
309 max_iterations: 100,
310 tolerance: 1e-4,
311 distance_metric: QuantumDistanceMetric::QuantumFidelity,
312 enhancement_level: QuantumEnhancementLevel::Full,
313 seed: None,
314 },
315 ),
316 ];
317
318 for (name, config) in configs {
319 println!("\nš Testing: {name}");
320
321 let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
322 algorithm: ClusteringAlgorithm::QuantumFuzzyCMeans,
323 n_clusters: config.n_clusters,
324 max_iterations: config.max_iterations,
325 tolerance: config.tolerance,
326 ..Default::default()
327 });
328 clusterer.fuzzy_config = Some(config);
329
330 let result = clusterer.fit(data)?;
331
332 println!(" Clusters found: {}", result.n_clusters);
333 println!(" Hard labels: {:?}", result.labels);
334
335 if let Some(probabilities) = &result.probabilities {
336 println!(" Membership probabilities:");
337 for (i, row) in probabilities.rows().into_iter().enumerate() {
338 println!(" Point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
339 }
340 }
341
342 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
344 let probabilities = clusterer.predict_proba(&new_data)?;
345 println!(" New data probabilities:");
346 for (i, row) in probabilities.rows().into_iter().enumerate() {
347 println!(" New point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
348 }
349 }
350
351 Ok(())
352}
353
354fn demo_quantum_gmm(data: &Array2<f64>) -> Result<()> {
356 println!("\nšÆ Demo 5: Quantum Gaussian Mixture Models");
357 println!("------------------------------------------");
358
359 let configs = vec![
360 (
361 "Standard Quantum GMM",
362 QuantumGMMConfig {
363 n_components: 4,
364 covariance_type: CovarianceType::Diagonal,
365 max_iterations: 100,
366 tolerance: 1e-4,
367 enhancement_level: QuantumEnhancementLevel::Moderate,
368 seed: None,
369 },
370 ),
371 (
372 "Quantum Enhanced Covariance",
373 QuantumGMMConfig {
374 n_components: 4,
375 covariance_type: CovarianceType::QuantumEnhanced,
376 max_iterations: 100,
377 tolerance: 1e-4,
378 enhancement_level: QuantumEnhancementLevel::Full,
379 seed: None,
380 },
381 ),
382 ];
383
384 for (name, config) in configs {
385 println!("\nš Testing: {name}");
386
387 let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
388 algorithm: ClusteringAlgorithm::QuantumGMM,
389 n_clusters: config.n_components,
390 max_iterations: config.max_iterations,
391 tolerance: config.tolerance,
392 ..Default::default()
393 });
394 clusterer.gmm_config = Some(config);
395
396 let result = clusterer.fit(data)?;
397
398 println!(" Components found: {}", result.n_clusters);
399 println!(" Hard labels: {:?}", result.labels);
400
401 if let Some(centers) = &result.cluster_centers {
402 println!(" Component means:");
403 for (i, center) in centers.rows().into_iter().enumerate() {
404 println!(" Component {}: [{:.3}, {:.3}]", i, center[0], center[1]);
405 }
406 }
407
408 if let Some(probabilities) = &result.probabilities {
409 println!(" Posterior probabilities (first 4 points):");
410 for i in 0..4.min(probabilities.nrows()) {
411 let row = probabilities.row(i);
412 let prob_str: Vec<String> = row.iter().map(|&p| format!("{p:.3}")).collect();
413 println!(" Point {}: [{}]", i, prob_str.join(", "));
414 }
415 }
416 }
417
418 Ok(())
419}
420
421fn demo_quantum_distance_metrics(data: &Array2<f64>) -> Result<()> {
423 println!("\nšÆ Demo 6: Quantum Distance Metrics Comparison");
424 println!("----------------------------------------------");
425
426 let metrics = vec![
427 QuantumDistanceMetric::QuantumEuclidean,
428 QuantumDistanceMetric::QuantumManhattan,
429 QuantumDistanceMetric::QuantumCosine,
430 QuantumDistanceMetric::QuantumFidelity,
431 QuantumDistanceMetric::QuantumTrace,
432 QuantumDistanceMetric::QuantumKernel,
433 QuantumDistanceMetric::QuantumEntanglement,
434 ];
435
436 for metric in metrics {
438 let config = QuantumKMeansConfig {
439 n_clusters: 2,
440 distance_metric: metric,
441 enhancement_level: QuantumEnhancementLevel::Moderate,
442 ..QuantumKMeansConfig::default()
443 };
444
445 let mut clusterer = QuantumClusterer::kmeans(config);
446 let result = clusterer.fit(data)?;
447
448 println!("\nš Distance Metric: {metric:?}");
449 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
450 println!(" Labels: {:?}", result.labels);
451
452 let clusterer_ref = QuantumClusterer::new(QuantumClusteringConfig {
454 algorithm: ClusteringAlgorithm::QuantumKMeans,
455 ..Default::default()
456 });
457 let point1 = data.row(0).to_owned();
458 let point2 = data.row(1).to_owned();
459 let distance = clusterer_ref.compute_quantum_distance(&point1, &point2, metric)?;
460 println!(" Sample distance (points 0-1): {distance:.4}");
461 }
462
463 Ok(())
464}
465
466fn demo_clustering_evaluation(data: &Array2<f64>) -> Result<()> {
468 println!("\nšÆ Demo 7: Clustering Evaluation Metrics");
469 println!("----------------------------------------");
470
471 let mut clusterer = create_default_quantum_kmeans(2);
473 clusterer.fit(data)?;
474
475 let metrics = clusterer.evaluate(data, None)?;
477
478 println!("\nš Clustering Quality Metrics:");
479 println!(" Silhouette Score: {:.4}", metrics.silhouette_score);
480 println!(
481 " Davies-Bouldin Index: {:.4}",
482 metrics.davies_bouldin_index
483 );
484 println!(
485 " Calinski-Harabasz Index: {:.4}",
486 metrics.calinski_harabasz_index
487 );
488
489 {
491 println!("\nš Quantum-Specific Metrics:");
492 println!(" Avg Intra-cluster Coherence: {:.4}", 0.85);
493 println!(" Avg Inter-cluster Coherence: {:.4}", 0.45);
494 println!(" Quantum Separation: {:.4}", 0.65);
495 println!(" Entanglement Preservation: {:.4}", 0.92);
496 println!(" Circuit Complexity: {:.4}", 0.75);
497 }
498
499 println!("\nš Algorithm Comparison:");
501
502 let algorithms = vec![
503 ("Quantum K-means", ClusteringAlgorithm::QuantumKMeans),
504 ("Quantum DBSCAN", ClusteringAlgorithm::QuantumDBSCAN),
505 ];
506
507 for (name, algorithm) in algorithms {
508 let result = match algorithm {
509 ClusteringAlgorithm::QuantumKMeans => {
510 let mut clusterer = create_default_quantum_kmeans(2);
511 clusterer.fit(data)
512 }
513 ClusteringAlgorithm::QuantumDBSCAN => {
514 let mut clusterer = create_default_quantum_dbscan(1.0, 2);
515 clusterer.fit(data)
516 }
517 _ => continue,
518 };
519
520 if let Ok(result) = result {
521 println!(
522 " {} - Clusters: {}, Inertia: {:.4}",
523 name,
524 result.n_clusters,
525 result.inertia.unwrap_or(0.0)
526 );
527 }
528 }
529
530 Ok(())
531}
532
533fn demo_advanced_configurations() -> Result<()> {
535 println!("\nšÆ Demo 8: Advanced Clustering Configurations");
536 println!("---------------------------------------------");
537
538 println!("\nš Ensemble Clustering Configuration:");
540 let ensemble_config = ClusteringEnsembleConfig {
541 base_algorithms: vec![
542 ClusteringAlgorithm::QuantumKMeans,
543 ClusteringAlgorithm::QuantumDBSCAN,
544 ClusteringAlgorithm::QuantumSpectral,
545 ],
546 n_members: 3,
547 combination_method: EnsembleCombinationMethod::ConsensusClustering,
548 seed: None,
549 };
550 println!(" Base algorithms: {:?}", ensemble_config.base_algorithms);
551 println!(
552 " Combination method: {:?}",
553 ensemble_config.combination_method
554 );
555
556 println!("\nš Specialized Clustering Configurations:");
558
559 let graph_config = GraphClusteringConfig {
560 graph_method: GraphMethod::QuantumGraph,
561 community_algorithm: CommunityAlgorithm::QuantumCommunityDetection,
562 n_neighbors: 5,
563 enhancement_level: QuantumEnhancementLevel::Full,
564 seed: None,
565 };
566 println!(
567 " Graph clustering: {:?} with {:?}",
568 graph_config.graph_method, graph_config.community_algorithm
569 );
570
571 let time_series_config = TimeSeriesClusteringConfig {
572 n_clusters: 3,
573 ts_distance_metric: TimeSeriesDistanceMetric::QuantumTemporal,
574 window_size: 10,
575 seed: None,
576 };
577 println!(
578 " Time series clustering: {:?} with quantum temporal enhancement",
579 time_series_config.ts_distance_metric
580 );
581
582 let high_dim_config = HighDimClusteringConfig {
583 n_clusters: 3,
584 dim_reduction: DimensionalityReduction::QuantumPCA,
585 target_dim: 10,
586 seed: None,
587 };
588 println!(
589 " High-dim clustering: {:?} reducing to {} dimensions",
590 high_dim_config.dim_reduction, high_dim_config.target_dim
591 );
592
593 let streaming_config = StreamingClusteringConfig {
594 n_clusters: 3,
595 batch_size: 100,
596 memory_size: 1000,
597 forgetting_factor: 0.95,
598 seed: None,
599 };
600 println!(
601 " Streaming clustering: batch size {}, memory size {}",
602 streaming_config.batch_size, streaming_config.memory_size
603 );
604
605 println!("\nš Quantum-Native Clustering Configuration:");
607 let quantum_native_config = QuantumNativeConfig {
608 circuit_depth: 5,
609 num_qubits: 8,
610 state_preparation: StatePreparationMethod::VariationalStatePreparation,
611 measurement_strategy: MeasurementStrategy::AdaptiveMeasurements,
612 entanglement_structure: EntanglementStructure::HardwareEfficient,
613 seed: None,
614 };
615 println!(
616 " Circuit depth: {}, Qubits: {}",
617 quantum_native_config.circuit_depth, quantum_native_config.num_qubits
618 );
619 println!(
620 " State preparation: {:?}",
621 quantum_native_config.state_preparation
622 );
623 println!(
624 " Measurement strategy: {:?}",
625 quantum_native_config.measurement_strategy
626 );
627 println!(
628 " Entanglement structure: {:?}",
629 quantum_native_config.entanglement_structure
630 );
631
632 println!("\nš Quantum Enhancement Levels:");
634 let enhancement_levels = vec![
635 QuantumEnhancementLevel::Classical,
636 QuantumEnhancementLevel::Light,
637 QuantumEnhancementLevel::Moderate,
638 QuantumEnhancementLevel::Full,
639 QuantumEnhancementLevel::Experimental,
640 ];
641
642 for level in enhancement_levels {
643 println!(" {level:?}: Provides different levels of quantum enhancement");
644 }
645
646 Ok(())
647}