o
    *Îj1$  ã                   @   s<   d dl Z ddgZdd„ Z			d	dd„ZG dd„ deƒZdS )
é    NÚGaussianDiffusionÚbeta_schedulec                 C   s:   |   |j¡} | d¡fd|jd   }| |  |¡  |¡S )z?Index tensor using t and format the output according to x.
    r   ©é   r   )ÚtoÚdeviceÚsizeÚndimÚview)ÚtensorÚtÚxÚshape© r   úx/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/multi_modal/video_synthesis/diffusion.pyÚ_i
   s   r   éè  c                 C   s6   | dkrt j|d |d |t jdd S td| › ƒ‚)NZ	linear_sdg      à?©Údtypeé   zUnsupported schedule: )ÚtorchZlinspaceÚfloat64Ú
ValueError)ZscheduleÚnum_timestepsZ	init_betaZ	last_betar   r   r   r      s   þþc                   @   s†   e Zd ZdZ					ddd„Zi d	d	d	fd
d„Zdd„ Ze ¡ i d	d	d	d	ddfdd„ƒZ	e ¡ i d	d	d	d	ddfdd„ƒZ
dd„ Zd	S )r   z¦ Diffusion Model for DDIM.
    "Denoising diffusion implicit models." by Song, Jiaming, Chenlin Meng, and Stefano Ermon.
    See https://arxiv.org/abs/2010.02502
    ÚepsÚlearned_rangeÚmseçê-™—q=Fc                 C   s°  t |tjƒstj|tjd}t|ƒdkrt|ƒdksJ ‚|dv s"J ‚|dv s(J ‚|dv s.J ‚|| _t|ƒ| _	|| _
|| _|| _|| _|| _d| j }tj|dd| _t | dg¡| jd d… g¡| _t | jdd … | dg¡g¡| _t | j¡| _t d	| j ¡| _t d	| j ¡| _t d	| j ¡| _t d	| j d ¡| _|d	| j  d	| j  | _t | j d
¡¡| _|t | j¡ d	| j  | _ d	| j t |¡ d	| j  | _!d S )Nr   r   r   )Úx0zx_{t-1}r   )Zlearnedr   Zfixed_largeÚfixed_small)r   Zrescaled_mseÚklZrescaled_klÚl1Zrescaled_l1Zcharbonnier©Údiméÿÿÿÿç      ð?g#B’¡œÇ;)"Ú
isinstancer   ZDoubleTensorr   r   ÚminÚmaxÚbetasÚlenr   Ú	mean_typeÚvar_typeÚ	loss_typeÚepsilonÚrescale_timestepsZcumprodÚalphas_cumprodÚcatZnew_onesZalphas_cumprod_prevZ	new_zerosZalphas_cumprod_nextÚsqrtZsqrt_alphas_cumprodZsqrt_one_minus_alphas_cumprodÚlogZlog_one_minus_alphas_cumprodÚsqrt_recip_alphas_cumprodÚsqrt_recipm1_alphas_cumprodÚposterior_varianceÚclampÚposterior_log_variance_clippedÚposterior_mean_coef1Úposterior_mean_coef2)Úselfr)   r+   r,   r-   r.   r/   Úalphasr   r   r   Ú__init__$   sb   

ÿ
ÿÿÿÿÿÿ
ÿÿÿÿ
þzGaussianDiffusion.__init__Nc                 C   sð  |du r|||   |¡fi |¤Ž}npt|tƒrt|ƒdksJ ‚|||   |¡fi |d ¤Ž}	|||   |¡fi |d ¤Ž}
| j d¡rE|	 d¡n|	 d¡d }|
dd…d|…f }||	dd…d|…f |
dd…d|…f   }|	dd…|d…f }tj|| |gdd}| jdkr”t	| j
||ƒ}t	| j||ƒ}| jdkrµt	| j||ƒ| t	| j||ƒ|  }|  |||¡\}}}|durç|dkrÁ|dksÃJ ‚tj| d¡ ¡ |dd d	¡ d
ddd¡}t |t | |¡¡| }n|durò| | |¡}||||fS )z*Distribution of p(x_{t-1} | x_t).
        Nr   r   r   Úfixedr"   r   r   r%   r$   )Ú_scale_timestepsr&   Úlistr*   r,   Ú
startswithr   r   r1   r   r6   r8   r+   r4   r5   Úq_posterior_mean_varianceZquantileÚflattenÚabsZclamp_r
   r'   r(   r7   )r;   Úxtr   ÚmodelÚmodel_kwargsr7   Ú
percentileÚguide_scaleÚoutZy_outZu_outr#   ÚaÚbÚcÚvarÚlog_varr   ÚmuÚ_Úsr   r   r   Úp_mean_variance]   sH   ÿÿ,

ÿÿþþz!GaussianDiffusion.p_mean_variancec                 C   sJ   t | j||ƒ| t | j||ƒ|  }t | j||ƒ}t | j||ƒ}|||fS )z/Distribution of q(x_{t-1} | x_t, x_0).
        )r   r9   r:   r6   r8   )r;   r   rE   r   rP   rN   rO   r   r   r   rB      s   ÿÿ
z+GaussianDiffusion.q_posterior_mean_varianceé   g        c              	   C   s–  | j |	 }|  |||||||¡\}}}}|durWt| j||ƒ}t| j||ƒ| | t| j||ƒ }|d|  ¡ |||  |¡fi |¤Ž  }t| j||ƒ| t| j||ƒ|  }t| j||ƒ| | t| j||ƒ }t| j||ƒ}t| j||  d¡|ƒ}d| d|  }d||  }|
t	 || ¡ }t	 
|¡}t	 d| |d  ¡| }| d¡ ¡ jdgd|jd  ¢R Ž }t	 |¡| | || |  }||fS )zÈSample from p(x_{t-1} | x_t) using DDIM.
            - condition_fn: for classifier-based guidance (guided-diffusion).
            - guide_scale: for classifier-free guidance (glide/dalle-2).
        Nr   r   r   r$   r   )r   rS   r   r0   r4   r5   r2   r?   r7   r   Z
randn_likeÚneÚfloatr
   r	   )r;   rE   r   rF   rG   r7   rH   Úcondition_fnrI   Úddim_timestepsÚetaZstriderQ   r   Úalphar   r<   Zalphas_prevrK   rL   ZsigmasÚnoiseÚ	directionÚmaskZxt_1r   r   r   Úddim_sample–   s@   
ÿÿ
ÿ
ÿÿÿÿ
&zGaussianDiffusion.ddim_samplec
                 C   s‚   |  d¡}
|}dt d| j| j| ¡  d| jd ¡ d¡}|D ]}tj|
f|tj|jd}|  	||||||||||	¡
\}}q |S )Nr   r   )r   r   )
r   r   Zaranger   r7   ÚflipÚfullÚlongr   r^   )r;   r[   rF   rG   r7   rH   rW   rI   rX   rY   rL   rE   ZstepsÚstepr   rQ   r   r   r   Úddim_sample_loopÇ   s"   
ÿ
ÿþ
þz"GaussianDiffusion.ddim_sample_loopc                 C   s   | j r| ¡ d | j S |S )Ng     @@)r/   rV   r   )r;   r   r   r   r   r?   á   s   z"GaussianDiffusion._scale_timesteps)r   r   r   r   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r=   rS   rB   r   Zno_gradr^   rc   r?   r   r   r   r   r      sB    
ú=
ù0	ö0÷)r   NN)r   Ú__all__r   r   Úobjectr   r   r   r   r   Ú<module>   s   	
ý