ó
    oM‡jí  ã                   ó@   • S SK r S SKrS SKJr  SSKJr   " S S5      rg)é    Né   )Úrandn_tensorc                   óš  • \ rS rSrSr      SS\S\S\S\S\S\4S	 jjr	S
 r
\S 5       rS\\S4   S\\R                  -  S\S\S\S\S\R                   4S jrS\R                   S\R                   S\R                   S\R                   4S jrS\R                   S\S\S\R&                  S\R                  S\R(                  4S jrSrg)ÚFreeInitMixiné   zMixin class for FreeInit.Ú	num_itersÚuse_fast_samplingÚmethodÚorderÚspatial_stop_frequencyÚtemporal_stop_frequencyc                 óL   • Xl         X l        X0l        X@l        XPl        X`l        g)aˆ  Enables the FreeInit mechanism as in https://huggingface.co/papers/2312.07537.

This implementation has been adapted from the [official repository](https://github.com/TianxingWu/FreeInit).

Args:
    num_iters (`int`, *optional*, defaults to `3`):
        Number of FreeInit noise re-initialization iterations.
    use_fast_sampling (`bool`, *optional*, defaults to `False`):
        Whether or not to speedup sampling procedure at the cost of probably lower quality results. Enables the
        "Coarse-to-Fine Sampling" strategy, as mentioned in the paper, if set to `True`.
    method (`str`, *optional*, defaults to `butterworth`):
        Must be one of `butterworth`, `ideal` or `gaussian` to use as the filtering method for the FreeInit low
        pass filter.
    order (`int`, *optional*, defaults to `4`):
        Order of the filter used in `butterworth` method. Larger values lead to `ideal` method behaviour
        whereas lower values lead to `gaussian` method behaviour.
    spatial_stop_frequency (`float`, *optional*, defaults to `0.25`):
        Normalized stop frequency for spatial dimensions. Must be between 0 to 1. Referred to as `d_s` in the
        original implementation.
    temporal_stop_frequency (`float`, *optional*, defaults to `0.25`):
        Normalized stop frequency for temporal dimensions. Must be between 0 to 1. Referred to as `d_t` in the
        original implementation.
N)Ú_free_init_num_itersÚ_free_init_use_fast_samplingÚ_free_init_methodÚ_free_init_orderÚ!_free_init_spatial_stop_frequencyÚ"_free_init_temporal_stop_frequency)Úselfr   r	   r
   r   r   r   s          Ú±C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\diffusers/pipelines/free_init_utils.pyÚenable_free_initÚFreeInitMixin.enable_free_init   s)   € ð@ %.Ô!Ø,=Ô)Ø!'ÔØ %ÔØ1GÔ.Ø2IÕ/ó    c                 ó   • SU l         g)z+Disables the FreeInit mechanism if enabled.N)r   ©r   s    r   Údisable_free_initÚFreeInitMixin.disable_free_initA   s
   € à$(ˆÕ!r   c                 óD   • [        U S5      =(       a    U R                  S L$ )Nr   )Úhasattrr   r   s    r   Úfree_init_enabledÚFreeInitMixin.free_init_enabledE   s!   € ä�tÐ3Ó4×^¸×9RÑ9RÐZ^Ð9^Ð^r   Úshape.ÚdeviceÚfilter_typeÚreturnc           	      óÞ  ^^• US   US   US   p˜n[         R                  " U5      n
TS:X  d  US:X  a  U
$ US:X  a  UU4S jnO%US:X  a  U4S jnOUS	:X  a  U4S
 jnO[        S5      e[        U5       Hg  n[        U5       HU  n[        U	5       HC  nTU-  SU-  U-  S-
  -  S-  SU-  U-  S-
  S-  -   SU-  U	-  S-
  S-  -   nU" U5      U
SXÍU4'   ME     MW     Mi     U
R	                  U5      $ )zLReturns the FreeInit filter based on filter type and other input conditions.éýÿÿÿéþÿÿÿéÿÿÿÿr   Úbutterworthc                 ó&   >• SSU TS-  -  T-  -   -  $ )Né   r   © )Úxr   r   s    €€r   Úretrieve_maskÚ?FreeInitMixin._get_free_init_freq_filter.<locals>.retrieve_mask\   s#   ø€ Ø˜A Ð%;¸QÑ%>Ñ!>À5Ñ HÑHÑIÐIr   Úgaussianc                 óH   >• [         R                  " SSTS-  -  -  U -  5      $ )Nr)   r   )ÚmathÚexp©r.   r   s    €r   r/   r0   `   s'   ø€ Ü—x’x  aÐ*@À!Ñ*CÑ&CÑ DÀqÑ HÓIÐIr   Úidealc                 ó   >• U TS-  ::  a  S$ S$ )Nr   r,   r   r-   r5   s    €r   r/   r0   d   s   ø€ ØÐ!7¸!Ñ!;Ó;�qÐBÀÐBr   z;`filter_type` must be one of gaussian, butterworth or idealr   r,   .)ÚtorchÚzerosÚNotImplementedErrorÚrangeÚto)r   r"   r#   r$   r   r   r   ÚtimeÚheightÚwidthÚmaskr/   ÚtÚhÚwÚd_squares       ``          r   Ú_get_free_init_freq_filterÚ(FreeInitMixin._get_free_init_freq_filterI   s%  ù€ ð $ B™i¨¨r©°E¸"±I�eˆÜ�{Š{˜5Ó!ˆà! QÓ&Ð*AÀQÓ*FØˆKà˜-Ó'÷Jà˜JÓ&öJà˜GÓ#öCô &Ð&cÓdÐdä�t–ˆAÜ˜6–]�Ü˜už�Aà0Ð3JÑJÈqÐSTÉuÐW[É|Ð^_ÑO_Ñ`ÐefÑfØ˜q™5 6™>¨AÑ-°!Ñ3ñ4à˜q™5 5™=¨1Ñ,°Ñ2ñ3ð ñ
 *7°xÓ)@�D˜˜a A˜Ó&ó &ó #ñ ð �w‰w�v‹Ðr   r.   ÚnoiseÚlow_pass_filterc                 ó8  • [         R                  " USS9n[         R                  " USS9n[         R                  " USS9n[         R                  " USS9nSU-
  nXC-  nXV-  nXx-   n	[         R                  " U	SS9n	[         R                  " U	SS9R
                  n
U
$ )zNoise reinitialization.)r'   r(   r)   )Údimr,   )ÚfftÚfftnÚfftshiftÚ	ifftshiftÚifftnÚreal)r   r.   rG   rH   Úx_freqÚ
noise_freqÚhigh_pass_filterÚ
x_freq_lowÚnoise_freq_highÚx_freq_mixedÚx_mixeds              r   Ú_apply_freq_filterÚ FreeInitMixin._apply_freq_filteru   s–   € ô —’˜! Ñ.ˆÜ—’˜f¨,Ñ7ˆÜ—X’X˜e¨Ñ6ˆ
Ü—\’\ *°,Ñ?ˆ
ð ˜Ñ.ÐØÑ-ˆ
Ø$Ñ7ˆØ!Ñ3ˆô —}’} \°|ÑDˆÜ—)’)˜L¨lÑ;×@Ñ@ˆàˆr   ÚlatentsÚfree_init_iterationÚnum_inference_stepsÚdtypeÚ	generatorc           	      ó€  • US:X  a%  UR                  5       R                  5       U l        GO&UR                  nS/USS  Q7nU R	                  UUU R
                  U R                  U R                  U R                  S9n	U R                  R                  R                  S-
  n
