Download make_curriculum.py from EugeneBoondock/sponge-compsearch: direct link, hf CLI and curl.
- Browser
- Download file 3.09 kB
-
https://huggingface.co/EugeneBoondock/sponge-compsearch/resolve/main/make_curriculum.py
- Command line
-
hf download hf://EugeneBoondock/sponge-compsearch/make_curriculum.py
-
curl -L -o make_curriculum.py https://huggingface.co/EugeneBoondock/sponge-compsearch/resolve/main/make_curriculum.py
3.09 kB
| """Build the curriculum streams for the multi-part score. | |
| A curriculum is three kinds of text one after another (Python source, C headers, | |
| Wikipedia), then a second, different helping of each. A .json file beside each stream | |
| marks the segments, and the scorer uses it to reward several things at once: each kind | |
| on its own, fast adaptation to a new kind, and retention when a kind returns. | |
| Needs data/search.bin and data/holdout.bin (python make_data.py) and the Wikipedia | |
| sample at data/dl/enwik8 (http://mattmahoney.net/dc/enwik8.zip, unzipped). | |
| python make_curriculum.py # writes data/multi.bin and data/multi_holdout.bin (+ .json) | |
| """ | |
| from __future__ import annotations | |
| import json | |
| import random | |
| import sysconfig | |
| from pathlib import Path | |
| KB = 1024 | |
| FIRST, SECOND, ADAPT = 224 * KB, 112 * KB, 16 * KB | |
| MB = 1024 * KB | |
| def c_headers(wanted: int) -> bytes: | |
| root = Path(sysconfig.get_paths()["stdlib"]).parent | |
| files = sorted(root.rglob("*.h")) | |
| random.Random(0).shuffle(files) | |
| chunks, total = [], 0 | |
| for path in files: | |
| try: | |
| chunk = path.read_bytes() | |
| except OSError: | |
| continue | |
| chunks.append(chunk) | |
| total += len(chunk) | |
| if total >= wanted: | |
| break | |
| joined = b"".join(chunks) | |
| if len(joined) < wanted: | |
| raise SystemExit(f"only {len(joined)} bytes of C headers found; need {wanted}") | |
| return joined | |
| def wikipedia(offset: int, length: int) -> bytes: | |
| with open("data/dl/enwik8", "rb") as handle: | |
| handle.seek(offset) | |
| return handle.read(length) | |
| def write(name: str, helpings: list[tuple[str, int, bytes]]) -> None: | |
| stream, segments = b"", [] | |
| for kind, which_pass, text in helpings: | |
| segments.append({"kind": kind, "pass": which_pass, | |
| "start": len(stream), "end": len(stream) + len(text)}) | |
| stream += text | |
| Path(f"data/{name}.bin").write_bytes(stream) | |
| Path(f"data/{name}.json").write_text( | |
| json.dumps({"adapt_bytes": ADAPT, "segments": segments}, indent=1), encoding="utf-8") | |
| print(f"wrote data/{name}.bin ({len(stream)} bytes, {len(segments)} segments)") | |
| def main() -> int: | |
| search = Path("data/search.bin").read_bytes() | |
| holdout = Path("data/holdout.bin").read_bytes() | |
| headers = c_headers(2 * (FIRST + SECOND)) | |
| half = FIRST + SECOND | |
| write("multi", [ | |
| ("python", 1, search[:FIRST]), | |
| ("c-header", 1, headers[:FIRST]), | |
| ("wikipedia", 1, wikipedia(0, FIRST)), | |
| ("python", 2, search[600 * KB:600 * KB + SECOND]), | |
| ("c-header", 2, headers[FIRST:half]), | |
| ("wikipedia", 2, wikipedia(5 * MB, SECOND)), | |
| ]) | |
| write("multi_holdout", [ | |
| ("python", 1, holdout[:FIRST]), | |
| ("c-header", 1, headers[half:half + FIRST]), | |
| ("wikipedia", 1, wikipedia(50 * MB, FIRST)), | |
| ("python", 2, holdout[600 * KB:600 * KB + SECOND]), | |
| ("c-header", 2, headers[half + FIRST:2 * half]), | |
| ("wikipedia", 2, wikipedia(60 * MB, SECOND)), | |
| ]) | |
| return 0 | |
| if __name__ == "__main__": | |
| raise SystemExit(main()) | |