QuantumClusterer

Struct QuantumClusterer 

Source
pub struct QuantumClusterer {
    pub kmeans_config: Option<QuantumKMeansConfig>,
    pub dbscan_config: Option<QuantumDBSCANConfig>,
    pub spectral_config: Option<QuantumSpectralConfig>,
    pub fuzzy_config: Option<QuantumFuzzyCMeansConfig>,
    pub gmm_config: Option<QuantumGMMConfig>,
    /* private fields */
}
Expand description

Main quantum clusterer

Fields§

§kmeans_config: Option<QuantumKMeansConfig>§dbscan_config: Option<QuantumDBSCANConfig>§spectral_config: Option<QuantumSpectralConfig>§fuzzy_config: Option<QuantumFuzzyCMeansConfig>§gmm_config: Option<QuantumGMMConfig>

Implementations§

Source§

impl QuantumClusterer

Source

pub fn new(config: QuantumClusteringConfig) -> Self

Create new quantum clusterer

Examples found in repository?
examples/quantum_clustering.rs (lines 328-334)
294fn demo_quantum_fuzzy_cmeans(data: &Array2<f64>) -> Result<()> {
295    println!("\n🎯 Demo 4: Quantum Fuzzy C-means Clustering");
296    println!("-------------------------------------------");
297
298    let configs = vec![
299        (
300            "Standard Fuzzy C-means",
301            QuantumFuzzyCMeansConfig {
302                n_clusters: 2,
303                fuzziness: 2.0,
304                max_iterations: 100,
305                tolerance: 1e-4,
306                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
307                enhancement_level: QuantumEnhancementLevel::Moderate,
308                seed: None,
309            },
310        ),
311        (
312            "High Fuzziness",
313            QuantumFuzzyCMeansConfig {
314                n_clusters: 2,
315                fuzziness: 3.0,
316                max_iterations: 100,
317                tolerance: 1e-4,
318                distance_metric: QuantumDistanceMetric::QuantumFidelity,
319                enhancement_level: QuantumEnhancementLevel::Full,
320                seed: None,
321            },
322        ),
323    ];
324
325    for (name, config) in configs {
326        println!("\n📊 Testing: {name}");
327
328        let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
329            algorithm: ClusteringAlgorithm::QuantumFuzzyCMeans,
330            n_clusters: config.n_clusters,
331            max_iterations: config.max_iterations,
332            tolerance: config.tolerance,
333            ..Default::default()
334        });
335        clusterer.fuzzy_config = Some(config);
336
337        let result = clusterer.fit(data)?;
338
339        println!("   Clusters found: {}", result.n_clusters);
340        println!("   Hard labels: {:?}", result.labels);
341
342        if let Some(probabilities) = &result.probabilities {
343            println!("   Membership probabilities:");
344            for (i, row) in probabilities.rows().into_iter().enumerate() {
345                println!("     Point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
346            }
347        }
348
349        // Test probabilistic prediction
350        let new_data = array![[1.5, 1.5], [4.5, 4.5]];
351        let probabilities = clusterer.predict_proba(&new_data)?;
352        println!("   New data probabilities:");
353        for (i, row) in probabilities.rows().into_iter().enumerate() {
354            println!("     New point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
355        }
356    }
357
358    Ok(())
359}
360
361/// Demo quantum Gaussian mixture models
362fn demo_quantum_gmm(data: &Array2<f64>) -> Result<()> {
363    println!("\n🎯 Demo 5: Quantum Gaussian Mixture Models");
364    println!("------------------------------------------");
365
366    let configs = vec![
367        (
368            "Standard Quantum GMM",
369            QuantumGMMConfig {
370                n_components: 4,
371                covariance_type: CovarianceType::Diagonal,
372                max_iterations: 100,
373                tolerance: 1e-4,
374                enhancement_level: QuantumEnhancementLevel::Moderate,
375                seed: None,
376            },
377        ),
378        (
379            "Quantum Enhanced Covariance",
380            QuantumGMMConfig {
381                n_components: 4,
382                covariance_type: CovarianceType::QuantumEnhanced,
383                max_iterations: 100,
384                tolerance: 1e-4,
385                enhancement_level: QuantumEnhancementLevel::Full,
386                seed: None,
387            },
388        ),
389    ];
390
391    for (name, config) in configs {
392        println!("\n📊 Testing: {name}");
393
394        let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
395            algorithm: ClusteringAlgorithm::QuantumGMM,
396            n_clusters: config.n_components,
397            max_iterations: config.max_iterations,
398            tolerance: config.tolerance,
399            ..Default::default()
400        });
401        clusterer.gmm_config = Some(config);
402
403        let result = clusterer.fit(data)?;
404
405        println!("   Components found: {}", result.n_clusters);
406        println!("   Hard labels: {:?}", result.labels);
407
408        if let Some(centers) = &result.cluster_centers {
409            println!("   Component means:");
410            for (i, center) in centers.rows().into_iter().enumerate() {
411                println!("     Component {}: [{:.3}, {:.3}]", i, center[0], center[1]);
412            }
413        }
414
415        if let Some(probabilities) = &result.probabilities {
416            println!("   Posterior probabilities (first 4 points):");
417            for i in 0..4.min(probabilities.nrows()) {
418                let row = probabilities.row(i);
419                let prob_str: Vec<String> = row.iter().map(|&p| format!("{p:.3}")).collect();
420                println!("     Point {}: [{}]", i, prob_str.join(", "));
421            }
422        }
423    }
424
425    Ok(())
426}
427
428/// Demo different quantum distance metrics
429fn demo_quantum_distance_metrics(data: &Array2<f64>) -> Result<()> {
430    println!("\n🎯 Demo 6: Quantum Distance Metrics Comparison");
431    println!("----------------------------------------------");
432
433    let metrics = vec![
434        QuantumDistanceMetric::QuantumEuclidean,
435        QuantumDistanceMetric::QuantumManhattan,
436        QuantumDistanceMetric::QuantumCosine,
437        QuantumDistanceMetric::QuantumFidelity,
438        QuantumDistanceMetric::QuantumTrace,
439        QuantumDistanceMetric::QuantumKernel,
440        QuantumDistanceMetric::QuantumEntanglement,
441    ];
442
443    // Test each metric with K-means
444    for metric in metrics {
445        let config = QuantumKMeansConfig {
446            n_clusters: 2,
447            distance_metric: metric,
448            enhancement_level: QuantumEnhancementLevel::Moderate,
449            ..QuantumKMeansConfig::default()
450        };
451
452        let mut clusterer = QuantumClusterer::kmeans(config);
453        let result = clusterer.fit(data)?;
454
455        println!("\n📊 Distance Metric: {metric:?}");
456        println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
457        println!("   Labels: {:?}", result.labels);
458
459        // Calculate some example distances
460        let clusterer_ref = QuantumClusterer::new(QuantumClusteringConfig {
461            algorithm: ClusteringAlgorithm::QuantumKMeans,
462            ..Default::default()
463        });
464        let point1 = data.row(0).to_owned();
465        let point2 = data.row(1).to_owned();
466        let distance = clusterer_ref.compute_quantum_distance(&point1, &point2, metric)?;
467        println!("   Sample distance (points 0-1): {distance:.4}");
468    }
469
470    Ok(())
471}
Source

