
    bi(                         d dl Z d dlZd dlZd dlmZ ddlmZmZ ddl	m
Z
 ddlmZmZmZmZ  G d de
e      Z G d	 d
ej"                        Zy)    N   )ConfigMixinregister_to_config)
ModelMixin   )	AttnBlockGlobalResponseNormTimestepBlockWuerstchenLayerNormc                        e Zd Zedddddg dg dg dg dg d	d
dddf fd	       Zd ZddZd ZddZddZ	ddZ
 xZS )WuerstchenDiffNeXt   @      i   )i@  i     r   )
      r   )r   r      r   )CTCTAr   r   )FTTT   r   g?c                    t         |           | _        | _        t	        |t
              s|gt        |      z  }t        j                  |      | _	        t        j                  |
t        t        |
            z   D cg c]  }|rt        j                  |d      nd   c}      | _        t        j                  dd      | _        t        j                   t        j"                  |      t        j                  ||dz  z  |d   d      t%        |d   dd            | _        dfd	}t        j                         | _        t+        t        |            D ]  }t        j                         }|dkD  rW|j-                  t        j                   t%        ||dz
     dd      t        j                  ||dz
     ||   dd	                   t+        ||         D ]:  }|	|   D ]0  }|
|   rnd}|j-                   ||||   ||   |||   
             2 < | j(                  j-                  |        t        j                         | _        t        t+        t        |                  D ]  }t        j                         }t+        ||         D ]o  }t1        |	|         D ]\  \  }}|t        |      dz
  k  r||cxk(  rdk(  rn n||   nd}||
|   rndz  }|j-                   ||||   ||   |||   
             ^ q |dkD  rT|j-                  t        j                   t%        ||   dd      t        j2                  ||   ||dz
     dd	                   | j.                  j-                  |        t        j                   t%        |d   dd      t        j                  |d   d|z  |dz  z  d      t        j4                  |            | _        | j9                  | j:                         y c c}w )Nr   )kernel_sizeFư>elementwise_affineepsr   r   c                     | dk(  rt        |||      S | dk(  rt        ||d|      S | dk(  rt        |      S t        d|  d      )	NC)r   dropoutAT)	self_attnr!   TzBlock type z not supported)ResBlockStageBr   r
   
ValueError)
block_typec_hiddennheadc_skipr!   c_condc_rr   s        v/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/diffusers/pipelines/wuerstchen/modeling_wuerstchen_diffnext.py	get_blockz.WuerstchenDiffNeXt.__init__.<locals>.get_blockD   sb    S %hKY`aas" 65DRYZZs"$Xs33 ;zl.!IJJ    )r   stride)r*   r!   )r   r   )super__init__r,   r+   
isinstancelistlennnLinearclip_mapper
ModuleListreversedConv2deffnet_mappers	LayerNormseq_norm
SequentialPixelUnshuffler   	embeddingdown_blocksrangeappend	up_blocks	enumerateConvTranspose2dPixelShuffleclfapply_init_weights)selfc_inc_outr,   
patch_sizer+   r(   r)   blockslevel_configinject_effneteffnet_embd	clip_embdr   r!   injectr.   i
down_block_r'   r*   up_blockjk	__class__s      ` `       `           r-   r2   zWuerstchenDiffNeXt.__init__   s   $ 	'4(i#h-/G 99Y7 mm ,d8M3J.KK BH		+v1=TQ
 V4Pj)IIdj!m,hqkqI4P
	K ==?s8}% 	0AJ1u!!MM+HQUOPU[_`		(1q5/8A;AVWX 6!9% w".q/ wJ'4Q'7VQF%%i
HQKqZ`jqrsjt&uvww ##J/	0  %H./ 	,A}}H6!9% u%.|A%? uMAz,-H0A,Aa1kPQkXa[WXFa(8fa?FOOIj(1+uQxX^hopqhr$stuu
 1uMM+HQKEW[\**8A;QUV_`a NN!!(+	," ==4PIIhqk1u9
A#>ANOOJ'
 	

4%%&Gs   #O=c           
         t        |t        j                  t        j                  f      r_t        j                  j                  |j                         |j                  *t        j                  j                  |j                  d       | j                  D ]0  }|t        j                  j                  |j                  d       2 t        j                  j                  | j                  j                  d       t        j                  j                  | j                  d   j                  d       t        j                  j                  | j                  d   j                  d       | j                  | j                  z   D ]  }|D ]  }t        |t               r`|j"                  d   j                  xj$                  t'        j(                  dt+        | j,                  j.                        z        z  c_        st        |t0              st        j                  j                  |j2                  j                  d         y )Nr   g{Gz?)stdr   r   )r3   r6   r;   r7   initxavier_uniform_weightbias	constant_r<   normal_r8   rA   rI   rB   rE   r%   channelwisedatanpsqrtsumconfigrP   r
   mapper)rL   mrk   level_blockblocks        r-   rK   z WuerstchenDiffNeXt._init_weights|   s   a"))RYY/0GG##AHH-vv!!!!&&!,)) 	9F!48	9 	((//T:
q 1 8 8$?
$((1+,,a0  ++dnn< 	>K$ >e^4%%b)0055SI[I[E\A\9]]5}5GG%%ell&9&91=	>	>r/   c                 *   ||z  }| j                   dz  }t        j                  |      |dz
  z  }t        j                  ||j
                        j                         j                  |       j                         }|d d d f   |d d d f   z  }t        j                  |j                         |j                         gd      }| j                   dz  dk(  r"t        j                  j                  |dd      }|j                  |j                         S )	Nr   r   )devicedim)r   r   constant)mode)dtype)r,   mathlogtorcharangerp   floatmulexpcatsincosr6   
functionalpadtoru   )rL   rmax_positionshalf_dimembs        r-   gen_r_embeddingz"WuerstchenDiffNeXt.gen_r_embedding   s    88q=hh}%A6ll8AHH5;;=AA3$GKKM4j3tQw<'iiCGGI.A688a<1--##Cj#ACvvAGGv$$r/   c                 J    | j                  |      }| j                  |      }|S N)r8   r>   )rL   clips     r-   gen_c_embeddingsz#WuerstchenDiffNeXt.gen_c_embeddings   s%    %}}T"r/   c                 L   g }t        | j                        D ]  \  }}d }|D ]  }	t        |	t              r||| j                  |   m|j
                  }
 | j                  |   t        j                  j                  |j                         |j                  dd  ddd      j                  |
            }| j                  |   |nd } |	||      }t        |	t              r
 |	||      }t        |	t              r
 |	||      } |	|      } |j                  d|        |S )NbicubicTsizert   	antialiasalign_cornersr   )rF   rB   r3   r%   r<   ru   r6   r   interpolaterz   shaper   r   r
   insert)rL   xr_embedeffnetr   level_outputsrV   rW   effnet_crn   ru   skips               r-   _down_encodezWuerstchenDiffNeXt._down_encode   s(   &t'7'78 	'MAzH# !e^4'D,?,?,B,N &#94#6#6q#9MM55 &QWWRS\	]aqu 6  bi$
 (,':':1'='I8tDaAy1aA}5a)AaA!!"   A&'	'( r/   c                    |d   }t        | j                        D ]P  \  }}d }t        |      D ]9  \  }	}
