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 321-327)
287fn 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        // Test probabilistic prediction
343        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
354/// Demo quantum Gaussian mixture models
355fn 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
421/// Demo different quantum distance metrics
422fn 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    // Test each metric with K-means
437    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        // Calculate some example distances
453        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}
Source

pub fn kmeans(config: QuantumKMeansConfig) -> Self

Create quantum K-means clusterer

Examples found in repository?
examples/quantum_clustering_simple.rs (line 66)
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}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 161)
120fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
121    println!("🎯 Demo 1: Quantum K-means Clustering");
122    println!("-------------------------------------");
123
124    // Create different K-means configurations
125    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        // Test prediction on new data
176        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
184/// Demo quantum DBSCAN clustering
185fn 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        // Count noise points (-1 labels)
222        let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); // Using MAX as noise label
223        println!("   Noise points: {noise_count}");
224
225        // Count points in each cluster
226        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
238/// Demo quantum spectral clustering
239fn 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        // Analyze cluster distribution
276        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
286/// Demo quantum fuzzy c-means clustering
287fn 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        // Test probabilistic prediction
343        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
354/// Demo quantum Gaussian mixture models
355fn 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
421/// Demo different quantum distance metrics
422fn 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    // Test each metric with K-means
437    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        // Calculate some example distances
453        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}
Source

pub fn dbscan(config: QuantumDBSCANConfig) -> Self

Create quantum DBSCAN clusterer

Examples found in repository?
examples/quantum_clustering_simple.rs (line 104)
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}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 215)
185fn 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        // Count noise points (-1 labels)
222        let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); // Using MAX as noise label
223        println!("   Noise points: {noise_count}");
224
225        // Count points in each cluster
226        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}
Source

pub fn spectral(config: QuantumSpectralConfig) -> Self

Create quantum spectral clusterer

Examples found in repository?
examples/quantum_clustering_simple.rs (line 132)
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}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 269)
239fn 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        // Analyze cluster distribution
276        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}
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 67)
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}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 162)
120fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
121    println!("🎯 Demo 1: Quantum K-means Clustering");
122    println!("-------------------------------------");
123
124    // Create different K-means configurations
125    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        // Test prediction on new data
176        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
184/// Demo quantum DBSCAN clustering
185fn 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        // Count noise points (-1 labels)
222        let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); // Using MAX as noise label
223        println!("   Noise points: {noise_count}");
224
225        // Count points in each cluster
226        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
238/// Demo quantum spectral clustering
239fn 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        // Analyze cluster distribution
276        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
286/// Demo quantum fuzzy c-means clustering
287fn 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        // Test probabilistic prediction
343        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
354/// Demo quantum Gaussian mixture models
355fn 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
421/// Demo different quantum distance metrics
422fn 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    // Test each metric with K-means
437    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        // Calculate some example distances
453        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
466/// Demo clustering evaluation metrics
467fn demo_clustering_evaluation(data: &Array2<f64>) -> Result<()> {
468    println!("\n🎯 Demo 7: Clustering Evaluation Metrics");
469    println!("----------------------------------------");
470
471    // Create a clusterer and fit the data
472    let mut clusterer = create_default_quantum_kmeans(2);
473    clusterer.fit(data)?;
474
475    // Evaluate clustering quality
476    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    // Show quantum-specific metrics if available
490    {
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    // Compare different algorithms on the same data
500    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}
Source

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

Predict cluster labels

Examples found in repository?
examples/quantum_clustering_simple.rs (line 83)
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}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 177)
120fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
121    println!("🎯 Demo 1: Quantum K-means Clustering");
122    println!("-------------------------------------");
123
124    // Create different K-means configurations
125    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        // Test prediction on new data
176        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}
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 344)
287fn 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        // Test probabilistic prediction
343        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}
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 459)
422fn 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    // Test each metric with K-means
437    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        // Calculate some example distances
453        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}
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 476)
467fn demo_clustering_evaluation(data: &Array2<f64>) -> Result<()> {
468    println!("\n🎯 Demo 7: Clustering Evaluation Metrics");
469    println!("----------------------------------------");
470
471    // Create a clusterer and fit the data
472    let mut clusterer = create_default_quantum_kmeans(2);
473    clusterer.fit(data)?;
474
475    // Evaluate clustering quality
476    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    // Show quantum-specific metrics if available
490    {
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    // Compare different algorithms on the same data
500    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}

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