o
    ?i#                     @   s,   d dl Zd dlZdd Zdd Zdd ZdS )    Nc                    s   d  | |||fD ]}t |tjr|  nq d usJ d fdd||fD \}}dd| | t||  | | d t|    S )Nz&at least one argument must be a Tensorc                    s,   g | ]}t |tjr|nt| qS  )
isinstancethTensortensorto).0xr   r   S/data/cameron/vidgen/unified_video_action/./simple_uva/diffusion/diffusion_utils.py
<listcomp>   s    znormal_kl.<locals>.<listcomp>      ?g         )r   r   r   exp)mean1logvar1mean2logvar2objr   r
   r   	normal_kl   s*   

r   c                 C   s2   ddt tdtj | dt | d     S )Nr         ?g       @gHm?   )r   tanhnpsqrtpipow)r	   r   r   r   approx_standard_normal_cdf   s   2r   c                C   s   | j |j   kr|j ksJ  J | | }t| }||d  }t|}||d  }t|}t|jdd}	td| jdd}
|| }t| dk |	t| dk|
t|jdd}|j | j ksfJ |S )Ngp?g-q=)minr   g+g+?)shaper   r   r   logclampwhere)r	   means
log_scalesZ
centered_xZinv_stdvZplus_inZcdf_plusZmin_inZcdf_minZlog_cdf_plusZlog_one_minus_cdf_minZ	cdf_delta	log_probsr   r   r   #discretized_gaussian_log_likelihood   s"   "r&   )torchr   numpyr   r   r   r&   r   r   r   r   <module>   s
   