"""Print the four-letter training and sampling calculations from the lecture.""" import math import torch from lecture_core import udlm_rates, geometric_cfg dtype = torch.float64 print('Alphabet order: A C G T; log losses are nats.') q = .6*torch.eye(4,dtype=dtype)+.1*torch.ones(4,4,dtype=dtype) print('Uniform one-step corruption matrix:\n',q) print('Two-step marginal from clean A:',(q@q)[0].tolist()) reverse=q[0]*q[:,1];reverse/=reverse.sum() print('Previous base given clean A and final C:',reverse.tolist()) loss=2*(-math.log(.6)-math.log(.7)) print('MDLM ACGT -> AmGm, t=.5, loss:',loss) print('MDLM reverse .5 -> .25 at missing C:',[.05,.30,.10,.05,.50]) z=torch.tensor([[1]]);t=torch.tensor([.5],dtype=dtype) a=udlm_rates(torch.tensor([[[1,0,0,0]]],dtype=dtype),z,t) b=udlm_rates(torch.tensor([[[.6,.2,.1,.1]]],dtype=dtype),z,t) rate_kl=(a*(a.clamp_min(1e-12).log()-b.clamp_min(1e-12).log())+b-a).sum() print('UDLM target rates C -> A,C,G,T:',a.flatten().tolist()) print('UDLM learned rates:',b.flatten().tolist(),'rate loss:',float(rate_kl)) p=.1*b;p[...,1]=1-.1*b.sum(-1) print('UDLM Euler step:',p.flatten().tolist()) print('CFG strength 2:',geometric_cfg(torch.full((4,),.25),torch.tensor([.1,.2,.6,.1]),2).tolist())