a
    Ad                     @   s   d dl Z d dlZd dlZd dlmZmZmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZ dejdgi fdejd	gi fd
ejdgi fgZdd eD ZG dd de jjZG dd de jjZG dd deZG dd dejZeje ejd< eZdS )    N)devicessd_samplers_commonsd_samplers_timesteps_impl)CFGDenoiser)ExtraNoiseParamsextra_noise_callback)optsZDDIMddimZPLMSplmsZUniPCunipcc                 C   s,   g | ]$\}}}}t ||fd d||qS )c                 S   s
   t || S N)CompVisSampler)modelfuncname r   E/var/www/html/stable-diffusion-webui/modules/sd_samplers_timesteps.py<lambda>       z<listcomp>.<lambda>)r   SamplerData).0labelr   aliasesoptionsr   r   r   
<listcomp>   s   
r   c                       s$   e Zd Z fddZdd Z  ZS )CompVisTimestepsDenoiserc                    s   t  j|i | || _d S r   super__init__inner_modelselfr   argskwargs	__class__r   r   r      s    z!CompVisTimestepsDenoiser.__init__c                 K   s   | j j||fi |S r   )r   apply_model)r    input	timestepsr"   r   r   r   forward   s    z CompVisTimestepsDenoiser.forward)__name__
__module____qualname__r   r(   __classcell__r   r   r#   r   r      s   r   c                       s,   e Zd Z fddZdd Zdd Z  ZS )CompVisTimestepsVDenoiserc                    s   t  j|i | || _d S r   r   r   r#   r   r   r   "   s    z"CompVisTimestepsVDenoiser.__init__c                 C   s@   | j j|tjd d d f | | j j|tjd d d f |  S r   )r   sqrt_alphas_cumprodtotorchintsqrt_one_minus_alphas_cumprod)r    x_ttvr   r   r   predict_eps_from_z_and_v&   s    z2CompVisTimestepsVDenoiser.predict_eps_from_z_and_vc                 K   s(   | j j||fi |}| |||}|S r   )r   r%   r6   )r    r&   r'   r"   model_outpute_tr   r   r   r(   )   s    z!CompVisTimestepsVDenoiser.forward)r)   r*   r+   r   r6   r(   r,   r   r   r#   r   r-   !   s   r-   c                       s0   e Zd Z fddZdd Zedd Z  ZS )CFGDenoiserTimestepsc                    s    t  | tjj| _d| _d S )NT)r   r   sharedsd_modelalphas_cumprodalphasmask_before_denoising)r    samplerr#   r   r   r   1   s    
zCFGDenoiserTimesteps.__init__c                 C   sJ   |j td}| j| d d d d d f }d|  }|||  |  }|S )N)dtype   )r/   r1   r=   sqrt)r    x_inx_outsigmatsa_tsqrt_one_minus_atpred_x0r   r   r   get_pred_x07   s
    z CFGDenoiserTimesteps.get_pred_x0c                 C   s0   | j d u r*tjjdkrtnt}|tj| _ | j S )Nr5   )
model_wrapr:   r;   parameterizationr-   r   )r    denoiserr   r   r   r   A   s    
z CFGDenoiserTimesteps.inner_model)r)   r*   r+   r   rJ   propertyr   r,   r   r   r#   r   r9   /   s   
r9   c                       s8   e Zd Z fddZdd Zd
ddZddd	Z  ZS )r   c                    s,   t  | d| _d| _d| _t| | _d S )Neta_ddimzEta DDIMg        )r   r   eta_option_fieldeta_infotext_fieldeta_defaultr9   model_wrap_cfg)r    r   r;   r#   r   r   r   K   s
    zCompVisSampler.__init__c              	   C   st   | j d uo| j jdd}tjr2|s2d}d|jd< ||r<dnd7 }ttjt	t
ddd| tjdd dd	}|S )
Ndiscard_next_to_last_sigmaFTzDiscard penultimate sigmarA   r   i  )devicei  )configr   getr   !always_discard_next_to_last_sigmaextra_generation_paramsr0   clipasarraylistranger   rU   )r    pstepsrT   r'   r   r   r   get_timestepsT   s    

.zCompVisSampler.get_timestepsNc                    s:  t ||\}}||}	|	d | }
tjj}t||	|  }td||	|   }|| ||  tj	dkrtj	|j
d< t||}t| |j}|tj	 | 7 | tjj}d|v r|
 d< d|v rd d< |j_|_||||jjd_|d  fdd	}jjr6d|j
d
< |S )NrA   r   zExtra noiser'   
is_img2imgTcond
image_conduncond
cond_scales_min_uncondc                      s"   j jfjdjd S NF)
extra_argsdisablecallbackfuncrS   sampler_extra_argscallback_stater   extra_params_kwargsr    xir   r   r      r   z/CompVisSampler.sample_img2img.<locals>.<lambda>	Pad conds)r   setup_img2img_stepsr`   r:   r;   r<   r0   rB   r   img2img_extra_noiserY   r   r   noise
initializeinspect	signaturerm   
parametersrS   init_latentlast_latent	cfg_scalerg   rn   launch_samplingpadded_cond_uncond)r    r^   xrv   conditioningunconditional_conditioningr_   image_conditioningt_encr'   Ztimesteps_schedr<   Zsqrt_alpha_cumprodZsqrt_one_minus_alpha_cumprodextra_noise_paramsrz   samplesr   rp   r   sample_img2img`   s>    



zCompVisSampler.sample_img2imgc           
         s   |p|j }||}| tjj}d|v r>| d< _||||jj	d_
| fdd}	jjrd|jd< |	S )Nr'   rb   c                      s"   j jfjdjd S rh   rl   r   rq   r    r   r   r   r      r   z'CompVisSampler.sample.<locals>.<lambda>Trs   )r_   r`   rw   rx   ry   rm   rz   r|   r}   rg   rn   r~   rS   r   rY   )
r    r^   r   r   r   r_   r   r'   rz   r   r   r   r   sample   s"    


zCompVisSampler.sample)NN)NN)r)   r*   r+   r   r`   r   r   r,   r   r   r#   r   r   J   s   	
,r   zmodules.sd_samplers_compvis)r0   rx   sysmodulesr   r   r   Z modules.sd_samplers_cfg_denoiserr   Zmodules.script_callbacksr   r   modules.sharedr   r:   r	   r
   r   Zsamplers_timestepssamplers_data_timestepsnnModuler   r-   r9   Samplerr   r)   ZVanillaStableDiffusionSamplerr   r   r   r   <module>   s(   	\