pub fn kmeans(config: QuantumKMeansConfig) -> Self

Create quantum K-means clusterer

Examples found in repository?
examples/quantum_clustering_simple.rs (line 73)
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}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 168)
127fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
128    println!("🎯 Demo 1: Quantum K-means Clustering");
129    println!("-------------------------------------");
130
131    // Create different K-means configurations
132    let configs = vec![
133        (
134            "Standard Quantum K-means",
135            QuantumKMeansConfig {
136                n_clusters: 2,
137                max_iterations: 100,
138                tolerance: 1e-4,
139                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
140                quantum_reps: 2,
141                enhancement_level: QuantumEnhancementLevel::Moderate,
142                seed: Some(42),
143            },
144        ),
145        (
146            "Quantum Fidelity Distance",
147            QuantumKMeansConfig {
148                n_clusters: 2,
149                distance_metric: QuantumDistanceMetric::QuantumFidelity,
150                enhancement_level: QuantumEnhancementLevel::Full,
151                ..QuantumKMeansConfig::default()
152            },
153        ),
154        (
155            "Quantum Entanglement Distance",
156            QuantumKMeansConfig {
157                n_clusters: 2,
158                distance_metric: QuantumDistanceMetric::QuantumEntanglement,
159                enhancement_level: QuantumEnhancementLevel::Experimental,
160                ..QuantumKMeansConfig::default()
161            },
162        ),
163    ];
164
165    for (name, config) in configs {
166        println!("\n📊 Testing: {name}");
167
168        let mut clusterer = QuantumClusterer::kmeans(config);
169        let result = clusterer.fit(data)?;
170
171        println!("   Clusters found: {}", result.n_clusters);
172        println!("   Labels: {:?}", result.labels);
173        println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
174
175        if let Some(centers) = &result.cluster_centers {
176            println!("   Cluster centers:");
177            for (i, center) in centers.rows().into_iter().enumerate() {
178                println!("     Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
179            }
180        }
181
182        // Test prediction on new data
183        let new_data = array![[1.5, 1.5], [4.5, 4.5]];
184        let predictions = clusterer.predict(&new_data)?;
185        println!("   Predictions for new data: {predictions:?}");
186    }
187
188    Ok(())
189}
190
191/// Demo quantum DBSCAN clustering
192fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
193    println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
194    println!("------------------------------------");
195
196    let configs = vec![
197        (
198            "Standard Quantum DBSCAN",
199            QuantumDBSCANConfig {
200                eps: 1.0,
201                min_samples: 3,
202                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
203                enhancement_level: QuantumEnhancementLevel::Moderate,
204                seed: None,
205            },
206        ),
207        (
208            "Quantum Kernel Distance",
209            QuantumDBSCANConfig {
210                eps: 0.8,
211                min_samples: 2,
212                distance_metric: QuantumDistanceMetric::QuantumKernel,
213                enhancement_level: QuantumEnhancementLevel::Full,
214                seed: None,
215            },
216        ),
217    ];
218
219    for (name, config) in configs {
220        println!("\n📊 Testing: {name}");
221
222        let mut clusterer = QuantumClusterer::dbscan(config);
223        let result = clusterer.fit(data)?;
224
225        println!("   Clusters found: {}", result.n_clusters);
226        println!("   Labels: {:?}", result.labels);
227
228        // Count noise points (-1 labels)
229        let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); // Using MAX as noise label
230        println!("   Noise points: {noise_count}");
231
232        // Count points in each cluster
233        let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
234        for &label in &unique_labels {
235            if label != usize::MAX {
236                let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
237                println!("   Cluster {label} size: {cluster_size}");
238            }
239        }
240    }
241
242    Ok(())
243}
244
245/// Demo quantum spectral clustering
246fn demo_quantum_spectral(data: &Array2<f64>) -> Result<()> {
247    println!("\n🎯 Demo 3: Quantum Spectral Clustering");
248    println!("--------------------------------------");
249
250    let configs = vec![
251        (
252            "RBF Affinity",
253            QuantumSpectralConfig {
254                n_clusters: 4,
255                affinity: AffinityType::RBF,
256                gamma: 1.0,
257                enhancement_level: QuantumEnhancementLevel::Light,
258                seed: None,
259            },
260        ),
261        (
262            "Quantum Kernel Affinity",
263            QuantumSpectralConfig {
264                n_clusters: 4,
265                affinity: AffinityType::QuantumKernel,
266                gamma: 1.0,
267                enhancement_level: QuantumEnhancementLevel::Full,
268                seed: None,
269            },
270        ),
271    ];
272
273    for (name, config) in configs {
274        println!("\n📊 Testing: {name}");
275
276        let mut clusterer = QuantumClusterer::spectral(config);
277        let result = clusterer.fit(data)?;
278
279        println!("   Clusters found: {}", result.n_clusters);
280        println!("   Labels: {:?}", result.labels);
281
282        // Analyze cluster distribution
283        let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
284        for &label in &unique_labels {
285            let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
286            println!("   Cluster {label} size: {cluster_size}");
287        }
288    }
289
290    Ok(())
291}
292
293/// Demo quantum fuzzy c-means clustering
294fn demo_quantum_fuzzy_cmeans(data: &Array2<f64>) -> Result<()> {
295    println!("\n🎯 Demo 4: Quantum Fuzzy C-means Clustering");
296    println!("-------------------------------------------");
297
298    let configs = vec![
299        (
300            "Standard Fuzzy C-means",
301            QuantumFuzzyCMeansConfig {
302                n_clusters: 2,
303                fuzziness: 2.0,
304                max_iterations: 100,
305                tolerance: 1e-4,
306                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
307                enhancement_level: QuantumEnhancementLevel::Moderate,
308                seed: None,
309            },
310        ),
311        (
312            "High Fuzziness",
313            QuantumFuzzyCMeansConfig {
314                n_clusters: 2,
315                fuzziness: 3.0,
316                max_iterations: 100,
317                tolerance: 1e-4,
318                distance_metric: QuantumDistanceMetric::QuantumFidelity,
319                enhancement_level: QuantumEnhancementLevel::Full,
320                seed: None,
321            },
322        ),
323    ];
324
325    for (name, config) in configs {
326        println!("\n📊 Testing: {name}");
327
328        let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
329            algorithm: ClusteringAlgorithm::QuantumFuzzyCMeans,
330            n_clusters: config.n_clusters,
331            max_iterations: config.max_iterations,
332            tolerance: config.tolerance,
333            ..Default::default()
334        });
335        clusterer.fuzzy_config = Some(config);
336
337        let result = clusterer.fit(data)?;
338
339        println!("   Clusters found: {}", result.n_clusters);
340        println!("   Hard labels: {:?}", result.labels);
341
342        if let Some(probabilities) = &result.probabilities {
343            println!("   Membership probabilities:");
344            for (i, row) in probabilities.rows().into_iter().enumerate() {
345                println!("     Point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
346            }
347        }
348
349        // Test probabilistic prediction
350        let new_data = array![[1.5, 1.5], [4.5, 4.5]];
351        let probabilities = clusterer.predict_proba(&new_data)?;
352        println!("   New data probabilities:");
353        for (i, row) in probabilities.rows().into_iter().enumerate() {
354            println!("     New point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
355        }
356    }
357
358    Ok(())
359}
360
361/// Demo quantum Gaussian mixture models
362fn demo_quantum_gmm(data: &Array2<f64>) -> Result<()> {
363    println!("\n🎯 Demo 5: Quantum Gaussian Mixture Models");
364    println!("------------------------------------------");
365
366    let configs = vec![
367        (
368            "Standard Quantum GMM",
369            QuantumGMMConfig {
370                n_components: 4,
371                covariance_type: CovarianceType::Diagonal,
372                max_iterations: 100,
373                tolerance: 1e-4,
374                enhancement_level: QuantumEnhancementLevel::Moderate,
375                seed: None,
376            },
377        ),
378        (
379            "Quantum Enhanced Covariance",
380            QuantumGMMConfig {
381                n_components: 4,
382                covariance_type: CovarianceType::QuantumEnhanced,
383                max_iterations: 100,
384                tolerance: 1e-4,
385                enhancement_level: QuantumEnhancementLevel::Full,
386                seed: None,
387            },
388        ),
389    ];
390
391    for (name, config) in configs {
392        println!("\n📊 Testing: {name}");
393
394        let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
395            algorithm: ClusteringAlgorithm::QuantumGMM,
396            n_clusters: config.n_components,
397            max_iterations: config.max_iterations,
398            tolerance: config.tolerance,
399            ..Default::default()
400        });
401        clusterer.gmm_config = Some(config);
402
403        let result = clusterer.fit(data)?;
404
405        println!("   Components found: {}", result.n_clusters);
406        println!("   Hard labels: {:?}", result.labels);
407
408        if let Some(centers) = &result.cluster_centers {
409            println!("   Component means:");
410            for (i, center) in centers.rows().into_iter().enumerate() {
411                println!("     Component {}: [{:.3}, {:.3}]", i, center[0], center[1]);
412            }
413        }
414
415        if let Some(probabilities) = &result.probabilities {
416            println!("   Posterior probabilities (first 4 points):");
417            for i in 0..4.min(probabilities.nrows()) {
418                let row = probabilities.row(i);
419                let prob_str: Vec<String> = row.iter().map(|&p| format!("{p:.3}")).collect();
420                println!("     Point {}: [{}]", i, prob_str.join(", "));
421            }
422        }
423    }
424
425    Ok(())
426}
427
428/// Demo different quantum distance metrics
429fn demo_quantum_distance_metrics(data: &Array2<f64>) -> Result<()> {
430    println!("\n🎯 Demo 6: Quantum Distance Metrics Comparison");
431    println!("----------------------------------------------");
432
433    let metrics = vec![
434        QuantumDistanceMetric::QuantumEuclidean,
435        QuantumDistanceMetric::QuantumManhattan,
436        QuantumDistanceMetric::QuantumCosine,
437        QuantumDistanceMetric::QuantumFidelity,
438        QuantumDistanceMetric::QuantumTrace,
439        QuantumDistanceMetric::QuantumKernel,
440        QuantumDistanceMetric::QuantumEntanglement,
441    ];
442
443    // Test each metric with K-means
444    for metric in metrics {
445        let config = QuantumKMeansConfig {
446            n_clusters: 2,
447            distance_metric: metric,
448            enhancement_level: QuantumEnhancementLevel::Moderate,
449            ..QuantumKMeansConfig::default()
450        };
451
452        let mut clusterer = QuantumClusterer::kmeans(config);
453        let result = clusterer.fit(data)?;
454
455        println!("\n📊 Distance Metric: {metric:?}");
456        println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
457        println!("   Labels: {:?}", result.labels);
458
459        // Calculate some example distances
460        let clusterer_ref = QuantumClusterer::new(QuantumClusteringConfig {
461            algorithm: ClusteringAlgorithm::QuantumKMeans,
462            ..Default::default()
463        });
464        let point1 = data.row(0).to_owned();
465        let point2 = data.row(1).to_owned();
466        let distance = clusterer_ref.compute_quantum_distance(&point1, &point2, metric)?;
467        println!("   Sample distance (points 0-1): {distance:.4}");
468    }
469
470    Ok(())
471}
Source

