Ancestral sampling with Euler method steps.
(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None)
| 137 | |
| 138 | @torch.no_grad() |
| 139 | def sample_euler_ancestral(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): |
| 140 | """Ancestral sampling with Euler method steps.""" |
| 141 | extra_args = {} if extra_args is None else extra_args |
| 142 | noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler |
| 143 | s_in = x.new_ones([x.shape[0]]) |
| 144 | for i in trange(len(sigmas) - 1, disable=disable): |
| 145 | denoised = model(x, sigmas[i] * s_in, **extra_args) |
| 146 | sigma_down, sigma_up = get_ancestral_step(sigmas[i], sigmas[i + 1], eta=eta) |
| 147 | if callback is not None: |
| 148 | callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised}) |
| 149 | d = to_d(x, sigmas[i], denoised) |
| 150 | # Euler method |
| 151 | dt = sigma_down - sigmas[i] |
| 152 | x = x + d * dt |
| 153 | if sigmas[i + 1] > 0: |
| 154 | x = x + noise_sampler(sigmas[i], sigmas[i + 1]) * s_noise * sigma_up |
| 155 | return x |
| 156 | |
| 157 | |
| 158 | @torch.no_grad() |
nothing calls this directly
no test coverage detected