Revision 5: negative-result model card, report rev. 5 (PDF/MD/figure), CITATION.cff, iterations 020-021 code, logs, sealed tests and checkpoints
7420c83 verified Download 020/make_sealed020.py from Eriksanchezolvera/cuerdas: direct link, hf CLI and curl.
- Browser
- Download file 2.71 kB
-
https://huggingface.co/Eriksanchezolvera/cuerdas/resolve/main/020/make_sealed020.py
- Command line
-
hf download hf://Eriksanchezolvera/cuerdas/020/make_sealed020.py
-
curl -L -o make_sealed020.py https://huggingface.co/Eriksanchezolvera/cuerdas/resolve/main/020/make_sealed020.py
2.71 kB
| # CUERDAS-020: sealed test generator. Fresh seed, never seen by any earlier iteration. | |
| import json, random, itertools, re, hashlib, sys | |
| from transformers import AutoTokenizer | |
| tok = AutoTokenizer.from_pretrained(sys.argv[1]); SEED = 20261016 | |
| meta = json.load(open(sys.argv[2])); V = meta['vocabulary']; rows = meta['rows']; SPL = meta['splits'] | |
| def t1(w): return tok.encode(' ' + w, add_special_tokens=False) | |
| used = {tuple(r['values']) for r in rows} | |
| fit = [tuple(rows[i]['values']) for i in SPL['fit']]; seen_at = {v[:2] for v in fit}; seen_sw = {v[2:] for v in fit} | |
| # replicate the 015-019 fresh test (seed 15015) so it is excluded | |
| rng = random.Random(15015); uni = [v for v in itertools.product(*[range(len(x)) for x in V]) if v not in used]; rng.shuffle(uni) | |
| isid = lambda v: v[:2] in seen_at and v[2:] in seen_sw | |
| fresh = set([v for v in uni if isid(v)][:200] + [v for v in uni if not isid(v)][:400]) | |
| S013 = (7, 7, 8, 5) | |
| elig = [v for v in itertools.product(*[range(len(x)) for x in V]) if v not in used and v not in fresh and not all(v[j] < S013[j] for j in range(4))] | |
| r = random.Random(SEED); r.shuffle(elig) | |
| sid = [v for v in elig if isid(v)][:200]; sood = [v for v in elig if not isid(v)][:400] | |
| W = lambda v: [V[j][v[j]] for j in range(4)] | |
| # unseen words: single-token, >=10 lowercase letters (the 018 training pool only has 3-9 letters, so these can never have been trained on) | |
| OLD_NEW = 'inspect repair cancel approve archive scan print send sensor battery printer server truck door screen cable broken stable late empty full warm missing urgent night evening weekend noon spring summer winter midnight'.split() | |
| cand = sorted(t[1:] for t in tok.get_vocab() if t.startswith('Ġ') and re.fullmatch(r'[a-z]{10,14}', t[1:])) | |
| r.shuffle(cand); usedtok = {t1(w)[0] for vs in V for w in vs}; NEW = [[] for _ in range(4)] | |
| for w in cand: | |
| j = min(range(4), key=lambda k: len(NEW[k])) | |
| if len(NEW[j]) >= 8: break | |
| if len(t1(w)) == 1 and t1(w)[0] not in usedtok and w not in OLD_NEW: NEW[j].append(w); usedtok.add(t1(w)[0]) | |
| def novel(n_new, n=192): | |
| out = [] | |
| for k in range(n): | |
| b = W(sood[k % 400]); js = r.sample(range(4), n_new) | |
| for j in js: b[j] = r.choice(NEW[j]) | |
| out.append(b) | |
| return out | |
| SEALED = {'seed': SEED, 'n_eligible_universe': len(elig) + len(sid) * 0, 'new_words': NEW, | |
| 'sealed_id': [W(v) for v in sid], 'sealed_ood': [W(v) for v in sood], | |
| 'sealed_1_new': novel(1), 'sealed_2_new': novel(2), 'sealed_4_new': novel(4)} | |
| s = json.dumps(SEALED, sort_keys=True); open(sys.argv[3], 'w').write(s) | |
| print('sha256', hashlib.sha256(s.encode()).hexdigest(), 'eligible', len(elig), {k: len(v) for k, v in SEALED.items() if isinstance(v, list)}) | |