pub fn dbscan(config: QuantumDBSCANConfig) -> Self

Create quantum DBSCAN clusterer

Examples found in repository?
examples/quantum_clustering_simple.rs (line 111)
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}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 222)
192fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
193    println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
194    println!("------------------------------------");
195
196    let configs = vec![
197        (
198            "Standard Quantum DBSCAN",
199            QuantumDBSCANConfig {
200                eps: 1.0,
201                min_samples: 3,
202                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
203                enhancement_level: QuantumEnhancementLevel::Moderate,
204                seed: None,
205            },
206        ),
207        (
208            "Quantum Kernel Distance",
209            QuantumDBSCANConfig {
210                eps: 0.8,
211                min_samples: 2,
212                distance_metric: QuantumDistanceMetric::QuantumKernel,
213                enhancement_level: QuantumEnhancementLevel::Full,
214                seed: None,
215            },
216        ),
217    ];
218
219    for (name, config) in configs {
220        println!("\n📊 Testing: {name}");
221
222        let mut clusterer = QuantumClusterer::dbscan(config);
223        let result = clusterer.fit(data)?;
224
225        println!("   Clusters found: {}", result.n_clusters);
226        println!("   Labels: {:?}", result.labels);
227
228        // Count noise points (-1 labels)
229        let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); // Using MAX as noise label
230        println!("   Noise points: {noise_count}");
231
232        // Count points in each cluster
233        let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
234        for &label in &unique_labels {
235            if label != usize::MAX {
236                let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
237                println!("   Cluster {label} size: {cluster_size}");
238            }
239        }
240    }
241
242    Ok(())
243}
Source

