#!/bin/bash set -euo pipefail DEMO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CONFIG="" MODE="run" while [[ $# -gt 0 ]]; do case "$1" in --config) CONFIG="$2"; shift 2 ;; --config=*) CONFIG="${1#*=}"; shift ;; --submit) MODE="submit"; shift ;; -h|--help) echo "Usage: bash run.sh --config configs/.yaml [--submit]"; exit 0 ;; *) echo "Unknown argument: $1" >&2; exit 2 ;; esac done [[ -n "$CONFIG" ]] || { echo "Please specify --config configs/.yaml" >&2; exit 2; } [[ "$CONFIG" = /* ]] || CONFIG="$DEMO_DIR/$CONFIG" [[ -f "$CONFIG" ]] || { echo "Config not found: $CONFIG" >&2; exit 2; } if [[ -z "${CONDA_PREFIX:-}" || -z "${ONESCIENCE_MODELS_DIR:-}" ]]; then export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-onescience-mattergen-source}" source "$DEMO_DIR/../../matchem_env.sh" fi CMD=$(python3 - "$CONFIG" "$DEMO_DIR/.." <<'PY' import os, shlex, sys, yaml import json cfg = yaml.safe_load(open(sys.argv[1])) root = os.path.abspath(sys.argv[2]) task = cfg.get("task", "train") script = {"train": "train.py", "finetune": "finetune.py", "generate": "generate.py"}.get(task) if not script: raise SystemExit(f"Unsupported task: {task}") args = [] for key, value in cfg.get("args", {}).items(): if isinstance(value, bool): if value: args.append(f"--{key.replace('_', '-')}") elif value is not None: value = json.dumps(value) if isinstance(value, (dict, list)) else str(value) value = os.path.expandvars(value) args.extend([f"--{key.replace('_', '-')}", value] if task == "generate" else [f"{key}={value}"]) print(" ".join(map(shlex.quote, [sys.executable, os.path.join(root, script), *args]))) PY ) echo "Running MatterGen: $CMD" if [[ "$MODE" == "submit" ]]; then TASK=$(python3 - "$CONFIG" <<'PY' import sys, yaml print(yaml.safe_load(open(sys.argv[1])).get("task", "train")) PY ) [[ "$TASK" == "train" ]] || { echo "--submit currently supports train configs only" >&2; exit 2; } DEVICES=$(python3 - "$CONFIG" <<'PY' import sys, yaml print(yaml.safe_load(open(sys.argv[1])).get("args", {}).get("trainer.devices", 8)) PY ) sbatch \ --gres="dcu:$DEVICES" \ --export="ALL,CONFIG_PATH=$CONFIG,SCRIPT_DIR=$DEMO_DIR/.." \ "$DEMO_DIR/../submit_train.sh" exit 0 fi cd "$DEMO_DIR/.." eval "$CMD"