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

pub fn kmeans(config: QuantumKMeansConfig) -> Self

Create quantum K-means clusterer

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

pub fn dbscan(config: QuantumDBSCANConfig) -> Self

Create quantum DBSCAN clusterer

Examples found in repository?
examples/quantum_clustering_simple.rs (line 101)
87fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
88    println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
89    println!("------------------------------------");
90
91    // Create DBSCAN configuration
92    let config = QuantumDBSCANConfig {
93        eps: 1.0,
94        min_samples: 3,
95        distance_metric: QuantumDistanceMetric::QuantumEuclidean,
96        enhancement_level: QuantumEnhancementLevel::Moderate,
97        seed: None,
98    };
99
100    // Create and train clusterer
101    let mut clusterer = QuantumClusterer::dbscan(config);
102    let result = clusterer.fit(data)?;
103
104    println!("   Clusters found: {}", result.n_clusters);
105    println!("   Labels: {:?}", result.labels);
106
107    // Count noise points (using MAX as noise label)
108    let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count();
109    println!("   Noise points: {}", noise_count);
110
111    Ok(())
112}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 205)
175fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
176    println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
177    println!("------------------------------------");
178
179    let configs = vec![
180        (
181            "Standard Quantum DBSCAN",
182            QuantumDBSCANConfig {
183                eps: 1.0,
184                min_samples: 3,
185                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
186                enhancement_level: QuantumEnhancementLevel::Moderate,
187                seed: None,
188            },
189        ),
190        (
191            "Quantum Kernel Distance",
192            QuantumDBSCANConfig {
193                eps: 0.8,
194                min_samples: 2,
195                distance_metric: QuantumDistanceMetric::QuantumKernel,
196                enhancement_level: QuantumEnhancementLevel::Full,
197                seed: None,
198            },
199        ),
200    ];
201
202    for (name, config) in configs {
203        println!("\n📊 Testing: {}", name);
204
205        let mut clusterer = QuantumClusterer::dbscan(config);
206        let result = clusterer.fit(data)?;
207
208        println!("   Clusters found: {}", result.n_clusters);
209        println!("   Labels: {:?}", result.labels);
210
211        // Count noise points (-1 labels)
212        let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); // Using MAX as noise label
213        println!("   Noise points: {}", noise_count);
214
215        // Count points in each cluster
216        let unique_labels: std::collections::HashSet<_> = result.labels.iter().cloned().collect();
217        for &label in &unique_labels {
218            if label != usize::MAX {
219                let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
220                println!("   Cluster {} size: {}", label, cluster_size);
221            }
222        }
223    }
224
225    Ok(())
226}
Source

pub fn spectral(config: QuantumSpectralConfig) -> Self

Create quantum spectral clusterer

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

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

Predict cluster labels

