///|
/// destiny Demo - Single-cell Diffusion Map Dimensionality Reduction.
/// Inspired by Bioconductor destiny package.

///|
fn main {
  println("=== destiny Diffusion Map Demo ===")
  println("Inspired by Bioconductor destiny package")
  println("")

  println("1. Creating single-cell data...")
  let cells = @src.create_example_sc_data(20, 5)
  println("   Cells: \{cells.length().to_string()}")
  println("   Genes per cell: \{cells[0].expression.length().to_string()}")
  println("")

  println("2. Computing distance matrix...")
  let dist_matrix = @src.compute_distance_matrix(cells, "euclidean")
  println(
    "   Distance matrix size: \{dist_matrix.n_cells.to_string()}x\{dist_matrix.n_cells.to_string()}",
  )
  println("")

  println("3. Computing diffusion map (2 components)...")
  let result = @src.compute_diffusion_map(cells, 2, 1.0)
  println("   Cells embedded: \{result.cell_ids.length().to_string()}")
  println("   Components: \{result.eigenvalues.length().to_string()}")
  println("")

  println("4. Eigenvalues:")
  let mut i = 0
  while i < result.eigenvalues.length() {
    println(
      "   Component \{i.to_string()}: eigenvalue = \{result.eigenvalues[i].to_string()}, explained variance = \{(result.explained_variance[i] * 100.0).to_string()}%",
    )
    i = i + 1
  }
  println("")

  println("5. Embedding coordinates (first 5 cells):")
  let coords = @src.destiny_plot_coordinates(result, 0, 1)
  let mut c = 0
  while c < 5 && c < coords.length() {
    let (cell_id, x, y) = coords[c]
    println("   \{cell_id}: DC1 = \{x.to_string()}, DC2 = \{y.to_string()}")
    c = c + 1
  }
  println("")

  println("6. Automatic embedding with optimal sigma...")
  let auto_result = @src.destiny_create_embedding(cells, 2)
  println("   Cells embedded: \{auto_result.cell_ids.length().to_string()}")
  println("")

  println("7. Diffusion map summary:")
  let summary = @src.destiny_summary(result)
  println("   \{summary}")

  println("=== destiny demo completed ===")
}