
    +h)             7          S SK JrJrJrJrJr  S SKrS SKrS SK	J
s  Jr  S SKJ
r
  SSKJrJr  SSKJr  SSKJr  SS	KJrJrJr  SS
KJr  SSKJrJrJrJrJrJ r J!r!J"r"  SSK#J$r$  SSK%J&r&  \RN                  " \(5      r)                 SiS\*S\+S\+S\+S\+S\,S\-S\*S\+S\\+   S\\+   S\\+   S\\+   S\,S\,S\,S\,S\*S \*S!\,S"\-S#\\*   S$\\+   S%\\*   S&\-42S' jjr.              SjS(\*S\+S\+S\-S\*S\+S)\-S\+S\\+   S\\+   S\,S\,S*\,S\,S\*S \*S!\,S#\\*   S$\\+   S&\-4(S+ jjr/                 SkS,\*S\+S\+S\+S-\+S\+S.\,S\-S\*S/\\+   S\+S\\+   S\\+   S\\+   S\,S\,S\,S\,S\*S \*S!\,S"\-S#\\*   S$\\+   S0\\*   S&\-S1\
R`                  46S2 jjr1 " S3 S4\
R`                  5      r2 " S5 S6\
R`                  5      r3 " S7 S8\
R`                  5      r4 " S9 S:\
R`                  5      r5 " S; S<\
R`                  5      r6 " S= S>\
R`                  5      r7 " S? S@\
R`                  5      r8 " SA SB\
R`                  5      r9 " SC SD\
R`                  5      r: " SE SF\
R`                  5      r; " SG SH\
R`                  5      r< " SI SJ\
R`                  5      r= " SK SL\
R`                  5      r> " SM SN\
R`                  5      r? " SO SP\
R`                  5      r@ " SQ SR\
R`                  5      rA " SS ST\
R`                  5      rB " SU SV\
R`                  5      rC " SW SX\
R`                  5      rD " SY SZ\
R`                  5      rE " S[ S\\
R`                  5      rF " S] S^\
R`                  5      rG " S_ S`\
R`                  5      rH " Sa Sb\
R`                  5      rI " Sc Sd\
R`                  5      rJ " Se Sf\
R`                  5      rK " Sg Sh\
R`                  5      rLg)l    )AnyDictOptionalTupleUnionN)nn   )	deprecatelogging)apply_freeu   )get_activation)	AttentionAttnAddedKVProcessorAttnAddedKVProcessor2_0)AdaGroupNorm)Downsample2DFirDownsample2DFirUpsample2DKDownsample2DKUpsample2DResnetBlock2DResnetBlockCondNorm2D
Upsample2D)DualTransformer2DModel)Transformer2DModeldown_block_type
num_layersin_channelsout_channelstemb_channelsadd_downsample
resnet_epsresnet_act_fntransformer_layers_per_blocknum_attention_headsresnet_groupscross_attention_dimdownsample_paddingdual_cross_attentionuse_linear_projectiononly_cross_attentionupcast_attentionresnet_time_scale_shiftattention_typeresnet_skip_time_actresnet_out_scale_factorcross_attention_normattention_head_dimdownsample_typedropoutc                    Uc  [         R                  SU	 S35        U	nU R                  S5      (       a  U SS  OU n U S:X  a  [        UUUUUUUUU
UUS9$ U S:X  a  [	        UUUUUUUUU
UUUS9$ U S	:X  a'  US
L a  S nOU=(       d    Sn[        UUUUUUUU
UUUUS9$ U S:X  aP  Uc  [        S5      e[        S60 SU_SU_SU_SU_SU_SU_SU_SU_SU_SU
_SU_SU_SU	_SU_SU_SU_SU_S U_S!U_6$ U S":X  aG  Uc  [        S#5      e[        S60 SU_SU_SU_SU_SU_SU_SU_SU_SU
_SU_S$U_S U_S%U_S&U_SU_S'U_6$ U S(:X  a  [        UUUUUUUUUUS)9
$ U S*:X  a  [        UUUUUUUUUUS+9
$ U S,:X  a  [        UUUUUUUU
UUS-9
$ U S.:X  a  [        UUUUUUUU
UUUS/9$ U S0:X  a  [        UUUUUUUUS19$ U S2:X  a  [        UUUUUUUUUUU(       d  S3S49$ S
S49$ [        U  S535      e)7NztIt is recommended to provide `attention_head_dim` when calling `get_down_block`. Defaulting `attention_head_dim` to .UNetRes   DownBlock2D)r   r   r    r!   r5   r"   r#   r$   r'   r)   r.   ResnetDownsampleBlock2D)r   r   r    r!   r5   r"   r#   r$   r'   r.   skip_time_actoutput_scale_factorAttnDownBlock2DFconv)r   r   r    r!   r5   r#   r$   r'   r)   r3   r.   r4   CrossAttnDownBlock2Dz>cross_attention_dim must be specified for CrossAttnDownBlock2Dr   r%   r   r    r!   r5   r"   r#   r$   r'   r)   r(   r&   r*   r+   r,   r-   r.   r/   SimpleCrossAttnDownBlock2DzDcross_attention_dim must be specified for SimpleCrossAttnDownBlock2Dr3   r<   r=   r2   SkipDownBlock2D)
r   r   r    r!   r5   r"   r#   r$   r)   r.   AttnSkipDownBlock2D)
r   r   r    r!   r5   r"   r#   r$   r3   r.   DownEncoderBlock2D)
r   r   r    r5   r"   r#   r$   r'   r)   r.   AttnDownEncoderBlock2D)r   r   r    r5   r"   r#   r$   r'   r)   r3   r.   KDownBlock2D)r   r   r    r!   r5   r"   r#   r$   KCrossAttnDownBlock2DT)r   r   r    r!   r5   r"   r#   r$   r(   r3   add_self_attention does not exist. )loggerwarning
startswithr:   r;   r>   
ValueErrorr@   rA   rB   rC   rD   rE   rF   rG   )r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   s                            _/home/james-whalen/.local/lib/python3.13/site-packages/diffusers/models/unets/unet_2d_blocks.pyget_down_blockrP   +   s9   8 ! C  DW  CX  XY  Z	
 1-<-G-G	-R-Roab)XgO-'!#%')!''1$;
 	
 
5	5&!#%')!''$;. 7
 	
 
-	-U""O-7O!#%'!''11$;+
 	
 
2	2&]^^# 
!
)E
 $
 &	

 (
 
 *
 "
 (
 (
  2
 !4
 !4
 "6
 #8
  "6!
" .#
$ %<%
& *'
 	
* 
8	8&cdd) 
!
#
 &
 (	

 
 *
 "
 (
 (
 !4
  2
 %<
 /
 !8
 "6
  "6!
 	
$ 
-	-!#%')!'1$;
 	
 
1	1"!#%')!'1$;
 	
 
0	0!!#%)!''1$;
 	
 
4	4%!#%)!''11$;
 	
 
N	*!#%')!'	
 		
 
3	3$!#%')!' 31+9t
 	
 @E
 	
 ((89
::    mid_block_typer=   mid_block_only_cross_attentionc                     U S:X  a  [        UUUUUUUUU	UUU
UUUS9$ U S:X  a  [        UUUUUUU	UUUUUUS9$ U S:X  a  [        UUUSUUUUUSS9
$ U c  g [        S	U  35      e)
NUNetMidBlock2DCrossAttn)r%   r   r!   r5   r#   r$   r=   r.   r(   r&   r'   r*   r+   r-   r/   UNetMidBlock2DSimpleCrossAttn)r   r!   r5   r#   r$   r=   r(   r3   r'   r.   r<   r,   r2   UNetMidBlock2Dr   F)
r   r!   r5   r   r#   r$   r=   r'   r.   add_attentionzunknown mid_block_type : )rU   rV   rW   rN   )rR   r!   r   r#   r$   r'   r=   r%   r&   r(   r*   r+   rS   r-   r.   r/   r0   r2   r3   r5   s                       rO   get_mid_blockrY      s    , 22&)E#'!' 3$; 3 3'!5"7-)
 	
" 
:	:,#'!' 3 31'$;.!?!5
 	
 
+	+#'!' 3'$;
 	
 
	4^4DEFFrQ   up_block_typeprev_output_channeladd_upsampleresolution_idxupsample_typereturnc                    Uc  [         R                  SU S35        UnU R                  S5      (       a  U SS  OU n U S:X  a  [        UUUUUU	UUUUUUS9$ U S:X  a  [	        UUUUUU	UUUUUUUUS9$ U S	:X  aS  Uc  [        S
5      e[        S60 SU_SU
_SU_SU_SU_SU_SU	_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_6$ U S:X  aM  Uc  [        S 5      e[        S60 SU_SU_SU_SU_SU_SU	_SU_SU_SU_SU_SU_SU_S!U_SU_S"U_S#U_SU_S$U_6$ U S%:X  a(  US&L a  S nOU=(       d    S'n[        UUUUUU	UUUUUUUS(9$ U S):X  a  [        UUUUUU	UUUUUS*9$ U S+:X  a  [        UUUUUU	UUUUUUS,9$ U S-:X  a  [        UUUU	UUUUUUUS.9$ U S/:X  a  [        UUUU	UUUUUUUUS09$ U S1:X  a  [        UUUUU	UUUUS29	$ U S3:X  a  [        UUUUU	UUUUUUS49$ [        U  S535      e)7NzrIt is recommended to provide `attention_head_dim` when calling `get_up_block`. Defaulting `attention_head_dim` to r7   r8   r9   	UpBlock2D)r   r   r    r[   r!   r]   r5   r\   r#   r$   r'   r.   ResnetUpsampleBlock2D)r   r   r    r[   r!   r]   r5   r\   r#   r$   r'   r.   r<   r=   CrossAttnUpBlock2Dz<cross_attention_dim must be specified for CrossAttnUpBlock2Dr   r%   r   r    r[   r!   r]   r5   r\   r#   r$   r'   r(   r&   r*   r+   r,   r-   r.   r/   SimpleCrossAttnUpBlock2DzBcross_attention_dim must be specified for SimpleCrossAttnUpBlock2Dr3   r<   r=   r2   AttnUpBlock2DFr?   )r   r   r    r[   r!   r]   r5   r#   r$   r'   r3   r.   r^   SkipUpBlock2D)r   r   r    r[   r!   r]   r5   r\   r#   r$   r.   AttnSkipUpBlock2D)r   r   r    r[   r!   r]   r5   r\   r#   r$   r3   r.   UpDecoderBlock2D)r   r   r    r]   r5   r\   r#   r$   r'   r.   r!   AttnUpDecoderBlock2D)r   r   r    r]   r5   r\   r#   r$   r'   r3   r.   r!   
KUpBlock2D)	r   r   r    r!   r]   r5   r\   r#   r$   KCrossAttnUpBlock2D)r   r   r    r!   r]   r5   r\   r#   r$   r(   r3   rI   rJ   )rK   rL   rM   ra   rb   rN   rc   rd   re   rf   rg   rh   ri   rj   rk   )rZ   r   r   r    r[   r!   r\   r#   r$   r]   r%   r&   r'   r(   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r^   r5   s                             rO   get_up_blockrl   G  s_   : ! A  BU  AV  VW  X	
 1)6)A)A))L)LM!"%R_M#!#% 3')%!''$;
 	
 
1	1$!#% 3')%!''$;. 7
 	
  
.	.&[\\! 
!
)E
 $
 &	

 !4
 (
 *
 
 &
 "
 (
 (
 !4
 !4
 "6
  #8!
" "6#
$ .%
& %<'
( *)
 	
, 
4	4&abb' 
!
#
 &
 !4	

 (
 *
 
 &
 "
 (
 (
 !4
  2
 %<
 /
  !8!
" "6#
$ "6%
 	
( 
/	)5  M)3VM!#% 3')!''1$;'
 	
 
/	)!#% 3')%!'$;
 	
 
-	- !#% 3')%!'1$;
 	
 
,	,!#%)%!''$;'
 	
 
0	0#!#%)%!''1$;'
 	
 
,	&!#%')%!'

 
	
 
/	/"!#%')%!' 31
 	
 &67
88rQ   c                   v   ^  \ rS rSrSrS\S\S\4U 4S jjrS\R                  S\R                  4S	 jr
S
rU =r$ )AutoencoderTinyBlocki(  a  
Tiny Autoencoder block used in [`AutoencoderTiny`]. It is a mini residual module consisting of plain conv + ReLU
blocks.

Args:
    in_channels (`int`): The number of input channels.
    out_channels (`int`): The number of output channels.
    act_fn (`str`):
        ` The activation function to use. Supported values are `"swish"`, `"mish"`, `"gelu"`, and `"relu"`.

Returns:
    `torch.Tensor`: A tensor with the same shape as the input tensor, but with the number of channels equal to
    `out_channels`.
r   r    act_fnc                   > [         TU ]  5         [        U5      n[        R                  " [        R
                  " XSSS9U[        R
                  " X"SSS9U[        R
                  " X"SSS95      U l        X:w  a  [        R
                  " XSSS9O[        R                  " 5       U l        [        R                  " 5       U l
        g )Nr	      )kernel_sizepaddingF)rr   bias)super__init__r   r   
SequentialConv2dr?   IdentityskipReLUfuse)selfr   r    ro   	__class__s       rO   rv   AutoencoderTinyBlock.__init__8  s    'MMIIkQJIIlaKIIlaK
	 * IIkQUK 		
 GGI	rQ   xr_   c                 f    U R                  U R                  U5      U R                  U5      -   5      $ N)r|   r?   rz   )r}   r   s     rO   forwardAutoencoderTinyBlock.forwardI  s&    yy1		!455rQ   )r?   r|   rz   )__name__
