///|
/// WNN 多模态整合演示: RNA+ADT 双模态 -> 细胞级权重 -> 联合图 -> 聚类.
fn main raise {
  println("=== WNN 加权最近邻多模态整合 (Seurat v4 风格) ===")

  // 模拟: 两群细胞, RNA 与 ADT 各自编码群结构(坐标尺度不同)
  let rng = @src.Rng::from_int(7)
  let rna : Array[Array[Double]] = []
  let adt : Array[Array[Double]] = []
  // 群 A: RNA ~(0,0), ADT ~(1,5)
  for i = 0; i < 15; i = i + 1 {
    rna.push([rng.uniform(-0.3, 0.3), rng.uniform(-0.3, 0.3)])
    adt.push([1.0 + rng.uniform(-0.5, 0.5), 5.0 + rng.uniform(-0.5, 0.5)])
  }
  // 群 B: RNA ~(10,10), ADT ~(8,12)
  for i = 0; i < 15; i = i + 1 {
    rna.push([10.0 + rng.uniform(-0.3, 0.3), 10.0 + rng.uniform(-0.3, 0.3)])
    adt.push([8.0 + rng.uniform(-0.5, 0.5), 12.0 + rng.uniform(-0.5, 0.5)])
  }
  let m_rna = @src.wnn_modality("RNA", rna)
  let m_adt = @src.wnn_modality("ADT", adt)
  println("细胞 \{rna.length()} 个, RNA 与 ADT 双模态")

  // 1. WNN 整合
  println("\n1. WNN 整合(k=8)")
  let result = @src.wnn_integrate(m_rna, m_adt, k=8)
  println("  " + result.weight_summary())
  println("  权重守恒(每细胞和=1): \{result.weights_normalized()}")

  // 2. 细胞级权重分布
  println("\n2. 细胞级模态权重(前 6 个)")
  for i = 0; i < 6; i = i + 1 {
    println(
      "  cell\{i}: w[RNA]=\{result.modality_weights[i][0]} w[ADT]=\{result.modality_weights[i][1]}",
    )
  }

  // 3. 联合图
  println("\n3. 联合加权图(对称)")
  let g = result.joint_graph
  println("  顶点数: \{g.num_vertices()}")
  let mut n_edges = 0
  for i = 0; i < g.num_vertices(); i = i + 1 {
    n_edges = n_edges + g.adj[i].length()
  }
  println("  有向边数(无向 x2): \{n_edges}")
  println(
    "  cell0 邻居: \{g.adj[0].length()} 个, cell15 邻居: \{g.adj[15].length()} 个",
  )
  println("  cell0 度: \{g.degree(0)}")

  // 4. 联合图聚类
  println("\n4. 联合图聚类(scanpy_leiden 闭环)")
  let labels = result.cluster()
  let mut s0 = ""
  let mut s1 = ""
  for i = 0; i < 15; i = i + 1 {
    s0 = s0 + labels[i].to_string()
  }
  for i = 15; i < 30; i = i + 1 {
    s1 = s1 + labels[i].to_string()
  }
  println("  群 A 标签: \{s0}")
  println("  群 B 标签: \{s1}")
  println(
    "  两群分离: \{labels[0] != labels[15]} (群 A=\{labels[0]}, 群 B=\{labels[15]})",
  )

  // 5. 模态结构强弱对比
  println("\n5. 模态结构强弱对权重的影响")
  // RNA 强结构(紧簇), ADT 近随机 -> RNA 权重应高
  let rna2 : Array[Array[Double]] = []
  for i = 0; i < 10; i = i + 1 {
    rna2.push([0.0, 0.0])
  }
  for i = 0; i < 10; i = i + 1 {
    rna2.push([100.0, 100.0])
  }
  let adt2 : Array[Array[Double]] = []
  for i = 0; i < 20; i = i + 1 {
    adt2.push([i.to_double() * 0.1, i.to_double() % 2.0 * 0.05])
  }
  let a2 = @src.wnn_modality("RNA", rna2)
  let b2 = @src.wnn_modality("ADT", adt2)
  let r2 = @src.wnn_integrate(a2, b2, k=3)
  let mut sa = 0.0
  for w in r2.modality_weights {
    sa = sa + w[0]
  }
  println("  RNA 强结构时平均 w[RNA] = \{sa / 20.0} (应显著 > 0.5)")

  println(
    "\n完成: 双模态 KNN -> 跨模态一致性权重 -> 联合图 -> 聚类全链路本地完成.",
  )
}