///|
/// 确定性并行调度演示: 静态轮转 vs LPT 贪心 -> DAG 流水线 -> 失败传播
/// -> 可复现 RNG 子流.
fn main raise {
// 1. 不均负载: 静态轮转 vs LPT 贪心
let costs = [10.0, 1.0, 9.0, 2.0, 8.0, 3.0, 7.0, 4.0, 6.0, 5.0]
let tasks : Array[@src.BpTask] = []
for i in 0.. map -> {snps, indels} -> annotate)
let pipeline : Array[@src.BpTask] = [
@src.BpTask::new("qc", 4.0, [1.0]),
@src.BpTask::with_deps("map", 6.0, [1.0], ["qc"]),
@src.BpTask::with_deps("call_snps", 5.0, [1.0], ["map"]),
@src.BpTask::with_deps("call_indels", 3.0, [1.0], ["map"]),
@src.BpTask::with_deps("annotate", 2.0, [1.0], ["call_snps", "call_indels"]),
]
let dag_rep = @src.bp_dag_schedule(pipeline, 2)
println("=== DAG 流水线: 5 阶段变异 calling x 2 workers ===")
for r in dag_rep.results {
println(
" " +
r.id +
"@w" +
r.worker.to_string() +
" " +
r.start.to_string() +
" ~ " +
r.finish.to_string() +
" " +
(if r.ok { "ok" } else { "FAIL" }),
)
}
println(
" makespan " +
dag_rep.makespan.to_string() +
" (关键路径 qc+map+call_snps+annotate)",
)
// 3. 失败传播: qc 失败 -> 下游全跳过
let broken : Array[@src.BpTask] = [
@src.BpTask::failing("qc", 4.0, []),
@src.BpTask::with_deps("map", 6.0, [], ["qc"]),
@src.BpTask::new("index", 2.0, [1.0]),
]
let fail_rep = @src.bp_dag_schedule(broken, 2)
println("=== 失败传播: qc 失败 ===")
println(
" 失败 " +
fail_rep.n_failed.to_string() +
", 跳过 " +
fail_rep.n_skipped.to_string() +
" (map 因上游失败未执行; index 独立不受影响)",
)
// 4. 可复现 RNG 子流
let s1 = @src.bp_rng_streams(42, 3)
let s2 = @src.bp_rng_streams(42, 3)
let v1 : Array[Int32] = []
for r in s1 {
v1.push(r.next_int(1000000))
}
let v2 : Array[Int32] = []
for r in s2 {
v2.push(r.next_int(1000000))
}
println("=== 并行可复现 RNG 子流 (seed=42, 3 流) ===")
println(" 流首值: " + repr(v1))
println(
" 重建一致: " +
(if v1 == v2 { "true" } else { "false" }) +
" (worker 各持独立子流, 并行模拟恒定可复现)",
)
println("")
println(
"注: 本模块为确定性并行调度框架(单线程模拟执行), 调度决策与",
)
println(
" 时间线与真实并行调度器一致; wasm 目标无原生线程.",
)
}