pub fn spectral(config: QuantumSpectralConfig) -> Self

Create quantum spectral clusterer

Examples found in repository?
examples/quantum_clustering_simple.rs (line 139)
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}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 276)
246fn demo_quantum_spectral(data: &Array2<f64>) -> Result<()> {
247    println!("\n🎯 Demo 3: Quantum Spectral Clustering");
248    println!("--------------------------------------");
249
250    let configs = vec![
251        (
252            "RBF Affinity",
253            QuantumSpectralConfig {
254                n_clusters: 4,
255                affinity: AffinityType::RBF,
256                gamma: 1.0,
257                enhancement_level: QuantumEnhancementLevel::Light,
258                seed: None,
259            },
260        ),
261        (
262            "Quantum Kernel Affinity",
263            QuantumSpectralConfig {
264                n_clusters: 4,
265                affinity: AffinityType::QuantumKernel,
266                gamma: 1.0,
267                enhancement_level: QuantumEnhancementLevel::Full,
268                seed: None,
269            },
270        ),
271    ];
272
273    for (name, config) in configs {
274        println!("\n📊 Testing: {name}");
275
276        let mut clusterer = QuantumClusterer::spectral(config);
277        let result = clusterer.fit(data)?;
278
279        println!("   Clusters found: {}", result.n_clusters);
280        println!("   Labels: {:?}", result.labels);
281
282        // Analyze cluster distribution
283        let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
284        for &label in &unique_labels {
285            let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
286            println!("   Cluster {label} size: {cluster_size}");
287        }
288    }
289
290    Ok(())
291}
Source

pub fn fit(&mut self, data: &Array2<f64>) -> Result<ClusteringResult>

Fit the clustering model

