a
    
dC                     @   sL   d Z ddlZddlZddlmZ ddlmZmZmZm	Z	 G dd de
ZdS )zSAMPLING ONLY.    N)tqdm)make_ddim_sampling_parametersmake_ddim_timesteps
noise_likeextract_into_tensorc                       s   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e d ddZe d!ddZe d"ddZ  ZS )#DDIMSampler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/ddim.pyr      s
    
zDDIMSampler.__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DDIMSampler.register_bufferuniform        Tc              	      s  t || j|d _ jj}|jd  jks4J 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 )N)ddim_discr_methodnum_ddim_timestepsnum_ddpm_timestepsverboser   z+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+DDIMSampler.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)r   r   r8   r   r.   shaper   r-   r/   npsqrtcpulogr   r   )r   ddim_num_stepsZddim_discretizeddim_etar%   r.   to_torchr:   r;   r<   Z"sigmas_for_original_sampling_stepsr   r*   r   make_schedule   s8    "zDDIMSampler.make_scheduleNFr2   d   c                  K   s6  |d urt |trb|t| d  }t |tr:|d }q&|jd }||krtd| d|  n`t |tr|D ]&}|jd |krptd| d|  qpn(|jd |krtd|jd  d|  | j||	|d |\}}}||||f}td| d|	  | j||||||
|d||||||||||d\}}||fS )	Nr   zWarning: Got z! conditionings but batch-size is )rD   rE   r%   z Data shape for DDIM sampling is z, eta 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ucg_schedule)
isinstancedictlistkeysr?   printrG   ddim_sampling) r   S
batch_sizer?   conditioningrI   Znormals_sequencerJ   Zquantize_x0r9   rL   rM   rP   rO   rQ   rR   r%   rS   rT   rU   rV   rW   rX   r   ctmpcbsCHWsizesamplesintermediatesr   r   r   sample7   sF    




zDDIMSampler.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d|nt|}|r|n|j	d }td| d t|d|d}t|D ]\}}|| d }tj|f||tjd	}|d urT|	d us2J | j |	|} | | d
| |  }|d ur|t|t|kstJ || }| j|||||||||||||d}!|!\}}"|r|| |
r|
|"| || dks||d kr|d | |d |" q||fS )Nr   r   r6   )x_interpred_x0Running DDIM Sampling with 
 timestepszDDIM Samplerdesctotalr   dtyper2   )
indexuse_original_stepsrK   rP   rO   rQ   rR   rU   rV   rW   rl   rm   )r   r-   r   r   randnr   r8   intminr?   reversedranger@   flipr]   r   	enumeratefulllongq_samplelenp_sample_ddimappend)#r   condr?   rS   rN   rI   	timestepsrK   rL   rM   rJ   rT   rP   rO   rQ   rR   rU   rV   rW   rX   r   bimgZ
subset_endri   
time_rangetotal_stepsiteratoristepru   tsimg_origoutsrm   r   r   r   r^   {   sP    
*

zDDIMSampler.ddim_samplingc           &         sF  g |j |jR ^}}}d u s*|dkr>| j|| }n$t|gd }t|gd }t trttsvJ t } D ]Tt  tr fddt	t
  D |< qt   g|< qn`t tr*t }ttsJ t	t
 D ]"}|t|  | g qnt g}| j|||d\}}||||   }| jjdkr| j|||}n|}|
d ur| jjdksJ d|
j| j||| fi |}|r| jjn| j}|r| jjn| j}|r| jjn| j}|r| jjn| j}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	}!| jjdkr||!|  |  }"n| j|||}"|r| jj|"^}"}}|d urt d| | d   | }#| t|j || | }$|	d
kr*tjj j!|$|	d}$| |" |# |$ }%|%|"fS )Nr2      c                    s*   g | ]"}t  |   | gqS r   )r   cat).0r   ckrV   r   r   
<listcomp>   s
   

z-DDIMSampler.p_sample_ddim.<locals>.<listcomp>vepsznot implementedr6   rk   r!   )p)"r?   r   r   apply_modelr   r   rY   rZ   r[   r{   r   r   chunkparameterizationpredict_eps_from_z_and_vmodify_scorer.   r;   r/   r<   r1   r=   r>   r:   r~   rA   predict_start_from_z_and_vfirst_stage_modelquantizeNotImplementedErrorr   nn
functionaldropout)&r   r)   r   tru   repeat_noiserv   rK   rP   rO   rQ   rR   rU   rV   rW   r   _r   model_outputx_int_inc_inr   Zmodel_uncondZmodel_tZe_talphasalphas_prevZsqrt_one_minus_alphassigmasa_tZa_prevZsigma_tZsqrt_one_minus_atrm   Zdir_xtnoisex_prevr   r   r   r      sh    
"


zDDIMSampler.p_sample_ddimc	                 C   s  |r
| j n
| jjd }	||	ks"J |}
|rH| jd |
 }| jd |
 }n"| jd |
 }t| jd |
 }|}g }g }t	t
|
ddD ]\}tj|jd f|| jjtjd}|dkr| j|||}nV|d usJ t| jt||ft||ft||fd\}}||||   }|| ||   | }||  d||  d  d||  d    | }|| }|r||
|  dkr||
d k r|| || n(|r||
d kr|| || |r|| q||d}|r|d	|i ||fS )
Nr   zEncoding Image)rq   rs   r2   r   r6   )Z	x_encodedZintermediate_stepsri   )r   r8   r?   r.   r/   r;   r   tensorr<   r   r{   r~   r   r   r   r   r   r   rA   r   update)r   rM   r   Zt_encrv   return_intermediatesrU   rV   rI   Znum_reference_steps	num_stepsZalphas_nextr   x_nextri   Zinter_stepsr   r   Z
noise_predZ
e_t_uncondZxt_weightedZweighted_noise_predoutr   r   r   encode   s^     
&




zDDIMSampler.encodec                 C   sZ   |r| j }| j}nt| j}| j}|d u r6t|}t|||j| t|||j|  S r
   )	r0   r1   r   rA   r;   r=   
randn_liker   r?   )r   rM   r   rv   r   r0   r1   r   r   r   stochastic_encode-  s    
zDDIMSampler.stochastic_encodec              
   C   s   |rt | jn| j}|d | }t |}	|jd }
td|
 d t|	d|
d}|}t|D ]Z\}}|
| d }t	j
|jd f||jt	jd}| j|||||||d\}}|r`|| q`|S )	Nr   rn   ro   zDecoding imagerp   r6   rs   )ru   rv   rU   rV   )r@   aranger   r8   r|   r?   r]   r   r}   r   r~   r   r   r   )r   Zx_latentr   Zt_startrU   rV   rv   rI   r   r   r   r   Zx_decr   r   ru   r   r   r   r   r   decode=  s     


zDDIMSampler.decode)r    r!   T)NNNNFr!   NNr2   r!   NNTNrH   r2   NNN)NFNNFNNNrH   r2   r!   NNr2   NNN)
FFFr2   r!   NNr2   NN)FNr2   NN)FN)r2   NFN)__name__
__module____qualname__r   r   r   r   rG   no_gradrj   r^   r   r   r   r   __classcell__r   r   r   r   r   
   s`   
                   C      9    H  .  r   )__doc__r   numpyr@   r   !ldm.modules.diffusionmodules.utilr   r   r   r   objectr   r   r   r   r   <module>   s
   