o
    *jh                     @   s|   d dl Z d dlZd dlmZmZmZmZ ddgZdd Zdd Z	d	d
 Z
dd Zdd Z			dddZG dd deZdS )    N)
DPM_SolverNoiseScheduleVPmodel_wrappermodel_wrapper_guided_diffusionGaussianDiffusionbeta_schedulec                 C   s>   d| | t ||  }| | d t |  }d||  S )Ng               ?)torchexp)mu1Zlogvar1mu2Zlogvar2ab r   r/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/multi_modal/diffusion/diffusion.pykl_divergence   s   r   c                 C   s2   ddt tdtj | dt | d     S )Nr	         ?       @gHm?   )r
   tanhmathsqrtpipow)xr   r   r   standard_normal_cdf   s   "r   c                 C   s   | j |j   kr|j ksJ  J | | }t| }t||d  }t||d  }t|jdd}td| jdd}|| }	t| dk |t| dk|t|	jdd}
|
j | j ksbJ |
S )Ngp?g-q=)minr   g++?)shaper
   r   r   logclampwhere)x0mean	log_scaleZcxZinv_stdvZcdf_plusZcdf_minZlog_cdf_plusZlog_one_minus_cdf_minZ	cdf_deltaZ	log_probsr   r   r   #discretized_gaussian_log_likelihood   s    "r&   c                 C   s:   |  |j} |dfd|jd   }| | | |S )Nr      r(   )todevicesizendimview)tensortr   r   r   r   r   _i*   s   r0   c                 C   s    t | d d t j d d S )NgMb?gT㥛 ?r   )r   cosr   )ur   r   r   	cosine_fn0   s    r3     c           	      C   s   | dkrd| }|p|d }|p|d }t j|||t jdS | dkr:|p%d}|p)d}t j|d	 |d	 |t jdd
 S | dkrig }t|D ]}|| }|d | }|tdt|t|  d qDt j|t jdS td|  )NZlinear     @@g-C6?g{Gz?dtypeZ	quadraticg~jtX?g+?r	   r   Zcosiner(   r   r   zUnsupported schedule: )	r
   Zlinspacefloat64rangeappendr   r3   r.   
ValueError)	schedulenum_timestepsZ	init_betaZ	last_betascalebetasstept1t2r   r   r   r   4   s0   
"c                   @   s  e Zd Z				d.ddZd/dd	Zd
d Zdd Ze i ddddfddZ	e i ddddfddZ
i dddfddZe i ddddddddddf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e i ddddfddZe i ddddfd d!Ze i dddddfd"d#Ze i dddddfd$d%Zi dfd&d'Zi ddfd(d)Ze i ddfd*d+Zd,d- ZdS )0r   epslearned_rangemseFc                 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 )Nr6   r   r(   )r#   x_{t-1}rC   )learnedrD   fixed_largefixed_small)rE   rescaled_mseklrescaled_kll1rescaled_l1dimr   g#B;)!
isinstancer
   ZDoubleTensorr.   r8   r   maxr?   lenr=   	mean_typevar_type	loss_typerescale_timestepsZcumprodalphas_cumprodcatZnew_onesZalphas_cumprod_prev	new_zerosZalphas_cumprod_nextr   sqrt_alphas_cumprodsqrt_one_minus_alphas_cumprodr    log_one_minus_alphas_cumprodsqrt_recip_alphas_cumprodsqrt_recipm1_alphas_cumprodposterior_variancer!   posterior_log_variance_clippedposterior_mean_coef1posterior_mean_coef2)selfr?   rU   rV   rW   rX   alphasr   r   r   __init__Q   s`   




zGaussianDiffusion.__init__Nc                 C   s:   |d u r	t |n|}t| j||| t| j|||  S N)r
   
randn_liker0   r\   r]   )re   r#   r/   noiser   r   r   q_sample   s   zGaussianDiffusion.q_samplec                 C   s<   t | j||| }t d| j ||}t | j||}|||fS )Nr   )r0   r\   rY   r^   )re   r#   r/   muvarlog_varr   r   r   q_mean_variance   s   
z!GaussianDiffusion.q_mean_variancec                 C   sJ   t | j||| t | j|||  }t | j||}t | j||}|||fS rh   )r0   rc   rd   ra   rb   )re   r#   xtr/   rl   rm   rn   r   r   r   q_posterior_mean_variance   s   
z+GaussianDiffusion.q_posterior_mean_variancec	              	   C   s   |  |||||||\}	}
}}t|}dd|jd   }|d j| }|d urA||| |fi |}|	 |
|   }	|	|td|  |  }||fS )N)rQ   r'   r(   r   r	   )	p_mean_variancer
   ri   r,   nefloatr-   _scale_timestepsr   )re   rp   r/   modelmodel_kwargsr!   
percentilecondition_fnguide_scalerl   rm   rn   r#   rj   r   maskZgradxt_1r   r   r   p_sample   s   
zGaussianDiffusion.p_samplec                 C   sd   |  \}}	}
}|}t| jdD ]}tj|f|tj|jd}| ||||||||\}}q|S Nr   r7   r*   )	r+   r
   aranger=   flipfulllongr*   r}   )re   rj   rv   rw   r!   rx   ry   rz   r   chwrp   r@   r/   _r   r   r   p_sample_loop   s   

zGaussianDiffusion.p_sample_loopc                 C   s  |d u r|||  |fi |}net|trt|dksJ | jdks%J |||  |fi |d }	|||  |fi |d }
|
d d d df }||	d d d df |
d d d df   }|	d d dd f }tj|| |gdd}| jdkr|jddd\}}t	|}nh| jdkr|jddd\}}t
| j||}t
t| j||}|d d	 }|| d| |  }t	|}n3| jd
krt
t| jdd | jdd  g||}t|}n| jdkrt
| j||}t
| j||}| jdkr|}t
d| j ||| t
| j| j |||  }n5| jdkr%|}| |||\}}}n"| jdkrGt
| j||| t
| j|||  }| |||\}}}|d ur||dkrV|dksXJ tj|d |ddddddd}t|t| || }n|d ur|| |}||||fS )Nr   rC   r   r(   r   rO   rG   rD   r   rH   rI   rF   r   r#   rQ   )ru   rR   listrT   rU   r
   rZ   rV   chunkr   r0   rb   r    r?   ra   rc   rd   rq   r_   r`   ZquantileflattenabsZclamp_r-   r   rS   r!   )re   rp   r/   rv   rw   r!   rx   rz   outZy_outZu_outr   r   r   rn   rm   ZfractionZmin_log_varZmax_log_varrl   r#   r   sr   r   r   rr      sv   	,


