///|
/// Demo: GOSemSim — GO semantic similarity (Bioconductor).
///
/// Ported from GOSemSim R package (Yu et al., 2010).
/// Five measures: Resnik, Lin, Rel (Schlicker), Jiang, Wang.
/// Gene-level combine: max, avg, rcmax, BMA.
fn main {
  let g = @src.gosemsim_example_graph()

  println("=== GOSemSim Demo (Bioconductor) ===")
  println("GO semantic similarity — 5 measures × gene-level combine")
  println("")

  println("Example GO DAG (root=GO:0008150):")
  println("  GO:0008150(ic=0.0) biological_process")
  println("    ├── GO:0050896(0.3) response_to_stimulus")
  println(
    "    │    ├── GO:0009987(0.5) cellular_process → GO:0006810(0.7) transport",
  )
  println(
    "    │    └── GO:0023046(0.4) signaling → GO:0007165(0.6) signal_transduction",
  )
  println(
    "    └── GO:0009058(0.2) biosynthetic_process → GO:0010467(0.35) gene_expression",
  )
  println("")

  // ── Term-level comparison ──────────────────────────────────────────
  println("=== Term-level similarity (5 measures) ===")

  fn fmt(v : Double) -> String {
    v.to_string()
  }

  let pair : Array[(String, String, String)] = Array(capacity=0)
  pair.push(("GO:0006810", "GO:0006810", "self"))
  pair.push(("GO:0006810", "GO:0009987", "parent-child"))
  pair.push(("GO:0006810", "GO:0007165", "sibling_subtree"))
  pair.push(("GO:0009987", "GO:0023046", "siblings"))
  pair.push(("GO:0006810", "GO:0010467", "no_common"))
  pair.push(("GO:0007165", "GO:0010467", "distant_root"))

  println("Pair\tResnik\tLin\tRel\tJiang\tWang")
  let mut i = 0
  while i < pair.length() {
    let (t1, t2, desc) = pair[i]
    let resnik = @src.gosemsim_term_sim(g, t1, t2, @src.resnik_measure())
    let lin = @src.gosemsim_term_sim(g, t1, t2, @src.lin_measure())
    let rel = @src.gosemsim_term_sim(g, t1, t2, @src.rel_measure())
    let jiang = @src.gosemsim_term_sim(g, t1, t2, @src.jiang_measure())
    let wang = @src.gosemsim_term_sim(g, t1, t2, @src.wang_measure())
    println(
      desc +
      "\t" +
      fmt(resnik) +
      "\t" +
      fmt(lin) +
      "\t" +
      fmt(rel) +
      "\t" +
      fmt(jiang) +
      "\t" +
      fmt(wang),
    )
    i = i + 1
  }
  println("")

  // ── Gene-level combine methods ──────────────────────────────────────
  println("=== Gene-level similarity (Resnik × combine) ===")
  let go1 : Array[String] = ["GO:0006810", "GO:0007165"]
  let go2 : Array[String] = ["GO:0006810", "GO:0009987"]

  // Resnik 2x2 matrix:
  //   GO:0006810 vs GO:0006810 = 0.7
  //   GO:0006810 vs GO:0009987 = 0.5
  //   GO:0007165 vs GO:0006810 = 0.3
  //   GO:0007165 vs GO:0009987 = 0.3
  let max_v = @src.gosemsim_gen_sim(
    g,
    go1,
    go2,
    @src.resnik_measure(),
    combine="max",
  )
  let avg_v = @src.gosemsim_gen_sim(
    g,
    go1,
    go2,
    @src.resnik_measure(),
    combine="avg",
  )
  let rcmax_v = @src.gosemsim_gen_sim(
    g,
    go1,
    go2,
    @src.resnik_measure(),
    combine="rcmax",
  )
  let bma_v = @src.gosemsim_gen_sim(
    g,
    go1,
    go2,
    @src.resnik_measure(),
    combine="BMA",
  )

  println("  Gene1: transport(0.7) + signal_transduction(0.6)")
  println("  Gene2: transport(0.7) + cellular_process(0.5)")
  println("  Resnik matrix: [[0.7, 0.5], [0.3, 0.3]]")
  println("  combine=max    → " + fmt(max_v))
  println("  combine=avg    → " + fmt(avg_v))
  println("  combine=rcmax  → " + fmt(rcmax_v))
  println("  combine=BMA    → " + fmt(bma_v))
  println("")

  println("=== Done ===")
}