o
    ¶Ïiq(  ã                   @   sè   d dl Z d dlmZ d dlmZ dd„ Zdd„ ZG dd„ dejƒZG d	d
„ d
ejƒZ	G dd„ dejƒZ
G dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZdS )é    N)ÚOrderedDictc                 O   óV   | dkrt j|i |¤ŽS | dkrt j|i |¤ŽS | dkr$t j|i |¤ŽS td| › ƒ‚)z4
    Create a 1D, 2D, or 3D convolution module.
    é   é   é   úunsupported dimensions: )ÚnnÚConv1dÚConv2dÚConv3dÚ
ValueError©ÚdimsÚargsÚkwargs© r   ú7/mnt/c/Users/fbmor/ComfyUI/comfy/t2i_adapter/adapter.pyÚconv_nd   ó   r   c                 O   r   )z8
    Create a 1D, 2D, or 3D average pooling module.
    r   r   r   r   )r   Ú	AvgPool1dÚ	AvgPool2dÚ	AvgPool3dr   r   r   r   r   Úavg_pool_nd   r   r   c                       s*   e Zd ZdZd	‡ fdd„	Zdd„ Z‡  ZS )
Ú
DownsampleaD  
    A downsampling layer with an optional convolution.
    :param channels: channels in the inputs and outputs.
    :param use_conv: a bool determining if a convolution is applied.
    :param dims: determines if the signal is 1D, 2D, or 3D. If 3D, then
                 downsampling occurs in the inner-two dimensions.
    r   Nr   c                    s|   t ƒ  ¡  || _|p|| _|| _|| _|dkrdnd}|r,t|| j| jd||d| _d S | j| jks4J ‚t|||d| _d S )Nr   r   )r   r   r   )ÚstrideÚpadding)Úkernel_sizer   )	ÚsuperÚ__init__ÚchannelsÚout_channelsÚuse_convr   r   Úopr   )Úselfr   r!   r   r    r   r   ©Ú	__class__r   r   r   *   s   

ÿzDownsample.__init__c                 C   sL   |j d | jks
J ‚| js|j d d |j d d g}|| j_|  |¡}|S )Nr   r   r   )Úshaper   r!   r"   r   )r#   Úxr   r   r   r   Úforward9   s   
zDownsample.forward)r   Nr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r(   Ú__classcell__r   r   r$   r   r   !   s    r   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )	ÚResnetBlockr   FTc                    sº   t ƒ  ¡  |d }||ks|dkrt |||d|¡| _nd | _t ||ddd¡| _t ¡ | _t |||d|¡| _|dkrGt |||d|¡| _	nd | _	|| _
| j
dkr[t||d| _d S d S )Nr   Fr   r   T©r!   )r   r   r   r
   Úin_convÚblock1ÚReLUÚactÚblock2ÚskepÚdownr   Údown_opt)r#   Úin_cÚout_cr6   ÚksizeÚskr!   Úpsr$   r   r   r   D   s   


ÿzResnetBlock.__init__c                 C   sf   | j dkr
|  |¡}| jd ur|  |¡}|  |¡}|  |¡}|  |¡}| jd ur/||  |¡ S || S ©NT)r6   r7   r0   r1   r3   r4   r5   ©r#   r'   Úhr   r   r   r(   X   s   







zResnetBlock.forward)r   FT©r)   r*   r+   r   r(   r-   r   r   r$   r   r.   C   s    r.   c                       s8   e Zd Zg d¢ddddddf‡ fdd„	Zdd	„ Z‡  ZS )
ÚAdapter©i@  i€  é   rC   r   é@   FTc                    sR  t t| ƒ ¡  d| _g }g d¢}	|| _| jrd| _dg}dg}	|| j| j  | _t | j¡| _|| _	|| _
g | _tt|ƒƒD ]U}
t|ƒD ]N}|
|	v rc|dkrc| j t||
d  ||
 d|||d¡ qD|
