#!/usr/bin/env bash
set -euo pipefail

# Usage:
#   ./run_5_reps_k.sh [-a affinity] K1 [K2 K3 ...]
#
# Examples:
#   ./run_5_reps_k.sh 10 20
#   ./run_5_reps_k.sh 4 8 16 24
#   ./run_5_reps_k.sh -a 0 10 20

AFFINITY=1
K_VALUES=()

while [[ $# -gt 0 ]]; do
    case "$1" in
        -a|--affinity)
            if [[ $# -lt 2 ]]; then
                echo "Missing value for affinity."
                exit 1
            fi
            AFFINITY="$2"
            shift 2
            ;;
        *)
            K_VALUES+=("$1")
            shift
            ;;
    esac
done

if [[ ${#K_VALUES[@]} -eq 0 ]]; then
    echo "Usage: $0 [-a affinity: 0|1] K1 [K2 K3 ...]"
    exit 1
fi

if ! [[ "$AFFINITY" =~ ^[01]$ ]]; then
    echo "affinity must be 0 or 1."
    exit 1
fi

for K in "${K_VALUES[@]}"; do
    if ! [[ "$K" =~ ^[0-9]+$ ]] || [[ "$K" -le 0 ]]; then
        echo "K values must be positive integers. Invalid K: $K"
        exit 1
    fi
done

F=10000
H=640
W=640
REPS=10

make

echo "Generating shared memory: F=$F H=$H W=$W"
./shm_generator "$F" "$H" "$W"
echo

for K in "${K_VALUES[@]}"; do
    echo "################################"
    echo "Starting benchmark for K=$K"
    echo "################################"
    echo

    for rep in $(seq 1 "$REPS"); do
        echo "=============================="
        echo "Rep $rep/$REPS  |  K=$K  |  F=$F H=$H W=$W  |  affinity=$AFFINITY"
        echo "=============================="

        ./shm_benchmark "$F" "$H" "$W" "$K" "$AFFINITY" \
            | awk '
                /One-to-One Pipe sorting time:/   { print; fflush(); }
                /One-to-Many Pipe sorting time:/  { print; fflush(); }
                /Many-to-Many Pipe sorting time:/ { print; fflush(); }
            '

        echo
    done
done