a
    
d2                     @   s`   d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ G dd deZdS )	zSAMPLING ONLY.    N)tqdm)partial)make_ddim_sampling_parametersmake_ddim_timesteps
noise_like)norm_thresholdingc                       sp   e Zd Zdedf fdd	Zdd Zdd
dZe dddZ	e dddZ
e dddZ  ZS )PLMSSamplerlinearcudac                    s(   t    || _|j| _|| _|| _d S N)super__init__modelnum_timestepsddpm_num_timestepsscheduledevice)selfr   r   r   kwargs	__class__ l/var/www/html/stable-diffusion-webui/repositories/stable-diffusion-stability-ai/ldm/models/diffusion/plms.pyr      s
    
zPLMSSampler.__init__c                 C   s6   t |tjkr&|j| jkr&|| j}t| || d S r   )typetorchTensorr   tosetattr)r   nameattrr   r   r   register_buffer   s    zPLMSSampler.register_bufferuniform        Tc              	      s  |dkrt dt|| j|d _ jj}|jd  jksDJ d fdd} d| jj  d||  d	| jj	  d
|t
|   d|t
d|    d|t
d|    d|t
d|    d|t
d|  d  t|  j||d\}}}	 d|  d|  d|	  dt
d|  |td j	 d j  d j j	    }
 d|
 d S )Nr   zddim_eta must be 0 for PLMS)ddim_discr_methodnum_ddim_timestepsnum_ddpm_timestepsverbosez+alphas have to be defined for each timestepc                    s   |    tj jjS r   )clonedetachr   r   float32r   r   )xr   r   r   <lambda>!       z+PLMSSampler.make_schedule.<locals>.<lambda>betasalphas_cumprodalphas_cumprod_prevsqrt_alphas_cumprodsqrt_one_minus_alphas_cumprod      ?log_one_minus_alphas_cumprodsqrt_recip_alphas_cumprodsqrt_recipm1_alphas_cumprod   )	alphacumsddim_timestepsetar&   ddim_sigmasddim_alphasddim_alphas_prevddim_sqrt_one_minus_alphas"ddim_sigmas_for_original_num_steps)
ValueErrorr   r   r9   r   r/   shaper    r.   r0   npsqrtcpulogr   r   )r   ddim_num_stepsddim_discretizeddim_etar&   r/   to_torchr;   r<   r=   "sigmas_for_original_sampling_stepsr   r+   r   make_schedule   s<    "zPLMSSampler.make_scheduleNFr3   d   c                 K   s   |d urrt |trJ|t| d  jd }||krrtd| d|  n(|jd |krrtd|jd  d|  | j||	|d |\}}}||||f}td|  | j||||||
|d|||||||||d\}}||fS )Nr   zWarning: Got z! conditionings but batch-size is )rF   rH   r&   z Data shape for PLMS sampling is F)callbackimg_callbackquantize_denoisedmaskx0ddim_use_original_stepsnoise_dropouttemperaturescore_correctorcorrector_kwargsx_Tlog_every_tunconditional_guidance_scaleunconditional_conditioningdynamic_threshold)
isinstancedictlistkeysrA   printrK   plms_sampling)r   S
batch_sizerA   conditioningrM   normals_sequencerN   quantize_x0r:   rP   rQ   rT   rS   rU   rV   r&   rW   rX   rY   rZ   r[   r   cbsCHWsizesamplesintermediatesr   r   r   sample;   s8    


zPLMSSampler.samplec           %      C   s:  | j jj}|d }|d u r*tj||d}n|}|d u rH|r@| jn| j}nD|d ur|stt|| jj	d  d| jj	d  d }| jd | }|g|gd}|rt
ttd|nt|}|r|n|j	d }td| d t|d|d}g }t|D ]8\}}|| d }tj|f||tjd	}tj|f|t|d t|d  |tjd	} |d ur|	d usfJ | j |	|}!|!| d
| |  }| j|||||||||||||| |d}"|"\}}#}$||$ t|dkr|d |r|| |
r|
|#| || dks||d kr|d | |d |# q||fS )Nr   r   r7   )x_interpred_x0zRunning PLMS Sampling with z
 timestepszPLMS Sampler)desctotal)r   dtyper3   )indexuse_original_stepsrO   rT   rS   rU   rV   rY   rZ   old_epst_nextr[      rp   rq   )r   r.   r   r   randnr   r9   intminrA   r^   reversedrangerB   flipr`   r   	enumeratefulllonglenq_samplep_sample_plmsappendpop)%r   condrA   rW   rR   rM   	timestepsrO   rP   rQ   rN   rX   rT   rS   rU   rV   rY   rZ   r[   r   bimg
subset_endrm   
time_rangetotal_stepsiteratorrw   istepru   tsZts_nextimg_origoutsrq   e_tr   r   r   ra   v   sV    
* ,



zPLMSSampler.plms_samplingc                    s  g j jR ^}
fdd}|r<jjnj |rNjjnj|r`jjnj|rrjj	nj
 	fdd}||}t|dkr|||\}}|||}|| d }nt|dkrd| |d	  d }nrt|dkr.d
| d|d	   d|d   d }n>t|dkrld| d|d	   d|d   d|d   d }|||\}}|||fS )Nc                    s   d u sdkr"j | | }nXt| gd }t|gd }t g}j |||d\}}|||   }d urj jdksJ jj || | fi }|S )Nr3      eps)r   apply_modelr   catchunkparameterizationmodify_score)r*   tr   x_int_inc_in
e_t_uncond)crV   rU   r   rZ   rY   r   r   get_model_output   s    z3PLMSSampler.p_sample_plms.<locals>.get_model_outputc                    s  t jdddf | d}t jdddf| d}t jdddf	| d}t jdddf
| d}||   |  }rjj|^}}}d urt|}d| |d   |  }|tj  }	dkrt j	j
j|	d}	| | | |	 }
|
|fS )Nr7   ro   r3   r   r"   )p)r   r   rC   r   first_stage_modelquantizer   r   rA   nn
functionaldropout)r   ru   a_ta_prevsigma_tsqrt_one_minus_atrq   _dir_xtnoisex_prev)alphasalphas_prevr   r   r[   rS   rO   repeat_noiser   sigmassqrt_one_minus_alphasrT   r*   r   r   get_x_prev_and_pred_x0   s    
z9PLMSSampler.p_sample_plms.<locals>.get_x_prev_and_pred_x0r   r   r7                  7   ;   %   	      )rA   r   r   r/   r<   r0   r=   r2   r>   r?   r;   r   )r   r*   r   r   ru   r   rv   rO   rT   rS   rU   rV   rY   rZ   rw   rx   r[   r   r   r   r   r   rq   e_t_next	e_t_primer   )r   r   r   r   rV   r   r[   rS   rO   r   rU   r   r   r   rT   rZ   rY   r*   r   r      s(    $

&0zPLMSSampler.p_sample_plms)r!   r"   T)NNNNFr"   NNr3   r"   NNTNrL   r3   NN)NFNNFNNNrL   r3   r"   NNr3   NN)FFFr3   r"   NNr3   NNNN)__name__
__module____qualname__r   r   r   r    rK   no_gradrn   ra   r   __classcell__r   r   r   r   r      sJ   
!                  :      ;    r   )__doc__r   numpyrB   r   	functoolsr   !ldm.modules.diffusionmodules.utilr   r   r   Z"ldm.models.diffusion.sampling_utilr   objectr   r   r   r   r   <module>   s   