class_docstr: Denoising diffusion probabilistic models (DDPMs) explores the connections between denoising score matching and
  Langevin dynamics sampling.
  
  [`~ConfigMixin`] takes care of storing all config attributes that are passed in the scheduler's `__init__`
  function, such as `num_train_timesteps`. They can be accessed via `scheduler.config.num_train_timesteps`.
  [`SchedulerMixin`] provides general loading and saving functionality via the [`SchedulerMixin.save_pretrained`] and
  [`~SchedulerMixin.from_pretrained`] functions.
  
  For more details, see the original paper: https://arxiv.org/abs/2006.11239
  
  Args:
      num_train_timesteps (`int`): number of diffusion steps used to train the model.
      beta_start (`float`): the starting `beta` value of inference.
      beta_end (`float`): the final `beta` value.
      beta_schedule (`str`):
          the beta schedule, a mapping from a beta range to a sequence of betas for stepping the model. Choose from
          `linear`, `scaled_linear`, `squaredcos_cap_v2` or `sigmoid`.
      trained_betas (`np.ndarray`, optional):
          option to pass an array of betas directly to the constructor to bypass `beta_start`, `beta_end` etc.
      variance_type (`str`):
          options to clip the variance used when adding noise to the denoised sample. Choose from `fixed_small`,
          `fixed_small_log`, `fixed_large`, `fixed_large_log`, `learned` or `learned_range`.
      clip_sample (`bool`, default `True`):
          option to clip predicted sample for numerical stability.
      clip_sample_range (`float`, default `1.0`):
          the maximum magnitude for sample clipping. Valid only when `clip_sample=True`.
      prediction_type (`str`, default `epsilon`, optional):
          prediction type of the scheduler function, one of `epsilon` (predicting the noise of the diffusion
          process), `sample` (directly predicting the noisy sample`) or `v_prediction` (see section 2.4
          https://imagen.research.google/video/paper.pdf)
      thresholding (`bool`, default `False`):
          whether to use the "dynamic thresholding" method (introduced by Imagen, https://arxiv.org/abs/2205.11487).
          Note that the thresholding method is unsuitable for latent-space diffusion models (such as
          stable-diffusion).
      dynamic_thresholding_ratio (`float`, default `0.995`):
          the ratio for the dynamic thresholding method. Default is `0.995`, the same as Imagen
          (https://arxiv.org/abs/2205.11487). Valid only when `thresholding=True`.
      sample_max_value (`float`, default `1.0`):
          the threshold value for dynamic thresholding. Valid only when `thresholding=True`.
      timestep_spacing (`str`, default `"leading"`):
          The way the timesteps should be scaled. Refer to Table 2. of [Common Diffusion Noise Schedules and Sample
          Steps are Flawed](https://arxiv.org/abs/2305.08891) for more information.
      steps_offset (`int`, default `0`):
          an offset added to the inference steps. You can use a combination of `offset=1` and
          `set_alpha_to_one=False`, to make the last step use step 0 for the previous alpha product, as done in
          stable diffusion.
      rescale_betas_zero_snr (`bool`, defaults to `False`):
          Whether to rescale the betas to have zero terminal SNR. This enables the model to generate very bright and
          dark samples instead of limiting it to samples with medium brightness. Loosely related to
          [`--offset_noise`](https://github.com/huggingface/diffusers/blob/74fd735eb073eb1d774b1ab4154a0876eb82f055/examples/dreambooth/train_dreambooth.py#L506).
class_docstr_tok: ["Denoising","diffusion","probabilistic","models","(","DDPMs",")","explores","the","connections","between","denoising","score","matching","and","Langevin","dynamics","sampling",".","[","`","~ConfigMixin","`","]","takes","care","of","storing","all","config","attributes","that","are","passed","in","the","scheduler","'s","`","__init__","`","function",",","such","as","`","num_train_timesteps","`",".","They","can","be","accessed","via","`","scheduler.config.num_train_timesteps","`",".","[","`","SchedulerMixin","`","]","provides","general","loading","and","saving","functionality","via","the","[","`","SchedulerMixin.save_pretrained","`","]","and","[","`","~SchedulerMixin.from_pretrained","`","]","functions",".","For","more","details",",","see","the","original","paper",":","https",":","\/\/arxiv.org\/abs\/2006.11239","Args",":","num_train_timesteps","(","`","int","`",")",":","number","of","diffusion","steps","used","to","train","the","model",".","beta_start","(","`","float","`",")",":","the","starting","`","beta","`","value","of","inference",".","beta_end","(","`","float","`",")",":","the","final","`","beta","`","value",".","beta_schedule","(","`","str","`",")",":","the","beta","schedule",",","a","mapping","from","a","beta","range","to","a","sequence","of","betas","for","stepping","the","model",".","Choose","from","`","linear","`",",","`","scaled_linear","`",",","`","squaredcos_cap_v2","`","or","`","sigmoid","`",".","trained_betas","(","`","np.ndarray","`",",","optional",")",":","option","to","pass","an","array","of","betas","directly","to","the","constructor","to","bypass","`","beta_start","`",",","`","beta_end","`","etc",".","variance_type","(","`","str","`",")",":","options","to","clip","the","variance","used","when","adding","noise","to","the","denoised","sample",".","Choose","from","`","fixed_small","`",",","`","fixed_small_log","`",",","`","fixed_large","`",",","`","fixed_large_log","`",",","`","learned","`","or","`","learned_range","`",".","clip_sample","(","`","bool","`",",","default","`","True","`",")",":","option","to","clip","predicted","sample","for","numerical","stability",".","clip_sample_range","(","`","float","`",",","default","`","1.0","`",")",":","the","maximum","magnitude","for","sample","clipping",".","Valid","only","when","`","clip_sample=True","`",".","prediction_type","(","`","str","`",",","default","`","epsilon","`",",","optional",")",":","prediction","type","of","the","scheduler","function",",","one","of","`","epsilon","`","(","predicting","the","noise","of","the","diffusion","process",")",",","`","sample","`","(","directly","predicting","the","noisy","sample","`",")","or","`","v_prediction","`","(","see","section","2.4","https",":","\/\/imagen.research.google\/video\/paper.pdf",")","thresholding","(","`","bool","`",",","default","`","False","`",")",":","whether","to","use","the","``","dynamic","thresholding","''","method","(","introduced","by","Imagen",",","https",":","\/\/arxiv.org\/abs\/2205.11487",")",".","Note","that","the","thresholding","method","is","unsuitable","for","latent-space","diffusion","models","(","such","as","stable-diffusion",")",".","dynamic_thresholding_ratio","(","`","float","`",",","default","`","0.995","`",")",":","the","ratio","for","the","dynamic","thresholding","method",".","Default","is","`","0.995","`",",","the","same","as","Imagen","(","https",":","\/\/arxiv.org\/abs\/2205.11487",")",".","Valid","only","when","`","thresholding=True","`",".","sample_max_value","(","`","float","`",",","default","`","1.0","`",")",":","the","threshold","value","for","dynamic","thresholding",".","Valid","only","when","`","thresholding=True","`",".","timestep_spacing","(","`","str","`",",","default","`","``","leading","''","`",")",":","The","way","the","timesteps","should","be","scaled",".","Refer","to","Table","2.","of","[","Common","Diffusion","Noise","Schedules","and","Sample","Steps","are","Flawed","]","(","https",":","\/\/arxiv.org\/abs\/2305.08891",")","for","more","information",".","steps_offset","(","`","int","`",",","default","`","0","`",")",":","an","offset","added","to","the","inference","steps",".","You","can","use","a","combination","of","`","offset=1","`","and","`","set_alpha_to_one=False","`",",","to","make","the","last","step","use","step","0","for","the","previous","alpha","product",",","as","done","in","stable","diffusion",".","rescale_betas_zero_snr","(","`","bool","`",",","defaults","to","`","False","`",")",":","Whether","to","rescale","the","betas","to","have","zero","terminal","SNR",".","This","enables","the","model","to","generate","very","bright","and","dark","samples","instead","of","limiting","it","to","samples","with","medium","brightness",".","Loosely","related","to","[","`","--","offset_noise","`","]","(","https",":","\/\/github.com\/huggingface\/diffusers\/blob\/74fd735eb073eb1d774b1ab4154a0876eb82f055\/examples\/dreambooth\/train_dreambooth.py","#","L506",")","."]
docstr: Predict the sample at the previous timestep by reversing the SDE. Core function to propagate the diffusion
  process from the learned model outputs (most often the predicted noise).
  
  Args:
      model_output (`torch.FloatTensor`): direct output from learned diffusion model.
      timestep (`int`): current discrete timestep in the diffusion chain.
      sample (`torch.FloatTensor`):
          current instance of sample being created by diffusion process.
      generator: random number generator.
      return_dict (`bool`): option for returning tuple rather than DDPMParallelSchedulerOutput class
  
  Returns:
      [`~schedulers.scheduling_utils.DDPMParallelSchedulerOutput`] or `tuple`:
      [`~schedulers.scheduling_utils.DDPMParallelSchedulerOutput`] if `return_dict` is True, otherwise a `tuple`.
      When returning a tuple, the first element is the sample tensor.
docstr_tok: ["Predict","the","sample","at","the","previous","timestep","by","reversing","the","SDE",".","Core","function","to","propagate","the","diffusion","process","from","the","learned","model","outputs","(","most","often","the","predicted","noise",")",".","Args",":","model_output","(","`","torch.FloatTensor","`",")",":","direct","output","from","learned","diffusion","model",".","timestep","(","`","int","`",")",":","current","discrete","timestep","in","the","diffusion","chain",".","sample","(","`","torch.FloatTensor","`",")",":","current","instance","of","sample","being","created","by","diffusion","process",".","generator",":","random","number","generator",".","return_dict","(","`","bool","`",")",":","option","for","returning","tuple","rather","than","DDPMParallelSchedulerOutput","class","Returns",":","[","`","~schedulers.scheduling_utils.DDPMParallelSchedulerOutput","`","]","or","`","tuple","`",":","[","`","~schedulers.scheduling_utils.DDPMParallelSchedulerOutput","`","]","if","`","return_dict","`","is","True",",","otherwise","a","`","tuple","`",".","When","returning","a","tuple",",","the","first","element","is","the","sample","tensor","."]
code: def step(
      self,
      model_output: torch.FloatTensor,
      timestep: int,
      sample: torch.FloatTensor,
      generator=None,
      return_dict: bool = True,
  ) -> Union[DDPMParallelSchedulerOutput, Tuple]:
      """
      Predict the sample at the previous timestep by reversing the SDE. Core function to propagate the diffusion
      process from the learned model outputs (most often the predicted noise).
  
      Args:
          model_output (`torch.FloatTensor`): direct output from learned diffusion model.
          timestep (`int`): current discrete timestep in the diffusion chain.
          sample (`torch.FloatTensor`):
              current instance of sample being created by diffusion process.
          generator: random number generator.
          return_dict (`bool`): option for returning tuple rather than DDPMParallelSchedulerOutput class
  
      Returns:
          [`~schedulers.scheduling_utils.DDPMParallelSchedulerOutput`] or `tuple`:
          [`~schedulers.scheduling_utils.DDPMParallelSchedulerOutput`] if `return_dict` is True, otherwise a `tuple`.
          When returning a tuple, the first element is the sample tensor.
  
      """
      t = timestep
  
      prev_t = self.previous_timestep(t)
  
      if model_output.shape[1] == sample.shape[
          1
      ] * 2 and self.variance_type in ["learned", "learned_range"]:
          model_output, predicted_variance = torch.split(
              model_output, sample.shape[1], dim=1
          )
      else:
          predicted_variance = None
  
      # 1. compute alphas, betas
      alpha_prod_t = self.alphas_cumprod[t]
      alpha_prod_t_prev = (
          self.alphas_cumprod[prev_t] if prev_t >= 0 else self.one
      )
      beta_prod_t = 1 - alpha_prod_t
      beta_prod_t_prev = 1 - alpha_prod_t_prev
      current_alpha_t = alpha_prod_t / alpha_prod_t_prev
      current_beta_t = 1 - current_alpha_t
  
      # 2. compute predicted original sample from predicted noise also called
      # "predicted x_0" of formula (15) from https://arxiv.org/pdf/2006.11239.pdf
      if self.config.prediction_type == "epsilon":
          pred_original_sample = (
              sample - beta_prod_t ** (0.5) * model_output
          ) / alpha_prod_t ** (0.5)
      elif self.config.prediction_type == "sample":
          pred_original_sample = model_output
      elif self.config.prediction_type == "v_prediction":
          pred_original_sample = (alpha_prod_t**0.5) * sample - (
              beta_prod_t**0.5
          ) * model_output
      else:
          raise ValueError(
              f"prediction_type given as {self.config.prediction_type} must be one of `epsilon`, `sample` or"
              " `v_prediction`  for the DDPMScheduler."
          )
  
      # 3. Clip or threshold "predicted x_0"
      if self.config.thresholding:
          pred_original_sample = self._threshold_sample(
              pred_original_sample
          )
      elif self.config.clip_sample:
          pred_original_sample = pred_original_sample.clamp(
              -self.config.clip_sample_range,
              self.config.clip_sample_range,
          )
  
      # 4. Compute coefficients for pred_original_sample x_0 and current sample x_t
      # See formula (7) from https://arxiv.org/pdf/2006.11239.pdf
      pred_original_sample_coeff = (
          alpha_prod_t_prev ** (0.5) * current_beta_t
      ) / beta_prod_t
      current_sample_coeff = (
          current_alpha_t ** (0.5) * beta_prod_t_prev / beta_prod_t
      )
  
      # 5. Compute predicted previous sample µ_t
      # See formula (7) from https://arxiv.org/pdf/2006.11239.pdf
      pred_prev_sample = (
          pred_original_sample_coeff * pred_original_sample
          + current_sample_coeff * sample
      )
  
      # 6. Add noise
      variance = 0
      if t > 0:
          device = model_output.device
          variance_noise = randn_tensor(
              model_output.shape,
              generator=generator,
              device=device,
              dtype=model_output.dtype,
          )
          if self.variance_type == "fixed_small_log":
              variance = (
                  self._get_variance(
                      t, predicted_variance=predicted_variance
                  )
                  * variance_noise
              )
          elif self.variance_type == "learned_range":
              variance = self._get_variance(
                  t, predicted_variance=predicted_variance
              )
              variance = torch.exp(0.5 * variance) * variance_noise
          else:
              variance = (
                  self._get_variance(
                      t, predicted_variance=predicted_variance
                  )
                  ** 0.5
              ) * variance_noise
  
      pred_prev_sample = pred_prev_sample + variance
  
      if not return_dict:
          return (pred_prev_sample,)
  
      return DDPMParallelSchedulerOutput(
          prev_sample=pred_prev_sample,
          pred_original_sample=pred_original_sample,
      )
  
imports: import math
  from dataclasses import dataclass
  from typing import List, Optional, Tuple, Union
  import numpy
  import torch
  from ..configuration_utils import ConfigMixin, register_to_config
  from ..utils import BaseOutput
  from ..utils.torch_utils import randn_tensor
  from .scheduling_utils import KarrasDiffusionSchedulers, SchedulerMixin
label_desc: Use image node_id 6 for calling the DDPMParallelScheduler obj's underlying member method code with example usage: obj.step(model_output, timestep, sample, generator, return_dict) and returns: DDPMParallelSchedulerOutput, pred_prev_sample