snr_bias / code /scripts /grl_multiseed_sensitivity.py
cangyeone's picture
Upload GRL reproducibility package
7170296 verified
Raw
History Blame Contribute Delete
2.94 kB
#!/usr/bin/env python3
"""Prepare optional multi-seed rerun commands for GRL sensitivity checks."""
from __future__ import annotations
import argparse
import subprocess
from pathlib import Path
def phase_command(seed: int, phase_balanced: bool) -> list[str]:
if phase_balanced:
return [
"python",
"scripts/snr_transfer_phase_balanced_experiment.py",
"--out-dir",
f"outputs/snr_transfer_phase_balanced_seed{seed}",
"--cache-dir",
"outputs/snr_transfer_phase_balanced_cache",
"--seed",
str(seed),
"--init-modes",
"finetune",
"scratch",
"--scratch-train-steps",
"10000",
"--resume",
]
return [
"python",
"scripts/snr_transfer_experiment.py",
"--out-dir",
f"outputs/snr_transfer_seed{seed}",
"--seed",
str(seed),
"--resume",
]
def dispersion_command(seed: int) -> list[str]:
return [
"python",
"scripts/disp_snr_transfer_experiment.py",
"--out-dir",
f"outputs/disp_snr_transfer_seed{seed}",
"--seed",
str(seed),
"--epochs",
"5",
"--batch-size",
"256",
"--device",
"cpu",
]
def run_or_print(cmd: list[str], dry_run: bool) -> None:
print(" ".join(cmd))
if not dry_run:
subprocess.run(cmd, check=True)
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--seeds", nargs="+", type=int, default=[20260609, 20260610, 20260611])
parser.add_argument("--task", choices=["phase", "dispersion", "both"], default="both")
parser.add_argument("--dry-run", action="store_true", default=False)
parser.add_argument("--skip-existing", action="store_true", default=False)
parser.add_argument(
"--phase-balanced",
action="store_true",
help="Run the phase-aware P/S-balanced SNR experiment instead of the original record-level SNR experiment.",
)
args = parser.parse_args()
for seed in args.seeds:
if args.task in ("phase", "both"):
phase_prefix = "snr_transfer_phase_balanced_seed" if args.phase_balanced else "snr_transfer_seed"
out = Path(f"outputs/{phase_prefix}{seed}/summary.json")
if args.skip_existing and out.exists():
print(f"# skip existing {out}")
else:
run_or_print(phase_command(seed, args.phase_balanced), args.dry_run)
if args.task in ("dispersion", "both"):
out = Path(f"outputs/disp_snr_transfer_seed{seed}/summary.json")
if args.skip_existing and out.exists():
print(f"# skip existing {out}")
else:
run_or_print(dispersion_command(seed), args.dry_run)
if __name__ == "__main__":
main()