"""Authored scalar chain and two clipping rules; not torch-equivalent code."""
from fractions import Fraction as F
import math,json
def chain(d,n):
    if n<1:raise ValueError('positive chain length required')
    answer=F(1)
    for _ in range(n):answer*=d
    return answer
def norm_clip(v,limit):
    if limit<=0 or not math.isfinite(limit) or not all(math.isfinite(x) for x in v):raise ValueError('finite vector, positive finite limit')
    norm=math.sqrt(sum(x*x for x in v));scale=min(1.,limit/norm) if norm else 1.
    return [x*scale for x in v],norm,scale
if __name__=='__main__':
    rows=[{'local_derivative':str(d),'depth':n,'product_exact':str(chain(d,n)),'product_decimal':float(chain(d,n))} for d in [F(1,2),F(1),F(2)] for n in [1,4,12]]
    assert chain(F(1,2),12)==F(1,4096) and chain(F(2),12)==4096
    assert chain(F(-1,2),3)==F(-1,8) and chain(F(-1,2),4)==F(1,16)
    out,norm,scale=norm_clip([3.,4.],2.)
    assert math.isclose(norm,5) and math.isclose(scale,.4)
    assert all(math.isclose(x,y) for x,y in zip(out,[1.2,1.6]))
    assert math.isclose(math.hypot(*out),2) and math.isclose(out[0]*4-out[1]*3,0,abs_tol=1e-14)
    elementwise=[max(-2.,min(2.,x)) for x in [3.,4.]]
    assert elementwise==[2.,2.] and elementwise[0]*4-elementwise[1]*3!=0
    assert norm_clip([0.,0.],2.)[0]==[0.,0.] and norm_clip([.001,.002],2.)[0]==[.001,.002]
    print(json.dumps({'scalar_chains':rows,'global_norm_clipped':out,'original_norm':norm,'scale':scale,'elementwise_clipped':elementwise,'real_training':False},indent=2))
