///|
fn main {
  println("=== Bioconductor-style vsn Demo ===\n")

  println("--- 1. glog (Generalized Logarithm) ---")
  let xs = [0.1, 1.0, 10.0, 100.0, 1000.0]
  println("  vs glog transform with a=1.0, b=1.0:")
  let mut i = 0
  while i < xs.length() {
    let x = xs[i]
    let y = @bio.glog(x, 1.0, 1.0)
    let yinv = @bio.glog_inv(y, 1.0, 1.0)
    let diff_abs = (x - yinv).abs()
    println(
      "    glog(\{x}) = \{y}  (inverse check: |x - glog_inv(y)| = \{diff_abs})",
    )
    i = i + 1
  }

  println("\n--- 2. VSN2 Variance Stabilization ---")
  let data = [
    [100.0, 200.0, 150.0, 300.0],
    [150.0, 180.0, 160.0, 290.0],
    [90.0, 210.0, 140.0, 310.0],
    [110.0, 220.0, 155.0, 305.0],
    [120.0, 190.0, 145.0, 295.0],
    [5000.0, 8000.0, 6000.0, 9000.0],
    [6000.0, 7500.0, 6500.0, 8500.0],
    [5500.0, 8500.0, 5800.0, 9500.0],
  ]
  let fit = @bio.vsn_fit_and_report(data)
  println(@bio.summarize_vsn_fit(fit))
  let normalized = @bio.vsn2(data)
  println("\n  Normalized data (first 3 rows):")
  let mut r2 = 0
  while r2 < 3 && r2 < normalized.length() {
    let row = normalized[r2]
    let mut s2 = "    [".to_string()
    let mut c2 = 0
    while c2 < row.length() {
      if c2 > 0 {
        s2 = s2 + ", "
      }
      s2 = s2 + row[c2].to_string()
      c2 = c2 + 1
    }
    s2 = s2 + "]"
    println(s2)
    r2 = r2 + 1
  }

  println("\n--- 3. VSN Denoise ---")
  let denoised = @bio.vsn_denoise(data)
  let d_rows = denoised.length()
  let d_cols = if d_rows > 0 { denoised[0].length() } else { 0 }
  println("  Denoised data has shape [\{d_rows} x \{d_cols}]")
  let mut r = 0
  while r < 3 && r < denoised.length() {
    let row = denoised[r]
    let mut s = "    row[\{r}]: [".to_string()
    let mut c = 0
    while c < row.length() {
      if c > 0 {
        s = s + ", "
      }
      s = s + row[c].to_string()
      c = c + 1
    }
    s = s + "]"
    println(s)
    r = r + 1
  }

  println("\n--- 4. Mean-SD Bins ---")
  let bins = @bio.mean_sd_bins(data, 4)
  println("  Bins count: \{bins.length()}")
  let mut b = 0
  while b < bins.length() {
    let bin = bins[b]
    println(
      "    bin[\{b}]: mean_x=\{bin.mean_x}, sd_y=\{bin.sd_y}, count=\{bin.count}",
    )
    b = b + 1
  }

  println("\nVSN demo completed successfully!")
}