__module____qualname____firstlineno____doc__intstrrv   torchTensorr   __static_attributes____classcell__r~   s   @rO   rn   rn   (  sB    C s C "6 6%,, 6 6rQ   rn   c                      ^  \ rS rSrSr           SS\S\S\S\S\S\S	\S
\S\\   S\	S\	S\S\4U 4S jjjr
SS\R                  S\\R                     S\R                  4S jjrSrU =r$ )rW   iM  a  
A 2D UNet mid-block [`UNetMidBlock2D`] with multiple residual blocks and optional attention blocks.

Args:
    in_channels (`int`): The number of input channels.
    temb_channels (`int`): The number of temporal embedding channels.
    dropout (`float`, *optional*, defaults to 0.0): The dropout rate.
    num_layers (`int`, *optional*, defaults to 1): The number of residual blocks.
    resnet_eps (`float`, *optional*, 1e-6 ): The epsilon value for the resnet blocks.
    resnet_time_scale_shift (`str`, *optional*, defaults to `default`):
        The type of normalization to apply to the time embeddings. This can help to improve the performance of the
        model on tasks with long-range temporal dependencies.
    resnet_act_fn (`str`, *optional*, defaults to `swish`): The activation function for the resnet blocks.
    resnet_groups (`int`, *optional*, defaults to 32):
        The number of groups to use in the group normalization layers of the resnet blocks.
    attn_groups (`Optional[int]`, *optional*, defaults to None): The number of groups for the attention blocks.
    resnet_pre_norm (`bool`, *optional*, defaults to `True`):
        Whether to use pre-normalization for the resnet blocks.
    add_attention (`bool`, *optional*, defaults to `True`): Whether to add attention blocks.
    attention_head_dim (`int`, *optional*, defaults to 1):
        Dimension of a single attention head. The number of attention heads is determined based on this value and
        the number of input channels.
    output_scale_factor (`float`, *optional*, defaults to 1.0): The output scale factor.

Returns:
    `torch.Tensor`: The output of the last residual block, which is a tensor of shape `(batch_size, in_channels,
    height, width)`.

