Here it is. Run it from either v2-1 GGUF repo, against the eval/ folder as shipped:
import json, sys
def rows(path):
out, seen = {}, {}
for r in json.load(open(path))['rows']:
k = (r['id'], r['qid'])
seen[k] = seen.get(k, 0) + 1
out[k + (seen[k],)] = r
return out
d = sys.argv[1] if len(sys.argv) > 1 else 'eval'
full = rows(f'{d}/agreement-full.json')
for q in ['Q8_0', 'Q5_K_M', 'Q4_K_M']:
Q = rows(f'{d}/agreement-{q}.json')
keys = full.keys() & Q.keys()
for t in (0.70, 0.80):
flips = [k for k in keys if (max(full[k]['probs']) >= t) != (max(Q[k]['probs']) >= t)]
same = sum(full[k]['pick_index'] == Q[k]['pick_index'] for k in flips)
print(q, t, f'{len(flips)} of {len(keys)} cross the gate, {same} keep the same pick')
9B at 0.80: 0, 7, 16. At 0.70: 3, 4, 20.
27B at 0.80: 0, 6, 3. At 0.70: 1, 7, 9.
Agreed on both points. 0.80 was only an example, and a flip count says nothing about whether the routed action was right.
That second half can't be counted from these files yet.
Each row carries id, qid, type, probs and pick_index. No gold label. And all 260 ids are from typed-decisions-train.
With a label, the flips sort themselves.
A quant that lifts a wrong answer over the gate sends it out unreviewed. One that drops a right answer under it only costs a review.
Could the agreement files carry the gold index, on held-out rows?