///|
/// UMAP Dimensionality Reduction Demo
///
/// This demo shows how to use the uwot module for
/// Uniform Manifold Approximation and Projection (UMAP) analysis.
fn main {
println("=== UMAP Dimensionality Reduction Demo ===")
println("")
println("1. Default UMAP configuration:")
let config = @src.UmapConfig::new()
println(" n_neighbors: \{config.n_neighbors}")
println(" n_components: \{config.n_components}")
println(" n_epochs: \{config.n_epochs}")
println(" min_dist: \{config.min_dist}")
println(" spread: \{config.spread}")
println(" learning_rate: \{config.learning_rate}")
println(" metric: \{config.metric}")
println("")
println("2. Distance matrix calculation:")
let sample_data = [[0.0, 0.0, 0.0], [3.0, 4.0, 0.0], [1.0, 1.0, 1.0]]
let dist_matrix = @src.uwot_distance_matrix(sample_data)
println(" Samples: \{sample_data.length()}")
println(" Features per sample: \{sample_data[0].length()}")
println(" Distance matrix:")
let mut i = 0
while i < dist_matrix.length() {
println(" \{Repr(dist_matrix[i])}")
i = i + 1
}
println("")
println("3. UMAP on clustered test data:")
let test_data = @src.create_umap_test_data(20, 5)
println(" Test data samples: \{test_data.length()}")
println(" Test data features: \{test_data[0].length()}")
println(" Data has 4 clusters")
println("")
println("4. Running UMAP (reduced epochs for demo):")
let test_config = @src.UmapConfig::new_custom(5, 2, 100, 42)
let umap_result = @src.uwot_umap(test_data, test_config)
println(
" Embedding shape: \{umap_result.embedding.length()} x \{umap_result.embedding[0].length()}",
)
println(" Epochs run: \{umap_result.n_epochs}")
println("")
println("5. First few embedding coordinates:")
let mut j = 0
while j < 5 && j < umap_result.embedding.length() {
println(
" Sample \{j}: [\{umap_result.embedding[j][0]}, \{umap_result.embedding[j][1]}]",
)
j = j + 1
}
println("")
println("6. UMAP with 3 components:")
let config_3d = @src.UmapConfig::new_custom(5, 3, 100, 42)
let result_3d = @src.uwot_umap(test_data, config_3d)
println(
" Embedding shape: \{result_3d.embedding.length()} x \{result_3d.embedding[0].length()}",
)
println(
" Sample 0: [\{result_3d.embedding[0][0]}, \{result_3d.embedding[0][1]}, \{result_3d.embedding[0][2]}]",
)
println("")
println("=== Demo Complete ===")
}