"""Compare three metrics on fixed values; no model fitting."""
from fractions import Fraction as F
import json
def metrics(y,p):
    if len(y)!=len(p) or len(y)<2:raise ValueError("matching vectors of at least two required")
    n=len(y);mean=sum(y)/n;sse=sum((a-b)**2 for a,b in zip(y,p));sst=sum((a-mean)**2 for a in y)
    return {"MAE":sum(abs(a-b) for a,b in zip(y,p))/n,"MSE":sse/n,"R2":1-sse/sst if sst else None}
if __name__=="__main__":
    y=list(map(F,[0,1,2,3]));a=list(map(F,[1,2,3,4]));b=list(map(F,[0,1,2,7]))
    ma=metrics(y,a);mb=metrics(y,b);mean=metrics(y,[F(3,2)]*4)
    assert ma=={"MAE":F(1),"MSE":F(1),"R2":F(1,5)}
    assert mb=={"MAE":F(1),"MSE":F(4),"R2":F(-11,5)} and mean['R2']==0
    scaled=metrics([100*v for v in y],[100*v for v in a])
    assert scaled['MAE']==100*ma['MAE'] and scaled['MSE']==10000*ma['MSE'] and scaled['R2']==ma['R2']
    assert metrics([F(2),F(2)],[F(2),F(2)])['R2'] is None
    print(json.dumps({k:{m:str(v) for m,v in values.items()} for k,values in [('A',ma),('B',mb),('mean_reference',mean),('A_scaled_100',scaled)]},indent=2))
