#!/bin/bash
# ============================================================
# Запуск 12 экспериментов на GTA-UAV (2 варианта описаний × 6 комбинаций)
# ============================================================
#
# 6 комбинаций text_levels для каждого варианта:
#   1) level1              — только краткое описание
#   2) level2              — только пространственное
#   3) level3              — только ключевые паттерны
#   4) level1 level2       — краткое + пространственное
#   5) level1 level2 level3 — все три уровня
#   6) level1 level3       — краткое + паттерны (ablation)
#
# Использование:
#   bash scripts/run_experiments.sh           # все 12 экспериментов
#   bash scripts/run_experiments.sh v1        # только v1 (6 экспериментов)
#   bash scripts/run_experiments.sh v2        # только v2
#   bash scripts/run_experiments.sh v1 3      # v1, эксперимент 3
#   bash scripts/run_experiments.sh v2 1 4    # v2, эксперименты 1 и 4
# ============================================================

set -e  # Остановиться при ошибке

# ====================== НАСТРОЙКИ ===========================
DATA_ROOT="/media/servml/SSD_2_2TB/datasets/cvgl_datasets/GTA-UAV-LR"
DESCRIPTIONS_v1="/media/servml/SSD_2_2TB/datasets/cvgl_datasets/GTA-UAV-LR-captions_ v1"
DESCRIPTIONS_v2="/media/servml/SSD_2_2TB/datasets/cvgl_datasets/GTA-UAV-LR-captions_v2"
DGTRS_CKPT="/media/servml/SSD_2_2TB/weights/LRSCLIP/DGTRS-CLIP-ViT-B-16.pt"
STRIPNET_CKPT="/media/servml/SSD_2_2TB/weights/stripnet_small.pth"

# Общие гиперпараметры
EPOCHS=50
BATCH_SIZE=64
MICRO_BATCH=64
LR=0.0001
OUTPUT="outputs"

# Seed (протокол §0.4: dev=42; для финального вывода добить победителей на
# 123 и 456). Переопределяется из окружения, дефолт остаётся 42:
#   SEED=123 bash scripts/run_experiments.sh v2 2
SEED="${SEED:-42}"
# ============================================================

# Массив экспериментов: номер → уровни текста
declare -A EXPERIMENTS
EXPERIMENTS[1]="level1"                    # Только краткое описание
EXPERIMENTS[2]="level2"                    # Только пространственное
EXPERIMENTS[3]="level3"                    # Только ключевые паттерны
EXPERIMENTS[4]="level1 level2"             # Краткое + пространственное
EXPERIMENTS[5]="level1 level2 level3"      # Все три уровня
EXPERIMENTS[6]="level1 level3"             # Краткое + паттерны (ablation)

# ---------- Парсинг аргументов ----------
# Определить какие версии и эксперименты запускать
VERSIONS=()
EXP_NUMS=()

if [ $# -eq 0 ]; then
    # Без аргументов → все версии, все эксперименты
    VERSIONS=(v1 v2)
    EXP_NUMS=(1 2 3 4 5 6)
elif [ "$1" = "v1" ] || [ "$1" = "v2" ]; then
    # Первый аргумент — версия
    VERSIONS=("$1")
    shift
    if [ $# -eq 0 ]; then
        EXP_NUMS=(1 2 3 4 5 6)
    else
        EXP_NUMS=("$@")
    fi
else
    # Числа без версии → обе версии, указанные эксперименты
    VERSIONS=(v1 v2)
    EXP_NUMS=("$@")
fi

TOTAL=$(( ${#VERSIONS[@]} * ${#EXP_NUMS[@]} ))

echo "========================================"
echo "  CVGL Experiments on GTA-UAV"
echo "  Epochs: $EPOCHS | Batch: $BATCH_SIZE | Seed: $SEED"
echo "  Versions: ${VERSIONS[*]}"
echo "  Experiments: ${EXP_NUMS[*]}"
echo "  Total runs: $TOTAL"
echo "========================================"

# ---------- Проверки перед запуском ----------
if [[ "$DGTRS_CKPT" == "/path/to/"* ]]; then
    echo "❌ ОШИБКА: Заполни DGTRS_CKPT в скрипте!"
    exit 1
fi
if [[ "$STRIPNET_CKPT" == "/path/to/"* ]]; then
    echo "❌ ОШИБКА: Заполни STRIPNET_CKPT в скрипте!"
    exit 1
fi

RUN_IDX=0

for VERSION in "${VERSIONS[@]}"; do
    # Выбрать путь к описаниям по версии
    if [ "$VERSION" = "v1" ]; then
        DESCRIPTIONS="$DESCRIPTIONS_v1"
    else
        DESCRIPTIONS="$DESCRIPTIONS_v2"
    fi

    # Проверить что директория существует
    if [ ! -d "$DESCRIPTIONS" ]; then
        echo "⚠️  Папка описаний не найдена: $DESCRIPTIONS"
        echo "   Пропускаю версию $VERSION"
        continue
    fi

    for EXP_NUM in "${EXP_NUMS[@]}"; do
        LEVELS="${EXPERIMENTS[$EXP_NUM]}"
        RUN_IDX=$((RUN_IDX + 1))

        echo ""
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
        echo "  [$RUN_IDX/$TOTAL] ${VERSION} / Experiment $EXP_NUM: levels=[$LEVELS]"
        echo "  Descriptions: $DESCRIPTIONS"
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

        python train.py \
            --data_root "$DATA_ROOT" \
            --descriptions_path "$DESCRIPTIONS" \
            --text_levels $LEVELS \
            --dgtrs_checkpoint "$DGTRS_CKPT" \
            --stripnet_checkpoint "$STRIPNET_CKPT" \
            --epochs $EPOCHS \
            --batch_size $BATCH_SIZE \
            --micro_batch_size $MICRO_BATCH \
            --lr $LR \
            --seed $SEED \
            --output_dir "${OUTPUT}/${VERSION}/seed${SEED}" \
            --inject_mona

        echo "✅ [$RUN_IDX/$TOTAL] ${VERSION} / Experiment $EXP_NUM complete"
    done
done

echo ""
echo "========================================"
echo "  All $TOTAL experiments complete!"
echo "  Results:"
for VERSION in "${VERSIONS[@]}"; do
    echo "    ${VERSION}: ${OUTPUT}/${VERSION}/seed${SEED}/"
done
echo "========================================"