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