o
    ¶Ïiu7  ã                   @   sT  d dl Z d dlmZ d dlZdd„ Zdd„ ZG dd„ dƒZG d	d
„ d
eƒZG dd„ deƒZG dd„ dƒZ	G dd„ deƒZ
G dd„ de
ƒZG dd„ de	ƒZG dd„ dƒZG dd„ de jjƒZG dd„ deƒZG dd„ de jjƒZG dd„ deƒZdd „ ZG d!d"„ d"e jjƒZG d#d$„ d$eƒZd%ed&efd'd(„ZG d)d*„ d*e jjƒZG d+d,„ d,eƒZdS )-é    N)Úmake_beta_schedulec                 C   sh   d| |  d  }|  ¡ }|d  ¡ }|d  ¡ }||8 }||||  9 }|d }d|d< d| | d S )Né   r   éÿÿÿÿé   gj–_'ÜJj>ç      à?)ÚsqrtÚclone)ÚsigmasÚalphas_cumprodÚalphas_bar_sqrtÚalphas_bar_sqrt_0Úalphas_bar_sqrt_TÚ
alphas_bar© r   ú2/mnt/c/Users/fbmor/ComfyUI/comfy/model_sampling.pyÚ rescale_zero_terminal_snr_sigmas   s   r   c                 C   s6   |   ¡ dkr|  d¡S |  | jd d… d|d   ¡S )Nr   r   )r   )ÚnelementÚviewÚshape)ÚsigmaÚ	noise_dimr   r   r   Úreshape_sigma   s   
 r   c                   @   ó.   e Zd Zdd„ Zdd„ Zddd„Zdd	„ Zd
S )ÚEPSc                 C   s&   t ||jƒ}||d | jd  d  S ©Nr   r   ©r   ÚndimÚ
sigma_data©Úselfr   Únoiser   r   r   Úcalculate_input   s   zEPS.calculate_inputc                 C   ó   t ||jƒ}|||  S ©N©r   r   ©r   r   Úmodel_outputÚmodel_inputr   r   r   Úcalculate_denoised#   ó   zEPS.calculate_denoisedFc                 C   s<   t ||jƒ}|r|t d|d  ¡ }n|| }||7 }|S )Nç      ð?g       @)r   r   Útorchr   ©r   r   r    Úlatent_imageÚmax_denoiser   r   r   Únoise_scaling'   s   zEPS.noise_scalingc                 C   ó   |S r#   r   ©r   r   Úlatentr   r   r   Úinverse_noise_scaling1   ó   zEPS.inverse_noise_scalingN©F©Ú__name__Ú
__module__Ú__qualname__r!   r(   r/   r3   r   r   r   r   r      s
    

r   c                   @   ó   e Zd Zdd„ ZdS )ÚV_PREDICTIONc                 C   sP   t ||jƒ}|| jd  |d | jd   || | j |d | jd  d   S r   r   r%   r   r   r   r(   5   ó   DzV_PREDICTION.calculate_denoisedN©r7   r8   r9   r(   r   r   r   r   r;   4   ó    r;   c                   @   r:   )ÚEDMc                 C   sP   t ||jƒ}|| jd  |d | jd   || | j |d | jd  d   S r   r   r%   r   r   r   r(   :   r<   zEDM.calculate_denoisedNr=   r   r   r   r   r?   9   r>   r?   c                   @   r   )ÚCONSTc                 C   r0   r#   r   r   r   r   r   r!   ?   r4   zCONST.calculate_inputc                 C   r"   r#   r$   r%   r   r   r   r(   B   r)   zCONST.calculate_denoisedFc                 C   s    t ||jƒ}|| d| |  S ©Nr*   r$   r,   r   r   r   r/   F   s   zCONST.noise_scalingc                 C   s   t ||jƒ}|d|  S rA   r$   r1   r   r   r   r3   J   r)   zCONST.inverse_noise_scalingNr5   r6   r   r   r   r   r@   >   s
    
