import math

def binary_logit_loss(z, y):
    if not math.isfinite(z) or y not in (0,1):
        raise ValueError('finite logit and binary label required')
    return max(z,0.0)-z*y+math.log1p(math.exp(-abs(z)))

truth = [1,0]
for logits in ([.4,-.4],[4.0,-4.0],[.01,.01],[4.0,4.0]):
    losses = [binary_logit_loss(z,y) for z,y in zip(logits,truth)]
    accuracy = sum((z >= 0) == bool(y) for z,y in zip(logits,truth))/len(truth)
    print(logits, 'accuracy', accuracy, 'mean loss', round(sum(losses)/len(losses),6))
assert abs(binary_logit_loss(0,1)-math.log(2)) < 1e-12
assert binary_logit_loss(1000,0) == 1000.0
assert binary_logit_loss(-1000,1) == 1000.0
assert math.isfinite(binary_logit_loss(1000,1))
assert abs(binary_logit_loss(.4,1)-0.5130152523999526) < 1e-12
