"""Original scalar forward-mode teaching type; no general autograd framework."""
import math,json
class Dual:
 def __init__(self,value,tangent=0):
  if any(type(x) not in [int,float] or abs(x)>1e6 or not math.isfinite(x) for x in [value,tangent]):raise ValueError('bounded finite scalar primal/tangent')
  self.value=float(value);self.tangent=float(tangent)
 @staticmethod
 def wrap(x):return x if isinstance(x,Dual) else Dual(x)
 def __add__(self,other):
  b=self.wrap(other);return Dual(self.value+b.value,self.tangent+b.tangent)
 __radd__=__add__
 def __mul__(self,other):
  b=self.wrap(other);return Dual(self.value*b.value,self.tangent*b.value+self.value*b.tangent)
 __rmul__=__mul__
def sin(x):return Dual(math.sin(x.value),math.cos(x.value)*x.tangent)
def exp(x):
 if abs(x.value)>20:raise ValueError('exponential demo domain abs(primal)<=20')
 v=math.exp(x.value);return Dual(v,v*x.tangent)
def evaluate(x,seed):
 d=Dual(x,seed);square=d*d;s=sin(d);e=exp(d);term=square*s;out=term+e
 return out,[{'op':name,'primal':v.value,'tangent':v.tangent} for name,v in [('input',d),('square',square),('sin',s),('exp',e),('square_times_sin',term),('add',out)]]
def plain(x):return x*x*math.sin(x)+math.exp(x)
def demo():
 x=.5;analytic=2*x*math.sin(x)+x*x*math.cos(x)+math.exp(x);rows=[]
 for seed in [0,1,2]:
  out,tr=evaluate(x,seed);assert abs(out.value-plain(x))<1e-12 and abs(out.tangent-seed*analytic)<1e-12;rows.append({'seed':seed,'trace':tr,'derivative_tangent':out.tangent})
 h=1e-5;fd=(plain(x+h)-plain(x-h))/(2*h);assert abs(fd-analytic)<1e-8
 c=Dual(3);z=c*Dual(2,1)+4;assert z.value==10 and z.tangent==3
 repeated=(Dual(2,1)*Dual(2,1))*Dual(2,1);assert repeated.value==8 and repeated.tangent==12
 rejected=[]
 for label,fn in [('nonfinite',lambda:Dual(float('inf'))),('bool',lambda:Dual(True)),('overflow_profile',lambda:Dual(1e6)*Dual(1e6)),('exp_domain',lambda:exp(Dual(21))),('unsupported_abs',lambda:abs(Dual(0,1)))]:
  try:fn()
  except (ValueError,TypeError):rejected.append(label)
  else:raise AssertionError('expected rejection')
 return {'function':'x*x*sin(x)+exp(x)','x':x,'scalar_seed_runs':rows,'analytic_derivative':analytic,'finite_difference_separate_check':{'h':h,'approximation':fd,'absolute_error':abs(fd-analytic)},'nested_multiply_x3_at2_derivative':12,'constant_times_input_plus4_derivative':3,'rejected':rejected,'limits':'one scalar tangent, only add/multiply/sin/exp, no abs at zero derivative claim, no branch/full Jacobian/reverse autograd/Julia execution; h is absent from Dual propagation'}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=True,indent=2))