"


z!GaussianDiffusion.p_mean_variance   T
dpm_solverc                 C   sf   t d| j d}t||| j| j|||| j| j|
|	d}t||d}|j	||||||||||d
}|S )a  Sample using DPM-Solver-based method.
            - condition_fn: for classifier-based guidance (guided-diffusion).
            - guide_scale: for classifier-free guidance (glide/dalle-2).
            Please check all the parameters in `dpm_solver.sample` before using.
        Zdiscrete)r<   r?   )rv   noise_schedulerV   rU   rw   r!   rx   rX   r=   rz   ry   )model_fnr   )	stepsorder	skip_typemethodsolver_typet_startt_endlower_order_finaldenoise_to_zero)
r   r?   rt   r   rV   rU   rX   r=   r   sample)re   rj   rv   r   r   r   rw   r!   rx   ry   rz   Zdpm_solver_timestepsr   r   r   r   r   r   r   r   rp   r   r   r   dpm_solver_sample_loop
  sB   
z(GaussianDiffusion.dpm_solver_sample_loop        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 )Nr(   r   r   rQ   r'   )r=   rr   r0   rY   r_   r`   r   ru   r!   r
   ri   rs   rt   r-   r,   )re   rp   r/   rv   rw   r!   rx   ry   rz   ddim_timestepsetastrider   r#   alpharC   rf   alphas_prevr   r   Zsigmasrj   	directionr{   r|   r   r   r   ddim_sampleA  s@   



&zGaussianDiffusion.ddim_samplec
                 C   s   |  \}
}}}|}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   r=   r!   r   r   r   r*   r   )re   rj   rv   rw   r!   rx   ry   rz   r   r   r   r   r   r   rp   r   r@   r/   r   r   r   r   ddim_sample_loopn  s"   

z"GaussianDiffusion.ddim_sample_loopc	              	   C   s   | j | }	| |||||||\}
}
}
}t| j||| | t| j|| }tt| j| jdgg||	 	d| j |}t
|| t
d| |  }||fS )Nr(   r   )r=   rr   r0   r_   r`   r
   rZ   rY   r[   r!   r   )re   rp   r/   rv   rw   r!   rx   rz   r   r   r   r#   rC   Zalphas_nextrl   r   r   r   ddim_reverse_sample  s"   

 z%GaussianDiffusion.ddim_reverse_samplec                 C   sl   |  \}}	}
}|}td| j| j| }|D ]}tj|f|tj|jd}| ||||||||\}}q|S r~   )r+   r
   r   r=   r   r   r*   r   )re   r#   rv   rw   r!   rx   rz   r   r   r   r   r   rp   r   r@   r/   r   r   r   r   ddim_reverse_sample_loop  s   


z*GaussianDiffusion.ddim_reverse_sample_loopc
                    s   j |	  fdd}
fdd}|
|}ttdkr<|||\}}|
|| d}|| d }nHttdkrMd| td	  d }n7ttd
krfd| dtd	   dtd   d }nttdkrd| dtd	   dtd   dtd   d }|||\}}|||fS )Nc              	      s    | | \}}}}d urRtj|| }tj|| |  | tj||  }|d|  | |fi   }tj|| |  tj|| |  }tj|| |  | tj||  }|S )Nr(   )rr   r0   rY   r_   r`   r   ru   )rp   r/   r   r#   r   rC   )r!   ry   rz   rv   rw   rx   re   r   r   compute_eps  s0   

