Download bench/jev_suites.py from doofz/THX-01: direct link, hf CLI and curl.
- Browser
- Download file 2.99 kB
-
https://huggingface.co/doofz/THX-01/resolve/main/bench/jev_suites.py
- Command line
-
hf download hf://doofz/THX-01/bench/jev_suites.py
-
curl -L -o jev_suites.py https://huggingface.co/doofz/THX-01/resolve/main/bench/jev_suites.py
2.99 kB
| """Run THX-01 on the exact nibzard decision-model-benchmark suites (hash-verified), same state & criteria as Jev.""" | |
| import json, sys, time, collections | |
| import numpy as np | |
| sys.path.insert(0, ".") | |
| import thx01 | |
| S = "data/nibzard_suites/" | |
| INS = ("Choose the single best option for the decision state. You must commit to a single option even if the state does not " | |
| "determine the answer; in that case choose the least unreasonable option and report low confidence. Answer confidence " | |
| "separately. The confidence is your probability that your chosen option is correct.") | |
| def ece(conf, cor, bins=10): | |
| conf, cor = np.asarray(conf, float), np.asarray(cor, float) | |
| idx = np.digitize(conf, np.linspace(0, 1, bins + 1)[1:-1], right=True) | |
| return float(sum((idx == b).sum() / len(conf) * abs(cor[idx == b].mean() - conf[idx == b].mean()) for b in range(bins) if (idx == b).any())) | |
| MP = sys.argv[1] if len(sys.argv) > 1 else "." | |
| ag = thx01.load(MP, device="cuda") | |
| out = {} | |
| for suite in ["s1_intent77", "s2_spam", "s3_cardinality", "s4_order", "s5_confidence"]: | |
| items = [json.loads(l) for l in open(S + suite + ".jsonl")] | |
| qs = [{"decision": {"type": "choice", "instructions": INS, "criteria": {o: o for o in it["options"]}}} for it in items] | |
| t0 = time.perf_counter() | |
| res = ag.predict_batch([it["state"].strip() for it in items], qs, batch_size=32) | |
| wall = time.perf_counter() - t0 | |
| ch, cf = [], [] | |
| for it, r in zip(items, res): | |
| a = r["answers"]["decision"]; ch.append(it["options"].index(a["choice"])); cf.append(float(a["probabilities"][a["choice"]])) | |
| gold = [int(it["gold_index"]) for it in items] | |
| g = [i for i, x in enumerate(gold) if x >= 0] | |
| cor = [ch[i] == gold[i] for i in g] | |
| m = {"n": len(items), "accuracy": float(np.mean(cor)), "ece": ece([cf[i] for i in g], cor), | |
| "brier": float(np.mean([(cf[i] - float(ch[i] == gold[i])) ** 2 for i in g])), "ms_per_item": wall / len(items) * 1000} | |
| if suite == "s4_order": | |
| by = collections.defaultdict(list) | |
| for it, c in zip(items, ch): | |
| by[it["base_item_id"]].append(it["options"][c]) | |
| m["flip_rate"] = sum(len(set(v)) > 1 for v in by.values()) / len(by) | |
| if suite == "s5_confidence": | |
| ng = [cf[i] for i, x in enumerate(gold) if x < 0] | |
| m["admits_ignorance"] = float(np.mean([c <= 0.5 for c in ng])); m["mean_conf_no_good"] = float(np.mean(ng)) | |
| if suite == "s3_cardinality": | |
| byn = collections.defaultdict(list) | |
| for it, c, gg in zip(items, ch, gold): | |
| byn[json.loads(it["meta"].replace("'", '"'))["N"] if isinstance(it["meta"], str) else it["meta"]["N"]].append(c == gg) | |
| m["by_N"] = {int(k): float(np.mean(v)) for k, v in sorted(byn.items())} | |
| out[suite] = m | |
| print(suite, {k: (round(v, 4) if isinstance(v, float) else v) for k, v in m.items()}, flush=True) | |
| json.dump(out, open(sys.argv[2] if len(sys.argv) > 2 else "./results/jev_suites_thx01.json", "w"), indent=1) | |