"""Owned second-derivative example; exact rational central differences are approximate."""
from fractions import Fraction as F
import json
def f(z):
    u,v=z;return u**4+u*u*v+v*v
def grad(z):
    u,v=z;return [4*u**3+2*u*v,u*u+2*v]
def hessian(z):
    u,v=z;return [[12*u*u+2*v,2*u],[2*u,F(2)]]
def mv(A,v):return [sum(a*b for a,b in zip(row,v)) for row in A]
def central_grad_direction(z,v,h):
    plus=grad([x+h*d for x,d in zip(z,v)]);minus=grad([x-h*d for x,d in zip(z,v)])
    return [(a-b)/(2*h) for a,b in zip(plus,minus)]
def demo():
    z=[F(1),F(2)];v=[F(1),F(-1)];H=hessian(z);Hv=mv(H,v);curvature=sum(a*b for a,b in zip(v,Hv));checks=[]
    assert H==[[16,2],[2,2]] and Hv==[14,0] and curvature==14 and grad(z)==[8,5]
    for h in [F(1,1000),F(1,2000)]:
        estimate=central_grad_direction(z,v,h);err=[a-b for a,b in zip(estimate,Hv)]
        assert err==[4*h*h,0];checks.append({'h':h,'central_gradient_difference':estimate,'difference_from_analytic_Hv':err})
    assert checks[0]['difference_from_analytic_Hv'][0]==4*checks[1]['difference_from_analytic_Hv'][0]
    t=F(1,10);saddle={'function':'u^2-v^2','origin_gradient':[0,0],'origin_H':[[2,0],[0,-2]],'curvature_along_unit_u':2,'curvature_along_unit_v':-2,'value_at_t_zero':t*t,'value_at_zero_t':-t*t,'t':t}
    assert saddle['value_at_t_zero']>0>saddle['value_at_zero_t']
    return {'point':z,'direction_not_unit':v,'scalar_value':f(z),'gradient':grad(z),'analytic_H':H,'analytic_H_times_v':Hv,'v_transpose_H_v':curvature,'central_difference_checks':checks,'saddle_counterexample':saddle,'PyTorch_SciPy_or_optimization_executed':False}
if __name__=='__main__':print(json.dumps(demo(),default=str,indent=2))