r@   c                   @   r:   )ÚX0c                 C   r0   r#   r   r%   r   r   r   r(   O   r4   zX0.calculate_denoisedNr=   r   r   r   r   rB   N   r>   rB   c                   @   r:   )Ú
IMG_TO_IMGc                 C   r0   r#   r   r   r   r   r   r!   S   r4   zIMG_TO_IMG.calculate_inputN)r7   r8   r9   r!   r   r   r   r   rC   R   r>   rC   c                   @   s&   e Zd Zdd„ Zd	dd„Zdd„ ZdS )
ÚIMG_TO_IMG_FLOWc                 C   r0   r#   r   r%   r   r   r   r(   W   r4   z"IMG_TO_IMG_FLOW.calculate_denoisedFc                 C   s   |S r#   r   r,   r   r   r   r/   Z   r4   zIMG_TO_IMG_FLOW.noise_scalingc                 C   s   d| S rA   r   r1   r   r   r   r3   ]   s   z%IMG_TO_IMG_FLOW.inverse_noise_scalingNr5   )r7   r8   r9   r(   r/   r3   r   r   r   r   rD   V   s    
rD   c                   @   r   )ÚCOSMOS_RFLOWc                 C   s$   ||d  }t ||jƒ}|d|  S ©Nr   r*   r$   r   r   r   r   r!   a   s   zCOSMOS_RFLOW.calculate_inputc                 C   s,   ||d  }t ||jƒ}|d|  ||  S rF   r$   r%   r   r   r   r(   f   s   zCOSMOS_RFLOW.calculate_denoisedFc                 C   s    t ||jƒ}|| }||7 }|S r#   r$   r,   r   r   r   r/   k   s   zCOSMOS_RFLOW.noise_scalingc                 C   r0   r#   r   r1   r   r   r   r3   q   r4   z"COSMOS_RFLOW.inverse_noise_scalingNr5   r6   r   r   r   r   rE   `   s
    
rE   c                       sd   e Zd Zd‡ fdd„	Z			dd
d„Zdd„ Zedd„ ƒZedd„ ƒZdd„ Z	dd„ Z
dd„ Z‡  ZS )ÚModelSamplingDiscreteNc              	      s„   t ƒ  ¡  |d ur|j}ni }| dd¡}| dd¡}| dd¡}| dd¡}|d u r1| d	d
¡}| jd ||||d|d d| _d S )NÚbeta_scheduleÚlinearÚlinear_startg_ÎQÚK?Ú
linear_endgú~j¼t“ˆ?Ú	timestepséè  ÚzsnrFçü©ñÒMb€?)Úgiven_betasrH   rL   rJ   rK   Úcosine_srN   r*   )ÚsuperÚ__init__Úsampling_settingsÚgetÚ_register_scheduler   )r   Úmodel_configrN   rT   rH   rJ   rK   rL   ©Ú	__class__r   r   rS   u   s   

zModelSamplingDiscrete.__init__rI   rM   ç-Cëâ6?ç{®Gáz”?rO   Fc                 C   s†   |d ur|}n	t |||||d}d| }	tj|	dd}
|j\}t|ƒ| _|| _|| _|| _d|
 |
 d }| jr<t	|ƒ}|  
|¡ d S )N)rJ   rK   rQ   r*   r   ©Údimr   r   )r   r+   Úcumprodr   ÚintÚnum_timestepsrJ   rK   rN   r   Ú
set_sigmas)r   rP   rH   rL   rJ   rK   rQ   rN   ÚbetasÚalphasr
   r	   r   r   r   rV   ˆ   s   
z(ModelSamplingDiscrete._register_schedulec                 C   s(   |   d| ¡ ¡ |   d| ¡  ¡ ¡ d S )Nr	   Ú
log_sigmas)Úregister_bufferÚfloatÚlog)r   r	   r   r   r   ra   ¡   s   z ModelSamplingDiscrete.set_sigmasc                 C   ó
   | j d S ©Nr   ©r	   ©r   r   r   r   Ú	sigma_min¥   ó   
zModelSamplingDiscrete.sigma_minc                 C   rh   ©Nr   rj   rk   r   r   r   Ú	sigma_max©   rm   zModelSamplingDiscrete.sigma_maxc                 C   sH   |  ¡ }| | jj¡| jd d …d f  }| ¡ jdd |j¡ |j¡S )Nr   r\   )rg   Útord   ÚdeviceÚabsÚargminr   r   )r   r   Ú	log_sigmaÚdistsr   r   r   Útimestep­   s     zModelSamplingDiscrete.timestepc                 C   sx   t j| ¡  | jj¡dt| jƒd d}| ¡  	¡ }| 
¡  	¡ }| ¡ }d| | j|  || j|   }| ¡  |j¡S )Nr   r   )ÚminÚmax)r+   Úclamprf   rp   rd   rq   Úlenr	   ÚfloorÚlongÚceilÚfracÚexp)r   rv   ÚtÚlow_idxÚhigh_idxÚwrt   r   r   r   r   ²   s   ( zModelSamplingDiscrete.sigmac                 C   s8   |dkrdS |dkrdS d| }|   t |d ¡¡ ¡ S )Nç        ç33óÿdÍÍAr*   g     8@)r   r+   ÚtensorÚitem©r   Úpercentr   r   r   Úpercent_to_sigmaº   s   z&ModelSamplingDiscrete.percent_to_sigma)NN)NrI   rM   rZ   r[   rO   F)r7   r8   r9   rS   rV   ra   Úpropertyrl   ro   rv   r   rŠ   Ú__classcell__r   r   rX   r   rG   t   s    
ÿ

