#!/bin/sh
# Build every step, verify correctness (each binary refuses to benchmark if
# edge.csv does not parse exactly), run each on bench.csv, print the table.
# Each binary already does 3 in-process repetitions and reports its best.
set -e
cd "$(dirname "$0")"

[ -f bench.csv ] || { echo "bench.csv missing -- run: python3 gen_data.py"; python3 gen_data.py; }

for s in step1_naive step2_mmap step3_zerocopy step4_swar step5_typed; do
  echo "== $s =="
  c++ -std=c++20 -O2 "$s.cpp" -o "$s.bin"
  ./"$s.bin" | tee "/tmp/$s.out"
  echo
done

echo "===================== summary ====================="
printf "%-16s %10s %12s %10s\n" step "MB/s" "Mrows/s" allocs
for s in step1_naive step2_mmap step3_zerocopy step4_swar step5_typed; do
  line=$(grep '^BENCH' "/tmp/$s.out")
  mbps=$(echo "$line" | sed 's/.*mbps=\([0-9.]*\).*/\1/')
  secs=$(echo "$line" | sed 's/.*secs=\([0-9.]*\).*/\1/')
  rows=$(echo "$line" | sed 's/.*rows=\([0-9]*\).*/\1/')
  allocs=$(echo "$line" | sed 's/.*allocs=\([0-9]*\).*/\1/')
  mrps=$(echo "$rows $secs" | awk '{printf "%.1f", $1/$2/1e6}')
  printf "%-16s %10s %12s %10s\n" "$s" "$mbps" "$mrps" "$allocs"
done
