///|
/// VennDiagram module example - Venn diagram set operations and region calculations.
///
/// Run: moon run examples/venn_diagram_demo
fn main {
println("=== VennDiagram Module Demo ===")
println("Venn Diagram Set Operations and Region Calculations")
println("")
// Load sample data
println("=== Sample Data ===")
let sets = @bio.venn_sample_gene_sets()
let names = @bio.venn_sample_gene_names()
let n_sets = sets.length()
println("Number of sets: \{n_sets}")
let mut i = 0
while i < n_sets {
println(" \{names[i]}: \{sets[i].length()} elements")
i = i + 1
}
println("")
// Create Venn diagram
println("=== Venn Diagram ===")
let result = @bio.venn_diagram(sets, names~)
println("Total elements in universe: \{result.total_elements}")
println("Number of regions: \{result.regions.length()}")
println("")
// Show only-in-set elements
println("=== Elements Only in Each Set ===")
i = 0
while i < n_sets {
let only = @bio.venn_only_in_set(result, i)
println(" Only in \{names[i]}: \{only.length()} elements")
if only.length() > 0 {
println(" First 5: \{preview(only, 5)}")
}
i = i + 1
}
println("")
// Show intersection of all sets
println("=== Intersection of All Sets ===")
let all_intersect = @bio.venn_all_intersect(result)
println("Elements in all \{n_sets} sets: \{all_intersect.length()}")
if all_intersect.length() > 0 {
println(" Elements: \{preview(all_intersect, 10)}")
}
println("")
// Show unique to each set
println("=== Unique to Each Set ===")
let unique = @bio.venn_unique_to_each(result)
i = 0
while i < unique.length() {
println(" Unique to \{names[i]}: \{unique[i].length()} elements")
i = i + 1
}
println("")
// Pairwise overlap
println("=== Pairwise Overlap ===")
i = 0
while i < n_sets {
let mut j = i + 1
while j < n_sets {
if j < n_sets {
let overlap = @bio.venn_pairwise_overlap(result, i, j)
println(" \{names[i]} vs \{names[j]}:")
println(" Intersection: \{overlap["intersection_count"]}")
println(" Union: \{overlap["union_count"]}")
println(" Jaccard: \{format_stat(overlap["jaccard_index"])}")
println(
" Overlap coefficient: \{format_stat(overlap["overlap_coefficient"])}",
)
println(
" Dice coefficient: \{format_stat(overlap["dice_coefficient"])}",
)
}
j = j + 1
}
i = i + 1
}
println("")
// Set operations
println("=== Set Operations ===")
let a = sets[0]
let b = sets[1]
println("Set A (\{names[0]}): \{a.length()} elements")
println("Set B (\{names[1]}): \{b.length()} elements")
let inter = @bio.venn_intersection(a, b)
println("Intersection (A ∩ B): \{inter.length()} elements")
if inter.length() > 0 {
println(" Elements: \{preview(inter, 5)}")
}
let uni = @bio.venn_union_two(a, b)
println("Union (A ∪ B): \{uni.length()} elements")
let diff = @bio.venn_difference(a, b)
println("Difference (A - B): \{diff.length()} elements")
if diff.length() > 0 {
println(" Elements: \{preview(diff, 5)}")
}
println("")
// Similarity metrics
println("=== Similarity Metrics ===")
let jacc = @bio.venn_jaccard(a, b)
println("Jaccard index (A vs B): \{format_stat(jacc)}")
let dice = @bio.venn_dice(a, b)
println("Dice coefficient (A vs B): \{format_stat(dice)}")
println("")
// Summary
println("=== Summary ===")
let summary = @bio.venn_summary(result)
println(summary)
}
///|
fn preview(arr : Array[String], n : Int32) -> String {
let mut s = "["
let limit = if arr.length() < n { arr.length() } else { n }
let mut i = 0
while i < limit {
if i > 0 {
s = s + ", "
}
s = s + arr[i]
i = i + 1
}
if arr.length() > n {
s = s + ", ..."
}
s = s + "]"
s
}
///|
fn format_stat(value : Double) -> String {
let rounded = (value * 1000.0).round() / 1000.0
"\{rounded}"
}