a
    AdG1                      @   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ddgd	d
ifdddgd
dddfdddgdddfdddgd
ddfddddgddifdddgi fdd d!gi fd"d#d$gd%difd&d'd(gddd)fd*d+d,gdddd-fd.d/d0gddd1fd2dd3gi fd4dd5gddd6fd7ddgd8difd9dd:gdd;d<fd=dd>gd
dd;d?fd@ddAgddd;d?fdBdCdDgdddEfdFdCdGgd
dddHfdIdCdJgddddHfdKdLdMgddifdNdOdPgddifdQd dRgd	d
ifdSd'dTgd
ddddUfdVd+dWgd
ddddUfdXd/dYgd
dddZfd[ejd\gd
dd]fgZd^d_ eD Zg d`g d`g d`dagdagdagdagdagdagdb	Zdcdd eD ZdejjejjejjdeZG dfdg dgej	ZG dhdi diejZdS )j    N)sd_samplers_commonsd_samplers_extrasd_samplers_cfg_denoiser)CFGDenoiser)ExtraNoiseParamsextra_noise_callback)optszDPM++ 2M KarrasZsample_dpmpp_2mZk_dpmpp_2m_ka	schedulerkarraszDPM++ SDE Karrassample_dpmpp_sdeZk_dpmpp_sde_kaT)r	   second_orderbrownian_noisezDPM++ 2M SDE Exponentialsample_dpmpp_2m_sdeZk_dpmpp_2m_sde_expexponential)r	   r   zDPM++ 2M SDE KarrasZk_dpmpp_2m_sde_kazEuler aZsample_euler_ancestralZ	k_euler_aZk_euler_ancestral	uses_ensdZEulersample_eulerZk_eulerZLMSZ
sample_lmsZk_lmsZHeunsample_heunZk_heunr   ZDPM2sample_dpm_2Zk_dpm_2)discard_next_to_last_sigmar   zDPM2 asample_dpm_2_ancestralZ	k_dpm_2_a)r   r   r   z
DPM++ 2S asample_dpmpp_2s_ancestralZk_dpmpp_2s_a)r   r   zDPM++ 2MZ
k_dpmpp_2mz	DPM++ SDEZk_dpmpp_sde)r   r   zDPM++ 2M SDEr   zDPM++ 2M SDE HeunZk_dpmpp_2m_sde_heunheun)r   solver_typezDPM++ 2M SDE Heun KarrasZk_dpmpp_2m_sde_heun_ka)r	   r   r   zDPM++ 2M SDE Heun ExponentialZk_dpmpp_2m_sde_heun_expzDPM++ 3M SDEsample_dpmpp_3m_sdeZk_dpmpp_3m_sde)r   r   zDPM++ 3M SDE KarrasZk_dpmpp_3m_sde_ka)r	   r   r   zDPM++ 3M SDE ExponentialZk_dpmpp_3m_sde_expzDPM fastsample_dpm_fastZ
k_dpm_fastzDPM adaptiveZsample_dpm_adaptiveZk_dpm_adz
LMS KarrasZk_lms_kazDPM2 KarrasZ
k_dpm_2_ka)r	   r   r   r   zDPM2 a KarrasZk_dpm_2_a_kazDPM++ 2S a KarrasZk_dpmpp_2s_a_ka)r	   r   r   ZRestartrestart)r	   r   c                 C   s@   g | ]8\}}}}t |s$ttj|rt||fd d||qS )c                 S   s
   t || S N)KDiffusionSampler)modelfuncname r    F/var/www/html/stable-diffusion-webui/modules/sd_samplers_kdiffusion.py<lambda>+       z<listcomp>.<lambda>)callablehasattrk_diffusionsamplingr   ZSamplerData).0labelr   aliasesoptionsr    r    r!   
<listcomp>*   s   
r,   )s_churns_tmins_tmaxs_noiser0   )	r   r   r   r   r   r   r   r   r   c                 C   s   i | ]}|j |qS r    )name)r(   xr    r    r!   
<dictcomp><   r#   r3   )	Automaticr
   r   polyexponentialc                   @   s   e Zd Zedd ZdS )CFGDenoiserKDiffusionc                 C   s@   | j d u r:tjjdkrtjjntjj}|tjtjj	d| _ | j S )Nv)quantize)

model_wrapsharedsd_modelparameterizationr&   externalZCompVisVDenoiserZCompVisDenoiserr   enable_quantization)selfdenoiserr    r    r!   inner_modelF   s    
z!CFGDenoiserKDiffusion.inner_modelN)__name__
__module____qualname__propertyrA   r    r    r    r!   r6   E   s   r6   c                       s:   e Zd Zd
 fdd	Zdd ZdddZddd	Z  ZS )r   Nc                    sX   t  | t|g | _|p i | _t|r0|nttj	| j
| _t| | _| jj| _d S r   )super__init__sampler_extra_paramsgetextra_paramsr+   r$   getattrr&   r'   r   funcr6   model_wrap_cfgrA   r9   )r?   r   r;   r+   	__class__r    r!   rG   P   s    

zKDiffusionSampler.__init__c                 C   sx  | j d uo| j jdd}tjr2|s2d}d|jd< ||r<dnd7 }|jrV||}ntjdkr~| jj	d 
 | jj	d 
  }}tjrd	n||f\}}||d
}	ttj }
tj|jd< tj|krtjdkrtj|	d< tj|jd< tj|krtjdkrtj|	d< tj|jd< tjdkr"dnd}tjdkr`tjdkr`tj|kr`tj|	d< tj|jd< |
f d|i|	dtji}n| j d ur| j jdd dkrtjrd	n| jj	d 
 | jj	d 
 f\}}tjj|||tjd}nh| j d urD| j jdd dkrD| jj	d 
 | jj	d 
  }}tjj|||tjd}n| j|}|rtt|d d |dd  g}|S )Nr   FTzDiscard penultimate sigma   r   r4   )g?
   )	sigma_min	sigma_maxzSchedule typerS   zSchedule min sigmarT   zSchedule max sigmar5         ?g      @r   rhozSchedule rhondevicer	   r
   )rW   rS   rT   rX   )configr+   rI   r   !always_discard_next_to_last_sigmaextra_generation_params sampler_noise_scheduler_overridek_sched_typer9   sigmasitemuse_old_karras_scheduler_sigmask_diffusion_schedulerrS   rT   rV   r:   rX   r&   r'   get_sigmas_karrasget_sigmas_exponential
