quantum_clustering_simple/
quantum_clustering_simple.rs

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