
    +hZ3                         S SK Jr  S SKJrJrJr  S SKrS SKJr	  SSK
JrJr  SSKJrJrJrJrJrJr  \R(                  R                   " S S	5      5       r\ " S
 S\5      5       r " S S\\5      rg)    )	dataclass)OptionalTupleUnionN   )ConfigMixinregister_to_config   )CommonSchedulerStateFlaxKarrasDiffusionSchedulersFlaxSchedulerMixinFlaxSchedulerOutputadd_noise_commonget_velocity_commonc            	           \ rS rSr% \\S'   \R                  \S'   \R                  \S'   \R                  \S'   Sr\	\
   \S'   \S\S\R                  S\R                  S\R                  4S j5       rS	rg)
DDIMSchedulerState#   commonfinal_alpha_cumprodinit_noise_sigma	timestepsNnum_inference_stepsc                     U " UUUUS9$ )Nr   r   r   r    )clsr   r   r   r   s        c/home/james-whalen/.local/lib/python3.13/site-packages/diffusers/schedulers/scheduling_ddim_flax.pycreateDDIMSchedulerState.create-   s      3-	
 	
    r   )__name__
__module____qualname____firstlineno__r   __annotations__jnpndarrayr   r   intclassmethodr   __static_attributes__r   r    r   r   r   #   s{      $ kk!{{)-#-
$
 ![[
 ++	

 ;;
 
r    r   c                        \ rS rSr% \\S'   Srg)FlaxDDIMSchedulerOutput=   stater   N)r!   r"   r#   r$   r   r%   r*   r   r    r   r,   r,   =   s    r    r,   c                      \ rS rSr% Sr\ V Vs/ s H  oR                  PM     snn r\R                  \
S'   \S 5       r\SSSSS	S
SS
SS\R                  4S\S\S\S\S\\R&                     S\S\S\S\S\S\R                  4S jj5       rS/S\\   S\4S jjr S/S\S\R&                  S\\   S\R&                  4S jjr S0S\S \S!\S\4S" jjrS\4S# jr  S1S\S$\R&                  S\S\R&                  S%\S&\S\\\4   4S' jjrS\S(\R&                  S)\R&                  S*\R&                  S\R&                  4
S+ jr S\S\R&                  S)\R&                  S*\R&                  S\R&                  4
S, jr!S- r"S.r#g	s  snn f )2FlaxDDIMSchedulerB   a  
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://huggingface.co/papers/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 (`jnp.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 between for numerical stability. The clip range is determined by
        `clip_sample_range`.
    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, as required by some model families.
    prediction_type (`str`, default `epsilon`):
        indicates whether the model predicts the noise (epsilon), or the samples. One of `epsilon`, `sample`.
        `v-prediction` is not supported for this scheduler.
    dtype (`jnp.dtype`, *optional*, defaults to `jnp.float32`):
        the `dtype` used for params and computation.
dtypec                     g)NTr   selfs    r   	has_stateFlaxDDIMScheduler.has_statem   s    r    i  g-C6?g{Gz?linearNT      ?r   epsilonnum_train_timesteps
beta_startbeta_endbeta_scheduletrained_betasclip_sampleclip_sample_rangeset_alpha_to_onesteps_offsetprediction_typec                     Xl         g Nr2   )r5   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   r2   s               r   __init__FlaxDDIMScheduler.__init__q   s	     
r    r   returnc                    Uc  [         R                  " U 5      nU R                  R                  (       a  [        R
                  " SU R                  S9OUR                  S   n[        R
                  " SU R                  S9n[        R                  " SU R                  R                  5      R                  5       S S S2   n[        R                  UUUUS9$ )Nr9   rG   r   r   )r   r   configrB   r&   arrayr2   alphas_cumprodaranger;   roundr   )r5   r   r   r   r   s        r   create_stateFlaxDDIMScheduler.create_state   s    >)006F 150L0LCIIc,RXRgRghiRj 	
 99S

;JJq$++"A"ABHHJ4R4P	!(( 3-	 ) 
 	
r    r.   sampletimestepc                     U$ )z
Args:
    state (`PNDMSchedulerState`): the `FlaxPNDMScheduler` state data class instance.
    sample (`jnp.ndarray`): input sample
    timestep (`int`, optional): current timestep

Returns:
    `jnp.ndarray`: scaled input sample
r   )r5   r.   rT   rU   s       r   scale_model_input#FlaxDDIMScheduler.scale_model_input   s	     r    r   shapec                     U R                   R                  U-  n[        R                  " SU5      U-  R	                  5       SSS2   U R                   R
                  -   nUR                  UUS9$ )aM  
Sets the discrete timesteps used for the diffusion chain. Supporting function to be run before inference.

Args:
    state (`DDIMSchedulerState`):
        the `FlaxDDIMScheduler` state data class instance.
    num_inference_steps (`int`):
        the number of diffusion steps used when generating samples with a pre-trained model.