[        R                  " US   4U
5      R                  5       nU R                  R                  XR                  UR!                  U5      S9R!                  [        R"                  S9n[%        UUU[        R"                  S9nU R'                  XÍU	S9nUR!                  U5      nU R(                  (       a'  [+        S[-        X0R.                  -  US-   -  5      5      nUS:”  a  U R                  R1                  X4S9  XR                  R2                  4$ )	Nr   r,   )r"   r#   r$   r   r   r   )Úoriginal_samplesrG   Ú	timesteps)r]   )r"   r^   r#   r]   )rH   )r#   )ÚdetachÚcloneÚ_free_init_initial_noiser"   rE   r   r   r   r   Ú	schedulerÚconfigÚnum_train_timestepsr8   ÚfullÚlongÚ	add_noiser<   Úfloat32r   rX   r   ÚmaxÚintr   Úset_timestepsra   )r   rZ   r[   r\   r#   r]   r^   Úlatent_shapeÚfree_init_filter_shapeÚfree_init_freq_filterÚcurrent_diffuse_timestepÚdiffuse_timestepsÚz_tÚz_rands                 r   Ú_apply_free_initÚFreeInitMixin._apply_free_init‰   s²  € ð  !Ó#Ø,3¯N©NÓ,<×,BÑ,BÓ,DˆDÖ)à"Ÿ=™=ˆLà&'Ð%;¨,°q°rÐ*:Ñ%;Ð"Ø$(×$CÑ$CØ,ØØ ×2Ñ2Ø×+Ñ+Ø'+×'MÑ'MØ(,×(OÑ(Oð %Dð %Ð!ð (,§~¡~×'<Ñ'<×'PÑ'PÐSTÑ'TÐ$Ü %§
¢
¨L¸©OÐ+=Ð?WÓ X× ]Ñ ]Ó _Ðà—.‘.×*Ñ*Ø!(×0MÑ0MÐYj×YmÑYmÐntÓYuð +ð ç‰b”u—}‘}ˆbÐ%ð ô "Ø"Ø#ØÜ—m‘mñ	ˆFð ×-Ñ-¨cÐK`Ð-ÐaˆGØ—j‘j Ó'ˆGð ×,×,Ü"%Ø”3Ð*×-FÑ-FÑFÐJ]Ð`aÑJaÑbÓcó#Ðð  Ó"Ø�N‰N×(Ñ(Ð)<Ð(ÑLàŸ™×0Ñ0Ð0Ð0r   )rd   r   r   r   r   r   r   N)é   Fr*   é   ç      Ð?rz   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rm   ÚboolÚstrÚfloatr   r   Úpropertyr    Útupler8   r]   ÚTensorrE   rX   r#   Ú	Generatorrv   Ú__static_attributes__r-   r   r   r   r      s`  † Ù$ð Ø"'Ø#ØØ(,Ø)-ñ%Jàð%Jð  ð%Jð ð	%Jð
 ð%Jð !&ð%Jð "'õ%JòN)ð ñ_ó ð_ð*à�S˜#�X‰ð*ð �e—k‘kÑ!ð*ð ð	*ð
 ð*ð !&ð*ð "'ð*ð 
�‰ô*ðX E§L¡Lð ¸¿¹ð ÐX]×XdÑXdð Ðin×iuÑiuô ð(11à—‘ð11ð !ð11ð !ð	11ð
 —‘ð11ð �{‰{ð11ð —?‘?÷11r   r   )r3   r8   Ú	torch.fftrK   Úutils.torch_utilsr   r   r-   r   r   Ú<module>rŠ      s   ðó ã Ý å ,÷c1ò c1r   