in jcm/sampling.py [0:0]
def update_fn(self, rng, x, t):
sde = self.sde
score_fn = self.score_fn
n_steps = self.n_steps
target_snr = self.snr
if isinstance(sde, sde_lib.VPSDE) or isinstance(sde, sde_lib.subVPSDE):
timestep = (t * (sde.N - 1) / sde.T).astype(jnp.int32)
alpha = sde.alphas[timestep]
else:
alpha = jnp.ones_like(t)
def loop_body(step, val):
rng, x, x_mean = val
grad = score_fn(x, t)
rng, step_rng = jax.random.split(rng)
noise = jax.random.normal(step_rng, x.shape)
grad_norm = jnp.linalg.norm(
grad.reshape((grad.shape[0], -1)), axis=-1
).mean()
grad_norm = jax.lax.pmean(grad_norm, axis_name="batch")
noise_norm = jnp.linalg.norm(
noise.reshape((noise.shape[0], -1)), axis=-1
).mean()
noise_norm = jax.lax.pmean(noise_norm, axis_name="batch")
step_size = (target_snr * noise_norm / grad_norm) ** 2 * 2 * alpha
x_mean = x + batch_mul(step_size, grad)
x = x_mean + batch_mul(noise, jnp.sqrt(step_size * 2))
return rng, x, x_mean
_, x, x_mean = jax.lax.fori_loop(0, n_steps, loop_body, (rng, x, x))
return x, x_mean