rG   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚModelSamplingDiscreteEDMc                 C   ó   d|  ¡  S ©Ng      Ð?©rg   ©r   r   r   r   r   rv   Ã   ó   z!ModelSamplingDiscreteEDM.timestepc                 C   ó   |d   ¡ S r   ©r   ©r   rv   r   r   r   r   Æ   r“   zModelSamplingDiscreteEDM.sigmaN©r7   r8   r9   rv   r   r   r   r   r   rŽ   Â   ó    rŽ   c                       sV   e Zd Zd‡ fdd„	Zdd„ Zedd„ ƒZedd	„ ƒZd
d„ Zdd„ Z	dd„ Z
‡  ZS )ÚModelSamplingContinuousEDMNc                    sT   t ƒ  ¡  |d ur|j}ni }| dd¡}| dd¡}| dd¡}|  |||¡ d S )Nrl   gü©ñÒMb`?ro   g      ^@r   r*   )rR   rS   rT   rU   Úset_parameters)r   rW   rT   rl   ro   r   rX   r   r   rS   Ê   s   
z#ModelSamplingContinuousEDM.__init__c                 C   sD   || _ t t |¡t |¡d¡ ¡ }|  d|¡ |  d| ¡ ¡ d S )NrM   r	   rd   )r   r+   ÚlinspaceÚmathrg   r   re   )r   rl   ro   r   r	   r   r   r   rš   Ö   s   z)ModelSamplingContinuousEDM.set_parametersc                 C   rh   ri   rj   rk   r   r   r   rl   Ý   rm   z$ModelSamplingContinuousEDM.sigma_minc                 C   rh   rn   rj   rk   r   r   r   ro   á   rm   z$ModelSamplingContinuousEDM.sigma_maxc                 C   r   r   r‘   r’   r   r   r   rv   å   r“   z#ModelSamplingContinuousEDM.timestepc                 C   r”   r   r•   r–   r   r   r   r   è   r“   z ModelSamplingContinuousEDM.sigmac                 C   sJ   |dkrdS |dkrdS d| }t  | j¡}t  t  | j¡| | | ¡S ©Nr„   r…   r*   )rœ   rg   rl   r   ro   )r   r‰   Úlog_sigma_minr   r   r   rŠ   ë   s   z+ModelSamplingContinuousEDM.percent_to_sigmar#   ©r7   r8   r9   rS   rš   r‹   rl   ro   rv   r   rŠ   rŒ   r   r   rX   r   r™   É   s    

r™   c                   @   r   )ÚModelSamplingContinuousVc                 C   s   |  ¡ tj d S ©Nr   )Úatanrœ   Úpir’   r   r   r   rv   ÷   ó   z!ModelSamplingContinuousV.timestepc                 C   s   |t j d  ¡ S r¡   )rœ   r£   Útanr–   r   r   r   r   ú   r¤   zModelSamplingContinuousV.sigmaNr—   r   r   r   r   r    ö   r˜   r    c                 C   s$   | dkr|S | | d| d |   S )Nr*   r   r   )Úalphar€   r   r   r   Útime_snr_shiftþ   s   r§   c                       óX   e Zd Zd‡ fdd„	Zddd„Zedd	„ ƒZed
d„ ƒZdd„ Zdd„ Z	dd„ Z
‡  ZS )ÚModelSamplingDiscreteFlowNc                    s@   t ƒ  ¡  |d ur|j}ni }| j| dd¡| dd¡d d S )NÚshiftr*   Ú
multiplierrM   )rª   r«   ©rR   rS   rT   rš   rU   ©r   rW   rT   rX   r   r   rS     s
   
"z"ModelSamplingDiscreteFlow.__init__r*   rM   c                 C   s<   || _ || _|  t d|d d¡| | ¡}|  d|¡ d S ©Nr   r	   )rª   r«   r   r+   Úarangere   )r   rª   rL   r«   Útsr   r   r   rš     s    z(ModelSamplingDiscreteFlow.set_parametersc                 C   rh   ri   rj   rk   r   r   r   rl     rm   z#ModelSamplingDiscreteFlow.sigma_minc                 C   rh   rn   rj   rk   r   r   r   ro     rm   z#ModelSamplingDiscreteFlow.sigma_maxc                 C   s
   || j  S r#   )r«   r’   r   r   r   rv     s   
z"ModelSamplingDiscreteFlow.timestepc                 C   s   t | j|| j ƒS r#   )r§   rª   r«   r–   r   r   r   r     r¤   zModelSamplingDiscreteFlow.sigmac                 C   s(   |dkrdS |dkrdS t | jd| ƒS ©Nr„   r*   )r§   rª   rˆ   r   r   r   rŠ   !  s
   z*ModelSamplingDiscreteFlow.percent_to_sigmar#   )r*   rM   rM   rŸ   r   r   rX   r   r©     s    
	

r©   c                       s@   e Zd Zd‡ fdd„	Zddd„Zdd	„ Zd
d„ Zdd„ Z‡  ZS )ÚStableCascadeSamplingNc                    s4   t ƒ  ¡  |d ur|j}ni }|  | dd¡¡ d S )Nrª   r*   r¬   r­   rX   r   r   rS   )  s
   
zStableCascadeSampling.__init__r*   rO   c                 C   sŠ   || _ t |¡| _t | jd| j  tj d ¡d | _d| _tj| jtj	d}t
| jƒD ]}|d | j }|  |¡||< q-|  |¡ d S )Nr   r   r   é'  )Údtype)rª   r+   r†   rQ   Úcosr£   Ú_init_alpha_cumprodr`   ÚemptyÚfloat32Úranger   ra   )r   rª   rQ   r	   Úxr€   r   r   r   rš   3  s   &z$StableCascadeSampling.set_parametersc                 C   sŽ   t  || j d| j  t j d ¡d | j }| jdkr9|}|d|   ¡ }|dt  dt  | j¡ ¡ 7 }| ¡ }| 	dd¡}d| | d S )Nr   r   r   r*   rZ   g§èH.ÿï?)
r+   rµ   rQ   r£   r¶   rª   rg   r†   Úsigmoidry   )r   rv   Úalpha_cumprodÚvarÚlogSNRr   r   r   r   A  s   .
zStableCascadeSampling.sigmac                 C   sd   d|| d  }|  dd¡}| j |j¡| j |j¡}}|| d  ¡ tjd  d|  | }|S )Nr   r   r*   r   )ry   rQ   rp   rq   r¶   Úacosr+   r£   )r   r   r½   ÚsÚmin_varr€   r   r   r   rv   M  s
   &zStableCascadeSampling.timestepc                 C   s0   |dkrdS |dkrdS d| }|   t |¡¡S r   )r   r+   r†   rˆ   r   r   r   rŠ   T  s   z&StableCascadeSampling.percent_to_sigmar#   )r*   rO   )	r7   r8   r9   rS   rš   r   rv   rŠ   rŒ   r   r   rX   r   r²   (  s    