r   r!   r5   r   r#   r.   r$   r'   attn_groupsresnet_pre_normrX   r3   r=   c                   > [         TU ]  5         Ub  UO[        US-  S5      nXl        U	c
  US:X  a  UOS n	US:X  a  [	        UUUUUUSUUS9	/nO[        UUUUUUUUUU
S9
/n/ nUc  [        R                  SU S35        Un[        U5       H  nU R                  (       a-  UR                  [        UX-  UUUU	US:X  a  UOS S	S	S	S	S
95        OUR                  S 5        US:X  a"  UR                  [	        UUUUUUSUUS9	5        Mz  UR                  [        UUUUUUUUUU
S9
5        M     [        R                  " U5      U l        [        R                  " U5      U l        SU l        g )N       defaultspatial	r   r    r!   epsgroupsr5   time_embedding_normnon_linearityr=   
r   r    r!   r   r   r5   r   r   r=   pre_normiIt is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: r7   T
headsdim_headrescale_output_factorr   norm_num_groupsspatial_norm_dimresidual_connectionrt   upcast_softmax_from_deprecated_attn_blockF)ru   rv   minrX   r   r   rK   rL   rangeappendr   r   
ModuleList
attentionsresnetsgradient_checkpointing)r}   r   r!   r5   r   r#   r.   r$   r'   r   r   rX   r3   r=   r   r   _r~   s                    rO   rv   UNetMidBlock2D.__init__l  s     	)6)BK[\L\^`Ha*+Bi+O-UYK #i/% +!,"/"(#(1"/(;
G  +!,"/"(#(?"/(;,G 
%NN{  }H  |I  IJ  K "-z"A!!!!#)?!3.A&(3:QU^:^dh,0!'+48  !!$'&)3)$/%0&3&, ',5&3,?
 !$/%0&3&, ',C&3,?!0G #d --
3}}W-&+#rQ   hidden_statestembr_   c                 :   U R                   S   " X5      n[        U R                  U R                   SS  5       H^  u  p4[        R                  " 5       (       a.  U R
                  (       a  Ub  U" XS9nU R                  XAU5      nMM  Ub  U" XS9nU" X5      nM`     U$ )Nr   rq   r   )r   zipr   r   is_grad_enabledr   _gradient_checkpointing_func)r}   r   r   attnresnets        rO   r   UNetMidBlock2D.forward  s    Q<ab1ABLD$$&&4+F+F#$($BM $ A A&Y] ^#$($BM &} ; C rQ   )rX   r   r   r   )        rq   ư>r   swishr   NTTrq         ?r   )r   r   r   r   r   r   floatr   r   boolrv   r   r   r   r   r   r   s   @rO   rW   rW   M  s    D  '0$%) $""#%(r,r, r, 	r,
 r, r, "%r, r, r, c]r, r, r,  r, #r, r,hU\\ %,,9O [`[g[g  rQ   rW   c            '         ^  \ rS rSr                 SS\S\S\\   S\S\S\\\\   4   S\S	\	S
\	S\S\\   S\
S\S\S\S\
S\
S\
S\	4&U 4S jjjr     S S\R                  S\\R                     S\\R                     S\\R                     S\\\	\4      S\\R                     S\R                  4S jjrSrU =r$ )!rU   i  r   r!   r    r5   r   r%   r#   r.   r$   r'   resnet_groups_outr   r&   r=   r(   r*   r+   r-   r/   c                   > [         TU ]  5         U=(       d    UnXl        X0l        SU l        Xl        U
b  U
O[        US-  S5      n
[        U[        5      (       a  U/U-  nU=(       d    U
n[        UUUUU
UUUU	UUS9/n/ n[        U5       Hp  nU(       d&  UR                  [        UX=-  UUU   UUUUUS9	5        OUR                  [        UX=-  USUU
S95        UR                  [        UUUUUUUU	UUS9
5        Mr     [        R                  " U5      U l        [        R                  " U5      U l        S	U l        g )
NTr   r   r   r    r!   r   r   
groups_outr5   r   r   r=   r   )r   r   r(   r   r+   r-   r/   rq   r   r   r(   r   r   F)ru   rv   r   r    has_cross_attentionr&   r   
isinstancer   r   r   r   r   r   r   r   r   r   r   )r}   r   r!   r    r5   r   r%   r#   r.   r$   r'   r   r   r&   r=   r(   r*   r+   r-   r/   r   r   ir~   s                          rO   rv    UNetMidBlock2DCrossAttn.__init__  s   , 	#2{&(#' #6 )6)BK[\L\^`Ha 2C88,H+IJ+V(-> ')+$,$;+$7(
 
z"A'!!&+$;$0#?#B,?(9.C)9'5
 !!*+$;$0#$,?(5	 NN ,!-"/",#(?"/(;,5 #R --
3}}W-&+#rQ   r   r   encoder_hidden_statesattention_maskcross_attention_kwargsencoder_attention_maskr_   c           
         Ub(  UR                  SS 5      b  [        R                  S5        U R                  S   " X5      n[	        U R
                  U R                  SS  5       Hh  u  px[        R                  " 5       (       a3  U R                  (       a"  U" UUUUUSS9S   nU R                  XU5      nMR  U" UUUUUSS9S   nU" X5      nMj     U$ )NscaleSPassing `scale` to `cross_attention_kwargs` is deprecated. `scale` will be ignored.r   rq   Fr   r   r   r   return_dict)
getrK   rL   r   r   r   r   r   r   r   )	r}   r   r   r   r   r   r   r   r   s	            rO   r   UNetMidBlock2DCrossAttn.forwardV  s     "-%))'48DtuQ<ab1ABLD$$&&4+F+F $!*?+A#1+A %! ! !% A A&Y] ^ $!*?+A#1+A %! ! !'} ;) C, rQ   )r   r   r   r   r&   r    r   )Nr   rq   rq   r   r   r   r   NTrq   r      FFFr   NNNNNr   r   r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   s   @rO   rU   rU     s   
 '+?@ '0$+/ $#$%(#'%*&+!&')d,d, d, sm	d,
 d, d, ',CsO&<d, d, "%d, d, d, $C=d, d, !d, #d,  !!d," ##d,$  $%d,& 'd,( )d, d,R (,8<15;?9=$||$ u||$$  (5	$
 !.$ !)c3h 8$ !) 6$ 
$ $rQ   rU   c                    `  ^  \ rS rSr             SS\S\S\S\S\S\S\S	\S
\S\S\S\S\S\S\\   4U 4S jjjr	     SS\
R                  S\\
R                     S\\
R                     S\\
R                     S\\\\4      S\\
R                     S\
R                  4S jjrSrU =r$ )rV   i}  r   r!   r5   r   r#   r.   r$   r'   r   r3   r=   r(   r<   r,   r2   c                 H  > [         TU ]  5         SU l        Xl        Ub  UO[	        US-  S5      nXR                  -  U l        [        UUUUUUUUUU	US9/n/ n[        U5       H  n[        [        S5      (       a
  [        5       O	[        5       nUR                  [        UUU R
                  U R                  UUSSUUUS95        UR                  [        UUUUUUUUUU	US95        M     [        R                  " U5      U l        [        R                  " U5      U l        g )NTr   r   r   r    r!   r   r   r5   r   r   r=   r   r<   scaled_dot_product_attention	query_dimr(   r   r   added_kv_proj_dimr   rt   r   r,   r2   	processor)ru   rv   r   r3   r   	num_headsr   r   hasattrFr   r   r   r   r   r   r   r   )r}   r   r!   r5   r   r#   r.   r$   r'   r   r3   r=   r(   r<   r,   r2   r   r   r   r   r~   s                       rO   rv   &UNetMidBlock2DSimpleCrossAttn.__init__~  sL   $ 	#' "4)6)BK[\L\^`Ha$(?(?? '(+$$;+$7(+
 
z"A-4Q8V-W-W')]q]s  )(3..!44&9$1#')=)=' NN +!,"/"(#(?"/(;,"/) #H --
3}}W-rQ   r   r   r   r   r   r   r_   c                 (   Ub  UO0 nUR                  SS 5      b  [        R                  S5        Uc  Uc  S OUnOUnU R                  S   " X5      n[	        U R
                  U R                  SS  5       H  u  pU" U4UUS.UD6nU	" X5      nM     U$ )Nr   r   r   rq   r   r   )r   rK   rL   r   r   r   )
r}   r   r   r   r   r   r   maskr   r   s
             rO   r   %UNetMidBlock2DSimpleCrossAttn.forward  s     <R;]!7ce!%%gt4@NNpq!084>TD "DQ<ab1ABLD &;# )	M #=7M C rQ   )r3   r   r   r   r   )r   rq   r   r   r   r   Trq   r   r   FFNr   )r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   s   @rO   rV   rV   }  sx   
  '0$ $"#%(#'#%*.2!R.R. R. 	R.
 R. R. "%R. R. R. R.  R. #R. !R. R. #R.  'sm!R. R.n (,8<15;?9=%||% u||$%  (5	%
 !.% !)c3h 8% !) 6% 
% %rQ   rV   c                   &  ^  \ rS rSr           SS\S\S\S\S\S\S\S	\S
\S\S\S\S\S\4U 4S jjjr   SS\	R                  S\\	R                     S\\   S\\\\4      S\\	R                  \\	R                  S4   4   4
S jjrSrU =r$ )r>   i  r   r    r!   r5   r   r#   r.   r$   r'   r   r3   r=   r)   r4   c                 |  > [         TU ]  5         / n/ nXl        Uc  [        R	                  SU S35        Un[        U5       HQ  nUS:X  a  UOUnUR                  [        UUUUU	UUUUU
S9
5        UR                  [        UX+-  UUUU	SSSSS9
5        MS     [        R                  " U5      U l        [        R                  " U5      U l        US:X  a'  [        R                  " [        USX-SS	9/5      U l        O;US
:X  a.  [        R                  " [        UUUUU	UUUUU
SS9/5      U l        OS U l        SU l        g )Nr   r7   r   r   T	r   r   r   r   r   r   rt   r   r   r?   opuse_convr    rs   namer   )r   r    r!   r   r   r5   r   r   r=   r   downF)ru   rv   r4   rK   rL   r   r   r   r   r   r   r   r   r   downsamplersr   )r}   r   r    r!   r5   r   r#   r.   r$   r'   r   r3   r=   r)   r4   r   r   r   r~   s                     rO   rv   AttnDownBlock2D.__init__  s   " 	
.%NN{  }I  |J  JK  L ".z"A)*a+\KNN +!-"/"(#(?"/(;,  &</*="$1(,#'04! #> --
3}}W-f$ " $t,qu!D ( "!$0%1&3&, ',C&3,?!0!!D$ !%D&+#rQ   r   r   upsample_sizer   r_   .c                    Ub  UO0 nUR                  SS 5      b  [        R                  S5        Sn[        U R                  U R
                  5       Hh  u  pg[        R                  " 5       (       a3  U R                  (       a"  U R                  XaU5      nU" U40 UD6nXQ4-   nMR  U" X5      nU" U40 UD6nXQ4-   nMj     U R                  b8  U R                   H#  nU R                  S:X  a  U" XS9nM  U" U5      nM%     XQ4-  nX4$ )Nr   r   rJ   r   r   )r   rK   rL   r   r   r   r   r   r   r   r   r4   )	r}   r   r   r   r   output_statesr   r   downsamplers	            rO   r   AttnDownBlock2D.forwardX  s    <R;]!7ce!%%gt4@NNpqdoo>LF$$&&4+F+F $ A A&Y] ^ $] M6L M -0@ @ &} ; $] M6L M -0@ @ ? (#00''83$/$IM$/$>M	  1 --M++rQ   )r   r4   r   r   r   )r   rq   r   r   r   r   Trq   r   rq   r?   )NNN)r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r   s   @rO   r>   r>     sJ     '0$ $"#%("#%[,[, [, 	[,
 [, [, [, "%[, [, [, [,  [, #[,  [, [, [,@ (,'+;? ,|| , u||$ ,  }	 ,
 !)c3h 8 , 
u||U5<<#455	6 ,  ,rQ   r>   c            +         ^  \ rS rSr                  S#S\S\S\S\S\S\\\\   4   S\S	\S
\S\S\	S\S\S\S\S\	S\	S\	S\	S\	S\4*U 4S jjjr
      S$S\R                  S\\R                     S\\R                     S\\R                     S\\\\4      S\\R                     S\\R                     S\\R                  \\R                  S 4   4   4S! jjrS"rU =r$ )%r@   i{  r   r    r!   r5   r   r%   r#   r.   r$   r'   r   r&   r(   r=   r)   r"   r*   r+   r,   r-   r/   c                 t  > [         TU ]  5         / n/ nSU l        Xl        [	        U[
        5      (       a  U/U-  n[        U5       H|  nUS:X  a  UOUnUR                  [        UUUUU
UUU	UUS9
5        U(       d(  UR                  [        UX,-  UUU   UU
UUUUS9
5        M]  UR                  [        UX,-  USUU
S95        M~     [        R                  " U5      U l        [        R                  " U5      U l        U(       a'  [        R                  " [        USX/SS9/5      U l        OS U l        S	U l        g )
NTr   r   r   r   r(   r   r+   r,   r-   r/   rq   r   r   r   F)ru   rv   r   r&   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r}   r   r    r!   r5   r   r%   r#   r.   r$   r'   r   r&   r(   r=   r)   r"   r*   r+   r,   r-   r/   r   r   r   r~   s                            rO   rv   CrossAttnDownBlock2D.__init__|  sa   0 	
#' #6 2C88,H+IJ+V(z"A)*a+\KNN +!-"/"(#(?"/(;, (!!&+$;$0#?#B,?(5.C-A)9'5 !!*+$;$0#$,?(5	A #T --
3}}W- " $t,qu!D !%D&+#rQ   r   r   r   r   r   r   additional_residualsr_   .c           
      <   Ub(  UR                  SS 5      b  [        R                  S5        Sn[        [	        U R
                  U R                  5      5      n	[        U	5       H  u  n
u  p[        R                  " 5       (       a2  U R                  (       a!  U R                  XU5      nU" UUUUUSS9S   nOU" X5      nU" UUUUUSS9S   nU
[        U	5      S-
  :X  a  Ub  X-   nX4-   nM     U R                  b   U R                   H  nU" U5      nM     X4-   nX4$ )Nr   r   rJ   Fr   r   rq   )r   rK   rL   listr   r   r   	enumerater   r   r   r   lenr   )r}   r   r   r   r   r   r   r   r   blocksr   r   r   r   s                 rO   r   CrossAttnDownBlock2D.forward  sI    "-%))'48Dtuc$,,89!*6!2A~$$&&4+F+F $ A A&Y] ^ $!*?+A#1+A %! ! !'} ; $!*?+A#1+A %! ! CK!O#(<(H - D),<<M5 "38 (#00 +M :  1 *,<<M++rQ   )r   r   r   r   r&   r   )r   rq   rq   r   r   r   r   Trq   r   r   rq   TFFFFr   NNNNNN)r   r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   s   @rO   r@   r@   {  s     ?@ '0$ $#$#'%("##%*&+%*!&'-Y,Y, Y, 	Y,
 Y, Y, ',CsO&<Y, Y, "%Y, Y, Y, Y, !Y, !Y, #Y,   !Y," #Y,$ #%Y,&  $'Y,( #)Y,* +Y,, -Y, Y,| (,8<15;?9=7;4,||4, u||$4,  (5	4,
 !.4, !)c3h 84, !) 64, 'u||44, 
u||U5<<#455	64, 4,rQ   r@   c                      ^  \ rS rSr          SS\S\S\S\S\S\S\S	\S
\S\S\S\S\4U 4S jjjr SS\	R                  S\\	R                     S\\	R                  \\	R                  S4   4   4S jjrSrU =r$ )r:   i  r   r    r!   r5   r   r#   r.   r$   r'   r   r=   r"   r)   c                 N  > [         TU ]  5         / n[        U5       H.  nUS:X  a  UOUnUR                  [	        UUUUU	UUUUU
S9
5        M0     [
        R                  " U5      U l        U(       a'  [
        R                  " [        USX-SS9/5      U l	        OS U l	        SU l
        g )Nr   r   Tr   r   F)ru   rv   r   r   r   r   r   r   r   r   r   )r}   r   r    r!   r5   r   r#   r.   r$   r'   r   r=   r"   r)   r   r   r~   s                   rO   rv   DownBlock2D.__init__  s      	z"A)*a+\KNN +!-"/"(#(?"/(;, #" }}W- " $t,qu!D !%D&+#rQ   r   r   r_   .c                    [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        SnU R                   HN  n[        R
                  " 5       (       a$  U R                  (       a  U R                  XqU5      nOU" X5      nXa4-   nMP     U R                  b   U R                   H  nU" U5      nM     Xa4-   nX4$ Nr   r   The `scale` argument is deprecated and will be ignored. Please remove it, as passing it will raise an error in the future. `scale` should directly be passed while calling the underlying pipeline component i.e., via `cross_attention_kwargs`.1.0.0rJ   	r  r   r
   r   r   r   r   r   r   	r}   r   r   argskwargsdeprecation_messager   r   r   s	            rO   r   DownBlock2D.forwardB  s     t9q=FJJw5A #Ugw(;<llF$$&&4+F+F $ A A&Y] ^ &} ;),<<M # (#00 +M :  1 *,<<M++rQ   r   r   r   
r   rq   r   r   r   r   Tr   Trq   r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   s   @rO   r:   r:     s      '0$ $%(#"#1,1, 1, 	1,
 1, 1, 1, "%1, 1, 1, 1, #1, 1,  1, 1,h KO,"\\,19%,,1G,	u||U5<<#455	6, ,rQ   r:   c                      ^  \ rS rSr          SS\S\S\S\S\S\S\S	\S
\S\S\S\4U 4S jjjrS\	R                  S\	R                  4S jrSrU =r$ )rD   i\  r   r    r5   r   r#   r.   r$   r'   r   r=   r"   r)   c                   > [         TU ]  5         / n[        U5       HV  nUS:X  a  UOUnUS:X  a"  UR                  [	        UUS UUUSUU
S9	5        M5  UR                  [        UUS UUUUUU
U	S9
5        MX     [        R                  " U5      U l        U(       a'  [        R                  " [        USX,SS9/5      U l
        g S U l
        g )Nr   r   r   r   Tr   r   )ru   rv   r   r   r   r   r   r   r   r   r   )r}   r   r    r5   r   r#   r.   r$   r'   r   r=   r"   r)   r   r   r~   s                  rO   rv   DownEncoderBlock2D.__init__]  s     	z"A)*a+\K&)3)$/%1&*&, ',5&3,?
 !$/%1&*&, ',C&3,?!0# #@ }}W- " $t,qu!D !%DrQ   r   r_   c                     [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        U R                   H
  nU" US S9nM     U R                  b  U R                   H  nU" U5      nM     U$ Nr   r   r  r  r   )r  r   r
   r   r   )r}   r   r  r  r  r   r   s          rO   r   DownEncoderBlock2D.forward  s}    t9q=FJJw5A #Ugw(;<llF"=t<M # (#00 +M :  1 rQ   )r   r   r  r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   s   @rO   rD   rD   \  s    
  '0$ $%(#"#=%=% =% 	=%
 =% =% "%=% =% =% =% #=% =%  =% =%~U\\ u||  rQ   rD   c                      ^  \ rS rSr           SS\S\S\S\S\S\S\S	\S
\S\S\S\S\4U 4S jjjrS\	R                  S\	R                  4S jrSrU =r$ )rE   i  r   r    r5   r   r#   r.   r$   r'   r   r3   r=   r"   r)   c                 J  > [         TU ]  5         / n/ nU
c  [        R                  SU S35        Un
[	        U5       Hx  nUS:X  a  UOUnUS:X  a!  UR                  [        UUS UUUSUUS9	5        O!UR                  [        UUS UUUUUUU	S9
5        UR                  [        UX*-  U
UUUSSSSS9
5        Mz     [        R                  " U5      U l        [        R                  " U5      U l        U(       a'  [        R                  " [        USX-S	S
9/5      U l        g S U l        g )Nr   r7   r   r   r   r   Tr   r   r   )ru   rv   rK   rL   r   r   r   r   r   r   r   r   r   r   r   )r}   r   r    r5   r   r#   r.   r$   r'   r   r3   r=   r"   r)   r   r   r   r~   s                    rO   rv   AttnDownEncoderBlock2D.__init__  sj     	
%NN{  }I  |J  JK  L ".z"A)*a+\K&)3)$/%1&*&, ',5&3,?
 !$/%1&*&, ',C&3,?!0  &</*="$1(,#'04? #\ --
3}}W- " $t,qu!D !%DrQ   r   r_   c                 (   [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        [        U R                  U R
                  5       H  u  pVU" US S9nU" U5      nM     U R                  b  U R                   H  nU" U5      nM     U$ r  )r  r   r
   r   r   r   r   )r}   r   r  r  r  r   r   r   s           rO   r   AttnDownEncoderBlock2D.forward  s    t9q=FJJw5A #Ugw(;<doo>LF"=t<M /M ? (#00 +M :  1 rQ   )r   r   r   )r   rq   r   r   r   r   Trq   r   Trq   r  r   s   @rO   rE   rE     s    
  '0$ $"#%(#"#T%T% T% 	T%
 T% T% "%T% T% T% T%  T% #T% T%  T% T%lU\\ u||  rQ   rE   c                   N  ^  \ rS rSrSSSSSSS\R
                  " S5      S4	S	\S
