#!/bin/bash
# Phase A — query-MLP LEFT-TRAINED 1v vs 2v, eval at left + right OOD positions.

set -e
cd /data/cameron/para/libero

CKPT_1V=/data/cameron/para/libero/checkpoints/libero_query_v0/latest.pth
CKPT_2V=/data/cameron/para/libero/checkpoints/libero_2view_v0/latest.pth
LEFT_POS=/data/libero/ood_objpos_splits/exp3_left_test.npy
RIGHT_POS=/data/libero/ood_objpos_splits/exp3_right_test.npy

LOG_DIR=/data/cameron/para/libero/logs/phase_a_lefttrained_eval
mkdir -p $LOG_DIR

run_cell_2v() {
    local POS_FILE=$1; local LABEL=$2; local GPU=$3
    PYTHONPATH=/data/cameron/LIBERO LIBERO_DATA_PATH=/data/libero CUDA_VISIBLE_DEVICES=$GPU \
    DINO_REPO_DIR=/data/cameron/keygrip/dinov3 \
    DINO_WEIGHTS_PATH=/data/cameron/keygrip/dinov3/weights/dinov3_vits16plus_pretrain_lvd1689m-4057cbaa.pth \
    MUJOCO_GL=osmesa PYOPENGL_PLATFORM=osmesa \
    python3 -c "
import subprocess, numpy as np, sys, os
positions = np.load('$POS_FILE')
print(f'Evaluating {len(positions)} positions for [$LABEL]', flush=True)
successes, total = 0, 0
for k, (dx, dy) in enumerate(positions):
    cmd = ['python', 'eval_libero_2view_ood.py', '--checkpoint', '$CKPT_2V', '--n_episodes', '5', '--max_steps', '600', '--teleport', '--zero_rotation', '--clean_scene', '--shift_dx', str(dx), '--shift_dy', str(dy)]
    r = subprocess.run(cmd, capture_output=True, text=True, env=os.environ)
    s, t = 0, 0
    for line in r.stdout.split('\n'):
        if 'Success Rate' in line:
            pct = float(line.split(':')[1].strip().split('%')[0]) / 100
            s = int(round(pct * 5)); t = 5; break
    successes += s; total += t
    print(f'  pos[{k+1}/{len(positions)}] dx={dx:+.3f} dy={dy:+.3f}: {s}/{t} (cum: {successes}/{total})', flush=True)
print(f'$LABEL FINAL: {successes}/{total} = {100*successes/total if total>0 else 0:.0f}%')
" > $LOG_DIR/${LABEL}.log 2>&1
}

run_cell_1v() {
    local POS_FILE=$1; local LABEL=$2; local GPU=$3
    PYTHONPATH=/data/cameron/LIBERO LIBERO_DATA_PATH=/data/libero CUDA_VISIBLE_DEVICES=$GPU \
    DINO_REPO_DIR=/data/cameron/keygrip/dinov3 \
    DINO_WEIGHTS_PATH=/data/cameron/keygrip/dinov3/weights/dinov3_vits16plus_pretrain_lvd1689m-4057cbaa.pth \
    MUJOCO_GL=osmesa PYOPENGL_PLATFORM=osmesa \
    python3 -c "
import subprocess, numpy as np, sys, os
positions = np.load('$POS_FILE')
print(f'Evaluating {len(positions)} positions for [$LABEL]', flush=True)
successes, total = 0, 0
for k, (dx, dy) in enumerate(positions):
    cmd = ['python', 'eval_libero_query_ood.py', '--checkpoint', '$CKPT_1V', '--n_episodes', '5', '--max_steps', '600', '--teleport', '--zero_rotation', '--clean_scene', '--shift_dx', str(dx), '--shift_dy', str(dy)]
    r = subprocess.run(cmd, capture_output=True, text=True, env=os.environ)
    s, t = 0, 0
    for line in r.stdout.split('\n'):
        if 'Success Rate' in line:
            pct = float(line.split(':')[1].strip().split('%')[0]) / 100
            s = int(round(pct * 5)); t = 5; break
    successes += s; total += t
    print(f'  pos[{k+1}/{len(positions)}] dx={dx:+.3f} dy={dy:+.3f}: {s}/{t} (cum: {successes}/{total})', flush=True)
print(f'$LABEL FINAL: {successes}/{total} = {100*successes/total if total>0 else 0:.0f}%')
" > $LOG_DIR/${LABEL}.log 2>&1
}

(run_cell_2v $LEFT_POS  lt_2v_left  0) &
(run_cell_2v $RIGHT_POS lt_2v_right 1) &
(run_cell_1v $LEFT_POS  lt_1v_left  2) &
(run_cell_1v $RIGHT_POS lt_1v_right 7) &
wait
echo "=== left-trained query-MLP eval matrix complete ==="
for cell in lt_2v_left lt_2v_right lt_1v_left lt_1v_right; do
    grep "FINAL:" $LOG_DIR/${cell}.log 2>/dev/null || echo "$cell: missing"
done
