"""Soft-target arithmetic on chosen probability vectors; no model training."""
import math,json
p=[.8,.15,.05];students={"student_1":[.7,.2,.1],"student_2":[.8,.1,.1]}
def ce(p,q):return -sum(a*math.log(b) for a,b in zip(p,q))
def kl(p,q):return sum(a*math.log(a/b) for a,b in zip(p,q))
if __name__=="__main__":
    assert kl(p,p)==0
    result={}
    for name,q in students.items():
        assert abs(sum(q)-1)<1e-12 and all(v>0 for v in q)
        result[name]={"argmax":max(range(3),key=lambda i:q[i]),"soft_cross_entropy":ce(p,q),"KL":kl(p,q)}
    assert result["student_2"]["KL"] < result["student_1"]["KL"]
    assert all(x["argmax"]==0 for x in result.values())
    print(json.dumps(result,indent=2))