\S\S\S\S\S\S\S\	S\S\S\	4U 4S jjjr
  SS\R                  S\\R                     S\\R                     S\\R                  \\R                  S4   \R                  4   4S jjrSrU =r$ )rC   i  r   rq   r   r   r   T       @r   r    r!   r5   r   r#   r.   r$   r   r3   r=   r"   c                   > [         TU ]  5         [        R                  " / 5      U l        [        R                  " / 5      U l        U
c  [        R                  SU S35        Un
[        U5       H  nUS:X  a  UOUnU R
                  R                  [        UUUU[        US-  S5      [        US-  S5      UUUUU	S95        U R                  R                  [        UX*-  U
UUSSSSSS9
5        M     U(       ag  [        UUUU[        US-  S5      UUUUU	SSS	S
9U l        [        R                  " [        X"S9/5      U l        [        R                   " SUSSS9U l        g S U l        S U l        S U l        g )Nr   r7   r   r   r   r   Tr   firr   r    r!   r   r   r5   r   r   r=   r   use_in_shortcutr   kernelr    r	   rq   rq   rr   stride)ru   rv   r   r   r   r   rK   rL   r   r   r   r   r   resnet_downr   r   rx   	skip_conv)r}   r   r    r!   r5   r   r#   r.   r$   r   r3   r=   r"   r   r~   s                 rO   rv   AttnSkipDownBlock2D.__init__  s    	--+}}R(%NN{  }I  |J  JK  L ".z"A)*a+\KLL +!-"/"{a/4"<1#4b9#(?"/(;, OO"" &</*="$&(,#'04# #@ ,()+<1,b1$;+$7( $ D !#|/g.h iDYYq,FSYZDN#D $D!DNrQ   r   r   skip_sampler_   .c                    [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        Sn[        U R                  U R
                  5       H  u  pU" X5      nU	" U5      nXq4-  nM     U R                  bE  U R                  X5      nU R                   H  n
U
" U5      nM     U R                  U5      U-   nXq4-  nXU4$ r
  )	r  r   r
   r   r   r   r   r-  r.  )r}   r   r   r0  r  r  r  r   r   r   r   s              rO   r   AttnSkipDownBlock2D.forwardc  s     t9q=FJJw5A #Ugw(;<doo>LF"=7M /M--M ?
 ( ,,]AM#00)+6  1 !NN;7-GM--M[88rQ   )r   r   r-  r   r.  NNr   r   r   r   npsqrtr   r   r   r   rv   r   r   r   r   r   r   r   r   s   @rO   rC   rC     s'     '0$ $"#%'WWS\#N"N" N" 	N"
 N" N" N" "%N" N" N"  N" #N" N" N"f (,.2	9||9 u||$9 ell+	9 
u||U5<<#45u||C	D9 9rQ   rC   c                   N  ^  \ rS rSrSSSSSS\R
                  " S5      SS4	S	\S
\S\S\S\S\S\S\S\	S\S\	S\4U 4S jjjr
  SS\R                  S\\R                     S\\R                     S\\R                  \\R                  S4   \R                  4   4S jjrSrU =r$ )rB   i  r   rq   r   r   r   Tr#  r   r    r!   r5   r   r#   r.   r$   r   r=   r"   r)   c                 "  > [         TU ]  5         [        R                  " / 5      U l        [        U5       HS  nUS:X  a  UOUnU R                  R                  [        UUUU[        US-  S5      [        US-  S5      UUUU
U	S95        MU     U(       ag  [        UUUU[        US-  S5      UUUU
U	SSSS9U l	        [        R                  " [        X"S9/5      U l        [        R                  " S	US
S
S9U l        g S U l	        S U l        S U l        g )Nr   r   r   r   Tr%  r&  r)  r	   r*  r+  )ru   rv   r   r   r   r   r   r   r   r-  r   r   rx   r.  )r}   r   r    r!   r5   r   r#   r.   r$   r   r=   r"   r)   r   r~   s                 rO   rv   SkipDownBlock2D.__init__  s    	}}R(z"A)*a+\KLL +!-"/"{a/4"<1#4b9#(?"/(;, #$ ,()+<1,b1$;+$7( $ D !#|/g.h iDYYq,FSYZDN#D $D!DNrQ   r   r   r0  r_   .c                 T   [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        SnU R                   H  nU" X5      nXq4-  nM     U R                  bE  U R                  X5      nU R                   H  n	U	" U5      nM     U R                  U5      U-   nXq4-  nXU4$ r
  )r  r   r
   r   r   r-  r.  )
r}   r   r   r0  r  r  r  r   r   r   s
             rO   r   SkipDownBlock2D.forward  s     t9q=FJJw5A #Ugw(;<llF"=7M--M # ( ,,]AM#00)+6  1 !NN;7-GM--M[88rQ   )r   r-  r   r.  r3  r4  r   s   @rO   rB   rB     s     '0$ $%'WWS\#"#9"9" 9" 	9"
 9" 9" 9" "%9" 9" 9" #9" 9"  9" 9"| (,.2	9||9 u||$9 ell+	9 
u||U5<<#45u||C	D9 9rQ   rB   c                      ^  \ rS rSr          SS\S\S\S\S\S\S\S	\S
\S\S\S\S\4U 4S jjjr SS\	R                  S\\	R                     S\\	R                  \\	R                  S4   4   4S jjrSrU =r$ )r;   i  r   r    r!   r5   r   r#   r.   r$   r'   r   r=   r"   r<   c                 `  > [         TU ]  5         / n[        U5       H/  nUS:X  a  UOUnUR                  [	        UUUUU	UUUUU
US95        M1     [
        R                  " U5      U l        U(       a/  [
        R                  " [	        UUUUU	UUUUU
USS9/5      U l        OS U l        SU l	        g )Nr   r   Tr   r    r!   r   r   r5   r   r   r=   r   r<   r   F)
ru   rv   r   r   r   r   r   r   r   r   )r}   r   r    r!   r5   r   r#   r.   r$   r'   r   r=   r"   r<   r   r   r~   s                   rO   rv    ResnetDownsampleBlock2D.__init__  s      	z"A)*a+\KNN +!-"/"(#(?"/(;,"/ #$ }}W- "!$0%1&3&, ',C&3,?!0&3!!D& !%D&+#rQ   r   r   r_   .c                    [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        SnU R                   HN  n[        R
                  " 5       (       a$  U R                  (       a  U R                  XqU5      nOU" X5      nXa4-   nMP     U R                  b   U R                   H  nU" X5      nM     Xa4-   nX4$ r
  r  r  s	            rO   r   ResnetDownsampleBlock2D.forward  s     t9q=FJJw5A #Ugw(;<llF$$&&4+F+F $ A A&Y] ^ &} ;),<<M # (#00 +M @  1 *,<<M++rQ   r  )
r   rq   r   r   r   r   Tr   TFr   r  r   s   @rO   r;   r;     s      '0$ $%(##=,=, =, 	=,
 =, =, =, "%=, =, =, =, #=, =, =, =,@ KO,"\\,19%,,1G,	u||U5<<#455	6, ,rQ   r;   c            $         ^  \ rS rSr              SS\S\S\S\S\S\S\S	\S
\S\S\S\S\S\S\S\S\\   4"U 4S jjjr	     SS\
R                  S\\
R                     S\\
R                     S\\
R                     S\\\\4      S\\
R                     S\\
R                  \\
R                  S4   4   4S jjrSrU =r$ ) rA   i6  r   r    r!   r5   r   r#   r.   r$   r'   r   r3   r(   r=   r"   r<   r,   r2   c                   > [         TU ]  5         SU l        / n/ nXl        X R                  -  U l        [        U5       H  nUS:X  a  UOUnUR                  [        UUUUU	UUUUU
US95        [        [        S5      (       a
  [        5       O	[        5       nUR                  [        UUU R                  UUU	SSUUUS95        M     [        R                  " U5      U l        [        R                  " U5      U l        U(       a/  [        R                  " [        UUUUU	UUUUU
USS9/5      U l        OS U l        SU l        g )NTr   r   r   r   r>  F)ru   rv   r   r3   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r}   r   r    r!   r5   r   r#   r.   r$   r'   r   r3   r(   r=   r"   r<   r,   r2   r   r   r   r   r~   s                         rO   rv   #SimpleCrossAttnDownBlock2D.__init__7  sa   ( 	#' 
"4%)@)@@z"A)*a+\KNN +!-"/"(#(?"/(;,"/" .5Q8V-W-W')]q]s  *(4../&9$1#')=)='- #J --
3}}W- "!$0%1&3&, ',C&3,?!0&3!!D& !%D&+#rQ   r   r   r   r   r   r   r_   .c                    Ub  UO0 nUR                  SS 5      b  [        R                  S5        SnUc  Uc  S OUnOUn[        U R                  U R
                  5       Hh  u  p[        R                  " 5       (       a0  U R                  (       a  U R                  XU5      nU
" U4UUS.UD6nOU	" X5      nU
" U4UUS.UD6nXq4-   nMj     U R                  b   U R                   H  nU" X5      nM     Xq4-   nX4$ )Nr   r   rJ   r   r   rK   rL   r   r   r   r   r   r   r   r   )r}   r   r   r   r   r   r   r   r   r   r   r   s               rO   r   "SimpleCrossAttnDownBlock2D.forward  s3    <R;]!7ce!%%gt4@NNpq!084>TD "Ddoo>LF$$&&4+F+F $ A A&Y] ^ $!!*?#'! -	! !'} ; $!!*?#'! -	! *,<<M' ?* (#00 +M @  1 *,<<M++rQ   )r3   r   r   r   r   r   r   )r   rq   r   r   r   r   Trq   r   r   TFFNr   )r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   s   @rO   rA   rA   6  s     '0$ $"##'%(##%*.2%\,\, \, 	\,
 \, \, \, "%\, \, \, \,  \, !\, #\, \,  !\," ##\,$ 'sm%\, \,B (,8<15;?9=5,||5, u||$5,  (5	5,
 !.5, !)c3h 85, !) 65, 
u||U5<<#455	65, 5,rQ   rA   c                      ^  \ rS rSr      SS\S\S\S\S\S\S\S	\S
\4U 4S jjjr SS\	R                  S\\	R                     S\\	R                  \\	R                  S4   4   4S jjrSrU =r$ )rF   i  r   r    r!   r5   r   r#   r$   resnet_group_sizer"   c
                 Z  > [         TU ]  5         / n
[        U5       H6  nUS:X  a  UOUnX-  nX(-  nU
R                  [	        UUUUUUUUSSS9
5        M8     [
        R                  " U
5      U l        U	(       a%  [
        R                  " [        5       /5      U l	        OS U l	        SU l
        g )Nr   	ada_groupF
r   r    r5   r!   r   r   r   r   r   conv_shortcut_bias)ru   rv   r   r   r   r   r   r   r   r   r   )r}   r   r    r!   r5   r   r#   r$   rI  r"   r   r   r   r   r~   s                 rO   rv   KDownBlock2D.__init__  s     	z"A)*a+\K 5F%:JNN% +!-#"/!)""/(3', #( }}W- "}.? @D $D&+#rQ   r   r   r_   .c                 z   [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        SnU R                   HN  n[        R
                  " 5       (       a$  U R                  (       a  U R                  XqU5      nOU" X5      nXa4-  nMP     U R                  b  U R                   H  nU" U5      nM     X4$ r
  r  r  s	            rO   r   KDownBlock2D.forward  s     t9q=FJJw5A #Ugw(;<llF$$&&4+F+F $ A A&Y] ^ &} ;--M # (#00 +M :  1 ++rQ   r  )r   r   h㈵>gelur   Fr   r  r   s   @rO   rF   rF     s      #!#$+,+, +, 	+,
 +, +, +, +, +, +, +,\ KO,"\\,19%,,1G,	u||U5<<#455	6, ,rQ   rF   c                   l  ^  \ rS rSr        SS\S\S\S\S\S\S\S	\S
\S\S\S\4U 4S jjjr     SS\	R                  S\\	R                     S\\	R                     S\\	R                     S\\\\4      S\\	R                     S\\	R                  \\	R                  S4   4   4S jjrSrU =r$ )rG   i  r   r    r!   r(   r5   r   rI  r"   r3   rH   r#   r$   c                   > [         TU ]  5         / n/ nSU l        [        U5       HX  nUS:X  a  UOUnX-  nX'-  nUR	                  [        UUUUUUUUSSS9
5        UR	                  [        UX)-  U	UUSU
SUS9	5        MZ     [        R                  " U5      U l	        [        R                  " U5      U l
        U(       a%  [        R                  " [        5       /5      U l        OS U l        SU l        g )NTr   rK  FrL  
layer_norm)r(   r!   attention_biasrH   r2   
group_size)ru   rv   r   r   r   r   KAttentionBlockr   r   r   r   r   r   r   )r}   r   r    r!   r(   r5   r   rI  r"   r3   rH   r#   r$   r   r   r   r   r   r~   s                     rO   rv   KCrossAttnDownBlock2D.__init__  s    	
#' z"A)*a+\K 5F%:JNN% +!-#"/!)""/(3',   6&(;"/#''9)50
' #B }}W---
3 "}.? @D $D&+#rQ   r   r   r   r   r   r   r_   .c           
         Ub  UO0 nUR                  SS 5      b  [        R                  S5        Sn[        U R                  U R
                  5       H{  u  p[        R                  " 5       (       a0  U R                  (       a  U R                  UUU5      nU	" UUUUUUS9nOU" X5      nU	" UUUUUUS9nU R                  c  US-  nMv  Xq4-  nM}     U R                  b  U R                   H  n
U
" U5      nM     X4$ )Nr   r   rJ   r   embr   r   r   r   rF  )r}   r   r   r   r   r   r   r   r   r   r   s              rO   r   KCrossAttnDownBlock2D.forwardT  s     <R;]!7ce!%%gt4@NNpqdoo>LF$$&&4+F+F $ A A!!
 !%!*?#1+A+A! !'} ; $!*?#1+A+A!   ((!11; ?> (#00 +M :  1 ++rQ   )r   r   r   r   r   )r   r   r   T@   FrQ  rR  r   )r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r   s   @rO   rG   rG     sN    !##"$#( #>,>, >, 	>,
 !>, >, >, >, >,  >, !>, >, >, >,F (,8<15;?9=2,||2, u||$2,  (5	2,
 !.2, !)c3h 82, !) 62, 
u||U5<<#455	62, 2,rQ   rG   c                     ^  \ rS rSr           SS\S\S\S\S\S\S\S	\S
\S\S\S\S\S\S\4U 4S jjjr  SS\	R                  S\\	R                  S4   S\\	R                     S\\   S\	R                  4
S jjrSrU =r$ )re   i  r   r[   r    r!   r]   r5   r   r#   r.   r$   r'   r   r3   r=   r^   c                   > [         TU ]  5         / n/ nXl        Uc  [        R	                  SU S35        Un[        U5       Ha  nUUS-
  :X  a  UOUnUS:X  a  UOUnUR                  [        UU-   UUUUUU	U
UUS9
5        UR                  [        UX=-  UUUUSSSSS9
5        Mc     [        R                  " U5      U l        [        R                  " U5      U l        US:X  a&  [        R                  " [        USUS	9/5      U l        O;US
:X  a.  [        R                  " [        UUUUUUU	U
UUSS9/5      U l        OS U l        SU l        XPl        g )Nr   r7   rq   r   r   Tr   r?   r   r    r   )r   r    r!   r   r   r5   r   r   r=   r   upF)ru   rv   r^   rK   rL   r   r   r   r   r   r   r   r   r   
upsamplersr   r]   )r}   r   r[   r    r!   r]   r5   r   r#   r.   r$   r'   r   r3   r=   r^   r   r   r   res_skip_channelsresnet_in_channelsr~   s                        rO   rv   AttnUpBlock2D.__init__  s   $ 	
*%NN{  }I  |J  JK  L ".z"A01Z!^0C,89Q!4LNN 25F F!-"/"(#(?"/(;,  &</*="$1(,#'04% #B --
3}}W-F" mmZtbn-o,pqDOh& mm!$0%1&3&, ',C&3,?!0DO$ #DO&+#,rQ   r   res_hidden_states_tuple.r   r   r_   c                 (   [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        [        U R                  U R
                  5       H|  u  pUS   n
US S n[        R                  " X/SS9n[        R                  " 5       (       a-  U R                  (       a  U R                  XU5      nU	" U5      nMl  U" X5      nU	" U5      nM~     U R                  b3  U R                   H#  nU R                  S:X  a  U" XS	9nM  U" U5      nM%     U$ )
Nr   r   r  r  rq   dimr   r   )r  r   r
   r   r   r   r   catr   r   r   rc  r^   )r}   r   rg  r   r   r  r  r  r   r   res_hidden_states	upsamplers               rO   r   AttnUpBlock2D.forward  s    t9q=FJJw5A #Ugw(;<doo>LF 7 ;&=cr&B#!II}&HaPM$$&&4+F+F $ A A&Y] ^ $] 3 &} ; $] 3 ? ??&!__	%%1$-m$GM$-m$<M	 - rQ   )r   r   r   r]   r^   rc  )Nr   rq   r   r   r   r   Trq   r   r?   r3  )r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   s   @rO   re   re     s;    # '0$ $"#%(#!Z-Z- !Z- 	Z-
 Z- Z- Z- Z- Z- "%Z- Z- Z- Z-  Z- #Z-  !Z- Z-@ (,'+!||! "'u||S'8!9! u||$	!
  }! 
! !rQ   re   c            -         ^  \ rS rSr                  S%S\S\S\S\S\\   S\S\S	\\\\   4   S
\S\	S\	S\S\
S\S\S\S\
S\
S\
S\
S\
S\	4,U 4S jjjr      S&S\R                  S\\R                  S4   S\\R                     S\\R                     S\\\	\4      S\\   S \\R                     S!\\R                     S"\R                  4S# jjrS$rU =r$ )'rc   i
	  r   r    r[   r!   r]   r5   r   r%   r#   r.   r$   r'   r   r&   r(   r=   r\   r*   r+   r,   r-   r/   c                   > [         TU ]  5         / n/ nSU l        Xl        [	        U[
        5      (       a  U/U-  n[        U5       H  nUUS-
  :X  a  UOUnUS:X  a  UOUnUR                  [        UU-   UUU	UUU
UUUS9
5        U(       d(  UR                  [        UX.-  UUU   UUUUUUS9
5        Mm  UR                  [        UX.-  USUUS95        M     [        R                  " U5      U l        [        R                  " U5      U l        U(       a&  [        R                  " [        USUS9/5      U l        OS U l        SU l        XPl        g )	NTrq   r   r   r   r   ra  F)ru   rv   r   r&   r   r   r   r   r   r   r   r   r   r   r   r   rc  r   r]   )r}   r   r    r[   r!   r]   r5   r   r%   r#   r.   r$   r'   r   r&   r(   r=   r\   r*   r+   r,   r-   r/   r   r   r   rd  re  r~   s                               rO   rv   CrossAttnUpBlock2D.__init__	  st   2 	
#' #6 2C88,H+IJ+V(z"A01Z!^0C,89Q!4LNN 25F F!-"/"(#(?"/(;, (!!&+$;$0#?#B,?(5.C-A)9'5 !!*+$;$0#$,?(5	E #X --
3}}W- mmZtbn-o,pqDO"DO&+#,rQ   r   rg  .r   r   r   r   r   r   r_   c	                 *   Ub(  UR                  SS 5      b  [        R                  S5        [        U SS 5      =(       a5    [        U SS 5      =(       a!    [        U SS 5      =(       a    [        U SS 5      n	[	        U R
                  U R                  5       H  u  pUS   nUS S nU	(       aC  [        U R                  UUU R                  U R                  U R                  U R                  S9u  p[        R                  " X/S	S
9n[        R                  " 5       (       a3  U R                   (       a"  U R#                  XU5      nU" UUUUUSS9S   nM  U
" X5      nU" UUUUUSS9S   nM     U R$                  b  U R$                   H  nU" X5      nM     U$ )Nr   r   s1s2b1b2ri  rt  ru  rv  rw  rq   rj  Fr   r   )r   rK   rL   getattrr   r   r   r   r]   rt  ru  rv  rw  r   rl  r   r   r   rc  )r}   r   rg  r   r   r   r   r   r   is_freeu_enabledr   r   rm  rn  s                 rO   r   CrossAttnUpBlock2D.forwarde	  s    "-%))'48Dtu D$% *dD)*dD)* dD)	 	  doo>LF 7 ;&=cr&B#  3>''!%wwwwwwww40 "II}&HaPM$$&&4+F+F $ A A&Y] ^ $!*?+A#1+A %! ! !'} ; $!*?+A#1+A %! !? ?P ??&!__	 )- G - rQ   )r   r   r   r&   r   r]   rc  )Nr   rq   rq   r   r   r   r   Trq   r   r   TFFFFr   r  r   r   s   @rO   rc   rc   
	  s    )-?@ '0$ $#$#'%(!%*&+%*!&'/X-X- X- !	X-
 X- !X- X- X- ',CsO&<X- X- "%X- X- X- X- !X-  !!X-" ##X-$ %X-& #'X-(  $)X-* #+X-, -X-. /X- X-| (,8<;?'+159=B||B "'u||S'8!9B u||$	B
  (5B !)c3h 8B  }B !.B !) 6B 
B BrQ   rc   c                     ^  \ rS rSr          SS\S\S\S\S\\   S\S\S	\S
\S\S\S\S\S\4U 4S jjjr	  SS\
R                  S\\
R                  S4   S\\
R                     S\\   S\
R                  4
S jjrSrU =r$ )ra   i	  r   r[   r    r!   r]   r5   r   r#   r.   r$   r'   r   r=   r\   c                 x  > [         TU ]  5         / n[        U5       H>  nUUS-
  :X  a  UOUnUS:X  a  UOUnUR                  [	        UU-   UUUUUU	U
UUS9
5        M@     [
        R                  " U5      U l        U(       a&  [
        R                  " [        USUS9/5      U l	        OS U l	        SU l
        XPl        g )Nrq   r   r   Tra  F)ru   rv   r   r   r   r   r   r   r   rc  r   r]   )r}   r   r[   r    r!   r]   r5   r   r#   r.   r$   r'   r   r=   r\   r   r   rd  re  r~   s                      rO   rv   UpBlock2D.__init__	  s    " 	z"A01Z!^0C,89Q!4LNN 25F F!-"/"(#(?"/(;,	 #& }}W- mmZtbn-o,pqDO"DO&+#,rQ   r   rg  .r   r   r_   c                    [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        [        U SS 5      =(       a5    [        U SS 5      =(       a!    [        U SS 5      =(       a    [        U SS 5      nU R                   H  n	US	   n
US S	 nU(       aC  [        U R                  UU
U R                  U R                  U R                  U R                  S
9u  p[        R                  " X/SS9n[        R                  " 5       (       a%  U R                  (       a  U R                  XU5      nM  U	" X5      nM     U R                   b  U R                    H  nU" X5      nM     U$ )Nr   r   r  r  rt  ru  rv  rw  ri  rx  rq   rj  )r  r   r
   ry  r   r   r]   rt  ru  rv  rw  r   rl  r   r   r   rc  )r}   r   rg  r   r   r  r  r  rz  r   rm  rn  s               rO   r   UpBlock2D.forward	  sW    t9q=FJJw5A #Ugw(;< D$% *dD)*dD)* dD)	 	 llF 7 ;&=cr&B#  3>''!%wwwwwwww40 "II}&HaPM$$&&4+F+F $ A A&Y] ^ &} ;- #0 ??&!__	 )- G - rQ   r   r   r]   rc  )
Nr   rq   r   r   r   r   Tr   Tr3  r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   s   @rO   ra   ra   	  s!    )- '0$ $%(!/-/- !/- 	/-
 /- !/- /- /- /- "%/- /- /- /- #/- /- /-j (,'+0||0 "'u||S'8!90 u||$	0
  }0 
0 0rQ   ra   c                      ^  \ rS rSr           SS\S\S\\   S\S\S\S\S	\S
\S\S\S\S\\   4U 4S jjjr	SS\
R                  S\\
R                     S\
R                  4S jjrSrU =r$ )rh   i
  r   r    r]   r5   r   r#   r.   r$   r'   r   r=   r\   r!   c                   > [         TU ]  5         / n[        U5       HV  nUS:X  a  UOUnUS:X  a"  UR                  [	        UUUUU	USUUS9	5        M5  UR                  [        UUUUU	UUUUU
S9
5        MX     [        R                  " U5      U l        U(       a&  [        R                  " [        USUS9/5      U l
        OS U l
        X0l        g )Nr   r   r   r   Tra  )ru   rv   r   r   r   r   r   r   r   r   rc  r]   )r}   r   r    r]   r5   r   r#   r.   r$   r'   r   r=   r\   r!   r   r   input_channelsr~   s                    rO   rv   UpDecoderBlock2D.__init__
  s      	z"A,-F[N&)3)$2%1&3&, ',5&3,?
 !$2%1&3&, ',C&3,?!0% #B }}W- mmZtbn-o,pqDO"DO,rQ   r   r   r_   c                     U R                    H	  nU" XS9nM     U R                  b  U R                   H  nU" U5      nM     U$ Nr   )r   rc  )r}   r   r   r   rn  s        rO   r   UpDecoderBlock2D.forwardM
  sF    llF"=<M # ??&!__	 )- 8 - rQ   )r   r]   rc  )Nr   rq   r   r   r   r   Tr   TNr   r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   s   @rO   rh   rh   
  s    
 )- '0$ $%(!'+;-;- ;- !	;-
 ;- ;- ;- "%;- ;- ;- ;- #;- ;-  };- ;-zU\\ %,,9O [`[g[g  rQ   rh   c                      ^  \ rS rSr            SS\S\S\\   S\S\S\S\S	\S
\S\S\S\S\S\\   4U 4S jjjr	SS\
R                  S\\
R                     S\
R                  4S jjrSrU =r$ )ri   iX
  r   r    r]   r5   r   r#   r.   r$   r'   r   r3   r=   r\   r!   c                 v  > [         TU ]  5         / n/ nUc  [        R                  SU S35        Un[	        U5       H  nUS:X  a  UOUnUS:X  a!  UR                  [        UUUUU	USUUS9	5        O!UR                  [        UUUUU	UUUUU
S9
5        UR                  [        UX+-  UUUUS:w  a  U	OS US:X  a  UOS SSSSS95        M     [        R                  " U5      U l        [        R                  " U5      U l        U(       a&  [        R                  " [        USUS	9/5      U l        OS U l        X0l        g )
NjIt is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `out_channels`: r7   r   r   r   r   Tr   ra  )ru   rv   rK   rL   r   r   r   r   r   r   r   r   r   r   rc  r]   )r}   r   r    r]   r5   r   r#   r.   r$   r'   r   r3   r=   r\   r!   r   r   r   r  r~   s                      rO   rv   AttnUpDecoderBlock2D.__init__Y
  s|   " 	
%NN|  ~J  }K  KL  M ".z"A,-F[N&)3)$2%1&3&, ',5&3,?
 !$2%1&3&, ',C&3,?!0  &</*="5LPY5YM_c6MQZ6Z]`d(,#'04C #b --
3}}W- mmZtbn-o,pqDO"DO,rQ   r   r   r_   c                     [        U R                  U R                  5       H  u  p4U" XS9nU" XS9nM     U R                  b  U R                   H  nU" U5      nM     U$ r  )r   r   r   rc  )r}   r   r   r   r   rn  s         rO   r   AttnUpDecoderBlock2D.forward
  s]    doo>LF"=<M :M ? ??&!__	 )- 8 - rQ   )r   r   r]   rc  )Nr   rq   r   r   r   r   Trq   r   TNr   r  r   s   @rO   ri   ri   X
  s	   
 )- '0$ $"#%(!'+T-T- T- !	T-
 T- T- T- "%T- T- T- T-  T- #T- T-  }T- T-l	U\\ 	%,,9O 	[`[g[g 	 	rQ   ri   c                   B  ^  \ rS rSrSSSSSSSS\R
                  " S	5      S4
S
\S\S\S\S\\   S\S\S\S\	S\	S\
S\S\S\
4U 4S jjjr  S S\R                  S\\R                  S4   S\\R                     S\\R                  \R                  4   4S jjrSrU =r$ )!rg   i
  Nr   rq   r   r   r   Tr#  r   r[   r    r!   r]   r5   r   r#   r.   r$   r   r3   r=   r\   c                   > [         TU ]  5         [        R                  " / 5      U l        [        R                  " / 5      U l        [        U5       He  nXS-
  :X  a  UOUnUS:X  a  UOUnU R
                  R                  [        UU-   UUU[        UUS-  -   S5      [        US-  S5      UU	U
UUS95        Mg     Uc  [        R                  SU S35        UnU R                  R                  [        UX<-  UUUSSSSSS	9
5        [        XS
9U l        U(       a  [        UUUU[        US-  S5      [        US-  S5      UU	U
UUSSSS9U l        [        R                   " USSSSS9U l        [$        R                  R'                  [        US-  S5      X8SS9U l        [        R*                  " 5       U l        OS U l        S U l        S U l        S U l        XPl        g )Nrq   r   r   r   r   r  r7   Tr   r)  r%  r   r    r!   r   r   r   r5   r   r   r=   r   r'  rb  r(  r	   r	   r	   r*  rr   r,  rs   
num_groupsnum_channelsr   affine)ru   rv   r   r   r   r   r   r   r   r   rK   rL   r   r   rn  	resnet_uprx   r.  r   	GroupNorm	skip_normSiLUactr]   )r}   r   r[   r    r!   r]   r5   r   r#   r.   r$   r   r3   r=   r\   r   rd  re  r~   s                     rO   rv   AttnSkipUpBlock2D.__init__
  s   " 	--+}}R(z"A01!^0C,89Q!4LLL 25F F!-"/"14E4JJBO"<1#4b9#(?"/(;,	 #( %NN|  ~J  }K  KL  M "."8+&9 "$(#,0	
 '{N*()+<1,b1|q0"5$;+$7( $DN   YY|QFSYcijDN"XX//|q0"5Lim 0 DN wwyDH!DN!DN!DNDH,rQ   r   rg  .r   r_   c                    [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        U R                   H+  nUS   n	US S n[        R
                  " X/SS9nU" X5      nM-     U R                  S   " U5      nUb  U R                  U5      nOSnU R                  bH  U R                  U5      n
U R                  U
5      n
U R                  U
5      n
XJ-   nU R                  X5      nX4$ Nr   r   r  r  ri  rq   rj  )r  r   r
   r   r   rl  r   rn  r  r  r  r.  r}   r   rg  r   r0  r  r  r  r   rm  skip_sample_statess              rO   r   AttnSkipUpBlock2D.forward  s     t9q=FJJw5A #Ugw(;<llF 7 ;&=cr&B#!II}&HaPM"=7M # *=9"..5KK>>%!%!>!%*<!=!%0B!C%:K NN=?M))rQ   )r  r   r  r   r]   r.  r  rn  r3  r   r   r   r   r5  r6  r   r   r   r   r   rv   r   r   r   r   r   r   r   s   @rO   rg   rg   
  s9    )- '0$ $"#%'WWS\![-[- ![- 	[-
 [- ![- [- [- [- "%[- [- [-  [- #[- [- [-B (,%*||%* "'u||S'8!9%* u||$	%* 
u||U\\)	*%* %*rQ   rg   c                   B  ^  \ rS rSrSSSSSSS\R
                  " S	5      SS4
S
\S\S\S\S\\   S\S\S\S\	S\	S\
S\S\
S\4U 4S jjjr  S S\R                  S\\R                  S4   S\\R                     S\\R                  \R                  4   4S jjrSrU =r$ )!rf   iA  Nr   rq   r   r   r   Tr#  r   r[   r    r!   r]   r5   r   r#   r.   r$   r   r=   r\   upsample_paddingc                   > [         TU ]  5         [        R                  " / 5      U l        [        U5       He  nXS-
  :X  a  UOUnUS:X  a  UOUnU R                  R                  [        UU-   UUU[        UU-   S-  S5      [        US-  S5      UU	U
UUS95        Mg     [        XS9U l
        U(       a  [        UUUU[        US-  S5      [        US-  S5      UU	U
UUSSSS	9U l        [        R                  " US
SSSS9U l        [        R                  R                  [        US-  S5      X8SS9U l        [        R"                  " 5       U l        OS U l        S U l        S U l        S U l        XPl        g )Nrq   r   r   r   r   r)  Tr%  r  r	   r  r*  r  r  )ru   rv   r   r   r   r   r   r   r   r   rn  r  rx   r.  r   r  r  r  r  r]   )r}   r   r[   r    r!   r]   r5   r   r#   r.   r$   r   r=   r\   r  r   rd  re  r~   s                     rO   rv   SkipUpBlock2D.__init__B  s   " 	}}R(z"A01!^0C,89Q!4LLL 25F F!-"/" 25F F1LbQ"<1#4b9#(?"/(;,	 #( '{N*()+<1,b1|q0"5$;+$7( $DN   YY|QFSYcijDN"XX//|q0"5Lim 0 DN wwyDH!DN!DN!DNDH,rQ   r   rg  .r   r_   c                    [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        U R                   H+  nUS   n	US S n[        R
                  " X/SS9nU" X5      nM-     Ub  U R                  U5      nOSnU R                  bH  U R                  U5      n
U R                  U
5      n
U R                  U
5      n
XJ-   nU R                  X5      nX4$ r  )r  r   r
   r   r   rl  rn  r  r  r  r.  r  s              rO   r   SkipUpBlock2D.forward  s     t9q=FJJw5A #Ugw(;<llF 7 ;&=cr&B#!II}&HaPM"=7M # "..5KK>>%!%!>!%*<!=!%0B!C%:K NN=?M))rQ   )r  r  r   r]   r.  r  rn  r3  r  r   s   @rO   rf   rf   A  s9    )- '0$ $%'WWS\! !E-E- !E- 	E-
 E- !E- E- E- E- "%E- E- E- #E- E- E- E-V (,#*||#* "'u||S'8!9#* u||$	#* 
u||U\\)	*#* #*rQ   rf   c                     ^  \ rS rSr           SS\S\S\S\S\\   S\S\S	\S
\S\S\S\S\S\S\4U 4S jjjr	  SS\
R                  S\\
R                  S4   S\\
R                     S\\   S\
R                  4
S jjrSrU =r$ )rb   i  r   r[   r    r!   r]   r5   r   r#   r.   r$   r'   r   r=   r\   r<   c                   > [         TU ]  5         / n[        U5       H?  nUUS-
  :X  a  UOUnUS:X  a  UOUnUR                  [	        UU-   UUUUUU	U
UUUS95        MA     [
        R                  " U5      U l        U(       a/  [
        R                  " [	        UUUUUUU	U
UUUSS9/5      U l        OS U l        SU l	        XPl
        g )Nrq   r   r   Tr   r    r!   r   r   r5   r   r   r=   r   r<   rb  F)ru   rv   r   r   r   r   r   r   rc  r   r]   )r}   r   r[   r    r!   r]   r5   r   r#   r.   r$   r'   r   r=   r\   r<   r   r   rd  re  r~   s                       rO   rv   ResnetUpsampleBlock2D.__init__  s    $ 	z"A01Z!^0C,89Q!4LNN 25F F!-"/"(#(?"/(;,"/	 #( }}W- mm!$0%1&3&, ',C&3,?!0&3DO& #DO&+#,rQ   r   rg  .r   r   r_   c                    [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        U R                   Hj  nUS   n	US S n[        R
                  " X/SS9n[        R                  " 5       (       a%  U R                  (       a  U R                  XU5      nMb  U" X5      nMl     U R                  b  U R                   H  n
U
" X5      nM     U$ r  )
r  r   r
   r   r   rl  r   r   r   rc  )r}   r   rg  r   r   r  r  r  r   rm  rn  s              rO   r   ResnetUpsampleBlock2D.forward  s     t9q=FJJw5A #Ugw(;<llF 7 ;&=cr&B#!II}&HaPM$$&&4+F+F $ A A&Y] ^ &} ; # ??&!__	 )- > - rQ   r  )Nr   rq   r   r   r   r   Tr   TFr3  r  r   s   @rO   rb   rb     s?    )- '0$ $%(!#!B-B- !B- 	B-
 B- !B- B- B- B- "%B- B- B- B- #B- B-  !B- B-P (,'+|| "'u||S'8!9 u||$	
  } 
 rQ   rb   c            (         ^  \ rS rSr               S"S\S\S\S\S\\   S\S\S	\S
\S\S\S\S\S\S\S\S\S\S\\   4&U 4S jjjr	      S#S\
R                  S\\
R                  S4   S\\
R                     S\\
R                     S\\   S\\
R                     S\\\\4      S\\
R                     S\
R                  4S  jjrS!rU =r$ )$rd   i  r   r    r[   r!   r]   r5   r   r#   r.   r$   r'   r   r3   r(   r=   r\   r<   r,   r2   c                   > [         TU ]  5         / n/ nSU l        Xl        X R                  -  U l        [        U5       H  nUUS-
  :X  a  UOUnUS:X  a  UOUnUR                  [        UU-   UUUUUU	U
UUUS95        [        [        S5      (       a
  [        5       O	[        5       nUR                  [        UUU R                  U R                  UUSSUUUS95        M     [        R                  " U5      U l        [        R                  " U5      U l        U(       a/  [        R                  " [        UUUUUUU	U
UUUSS9/5      U l        OS U l        SU l        XPl        g )	NTrq   r   r   r   r   r  F)ru   rv   r   r3   r   r   r   r   r   r   r   r   r   r   r   r   r   rc  r   r]   )r}   r   r    r[   r!   r]   r5   r   r#   r.   r$   r'   r   r3   r(   r=   r\   r<   r,   r2   r   r   r   rd  re  r   r~   s                             rO   rv   !SimpleCrossAttnUpBlock2D.__init__  s   , 	
#' "4%)@)@@z"A01Z!^0C,89Q!4LNN 25F F!-"/"(#(?"/(;,"/" .5Q8V-W-W')]q]s  *(4..!44&9$1#')=)='1 #N --
3}}W- mm!$0%1&3&, ',C&3,?!0&3DO& #DO&+#,rQ   r   rg  .r   r   r   r   r   r   r_   c	                    Ub  UO0 nUR                  SS 5      b  [        R                  S5        Uc  Uc  S OUn	OUn	[        U R                  U R
                  5       H  u  pUS   nUS S n[        R                  " X/SS9n[        R                  " 5       (       a1  U R                  (       a   U R                  XU5      nU" U4UU	S.UD6nMp  U
" X5      nU" U4UU	S.UD6nM     U R                  b  U R                   H  nU" X5      nM     U$ )Nr   r   ri  rq   rj  r   )r   rK   rL   r   r   r   r   rl  r   r   r   rc  )r}   r   rg  r   r   r   r   r   r   r   r   r   rm  rn  s                 rO   r    SimpleCrossAttnUpBlock2D.forwardv  s<    <R;]!7ce!%%gt4@NNpq!084>TD "Ddoo>LF !8 ;&=cr&B#!II}&HaPM$$&&4+F+F $ A A&Y] ^ $!!*?#'! -	! !'} ; $!!*?#'! -	!% ?2 ??&!__	 )- > - rQ   )r3   r   r   r   r   r   r]   rc  )Nr   rq   r   r   r   r   Trq   r   r   TFFNr  )r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   s   @rO   rd   rd     s    )- '0$ $"##'%(!#%*.2)`-`- `- !	`-
 `- !`- `- `- `- "%`- `- `- `-  `- !`-  #!`-" #`-$ %`-& #'`-( 'sm)`- `-L (,8<'+15;?9=7||7 "'u||S'8!97 u||$	7
  (57  }7 !.7 !)c3h 87 !) 67 
7 7rQ   rd   c                      ^  \ rS rSr      SS\S\S\S\S\S\S\S	\S
\\   S\4U 4S jjjr	  SS\
R                  S\\
R                  S4   S\\
R                     S\\   S\
R                  4
S jjrSrU =r$ )rj   i  r   r    r!   r]   r5   r   r#   r$   rI  r\   c                   > [         TU ]  5         / nSU-  nUnUS-
  n[        U5       H@  nUS:X  a  UOUnX-  nX)-  nUR                  [	        UXS-
  :X  a  UOUUUUUUUSSS9
5        MB     [
        R                  " U5      U l        U
(       a%  [
        R                  " [        5       /5      U l	        OS U l	        SU l
        X@l        g )Nr   rq   r   rK  F)
r   r    r!   r   r   r   r5   r   r   rM  )ru   rv   r   r   r   r   r   r   r   rc  r   r]   )r}   r   r    r!   r]   r5   r   r#   r$   rI  r\   r   k_in_channelsk_out_channelsr   r   r   r~   s                    rO   rv   KUpBlock2D.__init__  s     	L($!^
z"A+,6-|K 5F%:JNN% +45a4Gl"/"!)#"/(3', #( }}W- mm[]O<DO"DO&+#,rQ   r   rg  .r   r   r_   c                    [        U5      S:  d  UR                  SS 5      b  Sn[        SSU5        US   nUb  [        R                  " X/SS9nU R
                   HJ  n[        R                  " 5       (       a%  U R                  (       a  U R                  XU5      nMB  U" X5      nML     U R                  b  U R                   H  n	U	" U5      nM     U$ r  )
r  r   r
   r   rl  r   r   r   r   rc  )
r}   r   rg  r   r   r  r  r  r   rn  s
             rO   r   KUpBlock2D.forward  s     t9q=FJJw5A #Ugw(;<"9""=".!II}&NTUVMllF$$&&4+F+F $ A A&Y] ^ &} ;	 # ??&!__	 )- 8 - rQ   r  )r      rQ  rR  r   Tr3  )r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   s   @rO   rj   rj     s      #+-!/-/- /- 	/-
 /- /- /- /- /- $C=/- /- /-j (,'+|| "'u||S'8!9 u||$	
  } 
 rQ   rj   c                   x  ^  \ rS rSr         SS\S\S\S\S\S\S\S	\S
\S\S\S\S\4U 4S jjjr      SS\	R                  S\\	R                  S4   S\\	R                     S\\	R                     S\\\\4      S\\   S\\	R                     S\\	R                     S\	R                  4S jjrSrU =r$ )rk   i   r   r    r!   r]   r5   r   r#   r$   rI  r3   r(   r\   r-   c                   > [         TU ]  5         / n/ nXs=:H  =(       a    U:H  Os  nX:g  nU(       a  SOSnSU l        Xl        U(       a  UOSU-  nUnUS-
  n[	        U5       H  nUS:X  a  UOUnX-  nX)-  nU(       a  UUS-
  :X  a  UnOS nUR                  [        UUUUUUUUUSSS95        UR                  [        UUS-
  :X  a  UOUUUS-
  :X  a  UU
-  OX*-  U
UUSUSUS	9	5        M     [        R                  " U5      U l
        [        R                  " U5      U l        U(       a%  [        R                  " [        5       /5      U l        OS U l        SU l        X@l        g )
NTFr   rq   r   rK  )r   r    conv_2d_out_channelsr!   r   r   r   r5   r   r   rM  rU  )r(   r!   rV  rH   r2   r-   )ru   rv   r   r3   r   r   r   rX  r   r   r   r   r   rc  r   r]   )r}   r   r    r!   r]   r5   r   r#   r$   rI  r3   r(   r\   r-   r   r   is_first_blockis_middle_blockrH   r  r  r   r   r   r  r~   s                            rO   rv   KCrossAttnUpBlock2D.__init__  s     	
$EEE%5%3T#' "4 )7A<L$!^
z"A+,6-|K 5F%:JAa$7'5$'+$NN% +!-)="/"!)#"/(3', '(JN':NZ!^+ #&88%;&(;"/#''9)5%53 #R }}W---
3 mm[]O<DO"DO&+#,rQ   r   rg  .r   r   r   r   r   r   r_   c	           
         US   nUb  [         R                  " X/SS9n[        U R                  U R                  5       Hc  u  p[         R
                  " 5       (       a1  U R                  (       a   U R                  U	UU5      nU
" UUUUUUS9nMP  U	" X5      nU
" UUUUUUS9nMe     U R                  b  U R                   H  nU" U5      nM     U$ )Nri  rq   rj  r[  )	r   rl  r   r   r   r   r   r   rc  )r}   r   rg  r   r   r   r   r   r   r   r   rn  s               rO   r   KCrossAttnUpBlock2D.forwardV  s     #:""=".!II}&NTUVMdoo>LF$$&&4+F+F $ A A!!
 !%!*?#1+A+A! !'} ; $!*?#1+A+A!# ?4 ??&!__	 )- 8 - rQ   )r3   r   r   r   r   r]   rc  )	r   r   rQ  rR  r   rq      TFr  )r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r   s   @rO   rk   rk      s{     #!#"##&!!&S-S- S- 	S-
 S- S- S- S- S- S-  S- !S- S- S- S-r (,8<;?'+159=-||- "'u||S'8!9- u||$	-
  (5- !)c3h 8-  }- !.- !) 6- 
- -rQ   rk   c                     ^  \ rS rSrSr        SS\S\S\S\S\\   S\S	\S
\S\S\\	   S\4U 4S jjjr
S\R                  S\S\S\R                  4S jrS\R                  S\S\S\R                  4S jr     SS\R                  S\\R                     S\\R                     S\\R                     S\\\	\4      S\\R                     S\R                  4S jjrSrU =r$ )rX  i  a  
A basic Transformer block.

Parameters:
    dim (`int`): The number of channels in the input and output.
    num_attention_heads (`int`): The number of heads to use for multi-head attention.
    attention_head_dim (`int`): The number of channels in each head.
    dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use.
    cross_attention_dim (`int`, *optional*): The size of the encoder_hidden_states vector for cross attention.
    attention_bias (`bool`, *optional*, defaults to `False`):
        Configure if the attention layers should contain a bias parameter.
    upcast_attention (`bool`, *optional*, defaults to `False`):
        Set to `True` to upcast the attention computation to `float32`.
    temb_channels (`int`, *optional*, defaults to 768):
        The number of channels in the token embedding.
    add_self_attention (`bool`, *optional*, defaults to `False`):
        Set to `True` to add self-attention to the block.
    cross_attention_norm (`str`, *optional*, defaults to `None`):
        The type of normalization to use for the cross attention. Can be `None`, `layer_norm`, or `group_norm`.
    group_size (`int`, *optional*, defaults to 32):
        The number of groups to separate the channels into for group normalization.
rk  r&   r3   r5   r(   rV  r-   r!   rH   r2   rW  c                   > [         TU ]  5         Xl        U	(       a1  [        X[	        SX-  5      5      U l        [        UUUUUS S S9U l        [        X[	        SX-  5      5      U l        [        UUUUUUUU
S9U l	        g )Nrq   )r   r   r   r5   rt   r(   r2   )r   r(   r   r   r5   rt   r-   r2   )
ru   rv   rH   r   maxnorm1r   attn1norm2attn2)r}   rk  r&   r3   r5   r(   rV  r-   r!   rH   r2   rW  r~   s               rO   rv   KAttentionBlock.__init__  s     	"4 %m#aAR:STDJ")+#$(%)DJ "-c!S=N6OP
 3%'-!5	

rQ   r   heightweightr_   c                 j    UR                  SSSS5      R                  UR                  S   X#-  S5      $ )Nr   r   r	   rq   ri  permutereshapeshaper}   r   r  r  s       rO   _to_3dKAttentionBlock._to_3d  s8    $$Q1a0889L9LQ9OQWQ`bdeerQ   c                 d    UR                  SSS5      R                  UR                  S   SX#5      $ )Nr   r   rq   ri  r  r  s       rO   _to_4dKAttentionBlock._to_4d  s2    $$Q1-55m6I6I!6LbRXaarQ   r   r\  r   r   r   c                    Ub  UO0 nUR                  SS 5      b  [        R                  S5        U R                  (       a`  U R	                  X5      nUR
                  SS  u  pU R                  XxU	5      nU R                  " U4S US.UD6n
U R                  XU	5      n
X-   nU R                  X5      nUR
                  SS  u  pU R                  XxU	5      nU R                  " U4UUc  UOUS.UD6n
U R                  XU	5      n
X-   nU$ )Nr   r   r   r   )r   rK   rL   rH   r  r  r  r  r  r  r  )r}   r   r   r\  r   r   r   norm_hidden_statesr  r  attn_outputs              rO   r   KAttentionBlock.forward  s9    <R;]!7ce!%%gt4@NNpq ""!%M!?/55ab9NF!%-?!P**"&*- )	K ++k6BK'7M "ZZ;+11!"5![[);VLjj
"7-B-J>Pf
 %	
 kk+v>#3rQ   )rH   r  r  r  r  )r   NFFr  FNr   r   )r   r   r   r   r   r   r   r   r   r   rv   r   r   r  r  r   r   r   r   r   r   s   @rO   rX  rX    s   8 -1$!& #(.2)
)
 !)
  	)

 )
 &c])
 )
 )
 )
 !)
 'sm)
 )
 )
VfELL f# fs fu|| fbELL b# bs bu|| b 9= '+15;?9=/||/  (5/ ell#/ !./ !)c3h 8/ !) 6/ 
/ /rQ   rX  )rq   NNNNFFFFr   r   Fr   NNNr   )r   rq   NNFFFFr   r   FNrq   r   )Nrq   NNNFFFFr   r   Fr   NNNr   )Mtypingr   r   r   r   r   numpyr5  r   torch.nn.functionalr   
functionalr   utilsr
   r   utils.torch_utilsr   activationsr   attention_processorr   r   r   normalizationr   r   r   r   r   r   r   r   r   r    transformers.dual_transformer_2dr   transformers.transformer_2dr   
get_loggerr   rK   r   r   r   r   rP   rY   Modulerl   rn   rW   rU   rV   r>   r@   r:   rD   rE   rC   rB   r;   rA   rF   rG   re   rc   ra   rh   ri   rg   rf   rb   rd   rj   rk   rX  rJ   rQ   rO   <module>r     sn   5 4      ' , ( Z Z (	 	 	 F < 
		H	% )*)-#')-(,!&"'!&"#,#!&%(*.(,%)3N;N;N; N; 	N;
 N; N; N; N; #&N; "#N; C=N; "#N; !N; N;  N;  !N;" #N;$ !%N;& 'N;( )N;* #+N;, #3--N;. !/N;0 c]1N;2 3N;p "%())-)-!&"'+0"#,#!&*.())HGHGHG HG 	HG
 HG HG HG #&HG "#HG "#HG HG  HG %)HG HG !HG  !HG" #HG$ #3-%HG& !'HG( )HGj %)())-#')-!&"'!&"#,#!&%(*.(,#'5^9^9^9 ^9 	^9
 ^9 ^9 ^9 ^9 ^9 SM^9 #&^9 "#^9 C=^9 "#^9 ^9   !^9" #^9$ %^9& !'^9( )^9* +^9, #-^9. #3-/^90 !1^92 C=3^94 5^96 YY7^9B"6299 "6J_RYY _DKbii K\zBII zz~,bii ~,BP,299 P,fK,")) K,\L L^dRYY dNm9")) m9`W9bii W9tW,bii W,tT, T,nC,299 C,Ls,BII s,l~BII ~B] ]@b		 bJFryy FR`299 `FC*		 C*Lk*BII k*\aBII aHZryy ZzM M`C")) CNxbii xrQ   