
    +h                          S SK JrJrJrJr  S SKrS SKrS SKrSSK	J
r
  SSKJr  SSKJr  SSKJrJr  SSKJr  S	S
KJrJr  S	SKJrJrJr  \R6                  " \5      r " S S\5      r " S S\5      rg)    )AnyListTupleUnionN   )
FrozenDict)VaeImageProcessor)AutoencoderKL)AttnProcessor2_0XFormersAttnProcessor)logging   )ModularPipelineBlocksPipelineState)ComponentSpec
InputParamOutputParamc                       \ rS rSrSr\S\\   4S j5       r\S\	4S j5       r
\S\\\	\4      4S j5       r\S\\	   4S j5       r\S 5       r\R$                  " 5       S	\S\4S
 j5       rSrg)StableDiffusionXLDecodeStep$   stable-diffusion-xlreturnc           	      X    [        S[        5      [        S[        [        SS05      SS9/$ )Nvaeimage_processorvae_scale_factor   from_configconfigdefault_creation_method)r   r
   r	   r   selfs    r/home/james-whalen/.local/lib/python3.13/site-packages/diffusers/modular_pipelines/stable_diffusion_xl/decoders.pyexpected_components/StableDiffusionXLDecodeStep.expected_components'   s7     %/!!!#5q"9:(5	
 	
    c                     g)Nz2Step that decodes the denoised latents into images r"   s    r$   description'StableDiffusionXLDecodeStep.description3   s    Cr'   c                 J    [        SSS9[        SS[        R                  SS9/$ )Noutput_typepil)defaultlatentsTz,The denoised latents from the denoising step)required	type_hintr*   )r   torchTensorr"   s    r$   inputs"StableDiffusionXLDecodeStep.inputs7   s0     }e4,,J	
 	
r'   c                     [        S[        [        [        R                  R                     [        [
        R                     [        [        R                     4   SS9/$ )NimageszMThe generated images, can be a PIL.Image.Image, torch.Tensor or a numpy arrayr2   r*   )	r   r   r   PILImager3   r4   nparrayr"   s    r$   intermediate_outputs0StableDiffusionXLDecodeStep.intermediate_outputsC   sL     SYY__ 5tELL7I4PRPXPX> YZk
 	
r'   c                 *   U R                   R                  nU R                   R                  [        R                  S9  [        U R                   R                  R                  R                  S   R                  [        [        45      nU(       a  U R                   R                  R                  U5        U R                   R                  R                  R                  U5        U R                   R                  R                  R                  U5        g g )Ndtyper   )r   rB   tor3   float32
isinstancedecoder	mid_block
attentions	processorr   r   post_quant_convconv_in)
componentsrB   use_torch_2_0_or_xformerss      r$   
upcast_vae&StableDiffusionXLDecodeStep.upcast_vaeM   s     $$.$.NN"",,77:DD %%
! %NN**--e4NN""**--e4NN"",,//6 %r'   statec                    U R                  U5      nUR                  S:X  Gd  UR                  nUR                  R                  [
        R                  :H  =(       a     UR                  R                  R                  Ul	        UR                  (       aa  U R                  U5        UR                  [        [        UR                  R                  R                  5       5      5      R                  5      nO{UR                  UR                  R                  :w  aW  [
        R                   R"                  R%                  5       (       a*  UR                  R                  UR                  5      Ul        ['        UR                  R                  S5      =(       a"    UR                  R                  R(                  S LUl        ['        UR                  R                  S5      =(       a"    UR                  R                  R,                  S LUl        UR*                  (       Ga-  UR.                  (       Ga  [
        R0                  " UR                  R                  R(                  5      R3                  SSSS5      R                  UR4                  UR                  5      Ul        [
        R0                  " UR                  R                  R,                  5      R3                  SSSS5      R                  UR4                  UR                  5      Ul        XCR,                  -  UR                  R                  R6                  -  UR(                  -   nO"XAR                  R                  R6                  -  nUR                  R9                  USS9S   Ul        UR                  (       a'  UR                  R                  [
        R                  S	9  OUR                  Ul        ['        US
5      (       a7  UR<                  b*  UR<                  R?                  UR:                  5      Ul        UR@                  RC                  UR:                  UR                  S9Ul        U RE                  X#5        X4$ )Nlatentlatents_meanlatents_std      F)return_dictr   rA   	watermark)r-   )#get_block_stater-   r0   r   rB   r3   float16r    force_upcastneeds_upcastingrN   rC   nextiterrJ   
parametersbackendsmpsis_availablehasattrrS   has_latents_meanrT   has_latents_stdtensorviewdevicescaling_factordecoder8   rX   apply_watermarkr   postprocessset_block_state)r#   rL   rP   block_stater0   s        r$   __call__$StableDiffusionXLDecodeStep.__call__`   sB   **51&&(2!))G*4..*>*>%--*O*vT^TbTbTiTiTvTvK'**
+!**T$z~~/M/M/X/X/Z*[%\%b%bc*.."6"66>>%%2244%/^^%6%6w}}%EJN
 
--~>q:>>CXCXCeCemqCq ( 
--}=o*..BWBWBcBckoBo ' +++0K0K0KLL!6!6!C!CDII!QPQSTUXXY`YgYgipivivw ( LL!6!6!B!BCHHAqRSTWWX_XfXfhohuhuv ' 555
8M8M8\8\\_j_w_ww  "NN$9$9$H$HH!+!6!6wE!6!RST!UK **!!!6!,!4!4K :{++
0D0D0P!+!5!5!E!EkFXFX!YK'77CCK,C,C D 
 	U0  r'   r)   N)__name__
__module____qualname____firstlineno__
model_namepropertyr   r   r%   strr*   r   r   r5   r>   staticmethodrN   r3   no_gradr   ro   __static_attributes__r)   r'   r$   r   r   $   s    &J	
T-%8 	
 	
 DS D D 	
U38_- 	
 	
 
d3i 
 
 7 7" ]]_7!- 7!M 7! 7!r'   r   c                       \ rS rSrSr\S\4S j5       r\S\\	   4S j5       r
\S\\\\4      4S j5       r\R                  " 5       S\S\4S j5       rS	rg
)'StableDiffusionXLInpaintOverlayMaskStep   r   r   c                      g)NzA post-processing step that overlays the mask on the image (inpainting task only).
only needed when you are using the `padding_mask_crop` option when pre-processing the image and maskr)   r"   s    r$   r*   3StableDiffusionXLInpaintOverlayMaskStep.description   s    u	
r'   c                 :    [        S[        [        SS05      SS9/$ )Nr   r   r   r   r   )r   r	   r   r"   s    r$   r%   ;StableDiffusionXLInpaintOverlayMaskStep.expected_components   s-     !!!#5q"9:(5	
 	
r'   c                 2   [        S5      [        S5      [        S5      [        S[        [        [        R                  R                     [        [
        R                     [        [        R                     4   SS9[        S[        [        [        4   SS9/$ )	Nimage
mask_imagepadding_mask_cropr8   z)The generated images from the decode stepr9   crops_coordszThe crop coordinates to use for preprocess/postprocess the image and mask, for inpainting task only. Can be generated in vae_encode step.)r   r   r   r:   r;   r3   r4   r<   r=   r   intr"   s    r$   r5   .StableDiffusionXLInpaintOverlayMaskStep.inputs   s     w|$*+SYY__ 5tELL7I4PRPXPX> YZG
 S/ h
 	
r'   rP   c           	      @   U R                  U5      nUR                  bh  UR                  b[  UR                   Vs/ s H>  nUR                  R                  UR                  UR                  XCR                  5      PM@     snUl        U R                  X#5        X4$ s  snf )N)	rY   r   r   r8   r   apply_overlayr   r   rm   )r#   rL   rP   rn   is        r$   ro   0StableDiffusionXLInpaintOverlayMaskStep.__call__   s    **51((49Q9Q9]
 %++	" ,A **88**K,=,=qBZBZ ,	"K 	U0  "s   ABr)   N)rq   rr   rs   rt   ru   rv   rw   r*   r   r   r%   r   r   r5   r3   ry   r   ro   rz   r)   r'   r$   r|   r|      s    &J
S 
 
 
T-%8 
 
 
U38_- 
 
" ]]_!- !M ! !r'   r|   ) typingr   r   r   r   numpyr<   r:   r3   configuration_utilsr   r   r	   modelsr
   models.attention_processorr   r   utilsr   modular_pipeliner   r   modular_pipeline_utilsr   r   r   
get_loggerrq   loggerr   r|   r)   r'   r$   <module>r      sb    + *  
  - 0 # Q  L K 
		H	%t!"7 t!n5!.C 5!r'   