ó
    oM‡jÒ"  ã                   ó  • S SK r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SS	KJrJrJrJr  SS
KJrJrJr  SSKJr  \
R*                  " \5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)é    Né   )Ú
FrozenDict)ÚClassifierFreeGuidance)ÚErnieImageTransformer2DModel)ÚFlowMatchEulerDiscreteScheduler)Úloggingé   )Ú
BlockStateÚLoopSequentialPipelineBlocksÚModularPipelineBlocksÚPipelineState)ÚComponentSpecÚ
InputParamÚOutputParamé   )ÚErnieImageModularPipelinec            	       óÂ   • \ rS rSrSr\S\4S j5       r\S\\	   4S j5       r
\S\\   4S j5       r\R                  " 5       S\S\S	\S
\R$                  4S j5       rSrg)ÚErnieImageLoopBeforeDenoiseré#   úernie-imageÚreturnc                 ó   •  g)NzêStep within the denoising loop that prepares the latent model input and timestep tensor. This block should be used to compose the `sub_blocks` attribute of a `LoopSequentialPipelineBlocks` object (e.g. `ErnieImageDenoiseLoopWrapper`).© ©Úselfs    Ú½C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\diffusers/modular_pipelines/ernie_image/denoise.pyÚdescriptionÚ(ErnieImageLoopBeforeDenoiser.description&   s   € ð<ð	
ó    c                 ó$   • [        S[        5      /$ )NÚtransformer)r   r   r   s    r   Úexpected_componentsÚ0ErnieImageLoopBeforeDenoiser.expected_components.   s   € ä˜mÔ-IÓJÐKÐKr   c                 ó8   • [        SS[        R                  SS9/$ )NÚlatentsTzThe latents to denoise.©ÚrequiredÚ	type_hintr   )r   ÚtorchÚTensorr   s    r   ÚinputsÚ#ErnieImageLoopBeforeDenoiser.inputs2   s&   € ô ØØÜŸ,™,Ø5ñ	ð
ð 	
r   Ú
componentsÚblock_stateÚiÚtc                 ó   • UR                   nUR                  UR                  R                  5      Ul        UR                  UR                  S   5      R                  UR                  R                  5      Ul        X4$ )Nr   )r%   Útor!   ÚdtypeÚlatent_model_inputÚexpandÚshapeÚtimestep)r   r-   r.   r/   r0   r%   s         r   Ú__call__Ú%ErnieImageLoopBeforeDenoiser.__call__=   sd   € à×%Ñ%ˆØ)0¯©°J×4JÑ4J×4PÑ4PÓ)QˆÔ&Ø Ÿx™x¨¯©°aÑ(8Ó9×<Ñ<¸Z×=SÑ=S×=YÑ=YÓZˆÔØÐ&Ð&r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú
model_nameÚpropertyÚstrr   Úlistr   r"   r   r+   r)   Úno_gradr   r
   Úintr*   r8   Ú__static_attributes__r   r   r   r   r   #   s¢   † Ø€Jàð
˜Só 
ó ð
ð ðL T¨-Ñ%8ó Ló ðLð ð
˜˜ZÑ(ó 
ó ð
ð ‡]‚]ƒ_ð'Ð#<ð 'È:ð 'ÐZ]ð 'Ðbg×bnÑbnó 'ó ó'r   r   c            	       óÂ   • \ rS rSrSr\S\\   4S j5       r\S\	4S j5       r
\S\\   4S j5       r\R                  " 5       S\S\S	\S
\R$                  4S j5       rSrg)ÚErnieImageLoopDenoiseréE   r   r   c           	      óX   • [        S[        5      [        S[        [        SS05      SS9/$ )Nr!   ÚguiderÚguidance_scaleg      @Úfrom_config)ÚconfigÚdefault_creation_method)r   r   r   r   r   s    r   r"   Ú*ErnieImageLoopDenoiser.expected_componentsH   s8   € ô ˜-Ô)EÓFÜØÜ&Ü!Ð#3°SÐ"9Ó:Ø(5ñ	ð
ð 	
r   c                 ó   •  g)Nz|Step within the denoising loop that runs the ErnieImage transformer with classifier-free guidance via the configured guider.r   r   s    r   r   Ú"ErnieImageLoopDenoiser.descriptionT   s   € ð%ð	
r   c                 óè   • [        SS[        R                  SS9[        SS[        R                  SS9[        S[        R                  SS	9[        S
[        R                  SS	9[        SS[        SS9/$ )NÚtext_bthTz3Padded text hidden states fed into the transformer.r&   Ú	text_lensz?Per-prompt text lengths used by the transformer attention mask.Únegative_text_bthz@Padded negative text hidden states for classifier-free guidance.©r(   r   Únegative_text_lensz>Per-prompt negative text lengths for classifier-free guidance.Únum_inference_stepszNTotal number of denoising steps. Used by the guider for step-aware scheduling.©r   r)   r*   rC   r   s    r   r+   ÚErnieImageLoopDenoiser.inputs[   s„   € ô ØØÜŸ,™,ØQñ	ô ØØÜŸ,™,Ø]ñ	ô Ø#ÜŸ,™,Ø^ñô
 Ø$ÜŸ,™,Ø\ñô
 Ø%ØÜØlñ	ð/
ð 	
r   r-   r.   r/   r0   c           	      ó‚  • UR                   UR                  4UR                  UR                  4S.nUR                  R                  X2R                  US9  UR                  R                  U5      nU H©  nUR                  R                  UR                  5        UR                  5        Vs0 s H  oˆ[        Xx5      _M     n	nUR                  " SUR                  UR                  SS.U	D6S   n
X§l        UR                  R                  UR                  5        M«     UR	                  U5      S   Ul        X4$ s  snf )N)rR   rS   )ÚsteprW   r7   F)Úhidden_statesr7   Úreturn_dictr   r   )rR   rT   rS   rV   rI   Ú	set_staterW   Úprepare_inputsÚprepare_modelsr!   ÚkeysÚgetattrr4   r7   Ú
noise_predÚcleanup_models)r   r-   r.   r/   r0   Úguider_inputsÚguider_stateÚguider_state_batchÚnameÚcond_kwargsrc   s              r   r8   ÚErnieImageLoopDenoiser.__call__|   sA  € ð %×-Ñ-¨{×/LÑ/LÐMØ%×/Ñ/°×1OÑ1OÐPñ
ˆð
 	×Ñ×#Ñ#¨×@_Ñ@_ÐjkÐ#ÑlØ!×(Ñ(×7Ñ7¸ÓFˆã".ÐØ×Ñ×,Ñ,¨Z×-CÑ-CÔDØO\×OaÑOaÔOcÓdÒOcÀt¤Ð);Ó!BÒBÑOcˆKÐdØ#×/Ò/ð Ø)×<Ñ<Ø$×-Ñ-Ø!ñð ñ	ð
 ñˆJð -7Ô)Ø×Ñ×,Ñ,¨Z×-CÑ-CÖDñ #/ð ",×!2Ñ!2°<Ó!@ÀÑ!CˆÔØÐ&Ð&ùò es   Â-D<r   N)r:   r;   r<   r=   r>   r?   rA   r   r"   r@   r   r   r+   r)   rB   r   r
   rC   r*   r8   rD   r   r   r   rF   rF   E   s    † Ø€Jàð	
 T¨-Ñ%8ó 	
ó ð	
ð ð
˜Só 
ó ð
ð ð
˜˜ZÑ(ó 
ó ð
ð@ ‡]‚]ƒ_ð'Ð#<ð 'È:ð 'ÐZ]ð 'Ðbg×bnÑbnó 'ó ó'r   rF   c            	       ó¤   • \ rS rSrSr\S\\   4S j5       r\S\	4S j5       r
\R                  " 5       S\S\S\S	\R                   4S
 j5       rSrg)ÚErnieImageLoopAfterDenoiseré–   r   r   c                 ó$   • [        S[        5      /$ )NÚ	scheduler)r   r   r   s    r   r"   Ú/ErnieImageLoopAfterDenoiser.expected_components™   s   € ä˜kÔ+JÓKÐLÐLr   c                 ó   • g)NzQStep within the denoising loop that updates the latents using the scheduler step.r   r   s    r   r   Ú'ErnieImageLoopAfterDenoiser.description�   s   € àbr   r-   r.   r/   r0   c                 óp  • UR                   R                  nUR                  R                  UR                  XBR                   SS9S   Ul         UR                   R                  U:w  aM  [
        R                  R                  R                  5       (       a   UR                   R                  U5      Ul         X4$ )NF)r]   r   )
r%   r3   ro   r[   rc   r)   ÚbackendsÚmpsÚis_availabler2   )r   r-   r.   r/   r0   Úlatents_dtypes         r   r8   Ú$ErnieImageLoopAfterDenoiser.__call__¡   sœ   € à#×+Ñ+×1Ñ1ˆØ(×2Ñ2×7Ñ7Ø×"Ñ" A×':Ñ':Èð 8ð 
à
ñˆÔð ×Ñ×$Ñ$¨Ó5¼%¿.¹.×:LÑ:L×:YÑ:Y×:[Ñ:[Ø"-×"5Ñ"5×"8Ñ"8¸Ó"GˆKÔØÐ&Ð&r   r   N)r:   r;   r<   r=   r>   r?   rA   r   r"   r@   r   r)   rB   r   r
   rC   r*   r8   rD   r   r   r   rl   rl   –   s…   † Ø€JàðM T¨-Ñ%8ó Mó ðMð ðc˜Só có ðcð ‡]‚]ƒ_ð'Ð#<ð 'È:ð 'ÐZ]ð 'Ðbg×bnÑbnó 'ó ó'r   rl   c                   óÈ   • \ rS rSrSr\S\4S j5       r\S\\	   4S j5       r
