a
    
d&                     @   s|  d dl Z d dlmZmZ d dlZd dlmZ d dlmZ ddl	m
Z
mZ G dd dejZG d	d
 d
eZG dd deZG dd dejZG dd dejZG dd deZG dd dejeZG dd deZG dd deZG dd deZG dd deZg dg dg dd Zed! ed"< ed# ed$< 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ZdS )-    N)	rearrangerepeat)nn)
functional   )samplingutilsc                       sB   e Zd ZdZd fdd	Zdd Zdd	 Zd
d Zdd Z  Z	S )Denoiserz>A Karras et al. preconditioner for denoising diffusion models.      ?karrasc                    sZ   t    || _|| _t|r$|| _|dkr6tj| _n |dkrH| j| _nt	d| d S )Nr   zsoft-min-snrzUnknown weighting type )
super__init__inner_model
sigma_datacallable	weightingtorch	ones_like_weighting_soft_min_snr
ValueError)selfr   r   r   	__class__ S/var/www/html/stable-diffusion-webui/repositories/k-diffusion/k_diffusion/layers.pyr      s    


zDenoiser.__init__c                 C   s$   || j  d |d | j d  d  S N   r   )r   sigmar   r   r   r      s    z Denoiser._weighting_soft_min_snrc                 C   s`   | j d |d | j d   }|| j  |d | j d  d  }d|d | j d  d  }|||fS )Nr   g      ?r   r   )r   r   c_skipc_outc_inr   r   r   get_scalings   s     zDenoiser.get_scalingsc                    s    fdd|  |D \}}}| |} |t| j  }	| j|	| |fi |}
 ||	  | }|
| ddd| S )Nc                    s   g | ]}t | jqS r   r   append_dimsndim.0xinputr   r   
<listcomp>&       z!Denoiser.loss.<locals>.<listcomp>r   r   )	r"   r   r   r$   r%   r   powflattenmean)r   r*   noiser   kwargsr   r    r!   Zc_weightnoised_inputmodel_outputtargetr   r)   r   loss%   s    
zDenoiser.lossc                    sB    fdd|  |D \}}}| j | |fi ||  |  S )Nc                    s   g | ]}t | jqS r   r#   r&   r)   r   r   r+   .   r,   z$Denoiser.forward.<locals>.<listcomp>)r"   r   )r   r*   r   r1   r   r    r!   r   r)   r   forward-   s    zDenoiser.forward)r
   r   )
__name__
__module____qualname____doc__r   r   r"   r5   r6   __classcell__r   r   r   r   r	      s   r	   c                   @   s   e Zd Zdd ZdS )DenoiserWithVariancec                    s    fdd|  |D \}}} |t| j  }| j|| |fddi|\}	}
t|
|	j}
 ||  | }|	| d |
  |
 d }|ddS )Nc                    s   g | ]}t | jqS r   r#   r&   r)   r   r   r+   4   r,   z-DenoiserWithVariance.loss.<locals>.<listcomp>Zreturn_varianceTr   r   )r"   r   r$   r%   r   expr.   r/   )r   r*   r0   r   r1   r   r    r!   r2   r3   logvarr4   lossesr   r)   r   r5   3   s     zDenoiserWithVariance.lossN)r7   r8   r9   r5   r   r   r   r   r<   2   s   r<   c                   @   s   e Zd ZdZdd ZdS )SimpleLossDenoiserz/L_simple with the Karras et al. preconditioner.c                 K   sP   ||t ||j  }| ||fi |}t|||}|| dddS )Nr   r   )r   r$   r%   r   to_dr-   r.   r/   )r   r*   r0   r   r1   r2   denoisedepsr   r   r   r5   @   s    zSimpleLossDenoiser.lossN)r7   r8   r9   r:   r5   r   r   r   r   r@   =   s   r@   c                       s*   e Zd Zdd fdd
Zdd Z  ZS )ResidualBlockNskipc                   s,   t    tj| | _|r|nt | _d S N)r   r   r   
SequentialmainIdentityrF   r   rF   rI   r   r   r   r   J   s    
zResidualBlock.__init__c                 C   s   |  || | S rG   )rI   rF   )r   r*   r   r   r   r6   O   s    zResidualBlock.forwardr7   r8   r9   r   r6   r;   r   r   r   r   rD   I   s   rD   c                   @   s   e Zd ZdS )ConditionedModuleN)r7   r8   r9   r   r   r   r   rM   U   s   rM   c                       s&   e Zd Z fddZdddZ  ZS )UnconditionedModulec                    s   t    || _d S rG   )r   r   module)r   rO   r   r   r   r   Z   s    
zUnconditionedModule.__init__Nc                 C   s
   |  |S rG   )rO   )r   r*   condr   r   r   r6   ^   s    zUnconditionedModule.forward)NrL   r   r   r   r   rN   Y   s   rN   c                   @   s   e Zd Zdd ZdS )ConditionedSequentialc                 C   s,   | D ]"}t |tr|||}q||}q|S rG   )
isinstancerM   )r   r*   rP   rO   r   r   r   r6   c   s
    

zConditionedSequential.forwardN)r7   r8   r9   r6   r   r   r   r   rQ   b   s   rQ   c                       s*   e Zd Zdd fdd
Zdd Z  ZS )ConditionedResidualBlockNrE   c                   s*   t    t| | _|r|nt | _d S rG   )r   r   rQ   rI   r   rJ   rF   rK   r   r   r   r   m   s    

z!ConditionedResidualBlock.__init__c                 C   s2   t | jtr| ||n| |}| ||| S rG   )rR   rF   rM   rI   )r   r*   rP   rF   r   r   r   r6   r   s    "z ConditionedResidualBlock.forwardrL   r   r   r   r   rS   l   s   rS   c                       s&   e Zd Zd fdd	Zdd Z  ZS )AdaGNh㈵>rP   c                    s2   t    || _|| _|| _t||d | _d S r   )r   r   
num_groupsrC   cond_keyr   Linearmapper)r   Zfeats_inr    rV   rC   rW   r   r   r   r   x   s
    
zAdaGN.__init__c                 C   sX   |  || j jddd\}}tj|| j| jd}tt	
||j|t	
||jd S )Nr   dim)rC   r   )rY   rW   chunkF
group_normrV   rC   r   addcmulr   r$   r%   )r   r*   rP   weightbiasr   r   r   r6      s    zAdaGN.forward)rU   rP   rL   r   r   r   r   rT   w   s   rT   c                       s&   e Zd Zd fdd	Zdd Z  ZS )SelfAttention2d        c                    s^   t    || dksJ ||| _|| _t||d d| _t||d| _t|| _	d S )Nr      r   )
r   r   norm_inn_headr   Conv2dqkv_projout_projDropoutdropout)r   r!   rg   normdropout_rater   r   r   r      s    

zSelfAttention2d.__init__c                 C   s   |j \}}}}| | ||}||| jd || j || gdd}|jddd\}}	}
tj||	|
| j	j
d}|dd ||||g}|| | S )Nre   r   r   r[   	dropout_p)shaperi   rf   viewrg   	transposer]   r^   scaled_dot_product_attentionrl   p
contiguousrj   )r   r*   rP   nchwqkvqkvyr   r   r   r6      s    *zSelfAttention2d.forward)rd   rL   r   r   r   r   rc      s   	rc   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	CrossAttention2drd   crosscross_paddingc                    s   t    || dksJ || _|| _t|| _||| _|| _t	||d| _
t||d | _t	||d| _t|| _d S )Nr   r   r   )r   r   rW   cond_key_paddingr   	LayerNormnorm_encnorm_decrg   rh   q_projrX   kv_projrj   rk   rl   )r   Zc_decZc_encrg   r   rn   rW   r   r   r   r   r      s    

zCrossAttention2d.__init__c                 C   s   |j \}}}}| | ||}||| j|| j || gdd}| | || j }||d| jd || j gdd}|j	ddd\}	}
|| j
 d d d d d d f d }tj||	|
|| jjd}|dd ||||g}|| | S )Nr   re   rZ   r   r[   iro   )rq   r   r   rr   rg   rs   r   r   rW   r]   r   r^   rt   rl   ru   rv   rj   )r   r*   rP   rw   rx   ry   rz   r|   kvr}   r~   	attn_maskr   r   r   r   r6      s    &&"zCrossAttention2d.forward)rd   r   r   rL   r   r   r   r   r      s     r   )      ?      ?r   r   )                  ?     ?r   r   r   r   )    8n?   Վ?   @Dh   $   <X?   ?r   r   r   r   r   r   )linearcubicZlanczos3r   bilinearr   bicubicc                       s&   e Zd Zd fdd	Zdd Z  ZS )Downsample2dr   reflectc                    sJ   t    || _tt| g}|jd d d | _| d|j	|  d S )Nr   r   kernel
r   r   pad_moder   tensor_kernelsrq   padregister_bufferTr   r   r   Z	kernel_1dr   r   r   r      s
    
zDownsample2d.__init__c                 C   s   t || jfd | j}||jd |jd | jjd | jjd g}tj|jd |jd}| j	||||f< t j
||ddS )N   r   r   devicer   )stride)r^   r   r   	new_zerosrq   r   r   aranger   toconv2dr   r(   ra   indicesr   r   r   r6      s
    .zDownsample2d.forward)r   r   rL   r   r   r   r   r      s   r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )
Upsample2dr   r   c                    sN   t    || _tt| gd }|jd d d | _| d|j	|  d S )Nr   r   r   r   r   r   r   r   r      s
    
zUpsample2d.__init__c                 C   s   t || jd d fd | j}||jd |jd | jjd | jjd g}tj|jd |jd}| j	||||f< t j
||d| jd d dS )Nr   r   r   r   r   )r   padding)r^   r   r   r   rq   r   r   r   r   r   conv_transpose2dr   r   r   r   r6      s
     .zUpsample2d.forward)r   r   rL   r   r   r   r   r      s   r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )FourierFeaturesr
   c                    s<   t    |d dksJ | dt|d |g|  d S )Nr   r   ra   )r   r   r   r   randn)r   in_featuresout_featuresstdr   r   r   r      s    
zFourierFeatures.__init__c                 C   s0   dt j | | jj }tj| | gddS )Nr   rZ   r[   )mathpira   r   r   catcossin)r   r*   fr   r   r   r6      s    zFourierFeatures.forward)r
   rL   r   r   r   r   r      s   r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )UNetr   c                    s,   t    t|| _t|| _|| _d S rG   )r   r   r   
ModuleListd_blocksu_blocksskip_stages)r   r   r   r   r   r   r   r      s    
zUNet.__init__c                 C   sl   g }| j | jd  D ]}|||}|| qtt| jt|D ]$\}\}}||||dkr`|nd }qB|S )Nr   )r   r   append	enumeratezipr   reversed)r   r*   rP   skipsblockirF   r   r   r   r6      s    
 zUNet.forward)r   rL   r   r   r   r   r      s   r   )r   einopsr   r   r   r   torch.nnr   r^    r   r   Moduler	   r<   r@   rD   rM   rN   rH   rQ   rS   rT   rc   r   r   r   r   r   r   r   r   r   r   <module>   s4   &	
 