"""Fit one positive temperature to authored validation logits; held-out logits never select it."""
import math,json
VAL_Z=[4,2,1,-1,-2,-4];VAL_Y=[1,1,0,0,1,0]
TEST_Z=[3,1.5,.5,-.5,-1.5,-3];TEST_Y=[1,1,1,0,0,0]
def sigmoid(x):return 1/(1+math.exp(-x)) if x>=0 else math.exp(x)/(1+math.exp(x))
def nll(zs,ys,beta):return sum(max(beta*z,0)+math.log1p(math.exp(-abs(beta*z)))-y*beta*z for z,y in zip(zs,ys))/len(zs)
def gradient(zs,ys,beta):return sum((sigmoid(beta*z)-y)*z for z,y in zip(zs,ys))/len(zs)
def fit_beta(zs,ys):
    lo,hi=.001,4.0;assert gradient(zs,ys,lo)<0<gradient(zs,ys,hi)
    for _ in range(80):
        mid=(lo+hi)/2
        if gradient(zs,ys,mid)<0:lo=mid
        else:hi=mid
    return (lo+hi)/2
def rows(zs,ys,beta):return [{'logit':z,'reference':y,'p_before':sigmoid(z),'p_after':sigmoid(beta*z),'class_before':int(z>=0),'class_after':int(beta*z>=0)} for z,y in zip(zs,ys)]
def demo():
    beta=fit_beta(VAL_Z,VAL_Y);temperature=1/beta
    derivative=gradient(VAL_Z,VAL_Y,beta);finite=(nll(VAL_Z,VAL_Y,beta+1e-5)-nll(VAL_Z,VAL_Y,beta-1e-5))/(2e-5)
    assert abs(derivative)<1e-12 and abs(finite-derivative)<1e-8 and temperature>1
    val_before,val_after=nll(VAL_Z,VAL_Y,1),nll(VAL_Z,VAL_Y,beta);test_before,test_after=nll(TEST_Z,TEST_Y,1),nll(TEST_Z,TEST_Y,beta)
    assert val_after<val_before and test_after>test_before
    val,test=rows(VAL_Z,VAL_Y,beta),rows(TEST_Z,TEST_Y,beta);assert all(r['class_before']==r['class_after'] for r in val+test)
    return {'authored_logits_not_network_outputs':True,'calibration_fit_rows':'validation only','beta_search_bounds':[.001,4.0],'bisection_iterations':80,'beta':beta,'temperature':temperature,'validation_nll_before':val_before,'validation_nll_after':val_after,'heldout_nll_before':test_before,'heldout_nll_after':test_after,'validation_rows':val,'heldout_rows':test,'optimality_gradient':derivative,'independent_finite_difference_gradient':finite,'hard_class_threshold':.5,'classifier_weights_trained_or_changed':False,'general_calibration_guarantee':False}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=False,indent=2))