\S\\   4S j5       r\S\\   4S j5       r\R                   " 5       S\S	\S\4S
 j5       rSrg)ÚErnieImageDenoiseLoopWrapperé¬   r   r   c                 ó   •  g)NzžPipeline block that iteratively denoises the latents over `timesteps`. The specific steps within each iteration can be customized with `sub_blocks` attribute.r   r   s    r   r   Ú(ErnieImageDenoiseLoopWrapper.description¯   s   € ðfð	
r   c                 óB   • [        S[        5      [        S[        5      /$ )Nro   r!   )r   r   r   r   s    r   Úloop_expected_componentsÚ5ErnieImageDenoiseLoopWrapper.loop_expected_components¶   s$   € ô ˜+Ô'FÓGÜ˜-Ô)EÓFð
ð 	
r   c                 óV   • [        SS[        R                  SS9[        SS[        SS9/$ )NÚ	timestepsTz#The timesteps to use for inference.r&   rW   zThe number of denoising steps.rX   r   s    r   Úloop_inputsÚ(ErnieImageDenoiseLoopWrapper.loop_inputs½   s<   € ô ØØÜŸ,™,ØAñ	ô Ø%ØÜØ<ñ	ð
ð 	
r   c                 ó6   • [        S[        R                  SS9/$ )Nr%   zThe denoised latents.rU   )r   r)   r*   r   s    r   Úintermediate_outputsÚ1ErnieImageDenoiseLoopWrapper.intermediate_outputsÎ   s   € ä˜I´·±ÐKbÑcÐdÐdr   r-   Ústatec           	      ó2  • U R                  U5      nU R                  UR                  S9 n[        UR                  5       H'  u  pVU R                  XXVS9u  pUR                  5         M)     S S S 5        U R                  X#5        X4$ ! , (       d  f       N"= f)N)Útotal)r/   r0   )Úget_block_stateÚprogress_barrW   Ú	enumerater‚   Ú	loop_stepÚupdateÚset_block_state)r   r-   rˆ   r.   rŒ   r/   r0   s          r   r8   Ú%ErnieImageDenoiseLoopWrapper.__call__Ò   s�   € à×*Ñ*¨5Ó1ˆØ×Ñ [×%DÑ%DÐÑEÈÜ! +×"7Ñ"7Ö8‘�Ø*.¯.©.¸ÐTU¨.Ð*[Ñ'�
Ø×#Ñ#Ö%ñ 9÷ Fð 	×Ñ˜UÔ0ØÐ Ð ÷ FÕEús   «ABÂ
Br   N)r:   r;   r<   r=   r>   r?   r@   r   rA   r   r   r   rƒ   r   r†   r)   rB   r   r   r8   rD   r   r   r   rz   rz   ¬   s´   † Ø€Jàð
˜Só 
ó ð
ð ð
¨$¨}Ñ*=ó 
ó ð
ð ð
˜T *Ñ-ó 
ó ð
ð  ðe d¨;Ñ&7ó eó ðeð ‡]‚]ƒ_ð!Ð#<ð !À]ð !ÐWdó !ó ó!r   rz   c                   ó>   • \ rS rSr\\\/r/ SQr\	S\
4S j5       rSrg)ÚErnieImageDenoiseStepéÝ   )Úbefore_denoiserÚdenoiserÚafter_denoiserr   c                 ó   •  g)Nz­Denoise step that iteratively denoises the latents. At each iteration it runs:
 - `ErnieImageLoopBeforeDenoiser`
 - `ErnieImageLoopDenoiser`
 - `ErnieImageLoopAfterDenoiser`r   r   s    r   r   Ú!ErnieImageDenoiseStep.descriptionå   s   € ð/ð	
r   r   N)r:   r;   r<   r=   r   rF   rl   Úblock_classesÚblock_namesr?   r@   r   rD   r   r   r   r“   r“   Ý   s3   † à$ØØ#ð€Mò
 D€Kàð
˜Só 
ó ó
r   r“   )r)   Úconfiguration_utilsr   Úguidersr   Úmodelsr   Ú
schedulersr   Úutilsr   Úmodular_pipeliner
   r   r   r   Úmodular_pipeline_utilsr   r   r   r   Ú
get_loggerr:   Úloggerr   rF   rl   rz   r“   r   r   r   Ú<module>r¥      s‡   ðó å -Ý -Ý 2Ý 9Ý ÷ó ÷ LÑ KÝ 7ð 
×	Ò	˜HÓ	%€ô'Ð#8ô 'ôDN'Ð2ô N'ôb'Ð"7ô 'ô,.!Ð#?ô .!ôb
Ð8õ 
r   