z2GaussianDiffusion.plms_sample.<locals>.compute_epsc                    sh   t  j| t  j||   }t  j| d}td| |  }t|| | }||fS )Nr   r(   )r0   r_   r`   rY   r!   r
   r   )rC   r/   r#   r   r   r|   )re   r   rp   r   r   
compute_x0  s   z1GaussianDiffusion.plms_sample.<locals>.compute_x0r   r   r(   r   rQ   r            g      (@7   ;   %   	   g      8@)r=   rT   	eps_cacher!   )re   rp   r/   rv   rw   r!   rx   ry   rz   plms_timestepsr   r   rC   r|   r#   Zeps_nextZ	eps_primer   )	r!   ry   rz   rv   rw   rx   re   r   rp   r   plms_sample  s0   




zGaussianDiffusion.plms_samplec	                 C   s   |  \}	}
}}|}dtd| j| j|  d| jd d}g }|D ]/}tj|	f|tj|jd}| 	||||||||||
\}}}|
| t|dkrT|d q%|S )Nr(   r   r      )r+   r
   r   r=   r!   r   r   r   r*   r   r:   rT   pop)re   rj   rv   rw   r!   rx   ry   rz   r   r   r   r   r   rp   r   r   r@   r/   r   rC   r   r   r   plms_sample_loop  s.   



z"GaussianDiffusion.plms_sample_loopc                    sJ  |d u r	t |n|}| j|||d}| jdv r/| |||||\}}| jdkr-|| j }|S | jdv r||| |fi |}	d}
| jdv rw|	jddd	\}	}t j	|	
 |gdd	 | j||| fd
dd\}
}| jdrw|
| j d }
||| |||d d| j }|	| | jdrdnd djdd	}||
 }|S )N)rj   )rK   rL   rL   )rE   rJ   rM   rN   r   )rG   rD   r   r(   rO   c                     s    S rh   r   )argskwargsfrozenr   r   <lambda>8  s    z(GaussianDiffusion.loss.<locals>.<lambda>)rv   Z	rescaled_r5   r   )rC   r#   rF   rM   )r
   ri   rk   rW   variational_lower_boundr=   ru   rV   r   rZ   detach
startswithrq   rU   r   endswithr   r   r$   )re   r#   r/   rv   rw   rj   rp   lossr   r   Zloss_vlbrm   targetr   r   r   r   #  sF   





zGaussianDiffusion.lossc                 C   s   |  |||\}}	}
| ||||||\}}	}}t||
||}|djddtd }t||d| d }|djddtd }t	|dk||}||fS )Nr(   rO   r   r	   )r$   r%   r   )
rq   rr   r   r   r$   r   r    r&   r
   r"   )re   r#   rp   r/   rv   rw   r!   rx   r   r   Zlog_var1r   Zlog_var2rK   Znllvlbr   r   r   r   I  s   	
z)GaussianDiffusion.variational_lower_boundc              
   C   sv  |  \}}}}	g g g d}
t| jdD ]d}tj|f|tj|jd}t|}| 	|||}| 
|||||||\}}t| j||| | t| j|| }|
d | |
d ||  djdd |
d ||  djdd qd	d
 |
 D }
| ||\}}}t||t|t|}|djddtd }||
d< |
d jdd| |
d< |
S )N)r   rE   x0_mser   r   r   r   r(   rO   rE   c                 S   s    i | ]\}}|t j|d dqS )r(   rO   )r
   stack).0kvr   r   r   
<dictcomp>  s     zBGaussianDiffusion.variational_lower_bound_loop.<locals>.<dictcomp>r   Zprior_bits_per_dimZtotal_bits_per_dim)r+   r
   r   r=   r   r   r   r*   ri   rk   r   r0   r_   r`   r:   Zsquarer   r$   itemsro   r   Z
zeros_liker   r    sum)re   r#   rv   rw   r!   rx   r   r   r   r   Zmetricsr@   r/   rj   rp   r   Zpred_x0rC   rl   r   rn   Zkl_priorr   r   r   variational_lower_bound_loopc  s8   
z.GaussianDiffusion.variational_lower_bound_loopc                 C   s   | j r| d | j S |S )Nr5   )rX   rt   r=   )re   r/   r   r   r   ru     s   z"GaussianDiffusion._scale_timesteps)rC   rD   rE   Frh   )__name__
__module____qualname__rg   rk   ro   rq   r
   Zno_gradr}   r   rr   r   r   r   r   r   r   r   r   r   r   ru   r   r   r   r   r   O   s    

6
D6,E +
*)r4   NN)r   r
   Z0modelscope.models.multi_modal.dpm_solver_pytorchr   r   r   r   __all__r   r   r&   r0   r3   r   objectr   r   r   r   r   <module>   s   