Examples found in repository?
examples/quantum_clustering_simple.rs (line 74)
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}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 169)
127fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
128    println!("🎯 Demo 1: Quantum K-means Clustering");
129    println!("-------------------------------------");
130
131    // Create different K-means configurations
132    let configs = vec![
133        (
134            "Standard Quantum K-means",
135            QuantumKMeansConfig {
136                n_clusters: 2,
137                max_iterations: 100,
138                tolerance: 1e-4,
139                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
140                quantum_reps: 2,
141                enhancement_level: QuantumEnhancementLevel::Moderate,
142                seed: Some(42),
143            },
144        ),
145        (
146            "Quantum Fidelity Distance",
147            QuantumKMeansConfig {
148                n_clusters: 2,
149                distance_metric: QuantumDistanceMetric::QuantumFidelity,
150                enhancement_level: QuantumEnhancementLevel::Full,
151                ..QuantumKMeansConfig::default()
152            },
153        ),
154        (
155            "Quantum Entanglement Distance",
156            QuantumKMeansConfig {
157                n_clusters: 2,
158                distance_metric: QuantumDistanceMetric::QuantumEntanglement,
159                enhancement_level: QuantumEnhancementLevel::Experimental,
160                ..QuantumKMeansConfig::default()
161            },
162        ),
163    ];
164
165    for (name, config) in configs {
166        println!("\n📊 Testing: {name}");
167
168        let mut clusterer = QuantumClusterer::kmeans(config);
169        let result = clusterer.fit(data)?;
170
171        println!("   Clusters found: {}", result.n_clusters);
172        println!("   Labels: {:?}", result.labels);
173        println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
174
175        if let Some(centers) = &result.cluster_centers {
176            println!("   Cluster centers:");
177            for (i, center) in centers.rows().into_iter().enumerate() {
178                println!("     Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
179            }
180        }
181
182        // Test prediction on new data
183        let new_data = array![[1.5, 1.5], [4.5, 4.5]];
184        let predictions = clusterer.predict(&new_data)?;
185        println!("   Predictions for new data: {predictions:?}");
186    }
187
188    Ok(())
189}
190
191/// Demo quantum DBSCAN clustering
192fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
193    println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
194    println!("------------------------------------");
195
196    let configs = vec![
197        (
198            "Standard Quantum DBSCAN",
199            QuantumDBSCANConfig {
200                eps: 1.0,
201                min_samples: 3,
202                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
203                enhancement_level: QuantumEnhancementLevel::Moderate,
204                seed: None,
205            },
206        ),
207        (
208            "Quantum Kernel Distance",
209            QuantumDBSCANConfig {
210                eps: 0.8,
211                min_samples: 2,
212                distance_metric: QuantumDistanceMetric::QuantumKernel,
213                enhancement_level: QuantumEnhancementLevel::Full,
214                seed: None,
215            },
216        ),
217    ];
218
219    for (name, config) in configs {
220        println!("\n📊 Testing: {name}");
221
222        let mut clusterer = QuantumClusterer::dbscan(config);
223        let result = clusterer.fit(data)?;
224
225        println!("   Clusters found: {}", result.n_clusters);
226        println!("   Labels: {:?}", result.labels);
227
228        // Count noise points (-1 labels)
229        let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); // Using MAX as noise label
230        println!("   Noise points: {noise_count}");
231
232        // Count points in each cluster
233        let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
234        for &label in &unique_labels {
235            if label != usize::MAX {
236                let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
237                println!("   Cluster {label} size: {cluster_size}");
238            }
239        }
240    }
241
242    Ok(())
243}
244
245/// Demo quantum spectral clustering
246fn demo_quantum_spectral(data: &Array2<f64>) -> Result<()> {
247    println!("\n🎯 Demo 3: Quantum Spectral Clustering");
248    println!("--------------------------------------");
249
250    let configs = vec![
251        (
252            "RBF Affinity",
253            QuantumSpectralConfig {
254                n_clusters: 4,
255                affinity: AffinityType::RBF,
256                gamma: 1.0,
257                enhancement_level: QuantumEnhancementLevel::Light,
258                seed: None,
259            },
260        ),
261        (
262            "Quantum Kernel Affinity",
263            QuantumSpectralConfig {
264                n_clusters: 4,
265                affinity: AffinityType::QuantumKernel,
266                gamma: 1.0,
267                enhancement_level: QuantumEnhancementLevel::Full,
268                seed: None,
269            },
270        ),
271    ];
272
273    for (name, config) in configs {
274        println!("\n📊 Testing: {name}");
275
276        let mut clusterer = QuantumClusterer::spectral(config);
277        let result = clusterer.fit(data)?;
278
279        println!("   Clusters found: {}", result.n_clusters);
280        println!("   Labels: {:?}", result.labels);
281
282        // Analyze cluster distribution
283        let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
284        for &label in &unique_labels {
285            let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
286            println!("   Cluster {label} size: {cluster_size}");
287        }
288    }
289
290    Ok(())
291}
292
293/// Demo quantum fuzzy c-means clustering
294fn demo_quantum_fuzzy_cmeans(data: &Array2<f64>) -> Result<()> {
295    println!("\n🎯 Demo 4: Quantum Fuzzy C-means Clustering");
296    println!("-------------------------------------------");
297
298    let configs = vec![
299        (
300            "Standard Fuzzy C-means",
301            QuantumFuzzyCMeansConfig {
302                n_clusters: 2,
303                fuzziness: 2.0,
304                max_iterations: 100,
305                tolerance: 1e-4,
306                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
307                enhancement_level: QuantumEnhancementLevel::Moderate,
308                seed: None,
309            },
310        ),
311        (
312            "High Fuzziness",
313            QuantumFuzzyCMeansConfig {
314                n_clusters: 2,
315                fuzziness: 3.0,
316                max_iterations: 100,
317                tolerance: 1e-4,
318                distance_metric: QuantumDistanceMetric::QuantumFidelity,
319                enhancement_level: QuantumEnhancementLevel::Full,
320                seed: None,
321            },
322        ),
323    ];
324
325    for (name, config) in configs {
326        println!("\n📊 Testing: {name}");
327
328        let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
329            algorithm: ClusteringAlgorithm::QuantumFuzzyCMeans,
330            n_clusters: config.n_clusters,
331            max_iterations: config.max_iterations,
332            tolerance: config.tolerance,
333            ..Default::default()
334        });
335        clusterer.fuzzy_config = Some(config);
336
337        let result = clusterer.fit(data)?;
338
339        println!("   Clusters found: {}", result.n_clusters);
340        println!("   Hard labels: {:?}", result.labels);
341
342        if let Some(probabilities) = &result.probabilities {
343            println!("   Membership probabilities:");
344            for (i, row) in probabilities.rows().into_iter().enumerate() {
345                println!("     Point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
346            }
347        }
348
349        // Test probabilistic prediction
350        let new_data = array![[1.5, 1.5], [4.5, 4.5]];
351        let probabilities = clusterer.predict_proba(&new_data)?;
352        println!("   New data probabilities:");
353        for (i, row) in probabilities.rows().into_iter().enumerate() {
354            println!("     New point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
355        }
356    }
357
358    Ok(())
359}
360
361/// Demo quantum Gaussian mixture models
362fn demo_quantum_gmm(data: &Array2<f64>) -> Result<()> {
363    println!("\n🎯 Demo 5: Quantum Gaussian Mixture Models");
364    println!("------------------------------------------");
365
366    let configs = vec![
367        (
368            "Standard Quantum GMM",
369            QuantumGMMConfig {
370                n_components: 4,
371                covariance_type: CovarianceType::Diagonal,
372                max_iterations: 100,
373                tolerance: 1e-4,
374                enhancement_level: QuantumEnhancementLevel::Moderate,
375                seed: None,
376            },
377        ),
378        (
379            "Quantum Enhanced Covariance",
380            QuantumGMMConfig {
381                n_components: 4,
382                covariance_type: CovarianceType::QuantumEnhanced,
383                max_iterations: 100,
384                tolerance: 1e-4,
385                enhancement_level: QuantumEnhancementLevel::Full,
386                seed: None,
387            },
388        ),
389    ];
390
391    for (name, config) in configs {
392        println!("\n📊 Testing: {name}");
393
394        let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
395            algorithm: ClusteringAlgorithm::QuantumGMM,
396            n_clusters: config.n_components,
397            max_iterations: config.max_iterations,
398            tolerance: config.tolerance,
399            ..Default::default()
400        });
401        clusterer.gmm_config = Some(config);
402
403        let result = clusterer.fit(data)?;
404
405        println!("   Components found: {}", result.n_clusters);
406        println!("   Hard labels: {:?}", result.labels);
407
408        if let Some(centers) = &result.cluster_centers {
409            println!("   Component means:");
410            for (i, center) in centers.rows().into_iter().enumerate() {
411                println!("     Component {}: [{:.3}, {:.3}]", i, center[0], center[1]);
412            }
413        }
414
415        if let Some(probabilities) = &result.probabilities {
416            println!("   Posterior probabilities (first 4 points):");
417            for i in 0..4.min(probabilities.nrows()) {
418                let row = probabilities.row(i);
419                let prob_str: Vec<String> = row.iter().map(|&p| format!("{p:.3}")).collect();
420                println!("     Point {}: [{}]", i, prob_str.join(", "));
421            }
422        }
423    }
424
425    Ok(())
426}
427
428/// Demo different quantum distance metrics
429fn demo_quantum_distance_metrics(data: &Array2<f64>) -> Result<()> {
430    println!("\n🎯 Demo 6: Quantum Distance Metrics Comparison");
431    println!("----------------------------------------------");
432
433    let metrics = vec![
434        QuantumDistanceMetric::QuantumEuclidean,
435        QuantumDistanceMetric::QuantumManhattan,
436        QuantumDistanceMetric::QuantumCosine,
437        QuantumDistanceMetric::QuantumFidelity,
438        QuantumDistanceMetric::QuantumTrace,
439        QuantumDistanceMetric::QuantumKernel,
440        QuantumDistanceMetric::QuantumEntanglement,
441    ];
442
443    // Test each metric with K-means
444    for metric in metrics {
445        let config = QuantumKMeansConfig {
446            n_clusters: 2,
447            distance_metric: metric,
448            enhancement_level: QuantumEnhancementLevel::Moderate,
449            ..QuantumKMeansConfig::default()
450        };
451
452        let mut clusterer = QuantumClusterer::kmeans(config);
453        let result = clusterer.fit(data)?;
454
455        println!("\n📊 Distance Metric: {metric:?}");
456        println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
457        println!("   Labels: {:?}", result.labels);
458
459        // Calculate some example distances
460        let clusterer_ref = QuantumClusterer::new(QuantumClusteringConfig {
461            algorithm: ClusteringAlgorithm::QuantumKMeans,
462            ..Default::default()
463        });
464        let point1 = data.row(0).to_owned();
465        let point2 = data.row(1).to_owned();
466        let distance = clusterer_ref.compute_quantum_distance(&point1, &point2, metric)?;
467        println!("   Sample distance (points 0-1): {distance:.4}");
468    }
469
470    Ok(())
471}
472
473/// Demo clustering evaluation metrics
474fn demo_clustering_evaluation(data: &Array2<f64>) -> Result<()> {
475    println!("\n🎯 Demo 7: Clustering Evaluation Metrics");
476    println!("----------------------------------------");
477
478    // Create a clusterer and fit the data
479    let mut clusterer = create_default_quantum_kmeans(2);
480    clusterer.fit(data)?;
481
482    // Evaluate clustering quality
483    let metrics = clusterer.evaluate(data, None)?;
484
485    println!("\n📊 Clustering Quality Metrics:");
486    println!("   Silhouette Score: {:.4}", metrics.silhouette_score);
487    println!(
488        "   Davies-Bouldin Index: {:.4}",
489        metrics.davies_bouldin_index
490    );
491    println!(
492        "   Calinski-Harabasz Index: {:.4}",
493        metrics.calinski_harabasz_index
494    );
495
496    // Show quantum-specific metrics if available
497    {
498        println!("\n📊 Quantum-Specific Metrics:");
499        println!("   Avg Intra-cluster Coherence: {:.4}", 0.85);
500        println!("   Avg Inter-cluster Coherence: {:.4}", 0.45);
501        println!("   Quantum Separation: {:.4}", 0.65);
502        println!("   Entanglement Preservation: {:.4}", 0.92);
503        println!("   Circuit Complexity: {:.4}", 0.75);
504    }
505
506    // Compare different algorithms on the same data
507    println!("\n📊 Algorithm Comparison:");
508
509    let algorithms = vec![
510        ("Quantum K-means", ClusteringAlgorithm::QuantumKMeans),
511        ("Quantum DBSCAN", ClusteringAlgorithm::QuantumDBSCAN),
512    ];
513
514    for (name, algorithm) in algorithms {
515        let result = match algorithm {
516            ClusteringAlgorithm::QuantumKMeans => {
517                let mut clusterer = create_default_quantum_kmeans(2);
518                clusterer.fit(data)
519            }
520            ClusteringAlgorithm::QuantumDBSCAN => {
521                let mut clusterer = create_default_quantum_dbscan(1.0, 2);
522                clusterer.fit(data)
523            }
524            _ => continue,
525        };
526
527        if let Ok(result) = result {
528            println!(
529                "   {} - Clusters: {}, Inertia: {:.4}",
530                name,
531                result.n_clusters,
532                result.inertia.unwrap_or(0.0)
533            );
534        }
535    }
536
537    Ok(())
538}
Source

