#!/bin/bash
# 续跑:b0(流式)已有 2 轮,只补 b1(批量)×2,再聚合 2 轮 mean±range。
set -u
cd /home/ubuntu/code/symcc
OUT=/tmp/batch_ab3   # 复用已有目录(含 b0_r1/b0_r2 + rows.csv)

cleanup() {  # 脚本内使用字面模式是安全的(本进程名为 bash,不含这些串)
  pkill -9 -x mpirun 2>/dev/null; pkill -9 -x orted 2>/dev/null
  pkill -9 -x base64 2>/dev/null; pkill -9 -x afl-showmap 2>/dev/null
  pkill -9 -f "mpi_concolic_execution.py" 2>/dev/null
  pkill -9 -f "mpi_fuzzing_helper.py -a fuzzer01" 2>/dev/null
  rm -rf /tmp/ompi.* /tmp/openmpi-sessions-* ~/.openmpi/sessions 2>/dev/null
  sleep 3
}
cleanup

for R in 1 2; do
  tag="b1_r${R}"; WP="$OUT/wp_$tag"; mkdir -p "$WP"
  echo "=== [$(date +%H:%M:%S)] RUN $tag : BATCH=1 round=$R np=32 ==="
  SYMCC_WORKER_PROFILE=1 SYMCC_WPROF_DIR="$WP" SYMCC_BATCH_SHOWMAP=1 \
    python3 benchmark/run_benchmark.py --targets lava-base64 --np-list 32 \
      --rounds 1 --timeout 120 --hybrid --no-serial \
      --output "$OUT/out_$tag" > "$OUT/log_$tag.txt" 2>&1
  python3 - "$WP" "$tag" "$OUT" <<'PY'
import sys, os, csv; sys.path.insert(0,"util")
import mpi_fuzzing_helper as m
wp,tag,out=sys.argv[1],sys.argv[2],sys.argv[3]
f=m.aggregate_phase_timing(wp); showmap=exec_=tot=nw=None
if f:
    for l in open(f).read().splitlines():
        p=l.split(",")
        if l.startswith("TOTAL"): exec_,showmap,tot=float(p[5]),float(p[6]),float(p[8])
        if p and p[0].isdigit(): nw=(nw or 0)+1
cov=""
cp=os.path.join(out,f"out_{tag}","benchmark_data.csv")
if os.path.exists(cp):
    for r in csv.DictReader(open(cp)):
        if r.get("mode")=="hybrid": cov=r.get("edge_cov_pct","")
open(os.path.join(out,"rows.csv"),"a").write(f"{tag},{showmap},{exec_},{tot},{nw},{cov}\n")
print(f"  {tag}: showmap={showmap}s exec={exec_}s total={tot}s workers={nw} cov={cov}%")
PY
  cleanup
done

echo "=== 2 轮汇总 mean±range ==="
python3 - "$OUT" <<'PY'
import sys, statistics as st
out=sys.argv[1]
rows=[l.split(",") for l in open(out+"/rows.csv").read().splitlines() if l.strip()]
# 只取每组前 2 轮(b0_r1/r2, b1_r1/r2)
def grp(pfx, idx):
    vals=[(r[0],float(r[idx])) for r in rows if r[0].startswith(pfx) and r[0][-1] in "12" and r[idx] not in("","None")]
    return vals
for name,idx in (("showmap_sec",1),("exec_sec",2),("cov",5)):
    b0=[v for _,v in grp("b0",idx)]; b1=[v for _,v in grp("b1",idx)]
    m0=sum(b0)/len(b0) if b0 else 0; m1=sum(b1)/len(b1) if b1 else 0
    print(f"{name:12} 流式 b0={[round(x,2) for x in b0]} mean={m0:.2f} | 批量 b1={[round(x,2) for x in b1]} mean={m1:.2f}")
b0=[v for _,v in grp("b0",1)]; b1=[v for _,v in grp("b1",1)]
if b0 and b1:
    m0=sum(b0)/len(b0); m1=sum(b1)/len(b1)
    print(f"\n>>> showmap 绝对耗时:流式 {m0:.2f}s → 批量 {m1:.2f}s = 降 {100*(m0-m1)/m0:+.1f}% (n=2 each)")
PY
echo "BATCH_AB2_DONE"
