
    
3j:u              	           S SK r S SKJr  S SKJr  S SKrS SKrSSKJ	r	J
r
  SSKJrJr  SSKJrJr  \" 5       (       a  S SKr\ " S	 S
\5      5       r  SS\S\S\S   S\R,                  4S jjr " S S\\	5      rg)    N)	dataclass)Literal   )ConfigMixinregister_to_config)
BaseOutputis_scipy_available   )KarrasDiffusionSchedulersSchedulerMixinc                   `    \ rS rSr% Sr\R                  \S'   Sr\R                  S-  \S'   Sr	g)KDPM2DiscreteSchedulerOutput   aM  
Output class for the scheduler's `step` function output.

Args:
    prev_sample (`torch.Tensor` of shape `(batch_size, num_channels, height, width)` for images):
        Computed sample `(x_{t-1})` of previous timestep. `prev_sample` should be used as next model input in the
        denoising loop.
    pred_original_sample (`torch.Tensor` of shape `(batch_size, num_channels, height, width)` for images):
        The predicted denoised sample `(x_{0})` based on the model output from the current timestep.
        `pred_original_sample` can be used to preview progress or for guidance.
prev_sampleNpred_original_sample )
__name__
__module____qualname____firstlineno____doc__torchTensor__annotations__r   __static_attributes__r       j/home/wildlama/miniconda3/lib/python3.13/site-packages/diffusers/schedulers/scheduling_k_dpm_2_discrete.pyr   r      s'    
 04%,,-4r   r   num_diffusion_timestepsmax_betaalpha_transform_type)cosineexplaplacereturnc           
      :   US:X  a  S nO"US:X  a  S nOUS:X  a  S nO[        SU 35      e/ n[        U 5       H<  nXP-  nUS-   U -  nUR                  [        SU" U5      U" U5      -  -
  U5      5        M>     [        R
                  " U[        R                  S	9$ )
a  
Create a beta schedule that discretizes the given alpha_t_bar function, which defines the cumulative product of
(1-beta) over time from t = [0,1].

Contains a function alpha_bar that takes an argument t and transforms it to the cumulative product of (1-beta) up
to that part of the diffusion process.

Args:
    num_diffusion_timesteps (`int`):
        The number of betas to produce.
    max_beta (`float`, defaults to `0.999`):
        The maximum beta to use; use values lower than 1 to avoid numerical instability.
    alpha_transform_type (`str`, defaults to `"cosine"`):
        The type of noise schedule for `alpha_bar`. Choose from `cosine`, `exp`, or `laplace`.

Returns:
    `torch.Tensor`:
        The betas used by the scheduler to step the model outputs.
r!   c                 h    [         R                  " U S-   S-  [         R                  -  S-  5      S-  $ )NgMb?gT㥛 ?r   )mathcospits    r   alpha_bar_fn)betas_for_alpha_bar.<locals>.alpha_bar_fnM   s-    88QY%/$''9A=>!CCr   r#   c           	         S[         R                  " SSU -
  5      -  [         R                  " SS[         R                  " SU -
  5      -  -
  S-   5      -  n[         R                  " U5      n[         R
                  " USU-   -  5      $ )Ng      r
         ?r   gư>)r'   copysignlogfabsr"   sqrt)r+   lmbsnrs      r   r,   r-   R   sm    q#'22TXXa!diiPSVWPWFXBX>X[_>_5``C((3-C99SAG_--r   r"   c                 4    [         R                  " U S-  5      $ )Ng      ()r'   r"   r*   s    r   r,   r-   Y   s    88AI&&r   z"Unsupported alpha_transform_type: r
   dtype)
ValueErrorrangeappendminr   tensorfloat32)r   r   r    r,   betasit1t2s           r   betas_for_alpha_barrC   3   s    0 x'	D 
	*	.
 
	&	' =>R=STUUE*+(!e..S\"-R0@@@(KL , <<U]]33r   c                      \ rS rSrSr\ V Vs/ s H  oR                  PM     snn rSr\	           S1S\
S\S\S\S	\R                  \\   -  S-  S
\S\S\S\S\S\
4S jj5       r\S 5       r\S 5       r\S 5       rS2S\
4S jjrS\R0                  S\\R0                  -  S\R0                  4S jr  S3S\
S\\R4                  -  S\
4S jjr\S 5       r S4S\\R0                  -  S\R0                  S-  S\
4S jjrS\\R0                  -  SS4S  jrS! rS"\R0                  S\R0                  4S# jr S"\R0                  S\
S\R0                  4S$ jr! S5S"\R0                  S\
S%\S&\S\R0                  4
S' jjr" S6S(\R0                  \R                  -  S\\R0                  -  S\R0                  \R                  -  S)\S\#\$-  4
S* jjr%S+\R0                  S,\R0                  S-\R0                  S\R0                  4S. jr&S/ r'S0r(gs  snn f )7KDPM2DiscreteSchedulerg   u	  
KDPM2DiscreteScheduler is inspired by the DPMSolver2 and Algorithm 2 from the [Elucidating the Design Space of
Diffusion-Based Generative Models](https://huggingface.co/papers/2206.00364) paper.

This model inherits from [`SchedulerMixin`] and [`ConfigMixin`]. Check the superclass documentation for the generic
methods the library implements for all schedulers such as loading and saving.

Args:
    num_train_timesteps (`int`, defaults to 1000):
        The number of diffusion steps to train the model.
    beta_start (`float`, defaults to 0.00085):
        The starting `beta` value of inference.
    beta_end (`float`, defaults to 0.012):
        The final `beta` value.
    beta_schedule (`str`, defaults to `"linear"`):
        The beta schedule, a mapping from a beta range to a sequence of betas for stepping the model. Choose from
        `linear` or `scaled_linear`.
    trained_betas (`np.ndarray`, *optional*):
        Pass an array of betas directly to the constructor to bypass `beta_start` and `beta_end`.
    use_karras_sigmas (`bool`, *optional*, defaults to `False`):
        Whether to use Karras sigmas for step sizes in the noise schedule during the sampling process. If `True`,
        the sigmas are determined according to a sequence of noise levels {σi}.
    use_exponential_sigmas (`bool`, *optional*, defaults to `False`):
        Whether to use exponential sigmas for step sizes in the noise schedule during the sampling process.
    use_beta_sigmas (`bool`, *optional*, defaults to `False`):
        Whether to use beta sigmas for step sizes in the noise schedule during the sampling process. Refer to [Beta
        Sampling is All You Need](https://huggingface.co/papers/2407.12173) for more information.
    prediction_type (`str`, defaults to `epsilon`, *optional*):
        Prediction type of the scheduler function; can be `epsilon` (predicts the noise of the diffusion process),
        `sample` (directly predicts the noisy sample`) or `v_prediction` (see section 2.4 of [Imagen
        Video](https://huggingface.co/papers/2210.02303) paper).
    timestep_spacing (`str`, defaults to `"linspace"`):
        The way the timesteps should be scaled. Refer to Table 2 of the [Common Diffusion Noise Schedules and
        Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) for more information.
    steps_offset (`int`, defaults to 0):
        An offset added to the inference steps, as required by some model families.
r   Nnum_train_timesteps
beta_startbeta_endbeta_scheduletrained_betasuse_karras_sigmasuse_exponential_sigmasuse_beta_sigmasprediction_typetimestep_spacingsteps_offsetc                    U R                   R                  (       a  [        5       (       d  [        S5      e[	        U R                   R                  U R                   R
                  U R                   R                  /5      S:  a  [        S5      eUb)  [        R                  " U[        R                  S9U l        OUS:X  a*  [        R                  " X#U[        R                  S9U l        OkUS:X  a4  [        R                  " US-  US-  U[        R                  S9S-  U l        O1US	:X  a  [        U5      U l        O[        U S
U R                   35      eSU R                  -
  U l        [        R"                  " U R                   SS9U l        U R'                  US U5        S U l        S U l        U R,                  R/                  S5      U l        g )Nz:Make sure to install scipy if you want to use beta sigmas.r
   znOnly one of `config.use_beta_sigmas`, `config.use_exponential_sigmas`, `config.use_karras_sigmas` can be used.r7   linearscaled_linearr/   r   squaredcos_cap_v2z is not implemented for g      ?r   dimcpu)configrN   r	   ImportErrorsumrM   rL   r9   r   r=   r>   r?   linspacerC   NotImplementedError	__class__alphascumprodalphas_cumprodset_timesteps_step_index_begin_indexsigmasto)selfrG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   s               r   __init__KDPM2DiscreteScheduler.__init__   s{    ;;&&/A/C/CZ[[++T[[-O-OQUQ\Q\QnQnopstt A  $m5==IDJh&
>QY^YfYfgDJo-
C3H[chcpcpquvvDJ11,-@ADJ%7OPTP^P^O_&`aaDJJ&#mmDKKQ? 	.6IJ kknnU+r   c                     U R                   R                  S;   a  U R                  R                  5       $ U R                  R                  5       S-  S-   S-  $ )N)r\   trailingr   r
   r/   )rY   rP   re   maxrg   s    r   init_noise_sigma'KDPM2DiscreteScheduler.init_noise_sigma   sH     ;;''+CC;;??$$!Q&*s22r   c                     U R                   $ )zW
The index counter for current timestep. It will increase 1 after each scheduler step.
)rc   rm   s    r   
step_index!KDPM2DiscreteScheduler.step_index   s    
 r   c                     U R                   $ )za
The index for the first timestep. It should be set from pipeline with `set_begin_index` method.
rd   rm   s    r   begin_index"KDPM2DiscreteScheduler.begin_index   s    
    r   ru   c                     Xl         g)z
Sets the begin index for the scheduler. This function should be run from pipeline before the inference.

Args:
    begin_index (`int`, defaults to `0`):
        The begin index for the scheduler.
Nrt   )rg   ru   s     r   set_begin_index&KDPM2DiscreteScheduler.set_begin_index   s
     (r   sampletimestepr$   c                     U R                   c  U R                  U5        U R                  (       a  U R                  U R                      nOU R                  U R                      nXS-  S-   S-  -  nU$ )aN  
Ensures interchangeability with schedulers that need to scale the denoising model input depending on the
current timestep.

Args:
    sample (`torch.Tensor`):
        The input sample.
    timestep (`int`, *optional*):
        The current timestep in the diffusion chain.

Returns:
    `torch.Tensor`:
        A scaled input sample.
r   r
   r/   )rq   _init_step_indexstate_in_first_orderre   sigmas_interpol)rg   rz   r{   sigmas       r   scale_model_input(KDPM2DiscreteScheduler.scale_model_input   se    & ??"!!(+$$KK0E((9E1HqLS01r   num_inference_stepsdevicec           	         Xl         U=(       d    U R                  R                  nU R                  R                  S:X  a>  [        R
                  " SUS-
  U[        R                  S9SSS2   R                  5       nGO<U R                  R                  S:X  a  X0R                   -  n[        R                  " SU5      U-  R                  5       SSS2   R                  5       R                  [        R                  5      nX@R                  R                  -  nOU R                  R                  S:X  af  X0R                   -  n[        R                  " USU* 5      R                  5       R                  5       R                  [        R                  5      nUS-  nO"[        U R                  R                   S	35      e[        R                  " SU R                  -
  U R                  -  S
-  5      n[        R                  " U5      n[        R                   " U[        R                  " S[#        U5      5      U5      nU R                  R$                  (       aS  U R'                  XaS9n[        R                  " U Vs/ s H  oR)                  X5      PM     sn5      R                  5       nOU R                  R*                  (       aE  U R-                  XaS9n[        R                  " U Vs/ s H  oR)                  X5      PM     sn5      nO_U R                  R.                  (       aD  U R1                  XaS9n[        R                  " U Vs/ s H  oR)                  X5      PM     sn5      n[2        R4                  " U5      R7                  US9U l        [        R:                  " US//5      R                  [        R                  5      n[2        R4                  " U5      R7                  US9nUR                  5       R=                  UR?                  S5      R                  5       S
5      RA                  5       n	[2        RB                  " USS USS RE                  S5      USS /5      U l#        [2        RB                  " U	SS U	SS RE                  S5      U	SS /5      U l$        [2        R4                  " U5      R7                  U5      nU	RK                  5       n	U R8                  RK                  5       n[        R                  " U	 V
s/ s H  oR)                  X5      PM     sn
5      n[2        R4                  " U5      R7                  X$RL                  S9n[2        RN                  " USS2S4   USS2S4   4SS9RQ                  5       n[2        RB                  " USS U/5      U l)        SU l*        SU l+        SU l,        U RF                  R7                  S5      U l#        gs  snf s  snf s  snf s  sn
f )au  
Sets the discrete timesteps used for the diffusion chain (to be run before inference).

Args:
    num_inference_steps (`int`):
        The number of diffusion steps used when generating samples with a pre-trained model.
    device (`str` or `torch.device`, *optional*):
        The device to which the timesteps should be moved to. If `None`, the timesteps are not moved.
r\   r   r
   r7   Nleadingrk   zY is not supported. Please make sure to choose one of 'linspace', 'leading' or 'trailing'.r/   )	in_sigmasr   )r   g        r   rV   rX   )-r   rY   rG   rP   npr\   r>   copyarangeroundastyperQ   r9   arrayra   r1   interplenrL   _convert_to_karras_sigma_to_trM   _convert_to_exponentialrN   _convert_to_betar   
from_numpyrf   
log_sigmasconcatenatelerprollr"   catrepeat_interleavere   r   rX   r8   stackflatten	timestepsrz   rc   rd   )rg   r   r   rG   r   
step_ratiore   r   r   r   sigma_interpoltimesteps_interpolinterleaved_timestepss                r   rb   $KDPM2DiscreteScheduler.set_timesteps   s    $7 1TT[[5T5T ;;'':5A':Q'>@S[][e[efgkikgklqqsI[[))Y6,0H0HHJ 1&9:ZGNNPQUSUQUV[[]ddegeoeopI111I[[))Z7,/G/GGJ #6J;GNNPUUW^^_a_i_ijINI;;//0  1J  K  A 3 33t7J7JJsRSVVF^
9bii3v;&?H;;((,,v,gFSY!ZSY%"2"25"ESY!Z[aacI[[//11F1lFSY!ZSY%"2"25"ESY!Z[I[[((**V*eFSY!ZSY%"2"25"ESY!Z[I**:6999H#077

C!!&),,F,; !**,++FKKN,>,>,@#FJJLiiVABZ-I-I!-LfUWUXk Z[$yyRa /!""5"G"G"JO\^\_L`a 
 $$Y/226:	 *--/__((*
XXP_`P_nn9P_`
 #--.@ADDVSbSbDc %-?"d
-KYWXWY[_W_M`,agi j r r tIbqM3H#IJ kknnU+K "[ "[ "[( as   7W%WW"W'c                     U R                   S L $ N)rz   rm   s    r   r~   +KDPM2DiscreteScheduler.state_in_first_orderP  s    {{d""r   schedule_timestepsc                     Uc  U R                   nX!:H  R                  5       n[        U5      S:  a  SOSnX4   R                  5       $ )a  
Find the index of a given timestep in the timestep schedule.

Args:
    timestep (`float` or `torch.Tensor`):
        The timestep value to find in the schedule.
    schedule_timesteps (`torch.Tensor`, *optional*):
        The timestep schedule to search in. If `None`, uses `self.timesteps`.

Returns:
    `int`:
        The index of the timestep in the schedule. For the very first step, returns the second index if
        multiple matches exist to avoid skipping a sigma when starting mid-schedule (e.g., for image-to-image).
r
   r   )r   nonzeror   item)rg   r{   r   indicesposs        r   index_for_timestep)KDPM2DiscreteScheduler.index_for_timestepU  sJ    " %!%%1::< w<!#a|  ""r   c                     U R                   c[  [        U[        R                  5      (       a%  UR	                  U R
                  R                  5      nU R                  U5      U l        gU R                  U l        g)z
Initialize the step index for the scheduler based on the given timestep.

Args:
    timestep (`float` or `torch.Tensor`):
        The current timestep to initialize the step index from.
N)
ru   
isinstancer   r   rf   r   r   r   rc   rd   )rg   r{   s     r   r}   'KDPM2DiscreteScheduler._init_step_indext  sZ     #(ELL11#;;t~~'<'<=#66x@D#00Dr   c                    [         R                  " [         R                  " US5      5      nX2SS2[         R                  4   -
  n[         R                  " US:  SS9R                  SS9R                  UR                  S   S-
  S9nUS-   nX%   nX&   nXs-
  Xx-
  -  n	[         R                  " U	SS5      n	SU	-
  U-  X-  -   n
U
R                  UR                  5      n
U
$ )at  
Convert sigma values to corresponding timestep values through interpolation.

Args:
    sigma (`np.ndarray`):
        The sigma value(s) to convert to timestep(s).
    log_sigmas (`np.ndarray`):
        The logarithm of the sigma schedule used for interpolation.

Returns:
    `np.ndarray`:
        The interpolated timestep value(s) corresponding to the input sigma(s).
g|=Nr   )axisr   )rl   r
   )	r   r1   maximumnewaxiscumsumargmaxclipshapereshape)rg   r   r   	log_sigmadistslow_idxhigh_idxlowhighwr+   s              r   r   "KDPM2DiscreteScheduler._sigma_to_t  s     FF2::eU34	 q"**}55 ))UaZq188a8@EE*JZJZ[\J]`aJaEbQ;!# _,GGAq! Ug,IIekk"r   r   c                    [        U R                  S5      (       a  U R                  R                  nOSn[        U R                  S5      (       a  U R                  R                  nOSnUb  UOUS   R	                  5       nUb  UOUS   R	                  5       nSn[
        R                  " SSU5      nUSU-  -  nUSU-  -  nXXx-
  -  -   U-  n	U	$ )a  
Construct the noise schedule as proposed in [Elucidating the Design Space of Diffusion-Based Generative
Models](https://huggingface.co/papers/2206.00364).

Args:
    in_sigmas (`torch.Tensor`):
        The input sigma values to be converted.
    num_inference_steps (`int`):
        The number of inference steps to generate the noise schedule for.

Returns:
    `torch.Tensor`:
        The converted sigma values following the Karras noise schedule.
	sigma_minN	sigma_maxr   r   g      @r
   )hasattrrY   r   r   r   r   r\   )
rg   r   r   r   r   rhorampmin_inv_rhomax_inv_rhore   s
             r   r   )KDPM2DiscreteScheduler._convert_to_karras  s    $ 4;;,,--II4;;,,--II!*!6IIbM<N<N<P	!*!6IIaL<M<M<O	{{1a!45AG,AG,(A BBsJr   c                    [        U R                  S5      (       a  U R                  R                  nOSn[        U R                  S5      (       a  U R                  R                  nOSnUb  UOUS   R	                  5       nUb  UOUS   R	                  5       n[
        R                  " [
        R                  " [        R                  " U5      [        R                  " U5      U5      5      nU$ )aP  
Construct an exponential noise schedule.

Args:
    in_sigmas (`torch.Tensor`):
        The input sigma values to be converted.
    num_inference_steps (`int`):
        The number of inference steps to generate the noise schedule for.

Returns:
    `torch.Tensor`:
        The converted sigma values following an exponential schedule.
r   Nr   r   r   )
r   rY   r   r   r   r   r"   r\   r'   r1   )rg   r   r   r   r   re   s         r   r   .KDPM2DiscreteScheduler._convert_to_exponential  s    " 4;;,,--II4;;,,--II!*!6IIbM<N<N<P	!*!6IIaL<M<M<O	DHHY$7)9LNabcr   alphabetac           
      J   [        U R                  S5      (       a  U R                  R                  nOSn[        U R                  S5      (       a  U R                  R                  nOSnUb  UOUS   R	                  5       nUb  UOUS   R	                  5       n[
        R                  " S[
        R                  " SSU5      -
   Vs/ s H-  n[        R                  R                  R                  XsU5      PM/     sn Vs/ s H  nXXXe-
  -  -   PM     sn5      n	U	$ s  snf s  snf )az  
Construct a beta noise schedule as proposed in [Beta Sampling is All You
Need](https://huggingface.co/papers/2407.12173).

Args:
    in_sigmas (`torch.Tensor`):
        The input sigma values to be converted.
    num_inference_steps (`int`):
        The number of inference steps to generate the noise schedule for.
    alpha (`float`, *optional*, defaults to `0.6`):
        The alpha parameter for the beta distribution.
    beta (`float`, *optional*, defaults to `0.6`):
        The beta parameter for the beta distribution.

Returns:
    `torch.Tensor`:
        The converted sigma values following a beta distribution schedule.
r   Nr   r   r   r
   )r   rY   r   r   r   r   r   r\   scipystatsr   ppf)
rg   r   r   r   r   r   r   r{   r   re   s
             r   r   'KDPM2DiscreteScheduler._convert_to_beta  s   0 4;;,,--II4;;,,--II!*!6IIbM<N<N<P	!*!6IIaL<M<M<O	
 %&Aq:M(N$N$N KK$$(($?$NC I$9:;
 s   4D?D model_outputreturn_dictc                 *   U R                   c  U R                  U5        U R                  (       aR  U R                  U R                      nU R                  U R                   S-      nU R                  U R                   S-      nONU R                  U R                   S-
     nU R                  U R                      nU R                  U R                      nSnXXS-   -  n	U R
                  R                  S:X  a  U R                  (       a  U	OUn
X:U-  -
  nOU R
                  R                  S:X  a2  U R                  (       a  U	OUn
X* U
S-  S-   S-  -  -  X:S-  S-   -  -   nOHU R
                  R                  S:X  a  [        S	5      e[        S
U R
                  R                   S35      eU R                  (       a  X;-
  U	-  nXi-
  nX0l	        OX;-
  U-  nXy-
  nU R                  nSU l	        U =R                  S-  sl
        X<U-  -   nU(       d  UU4$ [        XS9$ )a  
Predict the sample from the previous timestep by reversing the SDE. This function propagates the diffusion
process from the learned model outputs (most often the predicted noise).

Args:
    model_output (`torch.Tensor`):
        The direct output from learned diffusion model.
    timestep (`float`):
        The current discrete timestep in the diffusion chain.
    sample (`torch.Tensor`):
        A current instance of a sample created by the diffusion process.
    return_dict (`bool`):
        Whether or not to return a [`~schedulers.scheduling_k_dpm_2_discrete.KDPM2DiscreteSchedulerOutput`] or
        tuple.

Returns:
    [`~schedulers.scheduling_k_dpm_2_discrete.KDPM2DiscreteSchedulerOutput`] or `tuple`:
        If return_dict is `True`, [`~schedulers.scheduling_k_dpm_2_discrete.KDPM2DiscreteSchedulerOutput`] is
        returned, otherwise a tuple is returned where the first element is the sample tensor.
Nr
   r   epsilonv_predictionr   r/   rz   z+prediction_type not implemented yet: samplezprediction_type given as z, must be one of `epsilon`, or `v_prediction`)r   r   )rq   r}   r~   re   r   rY   rO   r]   r9   rz   rc   r   )rg   r   r{   rz   r   r   r   
sigma_nextgamma	sigma_hatsigma_inputr   
derivativedtr   s                  r   stepKDPM2DiscreteScheduler.step"  s   6 ??"!!(+$$KK0E!11$//A2EFNT__q%89J KK! 34E!11$//BNT__5J
 QY'	 ;;&&)3'+'@'@)nK#),,F#F [[((N:'+'@'@)nK#/<;PQ>TUCUZ]B]3]#^q.1,-$  [[((H4%&STT+DKK,G,G+HHtu  $$ 79DJ+B !K !7>IJ 'B[[FDK 	AB.$ 
 ,oor   original_samplesnoiser   c                     U R                   R                  UR                  UR                  S9nUR                  R                  S:X  av  [
        R                  " U5      (       a[  U R                  R                  UR                  [
        R                  S9nUR                  UR                  [
        R                  S9nO@U R                  R                  UR                  5      nUR                  UR                  5      nU R                  c!  U Vs/ s H  o`R                  Xe5      PM     nnOHU R                  b  U R                  /UR                  S   -  nOU R                  /UR                  S   -  nXG   R                  5       n[        UR                  5      [        UR                  5      :  a?  UR                  S5      n[        UR                  5      [        UR                  5      :  a  M?  XU-  -   n	U	$ s  snf )a  
Add noise to the original samples according to the noise schedule at the specified timesteps.

Args:
    original_samples (`torch.Tensor`):
        The original samples to which noise will be added.
    noise (`torch.Tensor`):
        The noise tensor to add to the original samples.
    timesteps (`torch.Tensor`):
        The timesteps at which to add noise, determining the noise level from the schedule.

Returns:
    `torch.Tensor`:
        The noisy samples with added noise scaled according to the timestep schedule.
)r   r8   mpsr7   r   r   )re   rf   r   r8   typer   is_floating_pointr   r>   ru   r   rq   r   r   r   	unsqueeze)
rg   r   r   r   re   r   r+   step_indicesr   noisy_sampless
             r   	add_noise KDPM2DiscreteScheduler.add_noise  s   , '7'>'>FVF\F\]""''50U5L5LY5W5W!%!2!23C3J3JRWR_R_!2!`!%5%<%<EMMRI!%!2!23C3J3J!K!%5%<%<=I #T]^T]q33AJT]L^L__( OO,yq/AAL !,,-	0BBL$,,.%++%5%;%;!<<OOB'E %++%5%;%;!<< )5=8 _s   G;c                 .    U R                   R                  $ r   )rY   rG   rm   s    r   __len__KDPM2DiscreteScheduler.__len__  s    {{...r   )rd   rc   r_   ra   r?   r   r   rz   re   r   r   )i  g_QK?g~jt?rS   NFFFr   r\   r   )r   )NNr   )333333?r   )T))r   r   r   r   r   r   name_compatiblesorderr   intfloatstrr   ndarraylistboolrh   propertyrn   rq   ru   rx   r   r   r   r   rb   r~   r   r}   r   r   r   r   r   tupler   r   r   r   ).0es   00r   rE   rE   g   s3   $L %>>$=qFF$=>LE $(#%9="'', %( *), ), ), 	),
 ), zzDK/$6),  ), !%), ), ), ), ), ),V 3 3     ! !(3 ( %,,& 
	B &*#'	R, R, ell"R, !	R,h # #
 Y]#,#BG,,QUBU#	#>1)= 1$ 1 "J$ELL $RWR^R^ $N TW \a\h\h F dg..<?.HM.[`.	.j !\pllRZZ/\p %,,&\p rzz)	\p
 \p 
&	-\p~.,,. ||. <<	.
 
.`/G ?s   HrE   )g+?r!   )r'   dataclassesr   typingr   numpyr   r   configuration_utilsr   r   utilsr   r	   scheduling_utilsr   r   scipy.statsr   r   r   r   r   rC   rE   r   r   r   <module>r     s     !    A 2 G  5: 5 5( @H14 1414 ""<=14 \\	14hK	/^[ K	/r   