a
    Ad                     @   s>  d dl Z d dlmZ d dlmZ d dlmZ G dd dZe Zdd Z	G d	d
 d
e j
je j
jZdadd Zdd Zede	e eddd e ee jedkse j reddd e eddd e eddd dd  dd Zdd Zedee edee eddd e ed e	e ed!d"d e dS )#    N)version)devices)CondFuncc                   @   s    e Zd ZdZdd Zdd ZdS )TorchHijackForUnetz
    This is torch, but with cat that resizes tensors to appropriate dimensions if they do not match;
    this makes it possible to create pictures with dimensions that are multiples of 8 rather than 64
    c                 C   sB   |dkr| j S tt|r"tt|S tdt| j d| dd S )Ncat'z' object has no attribute ')r   hasattrtorchgetattrAttributeErrortype__name__)selfitem r   >/var/www/html/stable-diffusion-webui/modules/sd_hijack_unet.py__getattr__   s
    

zTorchHijackForUnet.__getattr__c                 O   sn   t |dkrV|\}}|jdd  |jdd  krNtjjj||jdd  dd}||f}tj|g|R i |S )N   nearest)mode)lenshaper	   nn
functionalinterpolater   )r   tensorsargskwargsabr   r   r   r      s    zTorchHijackForUnet.catN)r   
__module____qualname____doc__r   r   r   r   r   r   r      s   	r   c                 K   s   t |trj| D ]V}t || tr<dd || D ||< qt || tjr\|| tjn|| ||< qt	 : | ||tj|tj|fi |
 W  d    S 1 s0    Y  d S )Nc                 S   s(   g | ] }t |tjr |tjn|qS r   )
isinstancer	   Tensortor   
dtype_unet).0xr   r   r   
<listcomp>+       zapply_model.<locals>.<listcomp>)r$   dictkeyslistr	   r%   r&   r   r'   autocastfloat)	orig_funcr   x_noisytcondr   yr   r   r   apply_model&   s    
.
r6   c                   @   s   e Zd Zdd Zdd ZdS )
GELUHijackc                 O   s    t jjj| g|R i | d S N)r	   r   GELU__init__)r   r   r   r   r   r   r:   4   s    zGELUHijack.__init__c                 C   s:   t jr&tjj|  | t jS tjj| |S d S r8   )	r   unet_needs_upcastr	   r   r9   forwardr0   r&   r'   )r   r)   r   r   r   r<   6   s     zGELUHijack.forwardN)r   r!   r"   r:   r<   r   r   r   r   r7   3   s   r7   c                   C   s,   t s(tdtt tdtt tdtta d S )NzEmodules.models.diffusion.ddpm_edit.LatentDiffusion.decode_first_stagezEmodules.models.diffusion.ddpm_edit.LatentDiffusion.encode_first_stagez>modules.models.diffusion.ddpm_edit.LatentDiffusion.apply_model)ddpm_edit_hijackr   first_stage_subfirst_stage_condr6   r;   r   r   r   r   hijack_ddpm_edit>   s    r@   c                  O   s   t jS r8   )r   r;   )r   r   r   r   r   <lambda>F   r+   rA   z5ldm.models.diffusion.ddpm.LatentDiffusion.apply_modelz;ldm.modules.diffusionmodules.openaimodel.timestep_embeddingc                 O   s0   | |g|R i | |jtjkr(tjntjS r8   r&   dtyper	   int64float32r   r'   r1   	timestepsr   r   r   r   r   rA   H   r+   z1.13.2z5ldm.modules.diffusionmodules.util.GroupNorm32.forwardc                 O   s   | |  g|R i |S r8   r0   )r1   r   r   r   r   r   r   rA   J   r+   z#ldm.modules.attention.GEGLU.forwardc                 C   s   | |  |  tjS r8   )r0   r&   r   r'   )r1   r   r)   r   r   r   rA   K   r+   z5open_clip.transformer.ResidualAttentionBlock.__init__c                 O   s    | dtirdp| |i |S )N	act_layerF)updater7   r1   r   r   r   r   r   rA   L   r+   c                 O   s   | dd u p|d tjjkS )NrI   )getr	   r   r9   )_r   r   r   r   r   rA   L   r+   c                 O   s   t jo|jjjtjkS r8   )r   r;   modeldiffusion_modelrC   r	   float16)rM   r   r   r   r   r   r   rA   N   r+   c                 K   s   | || tjfi |S r8   )r&   r   	dtype_vae)r1   r   r)   r   r   r   r   rA   O   r+   z<ldm.models.diffusion.ddpm.LatentDiffusion.decode_first_stagez<ldm.models.diffusion.ddpm.LatentDiffusion.encode_first_stagezBldm.models.diffusion.ddpm.LatentDiffusion.get_first_stage_encodingc                 O   s   | |i |  S r8   rH   rK   r   r   r   rA   R   r+   z;sgm.modules.diffusionmodules.wrappers.OpenAIWrapper.forwardz;sgm.modules.diffusionmodules.openaimodel.timestep_embeddingc                 O   s0   | |g|R i | |jtjkr(tjntjS r8   rB   rF   r   r   r   rA   U   r+   )r	   	packagingr   modulesr   Zmodules.sd_hijack_utilsr   r   thr6   r   r9   Moduler7   r=   r@   r;   parse__version__cudais_availabler?   r>   r   r   r   r   <module>   s.   
 