|v r€|dkr€| j t||
d  ||
 d	|||d¡ qD| j t||
 ||
 d	|||d¡ qDq>t | j¡| _t ||d d
dd¡| _d S )Né   )r   r   r   é   r   r   r   T)r6   r:   r;   r!   Fr   )r   rA   r   Úunshuffle_amountÚxlÚinput_channelsr   ÚPixelUnshuffleÚ	unshuffler   Únums_rbÚbodyÚrangeÚlenÚappendr.   Ú
ModuleListr
   Úconv_in)r#   r   rL   Úcinr:   r;   r!   rH   Úresblock_no_downsampleÚresblock_downsampleÚiÚjr$   r   r   r   h   s<   ÿÿÿø
zAdapter.__init__c                 C   sì   |   |¡}g }|  |¡}tt| jƒƒD ]G}t| jƒD ]}|| j | }| j| |ƒ}q| jrK| d ¡ |dkrA| d ¡ | d ¡ |dkrJ| d ¡ n
| d ¡ | d ¡ | |¡ q|d d d… }| jrr|dd … |d d… dœS d|iS )Nr   r   éÿÿÿÿr   )ÚinputÚmiddlerY   )	rK   rR   rN   rO   r   rL   rM   rH   rP   )r#   r'   ÚfeaturesrV   rW   Úidxr   r   r   r(   †   s,   





€

zAdapter.forwardr@   r   r   r$   r   rA   g   s     rA   c                       s(   e Zd ZdZdejf‡ fdd„Z‡  ZS )Ú	LayerNormz*Subclass torch's LayerNorm to handle fp16.r'   c                    s$   |j }tƒ  | tj¡¡}| |¡S ©N)Údtyper   r(   ÚtypeÚtorchÚfloat32)r#   r'   Ú	orig_typeÚretr$   r   r   r(   ¨   s   
zLayerNorm.forward)r)   r*   r+   r,   ra   ÚTensorr(   r-   r   r   r$   r   r]   ¥   s    r]   c                   @   s   e Zd Zdejfdd„ZdS )Ú	QuickGELUr'   c                 C   s   |t  d| ¡ S )Ng¬Zd;û?)ra   Úsigmoid©r#   r'   r   r   r   r(   °   s   zQuickGELU.forwardN)r)   r*   r+   ra   re   r(   r   r   r   r   rf   ®   s    rf   c                       sN   e Zd Zddededejf‡ fdd„Zdejfdd	„Zdejfd
d„Z‡  Z	S )ÚResidualAttentionBlockNÚd_modelÚn_headÚ	attn_maskc              
      sr   t ƒ  ¡  t ||¡| _t|ƒ| _t tdt 	||d ¡fdt
ƒ fdt 	|d |¡fgƒ¡| _t|ƒ| _|| _d S )NÚc_fcé   ÚgeluÚc_proj)r   r   r   ÚMultiheadAttentionÚattnr]   Úln_1Ú
Sequentialr   ÚLinearrf   ÚmlpÚln_2rl   )r#   rj   rk   rl   r$   r   r   r   ¶   s   

ÿÿ

zResidualAttentionBlock.__init__r'   c                 C   s>   | j d ur| j j|j|jdnd | _ | j|||d| j dd S )N)r_   ÚdeviceF)Úneed_weightsrl   r   )rl   Útor_   rx   rr   rh   r   r   r   Ú	attentionÁ   s   $z ResidualAttentionBlock.attentionc                 C   s,   ||   |  |¡¡ }||  |  |¡¡ }|S r^   )r{   rs   rv   rw   rh   r   r   r   r(   Å   s   zResidualAttentionBlock.forwardr^   )
r)   r*   r+   Úintra   re   r   r{   r(   r-   r   r   r$   r   ri   ´   s    ri   c                       s&   e Zd Zd
‡ fdd„	Zdd	„ Z‡  ZS )ÚStyleAdapteré   é   rE   r   rn   c                    s‚   t ƒ  ¡  ˆd }tj‡ ‡fdd„t|ƒD ƒŽ | _|| _t t 	d|ˆ¡| ¡| _
tˆƒ| _tˆƒ| _t |t 	ˆ|¡ ¡| _d S )Ng      à¿c                    s   g | ]}t ˆˆ ƒ‘qS r   )ri   )Ú.0Ú_©Únum_headÚwidthr   r   Ú
<listcomp>Ñ   s    z)StyleAdapter.__init__.<locals>.<listcomp>r   )r   r   r   rt   rN   Útransformer_layesÚ	num_tokenÚ	Parameterra   ÚrandnÚstyle_embeddingr]   Úln_postÚln_preÚproj)r#   r„   Úcontext_dimrƒ   Ún_layesr‡   Úscaler$   r‚   r   r   Í   s   
 

