///|
/// Sequence clustering example inspired by Biopython Bio.Cluster.
///
/// Run: moon run examples/cluster_demo/main.mbt
fn main {
println("=== Bio.Cluster Demo ===")
let sequences = [
"ACGTACGTACGT", "ACGTACATACGT", "ACATACGTACGT", "TTTTTTTTTTTT", "TTTTTTATTTTT",
"AAAAAAAAAAAA",
]
let names = ["Seq1", "Seq2", "Seq3", "Seq4", "Seq5", "Seq6"]
println("\n1. Sequences to cluster:")
for i = 0; i < sequences.length(); i = i + 1 {
println(" \{names[i]}: \{sequences[i]}")
}
println("\n2. Distance matrix:")
let distances = @bio.distance_matrix(sequences)
for i = 0; i < distances.length(); i = i + 1 {
let row = distances[i].map(fn(d) { d.to_string() }).join("\t")
println(" \{names[i]}:\t\{row}")
}
println("\n3. Single linkage clustering (threshold=0.2):")
let single_result = @bio.single_linkage_clustering(distances, 0.2)
println(" Number of clusters: \{@bio.total_clusters(single_result)}")
println("\n4. Complete linkage clustering (threshold=0.2):")
let complete_result = @bio.complete_linkage_clustering(distances, 0.2)
println(" Number of clusters: \{@bio.total_clusters(complete_result)}")
println("\n5. Average linkage clustering (threshold=0.2):")
let avg_result = @bio.average_linkage_clustering(distances, 0.2)
println(" Number of clusters: \{@bio.total_clusters(avg_result)}")
println("\n6. Convert to Newick format:")
let newick = @bio.hclust_to_newick(single_result, names)
println(" Newick: \{newick}")
println("\n7. Silhouette score (manual labels):")
let labels = [0, 0, 0, 1, 1, 2]
let score = @bio.seq_silhouette_score(sequences, labels)
println(" Score: \{score}")
println("\n8. Single linkage with higher threshold (0.5):")
let high_result = @bio.single_linkage_clustering(distances, 0.5)
println(" Number of clusters: \{@bio.total_clusters(high_result)}")
}