#!/usr/bin/env bash set -euo pipefail # Generate a GitLab CI child pipeline YAML for ML model training. # Reads environment variables with sensible defaults and writes # .training-generated.yml to the repository root. ############################################################################### # Configuration (environment variables with defaults) ############################################################################### SYMBOLS="${SYMBOLS:-ES.FUT}" MODELS="${MODELS:-all}" PHASE="${PHASE:-full}" MAX_PARALLEL="${MAX_PARALLEL:-10}" EPOCHS="${EPOCHS:-50}" HYPEROPT_TRIALS="${HYPEROPT_TRIALS:-20}" RUN_ID="${RUN_ID:-$(date +%Y%m%d-%H%M%S)}" REGISTRY="${REGISTRY:-rg.fr-par.scw.cloud/foxhunt-ci}" OUTPUT=".training-generated.yml" ############################################################################### # Model definitions ############################################################################### RL_MODELS=(dqn ppo) SUPERVISED_MODELS=(tft mamba2 tggn tlob liquid kan xlstm diffusion) # Models with hyperopt adapters (RL: DQN/PPO, Supervised: TFT/Mamba2) HYPEROPT_RL=(dqn ppo) HYPEROPT_SUPERVISED=(tft mamba2) HYPEROPT_MODELS=("${HYPEROPT_RL[@]}" "${HYPEROPT_SUPERVISED[@]}") ############################################################################### # Resolve which models to generate jobs for ############################################################################### resolve_models() { case "${MODELS}" in all) echo "${RL_MODELS[*]} ${SUPERVISED_MODELS[*]}" ;; rl) echo "${RL_MODELS[*]}" ;; supervised) echo "${SUPERVISED_MODELS[*]}" ;; *) # Comma-separated list echo "${MODELS}" | tr ',' ' ' ;; esac } SELECTED_MODELS=$(resolve_models) ############################################################################### # Helpers ############################################################################### # Replace dots with hyphens for valid YAML keys sanitize() { echo "$1" | tr '.' '-' } # Check if a model is an RL model is_rl_model() { local model="$1" for m in "${RL_MODELS[@]}"; do if [[ "$m" == "$model" ]]; then return 0 fi done return 1 } # Check if a model has a hyperopt adapter has_hyperopt() { local model="$1" for m in "${HYPEROPT_MODELS[@]}"; do if [[ "$m" == "$model" ]]; then return 0 fi done return 1 } # Check if a model is a supervised hyperopt model (TFT/Mamba2) is_supervised_hyperopt() { local model="$1" for m in "${HYPEROPT_SUPERVISED[@]}"; do if [[ "$m" == "$model" ]]; then return 0 fi done return 1 } # Get the hyperopt binary for a model hyperopt_binary() { local model="$1" if is_rl_model "$model"; then echo "hyperopt_baseline_rl" else echo "hyperopt_baseline_supervised" fi } # Get the training binary name for a model training_binary() { local model="$1" if is_rl_model "$model"; then echo "train_baseline_rl" else echo "train_baseline_supervised" fi } ############################################################################### # Begin generating the pipeline YAML ############################################################################### : > "$OUTPUT" cat >> "$OUTPUT" < ${SELECTED_MODELS} # PHASE: ${PHASE} # Generated: $(date -u +%Y-%m-%dT%H:%M:%SZ) YAML # --- Stages --------------------------------------------------------------- # if [[ "$PHASE" == "eval" ]]; then cat >> "$OUTPUT" <> "$OUTPUT" <> "$OUTPUT" <> "$OUTPUT" <> "$OUTPUT" <> "$OUTPUT" <> "$OUTPUT" <> "$OUTPUT" <