#!/usr/bin/env bash # Run colony experiments back to back so the GPU never idles. # scripts/run_queue.sh (edit the QUEUE below) # # Each entry: "|||" # NOTE: deliberately not `set -e` — one failing run must not cancel the rest of # the queue (a bad override once killed the whole queue in seconds). set -uo pipefail cd "$(dirname "$0")/.." QUEUE=( # THE CONTROL that makes the flagship result interpretable: one unit, same # half-evidence, no colony, fully trained. If the colony's 9.8% is real # information pooling, this must land far below it. "solo-d64-evihalf|64|1|arch.blackboard=latent arch.standpoints=none arch.aggregate=mean arch.halt_rule=boss arch.view_fraction=0.5 arch.view_enforce_coverage=False" # Ablation: unit differentiation without distributed evidence. "colony-d64-k4-roles|64|4|arch.blackboard=latent arch.standpoints=sudoku arch.aggregate=mean arch.halt_rule=quorum arch.role_embeddings=True" ) for entry in "${QUEUE[@]}"; do IFS='|' read -r name width k overrides <<< "$entry" echo "=== $(date -Is) starting ${name} ===" # shellcheck disable=SC2086 PYTHONUNBUFFERED=1 PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \ .venv/bin/python -m dsem.pretrain \ arch=colony \ data_paths="[data/sudoku-extreme-1k-aug-1000]" \ data_paths_test="[data/sudoku-testsub-12k]" \ evaluators="[]" \ epochs=50000 eval_interval=5000 \ global_batch_size=768 \ lr=1e-4 puzzle_emb_lr=1e-4 weight_decay=1.0 puzzle_emb_weight_decay=1.0 \ arch.mlp_t=True arch.pos_encodings=none \ arch.L_layers=2 arch.H_cycles=3 arch.L_cycles=6 \ "arch.hidden_size=${width}" "arch.num_agents=${k}" \ ema=True "+run_name=${name}" \ $overrides > "runs/${name}.out" 2>&1 < /dev/null echo "=== $(date -Is) finished ${name} ===" done echo "=== $(date -Is) queue complete ==="