r²   Úmur   c                 C   s$   t  | ¡t  | ¡d| d |   S ©Nr   )rœ   r   )rÂ   r   r€   r   r   r   Úflux_time_shift^  s   $rÄ   c                       r¨   )ÚModelSamplingFluxNc                    s6   t ƒ  ¡  |d ur|j}ni }| j| dd¡d d S )Nrª   çffffffò?)rª   r¬   r­   rX   r   r   rS   b  s
   
zModelSamplingFlux.__init__rÆ   r³   c                 C   s2   || _ |  t d|d d¡| ¡}|  d|¡ d S r®   )rª   r   r+   r¯   re   )r   rª   rL   r°   r   r   r   rš   k  s   z ModelSamplingFlux.set_parametersc                 C   rh   ri   rj   rk   r   r   r   rl   p  rm   zModelSamplingFlux.sigma_minc                 C   rh   rn   rj   rk   r   r   r   ro   t  rm   zModelSamplingFlux.sigma_maxc                 C   s   |S r#   r   r’   r   r   r   rv   x  r4   zModelSamplingFlux.timestepc                 C   s   t | jd|ƒS rA   ©rÄ   rª   r–   r   r   r   r   {  s   zModelSamplingFlux.sigmac                 C   s*   |dkrdS |dkrdS t | jdd| ƒS r±   rÇ   rˆ   r   r   r   rŠ   ~  s
   z"ModelSamplingFlux.percent_to_sigmar#   )rÆ   r³   rŸ   r   r   rX   r   rÅ   a  s    
	

rÅ   c                   @   r   )ÚModelSamplingCosmosRFlowc                 C   s   ||d  S rÃ   r   r’   r   r   r   rv   ‡  r“   z!ModelSamplingCosmosRFlow.timestepc                 C   s&   | j }|||d  kr|S |d|  S rÃ   )ro   )r   rv   ro   r   r   r   r   Š  s   zModelSamplingCosmosRFlow.sigmaNr—   r   r   r   r   rÈ   †  r˜   rÈ   )r+   Ú'comfy.ldm.modules.diffusionmodules.utilr   rœ   r   r   r   r;   r?   r@   rB   rC   rD   rE   ÚnnÚModulerG   rŽ   r™   r    r§   r©   r²   rf   rÄ   rÅ   rÈ   r   r   r   r   Ú<module>   s.    
N-%6%