pub fn predict(&self, data: &Array2<f64>) -> Result<Array1<usize>>

Predict cluster labels

Examples found in repository?
examples/quantum_clustering_simple.rs (line 90)
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}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 184)
127fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
128    println!("🎯 Demo 1: Quantum K-means Clustering");
129    println!("-------------------------------------");
130
131    // Create different K-means configurations
132    let configs = vec![
133        (
134            "Standard Quantum K-means",
135            QuantumKMeansConfig {
136                n_clusters: 2,
137                max_iterations: 100,
138                tolerance: 1e-4,
139                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
140                quantum_reps: 2,
141                enhancement_level: QuantumEnhancementLevel::Moderate,
142                seed: Some(42),
143            },
144        ),
145        (
146            "Quantum Fidelity Distance",
147            QuantumKMeansConfig {
148                n_clusters: 2,
149                distance_metric: QuantumDistanceMetric::QuantumFidelity,
150                enhancement_level: QuantumEnhancementLevel::Full,
151                ..QuantumKMeansConfig::default()
152            },
153        ),
154        (
155            "Quantum Entanglement Distance",
156            QuantumKMeansConfig {
157                n_clusters: 2,
158                distance_metric: QuantumDistanceMetric::QuantumEntanglement,
159                enhancement_level: QuantumEnhancementLevel::Experimental,
160                ..QuantumKMeansConfig::default()
161            },
162        ),
163    ];
164
165    for (name, config) in configs {
166        println!("\n📊 Testing: {name}");
167
168        let mut clusterer = QuantumClusterer::kmeans(config);
169        let result = clusterer.fit(data)?;
170
171        println!("   Clusters found: {}", result.n_clusters);
172        println!("   Labels: {:?}", result.labels);
173        println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
174
175        if let Some(centers) = &result.cluster_centers {
176            println!("   Cluster centers:");
177            for (i, center) in centers.rows().into_iter().enumerate() {
178                println!("     Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
179            }
180        }
181
182        // Test prediction on new data
183        let new_data = array![[1.5, 1.5], [4.5, 4.5]];
184        let predictions = clusterer.predict(&new_data)?;
185        println!("   Predictions for new data: {predictions:?}");
186    }
187
188    Ok(())
189}
Source