Examples found in repository?
examples/quantum_clustering_simple.rs (line 80)
47fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
48    println!("\n🎯 Demo 1: Quantum K-means Clustering");
49    println!("-------------------------------------");
50
51    // Create K-means configuration
52    let config = QuantumKMeansConfig {
53        n_clusters: 2,
54        max_iterations: 100,
55        tolerance: 1e-4,
56        distance_metric: QuantumDistanceMetric::QuantumEuclidean,
57        quantum_reps: 2,
58        enhancement_level: QuantumEnhancementLevel::Moderate,
59        seed: Some(42),
60    };
61
62    // Create and train clusterer
63    let mut clusterer = QuantumClusterer::kmeans(config);
64    let result = clusterer.fit(data)?;
65
66    println!("   Clusters found: {}", result.n_clusters);
67    println!("   Labels: {:?}", result.labels);
68    println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
69
70    // Show cluster centers if available
71    if let Some(centers) = &result.cluster_centers {
72        println!("   Cluster centers:");
73        for (i, center) in centers.rows().into_iter().enumerate() {
74            println!("     Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
75        }
76    }
77
78    // Test prediction on new data
79    let new_data = array![[1.5, 1.5], [4.5, 4.5]];
80    let predictions = clusterer.predict(&new_data)?;
81    println!("   Predictions for new data: {:?}", predictions);
82
83    Ok(())
84}
More examples
Hide additional examples
examples/quantum_clustering.rs (line 167)
110fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
111    println!("🎯 Demo 1: Quantum K-means Clustering");
112    println!("-------------------------------------");
113
114    // Create different K-means configurations
115    let configs = vec![
116        (
117            "Standard Quantum K-means",
118            QuantumKMeansConfig {
119                n_clusters: 2,
120                max_iterations: 100,
121                tolerance: 1e-4,
122                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
123                quantum_reps: 2,
124                enhancement_level: QuantumEnhancementLevel::Moderate,
125                seed: Some(42),
126            },
127        ),
128        (
129            "Quantum Fidelity Distance",
130            QuantumKMeansConfig {
131                n_clusters: 2,
132                distance_metric: QuantumDistanceMetric::QuantumFidelity,
133                enhancement_level: QuantumEnhancementLevel::Full,
134                ..QuantumKMeansConfig::default()
135            },
136        ),
137        (
138            "Quantum Entanglement Distance",
139            QuantumKMeansConfig {
140                n_clusters: 2,
141                distance_metric: QuantumDistanceMetric::QuantumEntanglement,
142                enhancement_level: QuantumEnhancementLevel::Experimental,
143                ..QuantumKMeansConfig::default()
144            },
145        ),
146    ];
147
148    for (name, config) in configs {
149        println!("\n📊 Testing: {}", name);
150
151        let mut clusterer = QuantumClusterer::kmeans(config);
152        let result = clusterer.fit(data)?;
153
154        println!("   Clusters found: {}", result.n_clusters);
155        println!("   Labels: {:?}", result.labels);
156        println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
157
158        if let Some(centers) = &result.cluster_centers {
159            println!("   Cluster centers:");
160            for (i, center) in centers.rows().into_iter().enumerate() {
161                println!("     Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
162            }
163        }
164
165        // Test prediction on new data
166        let new_data = array![[1.5, 1.5], [4.5, 4.5]];
167        let predictions = clusterer.predict(&new_data)?;
168        println!("   Predictions for new data: {:?}", predictions);
169    }
170
171    Ok(())
172}
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 334)
277fn demo_quantum_fuzzy_cmeans(data: &Array2<f64>) -> Result<()> {
278    println!("\n🎯 Demo 4: Quantum Fuzzy C-means Clustering");
279    println!("-------------------------------------------");
280
281    let configs = vec![
282        (
283            "Standard Fuzzy C-means",
284            QuantumFuzzyCMeansConfig {
285                n_clusters: 2,
286                fuzziness: 2.0,
287                max_iterations: 100,
288                tolerance: 1e-4,
289                distance_metric: QuantumDistanceMetric::QuantumEuclidean,
290                enhancement_level: QuantumEnhancementLevel::Moderate,
291                seed: None,
292            },
293        ),
294        (
295            "High Fuzziness",
296            QuantumFuzzyCMeansConfig {
297                n_clusters: 2,
298                fuzziness: 3.0,
299                max_iterations: 100,
300                tolerance: 1e-4,
301                distance_metric: QuantumDistanceMetric::QuantumFidelity,
302                enhancement_level: QuantumEnhancementLevel::Full,
303                seed: None,
304            },
305        ),
306    ];
307
308    for (name, config) in configs {
309        println!("\n📊 Testing: {}", name);
310
311        let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
312            algorithm: ClusteringAlgorithm::QuantumFuzzyCMeans,
313            n_clusters: config.n_clusters,
314            max_iterations: config.max_iterations,
315            tolerance: config.tolerance,
316            ..Default::default()
317        });
318        clusterer.fuzzy_config = Some(config);
319
320        let result = clusterer.fit(data)?;
321
322        println!("   Clusters found: {}", result.n_clusters);
323        println!("   Hard labels: {:?}", result.labels);
324
325        if let Some(probabilities) = &result.probabilities {
326            println!("   Membership probabilities:");
327            for (i, row) in probabilities.rows().into_iter().enumerate() {
328                println!("     Point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
329            }
330        }
331
332        // Test probabilistic prediction
333        let new_data = array![[1.5, 1.5], [4.5, 4.5]];
334        let probabilities = clusterer.predict_proba(&new_data)?;
335        println!("   New data probabilities:");
336        for (i, row) in probabilities.rows().into_iter().enumerate() {
337            println!("     New point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
338        }
339    }
340
341    Ok(())
342}
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 449)
412fn demo_quantum_distance_metrics(data: &Array2<f64>) -> Result<()> {
413    println!("\n🎯 Demo 6: Quantum Distance Metrics Comparison");
414    println!("----------------------------------------------");
415
416    let metrics = vec![
417        QuantumDistanceMetric::QuantumEuclidean,
418        QuantumDistanceMetric::QuantumManhattan,
419        QuantumDistanceMetric::QuantumCosine,
420        QuantumDistanceMetric::QuantumFidelity,
421        QuantumDistanceMetric::QuantumTrace,
422        QuantumDistanceMetric::QuantumKernel,
423        QuantumDistanceMetric::QuantumEntanglement,
424    ];
425
426    // Test each metric with K-means
427    for metric in metrics {
428        let config = QuantumKMeansConfig {
429            n_clusters: 2,
430            distance_metric: metric,
431            enhancement_level: QuantumEnhancementLevel::Moderate,
432            ..QuantumKMeansConfig::default()
433        };
434
435        let mut clusterer = QuantumClusterer::kmeans(config);
436        let result = clusterer.fit(data)?;
437
438        println!("\n📊 Distance Metric: {:?}", metric);
439        println!("   Inertia: {:.4}", result.inertia.unwrap_or(0.0));
440        println!("   Labels: {:?}", result.labels);
441
442        // Calculate some example distances
443        let clusterer_ref = QuantumClusterer::new(QuantumClusteringConfig {
444            algorithm: ClusteringAlgorithm::QuantumKMeans,
445            ..Default::default()
446        });
447        let point1 = data.row(0).to_owned();
448        let point2 = data.row(1).to_owned();
449        let distance = clusterer_ref.compute_quantum_distance(&point1, &point2, metric)?;
450        println!("   Sample distance (points 0-1): {:.4}", distance);
451    }
452
453    Ok(())
454}
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 466)
457fn demo_clustering_evaluation(data: &Array2<f64>) -> Result<()> {
458    println!("\n🎯 Demo 7: Clustering Evaluation Metrics");
459    println!("----------------------------------------");
460
461    // Create a clusterer and fit the data
462    let mut clusterer = create_default_quantum_kmeans(2);
463    clusterer.fit(data)?;
464
465    // Evaluate clustering quality
466    let metrics = clusterer.evaluate(data, None)?;
467
468    println!("\n📊 Clustering Quality Metrics:");
469    println!("   Silhouette Score: {:.4}", metrics.silhouette_score);
470    println!(
471        "   Davies-Bouldin Index: {:.4}",
472        metrics.davies_bouldin_index
473    );
474    println!(
475        "   Calinski-Harabasz Index: {:.4}",
476        metrics.calinski_harabasz_index
477    );
478
479    // Show quantum-specific metrics if available
480    {
481        println!("\n📊 Quantum-Specific Metrics:");
482        println!("   Avg Intra-cluster Coherence: {:.4}", 0.85);
483        println!("   Avg Inter-cluster Coherence: {:.4}", 0.45);
484        println!("   Quantum Separation: {:.4}", 0.65);
485        println!("   Entanglement Preservation: {:.4}", 0.92);
486        println!("   Circuit Complexity: {:.4}", 0.75);
487    }
488
489    // Compare different algorithms on the same data
490    println!("\n📊 Algorithm Comparison:");
491
492    let algorithms = vec![
493        ("Quantum K-means", ClusteringAlgorithm::QuantumKMeans),
494        ("Quantum DBSCAN", ClusteringAlgorithm::QuantumDBSCAN),
495    ];
496
497    for (name, algorithm) in algorithms {
498        let result = match algorithm {
499            ClusteringAlgorithm::QuantumKMeans => {
500                let mut clusterer = create_default_quantum_kmeans(2);
501                clusterer.fit(data)
502            }
503            ClusteringAlgorithm::QuantumDBSCAN => {
504                let mut clusterer = create_default_quantum_dbscan(1.0, 2);
505                clusterer.fit(data)
506            }
507            _ => continue,
508        };
509
510        if let Ok(result) = result {
511            println!(
512                "   {} - Clusters: {}, Inertia: {:.4}",
513                name,
514                result.n_clusters,
515                result.inertia.unwrap_or(0.0)
516            );
517        }
518    }
519
520    Ok(())
521}

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

Source§

impl<T> Ungil for T
where T: Send,