"""Arithmetic only: identical prescribed gradients, not a training benchmark."""
import math,json
if __name__=="__main__":
    sgd=adam=m=v=0.;rows=[]
    for t,g in enumerate([2.,-1.],1):
        sgd-=.1*g
        m=.9*m+.1*g;v=.999*v+.001*g*g
        mh=m/(1-.9**t);vh=v/(1-.999**t)
        adam-=.1*mh/(math.sqrt(vh)+1e-8)
        rows.append({"step":t,"gradient":g,"SGD":sgd,"Adam":adam,"m_hat":mh,"v_hat":vh})
    assert abs(rows[0]["SGD"]+.2)<1e-12
    assert abs(rows[0]["Adam"]+.1)<1e-8
    assert abs(rows[1]["SGD"]+.1)<1e-12
    assert rows[1]["Adam"]<rows[0]["Adam"]
    print(json.dumps(rows,indent=2))
