a
    Ä
þde  ã                   @   sž   d dl Z d dlZd dlmZ d dlmZ ddlmZm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dS )é    N)Únn)Ú
functionalé   )ÚlayersÚutilsc                 C   s   t j | j¡ | S )N)r   ÚinitÚorthogonal_Úweight)Úmodule© r   ú\/var/www/html/stable-diffusion-webui/repositories/k-diffusion/k_diffusion/models/image_v1.pyr   
   s    r   c                       s   e Zd Zd‡ fdd„	Z‡  ZS )ÚResConvBlocké    ç        c                    s¤   ||krd nt tj||dddƒ}tƒ jt ||td|| ƒ¡t ¡ tj||dddtj	|ddt ||td|| ƒ¡t ¡ tj||dddtj	|dd|d	 d S )	Né   F©Úbiasé   )ÚpaddingT)Úinplace)Úskip)
r   r   ÚConv2dÚsuperÚ__init__r   ÚAdaGNÚmaxÚGELUÚ	Dropout2d)ÚselfÚfeats_inÚc_inÚc_midÚc_outÚ
group_sizeÚdropout_rater   ©Ú	__class__r   r   r      s    "÷zResConvBlock.__init__)r   r   ©Ú__name__Ú
__module__Ú__qualname__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 )ÚDBlockr   é@   r   Fr   c                    sØ   t  ¡ g}t|ƒD ]ª}|dkr"|n|}||d k r6|n|‰| tˆ ||ˆˆ|ƒ¡ |
r†‡ ‡‡fdd„}| t ˆtdˆ| ƒ||¡¡ |r‡ ‡‡fdd„}| t ˆ|tdˆ| ƒ||¡¡ qt	ƒ j
|Ž  |  |	¡ d S )Nr   r   c                    s   t  ˆ | tdˆˆ ƒ¡S ©Nr   ©r   r   r   ©r    ©r   r#   Úmy_c_outr   r   Ú<lambda>&   ó    z!DBlock.__init__.<locals>.<lambda>c                    s   t  ˆ | tdˆˆ ƒ¡S r.   r/   r0   r1   r   r   r3   )   r4   )r   ÚIdentityÚrangeÚappendr   r   ÚSelfAttention2dr   ÚCrossAttention2dr   r   Úset_downsample)r   Ún_layersr   r    r!   r"   r#   Ú	head_sizer$   Ú
downsampleÚ	self_attnÚ
cross_attnÚc_encÚmodulesÚiÚmy_c_inÚnormr%   r1   r   r      s    
 $zDBlock.__init__c                 C   s   |rt  ¡ nt ¡ | d< | S ©Nr   )r   ÚDownsample2dr   r5   )r   r=   r   r   r   r:   .   s    zDBlock.set_downsample)r   r-   r   FFFr   )r(   r)   r*   r   r:   r+   r   r   r%   r   r,      s   r,   c                       s4   e Zd Zd‡ fdd„	Zd‡ fd	d
„	Zdd„ Z‡  ZS )ÚUBlockr   r-   r   Fr   c                    sà   g }t |ƒD ]ª}|dkr|n|}||d k r0|n|‰| tˆ ||ˆˆ|ƒ¡ |
r€‡ ‡‡fdd„}| t ˆtdˆ| ƒ||¡¡ |r‡ ‡‡fdd„}| t ˆ|tdˆ| ƒ||¡¡ q| t ¡ ¡ t	ƒ j
|Ž  |  |	¡ d S )Nr   r   c                    s   t  ˆ | tdˆˆ ƒ¡S r.   r/   r0   r1   r   r   r3   ;   r4   z!UBlock.__init__.<locals>.<lambda>c                    s   t  ˆ | tdˆˆ ƒ¡S r.   r/   r0   r1   r   r   r3   >   r4   )r6   r7   r   r   r8   r   r9   r   r5   r   r   Úset_upsample)r   r;   r   r    r!   r"   r#   r<   r$   Úupsampler>   r?   r@   rA   rB   rC   rD   r%   r1   r   r   4   s     $zUBlock.__init__Nc                    s(   |d urt j||gdd}tƒ  ||¡S )Nr   ©Údim)ÚtorchÚcatr   Úforward)r   ÚinputÚcondr   r%   r   r   rN   D   s    zUBlock.forwardc                 C   s   |rt  ¡ nt ¡ | d< | S )Néÿÿÿÿ)r   Ú
Upsample2dr   r5   )r   rI   r   r   r   rH   I   s    zUBlock.set_upsample)r   r-   r   FFFr   )N)r(   r)   r*   r   rN   rH   r+   r   r   r%   r   rG   3   s   rG   c                       s   e Zd Zd‡ fdd„	Z‡  ZS )Ú
MappingNetr   c                    sR   g }t |ƒD ]4}| tt |dkr&|n||¡ƒ¡ | t ¡ ¡ qtƒ j|Ž  d S rE   )r6   r7   r   r   ÚLinearr   r   r   )r   r   Z	feats_outr;   r   rB   r%   r   r   r   O   s
    "zMappingNet.__init__)r   r'   r   r   r%   r   rS   N   s   rS   c                       s8   e Zd Zd‡ fdd„	Zddd	„Zd
