import re,sys
from fractions import Fraction as F
root=sys.argv[1]
def parse(path,cols):
    rows={}
    for l in open(path,encoding='utf-8'):
        m=re.match(r'^([A-Za-z][\w\.\-\s]*?) & (.*)\\\\',l)
        if not m: continue
        vals=re.findall(r'(\d+\.\d+)\\(?:scriptsize|tiny)\{\$\\pm(\d+\.\d+)\$\}',m.group(2))
        if len(vals)==cols: rows[m.group(1).strip()]=vals
    return rows
M=parse(root+'/Tables/main_exp.tex',7); I=parse(root+'/Tables/exp_idood.tex',10)
print('main rows',len(M),'idood rows',len(I),'printed values main',sum(len(v)*2 for v in M.values()))
worst=F(0); within=0
for n,v in M.items():
    d=[F(x[0]) for x in v[:4]]; a=F(v[4][0]); g=abs(sum(d)/4-a); worst=max(worst,g); within+= g<=F(5,1000)
    if g>F(5,1000): print('gap',n,float(g))
print('Average vs mean: worst',float(worst),'within .005',within,'of',len(M))
print('avg range',min(F(v[4][0]) for v in M.values()),max(F(v[4][0]) for v in M.values()), [n for n,v in M.items() if v[4][0] in('45.53','59.95')])
print('range',float(max(F(v[4][0]) for v in M.values())-min(F(v[4][0]) for v in M.values())), 'third-of-range ratio 3/range', 3/float(max(F(v[4][0]) for v in M.values())-min(F(v[4][0]) for v in M.values())))
over=[]; mx=F(0)
for n in M:
    if n not in I: print('missing',n); continue
    v=I[n]
    for j in range(5):
        mean=(F(v[j][0])+F(v[5+j][0]))/2; g=abs(mean-F(M[n][j][0]))
        if n not in('GPT-4o','GPT-3.5'): mx=max(mx,g)
        else: over.append((n,j,float(mean),M[n][j][0],float(mean-F(M[n][j][0]))))
print('19 rows largest gap',float(mx)); print(over)
s=[F(M['GPT-4o'][j][1]) for j in range(5)]
import math
k=math.sqrt(2/3); print('sqrt(2/3)',k,[round(float(x)*k,4) for x in s]);print('thresholds ratio: 2.5/dim',[round(2.5/(float(x)*k),3) for x in s[:4]],'1.0/avg',round(1/(float(s[4])*k),3))
# ood bold
names=['sc','an','cf','sq','avg']
print('OOD best',[max(I,key=lambda n:F(I[n][5+j][0])) for j in range(5)],'bold in file: Step-2 sc, CoSER-70B an, Step-2 cf, GPT-4o sq, Step-2 avg')
print('ID best',[max(I,key=lambda n:F(I[n][j][0])) for j in range(5)])
opens=['Mistral-7B','Qwen-2-7B','LLaMA-3.1-8B','CoSER-8B','Vicuna-13B-1.5','Mixtral-8x7B','Qwen-2-72B','LLaMA-3.1-70B','Higgs-Llama-3-70B','CoSER-70B','DeepSeek-V3']
print('ID best open',[max(opens,key=lambda n:F(I[n][j][0])) for j in range(5)]); print('OOD best open',[max(opens,key=lambda n:F(I[n][5+j][0])) for j in range(5)])
print('above 57',[n for n,v in M.items() if F(v[4][0])>57])