r   NrL   )r   r   )rM   r;   r&   rP   rQ   rC   replace)r5   r.   r   rY   
step_ratior   s         r   set_timestepsFlaxDDIMScheduler.set_timesteps   sr     [[448KK
 ZZ#67*DKKMdPRdSVZVaVaVnVnn	}} 3  
 	
r    c                     UR                   R                  U   n[        R                  " US:  UR                   R                  U   UR                  5      nSU-
  nSU-
  nXv-  SXE-  -
  -  nU$ )Nr   r
   )r   rO   r&   wherer   )	r5   r.   rU   prev_timestepalpha_prod_talpha_prod_t_prevbeta_prod_tbeta_prod_t_prevvariances	            r   _get_varianceFlaxDDIMScheduler._get_variance   sx    ||228<IIQ ; ;M JELeLe
 ,&00$2q<;[7[\r    model_outputetareturn_dictc                    UR                   c  [        S5      eX0R                  R                  UR                   -  -
  nUR                  R
                  nUR                  n	X   n
[        R                  " US:  X   U	5      nSU
-
  nU R                  R                  S:X  a  XLS-  U-  -
  U
S-  -  nUnOU R                  R                  S:X  a  UnXJS-  U-  -
  US-  -  nO`U R                  R                  S:X  a#  U
S-  U-  US-  U-  -
  nU
S-  U-  US-  U-  -   nO#[        SU R                  R                   S	35      eU R                  R                  (       a;  UR                  U R                  R                  * U R                  R                  5      nU R                  XU5      nX_S-  -  nSU-
  US
-  -
  S-  U-  nUS-  U-  U-   nU(       d  UU4$ [        UUS9$ )a/  
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:
    state (`DDIMSchedulerState`): the `FlaxDDIMScheduler` state data class instance.
    model_output (`jnp.ndarray`): direct output from learned diffusion model.
    timestep (`int`): current discrete timestep in the diffusion chain.
    sample (`jnp.ndarray`):
        current instance of sample being created by diffusion process.
    return_dict (`bool`): option for returning tuple rather than FlaxDDIMSchedulerOutput class

Returns:
    [`FlaxDDIMSchedulerOutput`] or `tuple`: [`FlaxDDIMSchedulerOutput`] if `return_dict` is True, otherwise a
    `tuple`. When returning a tuple, the first element is the sample tensor.

zaNumber of inference steps is 'None', you need to run 'set_timesteps' after creating the schedulerr   r
   r:   g      ?rT   v_predictionzprediction_type given as z6 must be one of `epsilon`, `sample`, or `v_prediction`r   )prev_sampler.   )r   
ValueErrorrM   r;   r   rO   r   r&   r`   rD   r@   cliprA   rg   r,   )r5   r.   ri   rU   rT   rj   rk   ra   rO   r   rb   rc   rd   pred_original_samplepred_epsilonrf   	std_dev_tpred_sample_directionrn   s                      r   stepFlaxDDIMScheduler.step   s'   4 $$,s   !;;#B#BeF_F_#__44#77 &/IImq&8.:WYlm,& ;;&&)3$*S-AL-P$PT`ehTi#i 'L[[((H4#/ "c%:=Q%QQU`ehUiiL[[((N:$0#$5#?;PSCSWcBc#c (#-=cAQU[@[[L+DKK,G,G+H I" "  ;;""#7#<#<...0M0M$  %%e}Es++	 "#%6!6A!E3 OR^ ^ (C03GGJ__''&;eLLr    original_samplesnoiser   c                 0    [        UR                  X#U5      $ rF   )r   r   )r5   r.   rw   rx   r   s        r   	add_noiseFlaxDDIMScheduler.add_noise'  s      .>yQQr    c                 0    [        UR                  X#U5      $ rF   )r   r   )r5   r.   rT   rx   r   s        r   get_velocityFlaxDDIMScheduler.get_velocity0  s     #5<<	JJr    c                 .    U R                   R                  $ rF   )rM   r;   r4   s    r   __len__FlaxDDIMScheduler.__len__9  s    {{...r    rG   rF   )r   )g        T)$r!   r"   r#   r$   __doc__r   name_compatiblesr&   r2   r%   propertyr6   r	   float32r(   floatstrr   r'   boolrH   r   r   rR   rW   r   r]   rg   r   r,   ru   rz   r}   r   r*   ).0es   00r   r0   r0   B   s   $L %BB$AqFF$ABL99   $("%/3 #&!%(;;   	
   ,  !    yy  
8,@#A 
M_ 
2 Y]'14HPQT	 SU
'
>A
JO
	
,
#5 
$  [M![M kk[M 	[M
 [M [M [M 
&-	.[MzR!R ++R {{	R
 ;;R 
RK!K K {{	K
 ;;K 
K/a Cs   E=r0   )dataclassesr   typingr   r   r   flax	jax.numpynumpyr&   configuration_utilsr   r	   scheduling_utils_flaxr   r   r   r   r   r   structr   r,   r0   r   r    r   <module>r      ss   $ " ) )   A  
 
 
2 1  x/*K x/r    