Skip to content

ctde_v0.run_crowded_overnight

run_crowded_overnight

Overnight CROWDED-MAP curriculum batch — learn dense obstacle fields, not zero-shot.

Curriculum warm-start ladder (16²/4 → 24²/6 → 32²/10) on the CONNECTIVITY-SAFE crowded distribution --terrain crowded_mix (per-reset draw over clutter / pillars / rooms+clutter; ctde_v0.terrains guarantees the free space is one component, so coverage stays well-posed). Each rung warm-starts the previous (the scale-invariant transfer the campaign is about), and obstacle DENSITY is held ~constant (~15% of cells) by scaling --n-obstacles per rung so the warm-start sees the same clutter level at every scale. comm_r FIXED 5 on the honest spec.

Two cornerstones × two exploration drives (the obstacle-batch lesson: coverage-bump helps):

ARM (2): role (--role-picker expl_relay, the cognition-batch winner) | base (reference). EXPLORE (2): eoff (default reward) | ebump (--w-coverage 3).

LADDER (3, curriculum-chained): 16x16/4 → 24x24/6 → 32x32/10, rung i warm-starts rung i-1 (same arm+explore+seed) via --init-from.

Per seed: 2 arms × 2 explore × 3 rungs = 12 runs (4 curriculum chains). Run-dir <out>/seed{S}/{arm}_{explore}/{grid}x{grid}x{n} — a rung is skipped once it holds model.eqx (resumable), and a rung stays blocked until its predecessor's model.eqx exists.

# plan only:
JAX_PLATFORMS=cpu PYTHONPATH=.:../../../FiedlerValueEstimation     /Users/bijanmehr/Project.Zymera/zymera_lab/.venv/bin/python         ctde_v0/run_crowded_overnight.py --dry-run --seeds 1

# on balthar (GPU; memory-bound → keep --jobs small when 32²/10 is in play):
PYTHONPATH=.:../../../FiedlerValueEstimation ~/ZymeraLab/.venv/bin/python         ctde_v0/run_crowded_overnight.py --out runs/crowded --seeds 1 --iters 1200         --rollouts 16 --jobs 2

===>>> This launcher LAUNCHES REAL TRAINING; run it deliberately. <<<===

Unit

Unit(uid, run_dir, rung, seed, extra, prev_dir)

One curriculum rung: id, run-dir, (grid, n, comm_r), seed, extra flags, the predecessor rung's run-dir to warm-start from / wait on (None for the first rung).

Source code in experiments/ctde_v0/run_crowded_overnight.py
65
66
67
68
69
70
71
72
73
def __init__(self, uid, run_dir, rung, seed, extra, prev_dir):
    self.uid = uid
    self.run_dir = run_dir
    self.rung = rung
    self.seed = seed
    self.extra = extra
    self.init_from_dir = prev_dir
    self.needs_dir = prev_dir
    self.proc = None