in jcm/sampling.py [0:0]
def ode_sampler(prng, pstate, z=None):
"""The probability flow ODE sampler with black-box ODE solver.
Args:
prng: An array of random state. The leading dimension equals the number of devices.
pstate: Replicated training state for running on multiple devices.
z: If present, generate samples from latent code `z`.
Returns:
Samples, and the number of function evaluations.
"""
# Initial sample
rng = flax.jax_utils.unreplicate(prng)
rng, step_rng = random.split(rng)
if z is None:
# If not represent, sample the latent code from the prior distibution of the SDE.
x = sde.prior_sampling(step_rng, (jax.local_device_count(),) + shape)
else:
x = z
def ode_func(t, x):
x = from_flattened_numpy(x, (jax.local_device_count(),) + shape)
vec_t = jnp.ones((x.shape[0], x.shape[1])) * t
drift = drift_fn(pstate, x, vec_t)
return to_flattened_numpy(drift)
# Black-box ODE solver for the probability flow ODE
solution = integrate.solve_ivp(
ode_func,
(sde.T, eps),
to_flattened_numpy(x),
rtol=rtol,
atol=atol,
method=method,
)
nfe = solution.nfev
x = jnp.asarray(solution.y[:, -1]).reshape((jax.local_device_count(),) + shape)
# Denoising is equivalent to running one predictor step without adding noise
if denoise:
rng, *step_rng = random.split(rng, jax.local_device_count() + 1)
step_rng = jnp.asarray(step_rng)
x = denoise_update_fn(step_rng, pstate, x)
return x, nfe