///|
/// 3D 基因组建模演示: 接触图 -> 距离转换 -> cMDS -> 3D 坐标 -> PDB.
fn main raise {
  println("=== 3D 基因组建模 (接触图 -> cMDS -> PDB, ShRec 风格) ===")

  // 模拟接触图: 线性邻近衰减 + 第二域内强接触
  let n = 20
  let contacts : Array[Array[Double]] = Array(capacity=0)
  for i = 0; i < n; i = i + 1 {
    contacts.push(Array::make(n, 0.0))
  }
  for i = 0; i < n; i = i + 1 {
    for j = i + 1; j < n; j = j + 1 {
      let sep = if j - i > 0 { j - i } else { i - j }
      let v = if sep <= 5 {
        10.0 / sep.to_double()
      } else if sep <= 15 {
        2.0 / sep.to_double()
      } else {
        0.5 / sep.to_double()
      }
      contacts[i][j] = v
      contacts[j][i] = v
    }
  }
  let dom_end = if n / 2 + 5 < n { n / 2 + 5 } else { n }
  for i = n / 2; i < dom_end; i = i + 1 {
    for j = n / 2; j < dom_end; j = j + 1 {
      if i != j {
        contacts[i][j] = contacts[i][j] + 5.0
      }
    }
  }
  println("接触图 \{n}x\{n}(含 [10,15) 强接触域)")

  // 1. 距离转换
  println("\n1. 距离转换(ShRec3D 倒数变换)")
  let d = @src.genome3d_contact_to_distance(contacts)
  println("  d[0][1]=\{d[0][1]} (接触 10 -> 距离 0.1)")
  println("  d[0][19]=\{d[0][19]} (弱接触 -> 大距离)")

  // 2. cMDS 建模
  println("\n2. 经典 MDS 建模")
  let model = @src.genome3d_model(contacts)
  println("  " + model.summary())

  // 3. 结构验证
  println("\n3. 结构验证")
  let near = model.model_distance(5, 6)
  let far = model.model_distance(5, 18)
  println("  邻近 bead(5,6) 距离: \{near}")
  println("  远端 bead(5,18) 距离: \{far}")
  println("  邻近 < 远端: \{near < far}")
  // 域内压缩
  let intra = model.model_distance(13, 15)
  let inter = model.model_distance(13, 19)
  println(
    "  域内 bead(13,15): \{intra} < 域外(13,19): \{inter}: \{intra < inter}",
  )

  // 4. 坐标输出
  println("\n4. 3D 坐标(前 5 个 bead)")
  for i = 0; i < 5; i = i + 1 {
    let p = model.coordinates[i]
    println("  bead\{i}: (\{p[0]}, \{p[1]}, \{p[2]})")
  }

  // 5. PDB 输出与解析闭环
  println("\n5. PDB 输出(与结构栈闭环)")
  let pdb = model.to_pdb()
  let lines = pdb.split("\n").to_array()
  println("  ATOM 行:")
  for li = 0; li < lines.length() && li < 5; li = li + 1 {
    let s = lines[li].to_owned()
    if s.has_prefix("ATOM") || s.has_prefix("REMARK") {
      println("  | \{s}")
    }
  }
  let parsed = @src.genome3d_parse_pdb_ca(pdb)
  println("  解析回 \{parsed.length()} 个 CA 坐标(roundtrip 闭环)")
  println("  bead0 往返: (\{parsed[0][0]}, \{parsed[0][1]}, \{parsed[0][2]})")

  println(
    "\n完成: 接触图 -> 距离 -> cMDS 3D 坐标 -> PDB 全链路本地完成.",
  )
}