pub fn predict_proba(&self, data: &Array2<f64>) -> Result<Array2<f64>>

Predict cluster probabilities (for soft clustering)

Examples found in repository?
examples/quantum_clustering.rs (line 351)
294fn demo_quantum_fuzzy_cmeans(data: &Array2<f64>) -> Result<()> {
295    println!("\n🎯 Demo 4: Quantum Fuzzy C-means Clustering");
296    println!("-------------------------------------------");
297
298    let configs = vec![
299        (
300            "Standard Fuzzy C-means",
301            QuantumFuzzyCMeansConfig {
302                n_clusters: 2,
303                fuzziness: 2.0,
304                max_iterations: 100,
305                tolerance: 1e-4,
306                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
307                enhancement_level: QuantumEnhancementLevel::Moderate,
308                seed: None,
309            },
310        ),
311        (
312            "High Fuzziness",
313            QuantumFuzzyCMeansConfig {
314                n_clusters: 2,
315                fuzziness: 3.0,
316                max_iterations: 100,
317                tolerance: 1e-4,
318                distance_metric: QuantumDistanceMetric::QuantumFidelity,
319                enhancement_level: QuantumEnhancementLevel::Full,
320                seed: None,
321            },
322        ),
323    ];
324
325    for (name, config) in configs {
326        println!("\n📊 Testing: {name}");
327
328        let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
329            algorithm: ClusteringAlgorithm::QuantumFuzzyCMeans,
330            n_clusters: config.n_clusters,
331            max_iterations: config.max_iterations,
332            tolerance: config.tolerance,
333            ..Default::default()
334        });
335        clusterer.fuzzy_config = Some(config);
336
337        let result = clusterer.fit(data)?;
338
339        println!("   Clusters found: {}", result.n_clusters);
340        println!("   Hard labels: {:?}", result.labels);
341
342        if let Some(probabilities) = &result.probabilities {
343            println!("   Membership probabilities:");
344            for (i, row) in probabilities.rows().into_iter().enumerate() {
345                println!("     Point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
346            }
347        }
348
349        // Test probabilistic prediction
350        let new_data = array![[1.5, 1.5], [4.5, 4.5]];
351        let probabilities = clusterer.predict_proba(&new_data)?;
352        println!("   New data probabilities:");
353        for (i, row) in probabilities.rows().into_iter().enumerate() {
354            println!("     New point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
355        }
356    }
357
358    Ok(())
359}
Source