get_sigmastorchcat)r?   pstepsr   r_   Zm_sigma_minZm_sigma_maxrS   rT   Zsigmas_kwargsZsigmas_funcZdefault_rhor    r    r!   re   [   sH    

"


$
"0""zKDiffusionSampler.get_sigmasc                    s  t ||\}}||}	|	|| d d  }
|||
d   tjdkr~tj|jd< t||}t| |j}|tj 7 	| t
jj}d|v r|
d  d< d|v r|
d  d< d|v rt|
d  d< d|v r|
 d< d	|v r|
 d	< jjd
dr||	|}| d< jjdd dkr<d d< |j_|_||||jjd_|d  fdd}jjrd|jd< |S )NrP   r   zExtra noiserS   rY   rT   rW   sigma_schedr_   r   Fnoise_samplerr   r   cond
image_conduncondZ
cond_scales_min_uncondc                      s"   j jfjdjd S NF)
extra_argsdisablecallbackrL   rM   sampler_extra_argscallback_stater    extra_params_kwargsr?   xir    r!   r"      r#   z2KDiffusionSampler.sample_img2img.<locals>.<lambda>T	Pad conds)r   Zsetup_img2img_stepsre   r   img2img_extra_noiser\   r   r   noise
initializeinspect	signaturerL   
parameterslenrZ   r+   rI   create_noise_samplerrM   init_latentlast_latent	cfg_scalerp   rv   launch_samplingpadded_cond_uncond)r?   rh   r2   r}   conditioningunconditional_conditioningri   image_conditioningt_encr_   rj   Zextra_noise_paramsr   rk   samplesr    rx   r!   sample_img2img   sN    



z KDiffusionSampler.sample_img2imgc                    sD  |p|j }||}tjrBd|jd< td|d d   n|d  | t	j
j}d|v rv| d< d|v rjjd   d< jjd   d	< d
|v r| d
< jjddr܈||}	|	 d< jjdd dkrd d< _||||jjd_| fdd}
jjr@d|jd< |
S )NTzSGM noise multiplierrU   r   g       @rW   rS   rQ   rT   r_   r   Frk   r   r   rl   c                      s"   j jfjdjd S rq   ru   r    ry   r?   r2   r    r!   r"      r#   z*KDiffusionSampler.sample.<locals>.<lambda>r{   )ri   re   r   sgm_noise_multiplierr\   rf   sqrtr~   r   r   rL   r   r9   r_   r`   rZ   r+   rI   r   r   r   rp   rv   r   rM   r   )r?   rh   r2   r   r   ri   r   r_   r   rk   r   r    r   r!   sample   s>    




zKDiffusionSampler.sample)N)NN)NN)rB   rC   rD   rG   re   r   r   __classcell__r    r    rN   r!   r   O   s   2
6r   )rf   r   Zk_diffusion.samplingr&   modulesr   r   r   Z modules.sd_samplers_cfg_denoiserr   Zmodules.script_callbacksr   r   modules.sharedr   r:   Zrestart_samplerZsamplers_k_diffusionsamplers_data_k_diffusionrH   Zk_diffusion_samplers_mapr'   rc   rd   Zget_sigmas_polyexponentialrb   r6   Samplerr   r    r    r    r!   <module>   sp   
