class_docstr: Denoising diffusion implicit models is a scheduler that extends the denoising procedure introduced in denoising
  diffusion probabilistic models (DDPMs) with non-Markovian guidance.
  
  [`~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/2010.02502
  
  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`, or `squaredcos_cap_v2`.
      trained_betas (`np.ndarray`, optional):
          option to pass an array of betas directly to the constructor to bypass `beta_start`, `beta_end` etc.
      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`.
      set_alpha_to_one (`bool`, default `True`):
          each diffusion step uses the value of alphas product at that step and at the previous one. For the final
          step there is no previous alpha. When this option is `True` the previous alpha product is fixed to `1`,
          otherwise it uses the value of alpha at step 0.
      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.
      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.
      rescale_betas_zero_snr (`bool`, default `False`):
          whether to rescale the betas to have zero terminal SNR (proposed by https://arxiv.org/pdf/2305.08891.pdf).
          This can enable 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","implicit","models","is","a","scheduler","that","extends","the","denoising","procedure","introduced","in","denoising","diffusion","probabilistic","models","(","DDPMs",")","with","non-Markovian","guidance",".","[","`","~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\/2010.02502","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","`",",","or","`","squaredcos_cap_v2","`",".","trained_betas","(","`","np.ndarray","`",",","optional",")",":","option","to","pass","an","array","of","betas","directly","to","the","constructor","to","bypass","`","beta_start","`",",","`","beta_end","`","etc",".","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","`",".","set_alpha_to_one","(","`","bool","`",",","default","`","True","`",")",":","each","diffusion","step","uses","the","value","of","alphas","product","at","that","step","and","at","the","previous","one",".","For","the","final","step","there","is","no","previous","alpha",".","When","this","option","is","`","True","`","the","previous","alpha","product","is","fixed","to","`","1","`",",","otherwise","it","uses","the","value","of","alpha","at","step","0.","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",".","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",".","rescale_betas_zero_snr","(","`","bool","`",",","default","`","False","`",")",":","whether","to","rescale","the","betas","to","have","zero","terminal","SNR","(","proposed","by","https",":","\/\/arxiv.org\/pdf\/2305.08891.pdf",")",".","This","can","enable","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: Batched version of the `step` function, to be able to reverse the SDE for multiple samples/timesteps at once.
  Also, does not add any noise to the predicted sample, which is necessary for parallel sampling where the noise
  is pre-sampled by the pipeline.
  
  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.
      timesteps (`List[int]`):
          current discrete timesteps in the diffusion chain. This is now a list of integers.
      sample (`torch.FloatTensor`):
          current instance of sample being created by diffusion process.
      eta (`float`): weight of noise for added noise in diffusion step.
      use_clipped_model_output (`bool`): if `True`, compute "corrected" `model_output` from the clipped
          predicted original sample. Necessary because predicted original sample is clipped to [-1, 1] when
          `self.config.clip_sample` is `True`. If no clipping has happened, "corrected" `model_output` would
          coincide with the one provided as input and `use_clipped_model_output` will have not effect.
  
  Returns:
      `torch.FloatTensor`: sample tensor at previous timestep.
docstr_tok: ["Batched","version","of","the","`","step","`","function",",","to","be","able","to","reverse","the","SDE","for","multiple","samples\/timesteps","at","once",".","Also",",","does","not","add","any","noise","to","the","predicted","sample",",","which","is","necessary","for","parallel","sampling","where","the","noise","is","pre-sampled","by","the","pipeline",".","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",".","timesteps","(","`","List","[","int","]","`",")",":","current","discrete","timesteps","in","the","diffusion","chain",".","This","is","now","a","list","of","integers",".","sample","(","`","torch.FloatTensor","`",")",":","current","instance","of","sample","being","created","by","diffusion","process",".","eta","(","`","float","`",")",":","weight","of","noise","for","added","noise","in","diffusion","step",".","use_clipped_model_output","(","`","bool","`",")",":","if","`","True","`",",","compute","``","corrected","''","`","model_output","`","from","the","clipped","predicted","original","sample",".","Necessary","because","predicted","original","sample","is","clipped","to","[","-1",",","1","]","when","`","self.config.clip_sample","`","is","`","True","`",".","If","no","clipping","has","happened",",","``","corrected","''","`","model_output","`","would","coincide","with","the","one","provided","as","input","and","`","use_clipped_model_output","`","will","have","not","effect",".","Returns",":","`","torch.FloatTensor","`",":","sample","tensor","at","previous","timestep","."]
code: def batch_step_no_noise(
      self,
      model_output: torch.FloatTensor,
      timesteps: List[int],
      sample: torch.FloatTensor,
      eta: float = 0.0,
      use_clipped_model_output: bool = False,
  ) -> torch.FloatTensor:
      """
      Batched version of the `step` function, to be able to reverse the SDE for multiple samples/timesteps at once.
      Also, does not add any noise to the predicted sample, which is necessary for parallel sampling where the noise
      is pre-sampled by the pipeline.
  
      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.
          timesteps (`List[int]`):
              current discrete timesteps in the diffusion chain. This is now a list of integers.
          sample (`torch.FloatTensor`):
              current instance of sample being created by diffusion process.
          eta (`float`): weight of noise for added noise in diffusion step.
          use_clipped_model_output (`bool`): if `True`, compute "corrected" `model_output` from the clipped
              predicted original sample. Necessary because predicted original sample is clipped to [-1, 1] when
              `self.config.clip_sample` is `True`. If no clipping has happened, "corrected" `model_output` would
              coincide with the one provided as input and `use_clipped_model_output` will have not effect.
  
      Returns:
          `torch.FloatTensor`: sample tensor at previous timestep.
  
      """
      if self.num_inference_steps is None:
          raise ValueError(
              "Number of inference steps is 'None', you need to run 'set_timesteps' after creating the scheduler"
          )
  
      assert eta == 0.0
  
      # See formulas (12) and (16) of DDIM paper https://arxiv.org/pdf/2010.02502.pdf
      # Ideally, read DDIM paper in-detail understanding
  
      # Notation (<variable name> -> <name in paper>
      # - pred_noise_t -> e_theta(x_t, t)
      # - pred_original_sample -> f_theta(x_t, t) or x_0
      # - std_dev_t -> sigma_t
      # - eta -> η
      # - pred_sample_direction -> "direction pointing to x_t"
      # - pred_prev_sample -> "x_t-1"
  
      # 1. get previous step value (=t-1)
      t = timesteps
      prev_t = (
          t
          - self.config.num_train_timesteps // self.num_inference_steps
      )
  
      t = t.view(-1, *([1] * (model_output.ndim - 1)))
      prev_t = prev_t.view(-1, *([1] * (model_output.ndim - 1)))
  
      # 1. compute alphas, betas
      self.alphas_cumprod = self.alphas_cumprod.to(model_output.device)
      self.final_alpha_cumprod = self.final_alpha_cumprod.to(
          model_output.device
      )
      alpha_prod_t = self.alphas_cumprod[t]
      alpha_prod_t_prev = self.alphas_cumprod[torch.clip(prev_t, min=0)]
      alpha_prod_t_prev[prev_t < 0] = torch.tensor(1.0)
  
      beta_prod_t = 1 - alpha_prod_t
  
      # 3. compute predicted original sample from predicted noise also called
      # "predicted x_0" of formula (12) from https://arxiv.org/pdf/2010.02502.pdf
      if self.config.prediction_type == "epsilon":
          pred_original_sample = (
              sample - beta_prod_t ** (0.5) * model_output
          ) / alpha_prod_t ** (0.5)
          pred_epsilon = model_output
      elif self.config.prediction_type == "sample":
          pred_original_sample = model_output
          pred_epsilon = (
              sample - alpha_prod_t ** (0.5) * pred_original_sample
          ) / beta_prod_t ** (0.5)
      elif self.config.prediction_type == "v_prediction":
          pred_original_sample = (alpha_prod_t**0.5) * sample - (
              beta_prod_t**0.5
          ) * model_output
          pred_epsilon = (alpha_prod_t**0.5) * model_output + (
              beta_prod_t**0.5
          ) * sample
      else:
          raise ValueError(
              f"prediction_type given as {self.config.prediction_type} must be one of `epsilon`, `sample`, or"
              " `v_prediction`"
          )
  
      # 4. 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,
          )
  
      # 5. compute variance: "sigma_t(η)" -> see formula (16)
      # σ_t = sqrt((1 − α_t−1)/(1 − α_t)) * sqrt(1 − α_t/α_t−1)
      variance = (
          self._batch_get_variance(t, prev_t)
          .to(model_output.device)
          .view(*alpha_prod_t_prev.shape)
      )
      std_dev_t = eta * variance ** (0.5)
  
      if use_clipped_model_output:
          # the pred_epsilon is always re-derived from the clipped x_0 in Glide
          pred_epsilon = (
              sample - alpha_prod_t ** (0.5) * pred_original_sample
          ) / beta_prod_t ** (0.5)
  
      # 6. compute "direction pointing to x_t" of formula (12) from https://arxiv.org/pdf/2010.02502.pdf
      pred_sample_direction = (
          1 - alpha_prod_t_prev - std_dev_t**2
      ) ** (0.5) * pred_epsilon
  
      # 7. compute x_t without "random noise" of formula (12) from https://arxiv.org/pdf/2010.02502.pdf
      prev_sample = (
          alpha_prod_t_prev ** (0.5) * pred_original_sample
          + pred_sample_direction
      )
  
      return prev_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 8 for calling the DDIMParallelScheduler obj's underlying member method code with example usage: obj.batch_step_no_noise(model_output, timesteps, sample, eta, use_clipped_model_output) and returns: prev_sample