Skip to content

ctde_v0.run_roles_t2

run_roles_t2

T2 role-picker baseline runner — flat vs hand-coded role split on the OPEN density ladder.

The T2 baseline asks a single clean question: does the hand-coded explorer/relay role split (--role-picker expl_relay) beat the flat homogeneous shared explorer on the honest shared spec, held FIXED across a density-pinned OPEN world ladder? Every run is trained FROM SCRATCH (no warm-start, no inter-run deps) and graded on the two metrics the trainer logs every iter: coverage_pct and the REAL connectivity bar connectivity_real (λ₂>0.5).

Belief: the fixed spec now carries the FULL 7-channel SLAM occupancy KB as the baseline belief (--sense-walls --sense-free --boundary: free/occupied/unknown + occ_frontier + boundary), so both arms see occupancy rather than the old 5-channel coverage-trail belief.

TWO axes, crossed in full (2 arms × 3 worlds = 6 units per seed):

ARM (2) — what coordinates the team: flat : the homogeneous shared explorer, no extra flags. The REFERENCE. role : the hand-coded explorer/relay split (--role-picker expl_relay).

WORLD (3) — density-pinned OPEN ladder (grid / n_agents / comm_r), all open terrain: o16 : 16×16, 4 agents, comm_r 5, open. o24 : 24×24, 6 agents, comm_r 5, open. o32 : 32×32, 10 agents, comm_r 5, open.

Per seed: 2 arms × 3 worlds = 6 units. With the DEFAULT --seeds 0,1,2 that is 18 runs. Each unit's run-dir is <out>/seed{S}/{world}/{arm} (e.g. runs/roles_t2/seed0/o24/role).

Every unit is INDEPENDENT and FRESH: the run-dir is skipped once it holds a model.eqx; nothing warm-starts anything (init_from=None, needs_dir=None for every unit). --jobs N runs up to N train_ctde subprocesses at once (balthar is MEMORY-BOUND — keep N small if o32 is in play). --dry-run prints the full 18-unit plan (id, grid/N, all extra flags) and launches nothing.

# see the whole plan first (no training):
JAX_PLATFORMS=cpu PYTHONPATH=.:../../../FiedlerValueEstimation     /Users/bijanmehr/Project.Zymera/zymera_lab/.venv/bin/python         -m ctde_v0.run_roles_t2 --dry-run

# the real batch on balthar (drop JAX_PLATFORMS so it uses the GPU), 2 at a time:
PYTHONPATH=.:../../../FiedlerValueEstimation ~/ZymeraLab/.venv/bin/python         -m ctde_v0.run_roles_t2 --out runs/roles_t2 --iters 1500 --rollouts 16 --jobs 2

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

Unit

Unit(uid, run_dir, rung, seed, extra, init_from_dir, needs_dir)

One train_ctde run: an id, its run-dir, the extra flags, the seed/world, and the run-dir of a predecessor whose model.eqx must exist before it can start (here always None — every obstacle run is FRESH).

Source code in experiments/ctde_v0/run_roles_t2.py
106
107
108
109
110
111
112
113
114
def __init__(self, uid, run_dir, rung, seed, extra, init_from_dir, needs_dir):
    self.uid = uid
    self.run_dir = run_dir
    self.rung = rung                     # (g, n, r)
    self.seed = seed
    self.extra = extra
    self.init_from_dir = init_from_dir   # run-dir whose model.eqx warm-starts this, or None
    self.needs_dir = needs_dir           # run-dir that must be done first, or None
    self.proc = None