t        |
t              r|| j                  t        | j                        |z      |j                  } | j                  t        | j                        |z      t        j                  j                  |j                         |j                  dd  ddd      j                  |            }|	dk(  r
|dkD  r||   nd }||t        j                  ||gd      }n|} |
||      }t        |
t               r |
||      }t        |
t"              r |
||      }2 |
|      }< S |S )Nr   r   r   Tr   r   rq   )rF   rE   r3   r%   r<   r5   rB   ru   r6   r   r   rz   r   r   rx   r}   r   r
   )rL   r   r   r   r   r   rV   rY   r   rZ   rn   ru   r   s                r-   
_up_decodezWuerstchenDiffNeXt._up_decode   si   !$T^^4 	!KAxH%h/ !5e^4'D,?,?DDTDT@UXY@Y,Z,f &#Q4#6#6s4;K;K7Lq7P#QMM55 &QWWRS\	]aqu 6  bi$
 01Av!a%=+TD++#(99dH-=1#ED#+DaAy1aA}5a)AaA+!	!0 r/   c                    |t        j                  ||gd      }| j                  |      }|| j                  |      }|}	| j	                  |      }| j                  ||||      }
| j                  |
|||      }| j                  |      j                  dd      \  }}|j                         d|dz  z
  z  |z   }|r|	|z
  |z  S ||fS )Nr   rq   r   )
rx   r}   r   r   rA   r   r   rI   chunksigmoid)rL   r   r   r   r   x_catr   return_noiser   x_inr   abs                r-   forwardzWuerstchenDiffNeXt.forward   s    		1e*!,A&&q)((.D NN1))!WfdCOOM7FDAxx{   *1IIK1sQw;'#-1H>!a4Kr/   )i'  r   )NNgMbP?T)__name__
__module____qualname__r   r2   rK   r   r   r   r   r   __classcell__r\   s   @r-   r   r      sb     '0/]' ]'~>,	%
08r/   r   c                   (     e Zd Zd fd	ZddZ xZS )r%   c           
         t         |           t        j                  ||||dz  |      | _        t        |dd      | _        t        j                  t        j                  ||z   |dz        t        j                         t        |dz        t        j                  |      t        j                  |dz  |            | _        y )Nr   )r   paddinggroupsFr   r   r   )r1   r2   r6   r;   	depthwiser   normr?   r7   GELUr	   Dropoutre   )rL   cr*   r   r!   r\   s        r-   r2   zResBlockStageB.__init__   s    1a[+YZJZcde'eN	==IIa&j!a%(GGIq1u%JJwIIa!eQ
r/   c                     |}| j                  | j                  |            }|t        j                  ||gd      }| j	                  |j                  dddd            j                  dddd      }||z   S )Nr   rq   r   r   r   )r   r   rx   r}   re   permute)rL   r   x_skipx_ress       r-   r   zResBlockStageB.forward   sr    IIdnnQ'(		1f+1-AQYYq!Q23;;Aq!QG5yr/   )r   r   g        r   )r   r   r   r2   r   r   r   s   @r-   r%   r%      s    

r/   r%   )rv   numpyrg   rx   torch.nnr6   configuration_utilsr   r   models.modeling_utilsr   modeling_wuerstchen_commonr   r	   r
   r   r   Moduler%    r/   r-   <module>r      s@         B / i iM[ M`RYY r/   