"""Original exact Euler steps with analytic decay and closed-step oracles."""
from fractions import Fraction as F
import math,json

def euler(mode,start,end,y0,n):
 if mode not in ['decay','constant','time'] or any(type(v) not in [int,F] or abs(v)>100 for v in [start,end,y0]) or not start<end or end-start>6 or type(n) is not int or not 1<=n<=32:raise ValueError('known RHS, finite exact forward span<=6,n1..32')
 h=F(end-start,n);y=F(y0);rows=[]
 for i in range(n):
  t=F(start)+i*h;rhs=-2*y if mode=='decay' else F(3) if mode=='constant' else t;new=y+h*rhs
  if abs(new)>10**9:raise ValueError('bounded growth cap, not convergence')
  rows.append({'step':i,'old_t':str(t),'old_y':str(y),'rhs_at_old':str(rhs),'h':str(h),'new_t':str(t+h),'new_y':str(new)});y=new
 return y,rows

def demo():
 refinements=[];previous_error=math.inf
 for n in [4,8,16]:
  value,rows=euler('decay',0,1,1,n);closed=(1-F(2,n))**n;assert value==closed;reference=math.exp(-2);error=abs(float(value)-reference);assert error<previous_error;previous_error=error;refinements.append({'n':n,'trace':rows,'exact_Euler_closed_form':str(closed),'analytic_exp_minus2':reference,'absolute_endpoint_error':error})
 bad,badrows=euler('decay',0,6,1,4);assert bad==16 and all(F(r['new_y'])==(-2)**(i+1) for i,r in enumerate(badrows))
 constant,crows=euler('constant',0,1,5,4);assert constant==8
 time,trows=euler('time',0,1,0,4);assert time==F(3,8);wrong_right=F(5,8);assert time!=wrong_right
 rejected=[]
 for label,args in [('zero_steps',('decay',0,1,1,0)),('bool_steps',('decay',0,1,1,True)),('reverse_span',('decay',1,0,1,4)),('nonfinite',('decay',0,float('inf'),1,4)),('step_budget',('decay',0,1,1,33)),('unknown_rhs',('learned',0,1,1,4))]:
  try:euler(*args)
  except ValueError:rejected.append(label)
  else:raise AssertionError('expected rejection')
 return {'ODE':'yprime=-2y,y(0)=1','refinements_T1':refinements,'unstable_T6_h_three_halves':{'trace':badrows,'Euler_endpoint':str(bad),'analytic_exp_minus12':math.exp(-12),'amplification_per_step':'-2'},'constant_rhs_check':{'trace':crows,'endpoint':str(constant)},'time_rhs_old_time_check':{'trace':trows,'Euler_endpoint':str(time),'analytic_half':'1/2','wrong_right_time_endpoint':str(wrong_right)},'invalid_cases_rejected':rejected,'scope':'known authored IVP and fixed steps, no convergence flag from budget completion; exact arithmetic steps versus floating exponential reference, no solve_ivp/forecast/NeuralODE/model/Opera claim'}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=True,indent=2))
