a
    Ad                     @   sb   d dl Z d dlZd dlmZ d dlmZmZmZ i ZG dd dejZ	dd Z
dd	 Zd
d ZdS )    N)nn)devicespathssharedc                       s$   e Zd Z fddZdd Z  ZS )	VAEApproxc                    s   t t|   tddd| _tddd| _tddd| _tddd| _tddd| _	tddd| _
tddd| _tdd	d| _d S )
N      )   r	      )   r       )   r   @   r   )superr   __init__r   Conv2dconv1conv2conv3conv4conv5conv6conv7conv8)self	__class__ =/var/www/html/stable-diffusion-webui/modules/sd_vae_approx.pyr      s    zVAEApprox.__init__c                 C   s   d}t j||jd d |jd d f}t j|||||f}| j| j| j| j| j	| j
| j| jfD ]}||}t j|d}qd|S )N      r   g?)r   
functionalinterpolateshapepadr   r   r   r   r   r   r   r   
leaky_relu)r   xextralayerr   r   r   forward   s    &(zVAEApprox.forward)__name__
__module____qualname__r   r)   __classcell__r   r   r   r   r   
   s   r   c                 C   sB   t j| s>t jt j| dd td|   tj||  d S )NT)exist_okz Downloading VAEApprox model to: )	ospathexistsmakedirsdirnameprinttorchhubdownload_url_to_file)
model_path	model_urlr   r   r   download_model"   s    r:   c                  C   s   t tjddrdnd} t| }|d u rtjtj	d| }tj
|sZtjtjdd| }tj
|stjtj	d| }t|d|   t }|tj|tjjdkrd	nd d
 |  |tjtj |t| < |S )Nis_sdxlFzvaeapprox-sdxl.ptzmodel.ptz
VAE-approxmodelszUhttps://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/download/v1.0.0-pre/cudacpu)map_location)getattrr   sd_modelsd_vae_approx_modelsgetr/   r0   joinr   models_pathr1   script_pathr:   r   load_state_dictr5   loadr   devicetypeevaltodtype)
model_nameloaded_modelr8   r   r   r   model*   s    
$rP   c                 C   sf   t jjr&g dg dg dg dg}ng dg dg dg dg}t|| j}td	| |}|S )
N)gJ4?g[B>٬?gT㥛 ?)gSt$ȿgV-g?)gt$~?glV}?g{򰐿)gZd;׿gx#Ͽg}гYʿ)gOn?g"~?g9v?)gV-?gM?g/$?)gMbX9Ŀgx&1?gL7A`?)gZd;OǿgMbXѿgʡE޿z...lxy,lr -> ...rxy)r   rA   r;   r5   tensorrL   rI   einsum)samplecoeffscoefsx_sampler   r   r   cheap_approximation@   s    rW   )r/   r5   r   modulesr   r   r   rB   Moduler   r:   rP   rW   r   r   r   r   <module>   s   