d„ Zdd„ Z‡  ZS )ÚImageDenoiserModelV1Nr   r   r   Fc                    sú  t ƒ  ¡  || _|| _|| _|| _|| _t d|¡| _	|dkrPt
j||dd| _t||ƒ| _t
 || | jd  |td|d ƒ d¡| _t
 |td|d ƒ || jd  | jr²dnd d¡| _t
j | jj¡ t
j | jj¡ |	dkrôdgt|ƒ }g g  }}tt|ƒƒD ]R}|td|d ƒ }| t|| |||| || ||k|| || |	|
d
¡ q
tt|ƒƒD ]t}|t|ƒd k rŒ|| d n|| }|td|d ƒ }| t|| |||| |||k|| || |	|
d
¡ qjtj|t|ƒ|d| _d S )	Nr   r   Fr   r   )r=   r>   r?   r@   r$   )rI   r>   r?   r@   r$   )Úskip_stages)r   r   r    ÚchannelsÚunet_cond_dimÚ
patch_sizeÚhas_variancer   ÚFourierFeaturesÚtimestep_embedr   rT   Úmapping_condrS   Úmappingr   r   Úproj_inÚproj_outr   Úzeros_r	   r   Úlenr6   r7   r,   rG   ÚUNetÚreversedÚu_net)r   r    r   ÚdepthsrW   Úself_attn_depthsÚcross_attn_depthsÚmapping_cond_dimrX   Úcross_cond_dimr$   rY   rV   rZ   Úd_blocksÚu_blocksrB   rC   r2   r%   r   r   r   X   s2    
,6
>&:zImageDenoiserModelV1.__init__c                 C   s&  |  ¡ d }|  t |d¡¡}	|d u r0t |	¡n|  |¡}
|  |	|
 ¡}d|i}|d urjtj||gdd}|d ur‚||d< ||d< | j	dkršt
 || j	¡}|  |¡}|  ||¡}|  |¡}| jrò|d d …d d…f |d d …df  d¡ d¡ }}| j	dkrt
 || j	¡}| jr"|r"||fS |S )	Né   r   rP   r   rJ   ÚcrossÚcross_paddingrQ   )Úlogr\   r   Úappend_dimsrL   Ú
zeros_liker]   r^   rM   rY   ÚFÚpixel_unshuffler_   re   r`   rZ   ÚflattenÚmeanÚpixel_shuffle)r   rO   Úsigmar]   Z	unet_condZ
cross_condZcross_cond_paddingÚreturn_varianceÚc_noiser\   Zmapping_cond_embedÚmapping_outrP   Úlogvarr   r   r   rN   s   s,    


2zImageDenoiserModelV1.forwardc                 C   sÀ   t  | jj| jtd|d ƒ d¡| _t  | jtd|d ƒ | jjd¡| _t j 	| jj
¡ t j 	| jj¡ || j_t| jjƒD ]\}}| ||k¡ q|tt| jjƒƒD ]\}}| ||k¡ q¤| S )Nr   r   )r   r   r_   Úin_channelsrW   r   r`   Úout_channelsr   ra   r	   r   re   rV   Ú	enumeraterk   r:   rd   rl   rH   )r   rV   rB   Úblockr   r   r   Úset_skip_stages‹   s    $$z$ImageDenoiserModelV1.set_skip_stagesc                 C   sž   || _ t | j| j | j d  | jtd| jjd ƒ d¡| _	t | jtd| jjd ƒ | j| j d  | j
rndnd d¡| _tj | jj¡ tj | jj¡ d S )Nr   r   r   )rY   r   r   r    rX   rW   r   re   rV   r_   rZ   r`   r   ra   r	   r   )r   rY   r   r   r   Úset_patch_size—   s
    6>z#ImageDenoiserModelV1.set_patch_size)Nr   r   r   r   r   r   F)NNNNF)r(   r)   r*   r   rN   r   r‚   r+   r   r   r%   r   rU   W   s   
rU   )ÚmathrL   r   Útorch.nnr   rs   Ú r   r   r   ÚConditionedResidualBlockr   ÚConditionedSequentialr,   rG   Ú
SequentialrS   ÚModulerU   r   r   r   r   Ú<module>   s   	