deepgenopix / scripts /run_names.py
vedatonuryilmaz's picture
sync current ml-intern source for hf jobs
21b75e3 verified
Raw
History Blame Contribute Delete
3.42 kB
"""Canonical DeepGenopix run-name helpers.
HF Jobs write to shared Hub namespaces. These helpers produce names that carry
the architecture, source checkpoint, corpus, and mode so downstream jobs do not
accidentally consume a generic or overwritten run.
"""
from __future__ import annotations
import argparse
import hashlib
import re
from pathlib import Path
from deepgenopix.notebook_support import build_experiment_config
_SAFE = re.compile(r"[^A-Za-z0-9._-]+")
def slug(value: str) -> str:
"""Return a filesystem/HF-path-safe slug."""
cleaned = _SAFE.sub("-", value.strip()).strip("-._")
return cleaned or "unnamed"
def short_ref(value: str) -> str:
"""Return a stable short reference for a path or Hub URL."""
stem = slug(Path(value.rstrip("/")).stem or value)
digest = hashlib.sha256(value.encode("utf-8")).hexdigest()[:8]
return f"{stem}-{digest}"
def train_run_id(preset: str) -> str:
"""Return the canonical architecture-specific classifier run id."""
return build_experiment_config(preset).run_id
def quant_train_name(objective: str, source_checkpoint: str, reference_parquet: str) -> str:
"""Return a canonical QuantEncoder training output name."""
return "__".join(
[
f"quantenc-{slug(objective)}",
f"src-{short_ref(source_checkpoint)}",
f"ref-{short_ref(reference_parquet)}",
]
)
def quantify_name(encoder: str, reads: str, mode: str) -> str:
"""Return a canonical quantification output name."""
return "__".join(
[
f"quant-{short_ref(encoder)}",
f"reads-{short_ref(reads)}",
f"mode-{slug(mode)}",
]
)
def variant_name(quant_run_name: str, null_stats: str | None = None) -> str:
"""Return a canonical variant run name tied to the quant run it consumes."""
parts = [f"variant-{slug(quant_run_name)}"]
if null_stats:
parts.append(f"null-{short_ref(null_stats)}")
return "__".join(parts)
def main() -> int:
parser = argparse.ArgumentParser(description="Generate canonical DeepGenopix run names")
subparsers = parser.add_subparsers(dest="command", required=True)
train = subparsers.add_parser("train")
train.add_argument("--preset", required=True)
quant_train = subparsers.add_parser("quant-train")
quant_train.add_argument("--objective", required=True)
quant_train.add_argument("--source-checkpoint", required=True)
quant_train.add_argument("--reference-parquet", required=True)
quantify = subparsers.add_parser("quantify")
quantify.add_argument("--encoder", required=True)
quantify.add_argument("--reads", required=True)
quantify.add_argument("--mode", required=True)
variant = subparsers.add_parser("variant")
variant.add_argument("--quant-run-name", required=True)
variant.add_argument("--null-stats", default=None)
args = parser.parse_args()
if args.command == "train":
print(train_run_id(args.preset))
elif args.command == "quant-train":
print(quant_train_name(args.objective, args.source_checkpoint, args.reference_parquet))
elif args.command == "quantify":
print(quantify_name(args.encoder, args.reads, args.mode))
elif args.command == "variant":
print(variant_name(args.quant_run_name, args.null_stats))
return 0
if __name__ == "__main__":
raise SystemExit(main())