///|
/// msprime_demo — msprime 风格群体谱系模拟演示:
/// 时变 Ne 扩张模型 + 重组多块 -> SFS -> Tajima's D / Watterson theta ->
/// JSON / tree sequence.
///|
fn msd_demes() -> String {
"# demes model: bottleneck\n" +
"- start_time: 0\n end_time: 500\n ne: 1000\n" +
"- start_time: 500\n end_time: 10000\n ne: 10000\n"
}
///|
fn main {
println("1. msprime-lite 群体谱系模拟演示(时变 Ne + 重组 + SFS)")
// 2. demes 解析
let epochs = @src.msprime_parse_demes(msd_demes())
println("2. demes 解析: \{epochs.length()} 个 epoch")
for e in epochs {
println(" [\{e.start_time}, \{e.end_time}) Ne=\{e.ne}")
}
// 3. 模拟
let params : @src.MsprimeParams = {
n_samples: 20,
n_pops: 1,
epochs,
migration: None,
recombination_rate: 1.0e-8,
sequence_length: 10000,
mutation_rate: 1.0e-8,
n_blocks: 4,
}
let rng = @src.Rng::new(20261031UL)
let result = @src.msprime_simulate(params, rng)
println(
"3. 模拟: \{result.n_mutations}) \{result.sequence_length}bp, \{result.blocks.length()} 块",
)
// 4. SFS 统计
println(
"4. 统计: Tajima's D = \{result.tajima_d}, Watterson theta = \{result.watterson_theta}",
)
// 5. 折叠 SFS 前 5 项
println("5. 折叠 SFS (前 5 项):")
for i = 0; i < 5 && i < result.folded_sfs.length(); i = i + 1 {
println(" k=\{i}: \{result.folded_sfs[i]}")
}
// 6. 导出
let json = @src.msprime_json(result)
let ts = @src.msprime_tree_sequence(result)
println(
"6. JSON \{json.length()} 字节, tree sequence \{ts.length()} 字节",
)
println(@src.msprime_summary_line(result))
println(
"演示完成: demes 解析 -> 时变 Ne 模拟 -> 重组多块 -> SFS -> 统计量闭环",
)
}