#!/bin/bash
# Run InternVL VLA evaluation on all 10 libero_spatial tasks.
# Waits for the first checkpoint to appear, then launches evals.

set -e

CKPT_DIR="libero/checkpoints/internvl_vla_all"
OUT_DIR="libero/out/intern_vla_eval"
BENCHMARK="libero_spatial"
MODEL_TYPE="internvl"
MODEL_NAME="OpenGVLab/InternVL2_5-1B"
GPU="${CUDA_VISIBLE_DEVICES:-5}"
N_EPISODES=20

# Wait for checkpoint
echo "Waiting for checkpoint in $CKPT_DIR ..."
while true; do
    if [ -f "$CKPT_DIR/best.pth" ]; then
        CKPT="$CKPT_DIR/best.pth"
        break
    elif [ -f "$CKPT_DIR/latest.pth" ]; then
        CKPT="$CKPT_DIR/latest.pth"
        break
    fi
    sleep 30
done
echo "Found checkpoint: $CKPT"

export PYTHONPATH=/data/cameron/LIBERO:$PYTHONPATH
export DINO_REPO_DIR=/data/cameron/dinov3
export DINO_WEIGHTS_PATH=/data/cameron/dinov3/weights/dinov3_vits16plus_pretrain_lvd1689m-4057cbaa.pth
export TOKENIZERS_PARALLELISM=false

for TASK_ID in $(seq 0 9); do
    echo "=== Evaluating task $TASK_ID ==="
    CUDA_VISIBLE_DEVICES=$GPU python libero/eval.py \
        --model_type $MODEL_TYPE \
        --model_name $MODEL_NAME \
        --checkpoint "$CKPT" \
        --benchmark $BENCHMARK \
        --task_id $TASK_ID \
        --n_episodes $N_EPISODES \
        --out_dir "$OUT_DIR" \
        --save_video \
        2>&1 | tee "$OUT_DIR/eval_task${TASK_ID}.log"
    echo ""
done

echo "All evals complete. Results in $OUT_DIR/"
# Print summary
echo "=== Summary ==="
for f in "$OUT_DIR"/eval_${BENCHMARK}_task*.json; do
    python -c "
import json, sys
with open('$f') as fp:
    d = json.load(fp)
print(f'Task {d[\"task_id\"]}: {d[\"success_rate\"]*100:.0f}% ({int(sum(d[\"successes\"]))}/{d[\"n_episodes\"]})')
" 2>/dev/null || true
done
