MCPcopy Create free account
hub / github.com/Meshcapade/difflocks / sample_dpmpp_sde

Function sample_dpmpp_sde

k_diffusion/sampling.py:543–581  ·  view source on GitHub ↗

DPM-Solver++ (stochastic).

(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None, r=1 / 2)

Source from the content-addressed store, hash-verified

541
542@torch.no_grad()
543def sample_dpmpp_sde(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None, r=1 / 2):
544 """DPM-Solver++ (stochastic)."""
545 sigma_min, sigma_max = sigmas[sigmas > 0].min(), sigmas.max()
546 noise_sampler = BrownianTreeNoiseSampler(x, sigma_min, sigma_max) if noise_sampler is None else noise_sampler
547 extra_args = {} if extra_args is None else extra_args
548 s_in = x.new_ones([x.shape[0]])
549 sigma_fn = lambda t: t.neg().exp()
550 t_fn = lambda sigma: sigma.log().neg()
551
552 for i in trange(len(sigmas) - 1, disable=disable):
553 denoised = model(x, sigmas[i] * s_in, **extra_args)
554 if callback is not None:
555 callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised})
556 if sigmas[i + 1] == 0:
557 # Euler method
558 d = to_d(x, sigmas[i], denoised)
559 dt = sigmas[i + 1] - sigmas[i]
560 x = x + d * dt
561 else:
562 # DPM-Solver++
563 t, t_next = t_fn(sigmas[i]), t_fn(sigmas[i + 1])
564 h = t_next - t
565 s = t + h * r
566 fac = 1 / (2 * r)
567
568 # Step 1
569 sd, su = get_ancestral_step(sigma_fn(t), sigma_fn(s), eta)
570 s_ = t_fn(sd)
571 x_2 = (sigma_fn(s_) / sigma_fn(t)) * x - (t - s_).expm1() * denoised
572 x_2 = x_2 + noise_sampler(sigma_fn(t), sigma_fn(s)) * s_noise * su
573 denoised_2 = model(x_2, sigma_fn(s) * s_in, **extra_args)
574
575 # Step 2
576 sd, su = get_ancestral_step(sigma_fn(t), sigma_fn(t_next), eta)
577 t_next_ = t_fn(sd)
578 denoised_d = (1 - fac) * denoised + fac * denoised_2
579 x = (sigma_fn(t_next_) / sigma_fn(t)) * x - (t - t_next_).expm1() * denoised_d
580 x = x + noise_sampler(sigma_fn(t), sigma_fn(t_next)) * s_noise * su
581 return x
582
583
584@torch.no_grad()

Callers

nothing calls this directly

Calls 5

to_dFunction · 0.85
get_ancestral_stepFunction · 0.85
minMethod · 0.45
maxMethod · 0.45

Tested by

no test coverage detected