MCPcopy Index your code
hub / github.com/CompVis/diff2flow / encode

Method encode

diff2flow/ddim.py:224–281  ·  view source on GitHub ↗
(
        self,
        model,
        x0,
        t_enc=None,
        ddim_steps=100,
        use_original_steps=True,
        n_intermediates=0,
        model_kwargs=None,
        progress=True
    )

Source from the content-addressed store, hash-verified

222
223 @torch.no_grad()
224 def encode(
225 self,
226 model,
227 x0,
228 t_enc=None,
229 ddim_steps=100,
230 use_original_steps=True,
231 n_intermediates=0,
232 model_kwargs=None,
233 progress=True
234 ):
235 assert self.ddpm.parameterization == "eps", "Only works with eps parameterization"
236 if not use_original_steps:
237 warnings.warn('Using DDIM for encoding is not recommended, as it is not fully debugged.')
238
239 bs, dev = x0.shape[0], x0.device
240 model_kwargs = model_kwargs or {}
241 return_intermediates = n_intermediates > 0
242
243 self.make_schedule(ddim_num_steps=ddim_steps, device=dev, ddim_eta=0.0, verbose=False)
244
245 # steps
246 num_reference_steps = self.ddpm_num_timesteps if use_original_steps else self.ddim_timesteps.shape[0]
247 if t_enc is None:
248 t_enc = num_reference_steps
249 assert t_enc <= num_reference_steps
250 num_steps = t_enc
251
252 if use_original_steps:
253 alphas_next = self.ddpm.alphas_cumprod[:num_steps]
254 alphas = self.ddpm.alphas_cumprod_prev[:num_steps]
255 else:
256 alphas_next = self.ddim_alphas[:num_steps]
257 alphas = torch.tensor(self.ddim_alphas_prev[:num_steps])
258
259 x_next = x0
260 intermediates = []
261 inter_steps = []
262 for i in tqdm(range(num_steps), desc='Encoding x0', disable=not progress):
263 t = torch.full((bs,), i, device=dev, dtype=torch.long)
264
265 noise_pred = model(x_next, t, **model_kwargs)
266
267 xt_weighted = (alphas_next[i] / alphas[i]).sqrt() * x_next
268 weighted_noise_pred = alphas_next[i].sqrt() * (
269 (1 / alphas_next[i] - 1).sqrt() - (1 / alphas[i] - 1).sqrt()) * noise_pred
270 x_next = xt_weighted + weighted_noise_pred
271 if return_intermediates and i % (num_steps // n_intermediates) == 0 and i < num_steps - 1:
272 intermediates.append(x_next)
273 inter_steps.append(i)
274 elif return_intermediates and i >= num_steps - 2:
275 intermediates.append(x_next)
276 inter_steps.append(i)
277
278 out = {'x_encoded': x_next, 'intermediate_steps': inter_steps}
279 if return_intermediates:
280 out.update({'intermediates': intermediates})
281 return x_next, out

Callers

nothing calls this directly

Calls 2

make_scheduleMethod · 0.95
updateMethod · 0.80

Tested by

no test coverage detected