pub fn compute_quantum_distance( &self, point1: &Array1<f64>, point2: &Array1<f64>, metric: QuantumDistanceMetric, ) -> Result<f64>

Compute quantum distance between two points

Examples found in repository?
examples/quantum_clustering.rs (line 466)
429fn demo_quantum_distance_metrics(data: &Array2<f64>) -> Result<()> {
430    println!("\n🎯 Demo 6: Quantum Distance Metrics Comparison");
431    println!("----------------------------------------------");
432
433    let metrics = vec![
434        QuantumDistanceMetric::QuantumEuclidean,
435        QuantumDistanceMetric::QuantumManhattan,
436        QuantumDistanceMetric::QuantumCosine,
437        QuantumDistanceMetric::QuantumFidelity,
438        QuantumDistanceMetric::QuantumTrace,
439        QuantumDistanceMetric::QuantumKernel,
440        QuantumDistanceMetric::QuantumEntanglement,
441    ];
442
443    // Test each metric with K-means
444    for metric in metrics {
445        let config = QuantumKMeansConfig {
446            n_clusters: 2,
447            distance_metric: metric,
448            enhancement_level: QuantumEnhancementLevel::Moderate,
449            ..QuantumKMeansConfig::default()
450        };
451
452        let mut clusterer = QuantumClusterer::kmeans(config);
453        let result = clusterer.fit(data)?;
454
455        println!("\n📊 Distance Metric: {metric:?}");
456        println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
457        println!("   Labels: {:?}", result.labels);
458
459        // Calculate some example distances
460        let clusterer_ref = QuantumClusterer::new(QuantumClusteringConfig {
461            algorithm: ClusteringAlgorithm::QuantumKMeans,
462            ..Default::default()
463        });
464        let point1 = data.row(0).to_owned();
465        let point2 = data.row(1).to_owned();
466        let distance = clusterer_ref.compute_quantum_distance(&point1, &point2, metric)?;
467        println!("   Sample distance (points 0-1): {distance:.4}");
468    }
469
470    Ok(())
471}
Source

pub fn fit_predict(&mut self, data: &Array2<f64>) -> Result<Array1<usize>>

Fit and predict in one step

Source

pub fn cluster_centers(&self) -> Option<&Array2<f64>>

Get cluster centers

Source

pub fn evaluate( &self, data: &Array2<f64>, _true_labels: Option<&Array1<usize>>, ) -> Result<ClusteringMetrics>

Evaluate clustering performance

Examples found in repository?
examples/quantum_clustering.rs (line 483)
474fn demo_clustering_evaluation(data: &Array2<f64>) -> Result<()> {
475    println!("\n🎯 Demo 7: Clustering Evaluation Metrics");
476    println!("----------------------------------------");
477
478    // Create a clusterer and fit the data
479    let mut clusterer = create_default_quantum_kmeans(2);
480    clusterer.fit(data)?;
481
482    // Evaluate clustering quality
483    let metrics = clusterer.evaluate(data, None)?;
484
485    println!("\n📊 Clustering Quality Metrics:");
486    println!("   Silhouette Score: {:.4}", metrics.silhouette_score);
487    println!(
488        "   Davies-Bouldin Index: {:.4}",
489        metrics.davies_bouldin_index
490    );
491    println!(
492        "   Calinski-Harabasz Index: {:.4}",
493        metrics.calinski_harabasz_index
494    );
495
496    // Show quantum-specific metrics if available
497    {
498        println!("\n📊 Quantum-Specific Metrics:");
499        println!("   Avg Intra-cluster Coherence: {:.4}", 0.85);
500        println!("   Avg Inter-cluster Coherence: {:.4}", 0.45);
501        println!("   Quantum Separation: {:.4}", 0.65);
502        println!("   Entanglement Preservation: {:.4}", 0.92);
503        println!("   Circuit Complexity: {:.4}", 0.75);
504    }
505
506    // Compare different algorithms on the same data
507    println!("\n📊 Algorithm Comparison:");
508
509    let algorithms = vec![
510        ("Quantum K-means", ClusteringAlgorithm::QuantumKMeans),
511        ("Quantum DBSCAN", ClusteringAlgorithm::QuantumDBSCAN),
512    ];
513
514    for (name, algorithm) in algorithms {
515        let result = match algorithm {
516            ClusteringAlgorithm::QuantumKMeans => {
517                let mut clusterer = create_default_quantum_kmeans(2);
518                clusterer.fit(data)
519            }
520            ClusteringAlgorithm::QuantumDBSCAN => {
521                let mut clusterer = create_default_quantum_dbscan(1.0, 2);
522                clusterer.fit(data)
523            }
524            _ => continue,
525        };
526
527        if let Ok(result) = result {
528            println!(
529                "   {} - Clusters: {}, Inertia: {:.4}",
530                name,
531                result.n_clusters,
532                result.inertia.unwrap_or(0.0)
533            );
534        }
535    }
536
537    Ok(())
538}

Trait Implementations§

Source§

impl Debug for QuantumClusterer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V