a
    Ad                     @   s|   d dl Z d dlZd dlZd dlZd dlmZ d dlm	Z	 e 
 dddZe 
 dddZG d	d
 d
e	jZdddZdS )    N)shared)uni_pc        c                 C   s  | j j j}|| }|tjjj|d d dd |jjdkrBtj	ntj
}	td| }
|td|	   d|   d| |	      }|d u ri n|}||jd }||jd dddf}tjt|d |dD ]}t|d | }| |||  | fi |}||  | }|	|  | }||  | }|
|  | }|||  |  }d| |d	   | }|tjj| }| | | | }|d ur|||dd|d
 q|S )N   r   padmpsr   r   disable      ?   xisigma	sigma_hatdenoised)inner_modelalphas_cumprodtorchnn
functionalr	   todevicetypefloat64float32sqrtnpcpunumpynew_onesshapetqdmtrangelenitemk_diffusionsampling
randn_like)modelr   	timesteps
extra_argscallbackr   etar   alphasalphas_prevsqrt_one_minus_alphassigmass_ins_xr   indexe_ta_ta_prevsigma_tsqrt_one_minus_atpred_x0dir_xtnoise r@   J/var/www/html/stable-diffusion-webui/modules/sd_samplers_timesteps_impl.pyddim
   s,    
8>rB   c                    s,  | j j j}||  |tjjj|d d dd jjdkrBtj	ntj
td  |d u rdi n|}jd g}jd dddfg } fdd}	tjt|d |d	D ]d}
t|d |
 }||  | }|t|d d  | }| |fi |}t|dkrN|	||\}}| ||fi |}|| d
 }nt|dkrrd| |d  d
 }ndt|d
krd| d|d   d|d   d }n0d| d|d   d|d   d|d   d }|	||\}}|| t|dkr|d ||d ur||
dd|d qS )Nr   r   r   r
   r   r   c                    sl    |    }|    }|    }||   |  }d|  |  }| | | }||fS )Nr   )r(   r   )r8   r7   r9   r:   r<   r=   r>   x_prevr1   r2   r6   r3   r   r@   rA   get_x_prev_and_pred_x06   s    z$plms.<locals>.get_x_prev_and_pred_x0r   r                  7   ;   %   	         r   )r   r   r   r   r   r	   r   r   r   r   r   r   r#   r$   r%   r&   r'   r(   maxappendpop)r,   r   r-   r.   r/   r   r   r5   Zold_epsrE   r   r7   tst_nextr8   rC   r=   Ze_t_nextZ	e_t_primer@   rD   rA   plms*   s>    
8&0

rX   c                       s,   e Zd Z fddZdd Zdd Z  ZS )UniPCCFGc                    sJ   t  jd g|R i |  fdd}|_|_ _d_|_d S )Nc                    s(    | j dd|d  j d7  _ d S )Nr   r   r   )r7   )r   Zmodel_xr/   selfr@   rA   after_updatel   s    z'UniPCCFG.__init__.<locals>.after_updater   )super__init__	cfg_modelr.   r/   r7   r\   )r[   r_   r.   r/   argskwargsr\   	__class__rZ   rA   r^   i   s    zUniPCCFG.__init__c                 C   s   |d| j j  d S )Nr   g     @@)Znoise_scheduleZtotal_N)r[   Zt_continuousr@   r@   rA   get_model_input_timev   s    zUniPCCFG.get_model_input_timec                 C   s$   |  |}| j||fi | j}|S )N)rd   r_   r.   )r[   r   tZt_inputresr@   r@   rA   r,   y   s    
zUniPCCFG.model)__name__
__module____qualname__r^   rd   r,   __classcell__r@   r@   rb   rA   rY   h   s   rY   Fc              	   C   sv   | j j j}tjd|d}|r,|d d d nd }	t| |||ddtjjd}
|
j|t	||	tjj
d	tjjtjjd
}|S )Ndiscrete)r   r   i  gMbP?TF)Z
predict_x0ZthresholdingvariantZ	multistep)stepst_startZ	skip_typemethodorderZlower_order_final)r   r   r   ZNoiseScheduleVPrY   r   optsuni_pc_variantsampler'   uni_pc_skip_typeuni_pc_orderuni_pc_lower_order_final)r,   r   r-   r.   r/   r   
is_img2imgr   nsrn   Zunipc_samplerr@   r@   rA   unipc   s    
(ry   )NNNr   )NNN)NNNF)r   r%   k_diffusion.samplingr)   r"   r    modulesr   Zmodules.models.diffusion.uni_pcr   no_gradrB   rX   UniPCrY   ry   r@   r@   r@   rA   <module>   s   =