quantum_clustering_simple/
quantum_clustering_simple.rs

1#![allow(clippy::pedantic, clippy::unnecessary_wraps)]
2//! Simple Quantum Clustering Example
3//!
4//! This example demonstrates basic quantum clustering functionality
5//! with the working APIs in the quantum ML module.
6
7use quantrs2_ml::clustering::{
8    AffinityType, QuantumClusterer, QuantumDBSCANConfig, QuantumKMeansConfig, QuantumSpectralConfig,
9};
10use quantrs2_ml::dimensionality_reduction::{QuantumDistanceMetric, QuantumEnhancementLevel};
11use quantrs2_ml::prelude::*;
12use scirs2_core::ndarray::{array, Array2};
13
14fn main() -> Result<()> {
15    println!("🌀 Simple Quantum Clustering Demo");
16    println!("=================================\n");
17
18    // Create simple sample data
19    let data = array![
20        [1.0, 1.0],
21        [1.1, 1.1],
22        [0.9, 0.9],
23        [1.2, 0.8],
24        [5.0, 5.0],
25        [5.1, 5.1],
26        [4.9, 4.9],
27        [5.2, 4.8],
28    ];
29
30    println!("Sample data:");
31    for (i, row) in data.rows().into_iter().enumerate() {
32        println!("  Point {}: [{:.1}, {:.1}]", i, row[0], row[1]);
33    }
34
35    // Demo 1: Quantum K-means Clustering
36    demo_quantum_kmeans(&data)?;
37
38    // Demo 2: Quantum DBSCAN
39    demo_quantum_dbscan(&data)?;
40
41    // Demo 3: Quantum Spectral Clustering
42    demo_quantum_spectral(&data)?;
43
44    println!("\n✅ Simple quantum clustering demos completed successfully!");
45
46    Ok(())
47}
48
49/// Demo quantum K-means clustering
50fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
51    println!("\n🎯 Demo 1: Quantum K-means Clustering");
52    println!("-------------------------------------");
53
54    // Create K-means configuration
55    let config = QuantumKMeansConfig {
56        n_clusters: 2,
57        max_iterations: 100,
58        tolerance: 1e-4,
59        distance_metric: QuantumDistanceMetric::QuantumEuclidean,
60        quantum_reps: 2,
61        enhancement_level: QuantumEnhancementLevel::Moderate,
62        seed: Some(42),
63    };
64
65    // Create and train clusterer
66    let mut clusterer = QuantumClusterer::kmeans(config);
67    let result = clusterer.fit(data)?;
68
69    println!("   Clusters found: {}", result.n_clusters);
70    println!("   Labels: {:?}", result.labels);
71    println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
72
73    // Show cluster centers if available
74    if let Some(centers) = &result.cluster_centers {
75        println!("   Cluster centers:");
76        for (i, center) in centers.rows().into_iter().enumerate() {
77            println!("     Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
78        }
79    }
80
81    // Test prediction on new data
82    let new_data = array![[1.5, 1.5], [4.5, 4.5]];
83    let predictions = clusterer.predict(&new_data)?;
84    println!("   Predictions for new data: {predictions:?}");
85
86    Ok(())
87}
88
89/// Demo quantum DBSCAN clustering
90fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
91    println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
92    println!("------------------------------------");
93
94    // Create DBSCAN configuration
95    let config = QuantumDBSCANConfig {
96        eps: 1.0,
97        min_samples: 3,
98        distance_metric: QuantumDistanceMetric::QuantumEuclidean,
99        enhancement_level: QuantumEnhancementLevel::Moderate,
100        seed: None,
101    };
102
103    // Create and train clusterer
104    let mut clusterer = QuantumClusterer::dbscan(config);
105    let result = clusterer.fit(data)?;
106
107    println!("   Clusters found: {}", result.n_clusters);
108    println!("   Labels: {:?}", result.labels);
109
110    // Count noise points (using MAX as noise label)
111    let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count();
112    println!("   Noise points: {noise_count}");
113
114    Ok(())
115}
116
117/// Demo quantum spectral clustering
118fn demo_quantum_spectral(data: &Array2<f64>) -> Result<()> {
119    println!("\n🎯 Demo 3: Quantum Spectral Clustering");
120    println!("--------------------------------------");
121
122    // Create spectral configuration
123    let config = QuantumSpectralConfig {
124        n_clusters: 2,
125        affinity: AffinityType::RBF,
126        gamma: 1.0,
127        enhancement_level: QuantumEnhancementLevel::Light,
128        seed: None,
129    };
130
131    // Create and train clusterer
132    let mut clusterer = QuantumClusterer::spectral(config);
133    let result = clusterer.fit(data)?;
134
135    println!("   Clusters found: {}", result.n_clusters);
136    println!("   Labels: {:?}", result.labels);
137
138    Ok(())
139}