zStyleAdapter.__init__c                 C   s    | j tj|jd | j| j jd f|jd }tj||gdd}|  |¡}| ddd¡}|  	|¡}| ddd¡}|  
|d d …| j d …d d …f ¡}|| j }|S )Nr   rX   )rx   r   )Údimr   )rŠ   ra   Úzerosr&   r‡   rx   ÚcatrŒ   Úpermuter†   r‹   r   )r#   r'   rŠ   r   r   r   r(   Ø   s   ÿ

$
zStyleAdapter.forward)r~   r   rE   r   rn   r@   r   r   r$   r   r}   Ë   s    r}   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚResnetBlock_lightc                    s@   t ƒ  ¡  t ||ddd¡| _t ¡ | _t ||ddd¡| _d S )Nr   r   )r   r   r   r
   r1   r2   r3   r4   )r#   r8   r$   r   r   r   é   s   

zResnetBlock_light.__init__c                 C   s&   |   |¡}|  |¡}|  |¡}|| S r^   )r1   r3   r4   r>   r   r   r   r(   ï   s   


zResnetBlock_light.forwardr@   r   r   r$   r   r•   è   s    r•   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	extractorFc                    sŠ   t ƒ  ¡  t ||ddd¡| _g | _t|ƒD ]
}| j t|ƒ¡ qtj	| jŽ | _t ||ddd¡| _
|| _| jdkrCt|dd| _d S d S )Nr   r   TFr/   )r   r   r   r
   r0   rM   rN   rP   r•   rt   Úout_convr6   r   r7   )r#   r8   Úinter_cr9   rL   r6   r   r$   r   r   r   ø   s   

ÿzextractor.__init__c                 C   s6   | j dkr
|  |¡}|  |¡}|  |¡}|  |¡}|S r=   )r6   r7   r0   rM   r—   rh   r   r   r   r(     s   




zextractor.forward)Fr@   r   r   r$   r   r–   ÷   s    r–   c                       s0   e Zd Zg d¢ddf‡ fdd„	Zdd„ Z‡  ZS )ÚAdapter_lightrB   r   rD   c              
      sÎ   t t| ƒ ¡  d| _t | j¡| _|| j| j  | _|| _|| _	g | _
d| _tt|ƒƒD ]1}|dkrF| j
 t||| d || |dd¡ q,| j
 t||d  || d || |dd¡ q,t | j
¡| _
d S )NrE   Fr   rn   )r8   r˜   r9   rL   r6   r   T)r   r™   r   rG   r   rJ   rK   rI   r   rL   rM   rH   rN   rO   rP   r–   rQ   )r#   r   rL   rS   rV   r$   r   r   r     s   (0zAdapter_light.__init__c                 C   s`   |   |¡}g }tt| jƒƒD ]}| j| |ƒ}| d ¡ | d ¡ | |¡ qd|d d d… iS )NrY   rX   )rK   rN   rO   r   rM   rP   )r#   r'   r[   rV   r   r   r   r(      s   


zAdapter_light.forwardr@   r   r   r$   r   r™     s    r™   )ra   Útorch.nnr   Úcollectionsr   r   r   ÚModuler   r.   rA   r]   rf   ri   r}   r•   r–   r™   r   r   r   r   Ú<module>   s   "$>	