B
    áÉ’\Ó  ã               @   sD   d dl Z d dlmZ ddlmZmZ ddlmZ G dd„ deƒZdS )	é    N)Úcoloredé   )ÚDistributionÚNormalé   )Úutilc                   sŒ   e Zd Zd‡ fdd„	Zdd„ Zddd„Zedd	„ ƒZed
d„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZdd„ Z‡  ZS )ÚTruncatedNormalFc                sb  t  |¡| _t  |¡| _t  |¡| _t  |¡| _|rPt t | j| j¡| j¡| _| j 	¡ dkrfd| _
n4| j 	¡ dks‚| j 	¡ dkr’| j d¡| _
ntdƒ‚tt  t | j¡¡t  t | j¡¡ƒ| _| j| j | j | _| j| j | j | _| j | j¡| _| j | j¡| _| j| j | _t | j| j ¡| _d | _d | _| j ¡ }t ¡ }tƒ jdd||d d S )Nr   r   r   z+Expecting 1d or 2d (batched) probabilities.r   )ÚnameÚaddress_suffixÚbatch_shapeÚevent_shape)r   Ú	to_tensorÚ_mean_non_truncatedÚ_stddev_non_truncatedÚ_lowÚ_highÚtorchÚmaxÚminÚdimÚ_batch_lengthÚsizeÚRuntimeErrorr   Ú
zeros_likeÚ	ones_likeÚ_standard_normal_distÚ_alphaÚ_betaÚcdfÚ_standard_normal_cdf_alphaÚ_standard_normal_cdf_betaÚ_ZÚlogÚ_log_stddev_ZÚ_meanÚ	_varianceÚSizeÚsuperÚ__init__)ÚselfÚmean_non_truncatedÚstddev_non_truncatedÚlowÚhighZclamp_mean_between_low_highr   r   )Ú	__class__© úi/global/project/projectdirs/dasrepo/etalumis/pyprob_master_mar20/pyprob/distributions/truncated_normal.pyr(   
   s.    (
zTruncatedNormal.__init__c             C   s   d  | j| j| j| j¡S )NzPTruncatedNormal(mean_non_truncated:{}, stddev_non_truncated:{}, low:{}, high:{}))Úformatr   r   r   r   )r)   r/   r/   r0   Ú__repr__$   s    zTruncatedNormal.__repr__c             C   sÂ   t  |¡}| | j¡ | j¡}| | j¡ | j¡}t | 	|¡¡| j
 || j | j ¡ | j }| jdkrt| d¡}t  |¡r°ttdddgdƒ td| ƒ td|ƒ td	|ƒ |r¾t |¡S |S )
Nr   r   zCWarning: NaN, -Inf, or Inf encountered in TruncatedNormal log_prob.ÚredÚbold)ÚattrsÚdistributionÚvalueÚlog_prob)r   r   Úger   Útype_asÚler   r   r"   Úmulr   r8   r   r   r#   r   ÚsqueezeÚhas_nan_or_infÚprintr   Úsum)r)   r7   r@   ÚlbÚubÚlpr/   r/   r0   r8   '   s    
.





zTruncatedNormal.log_probc             C   s   | j S )N)r   )r)   r/   r/   r0   r,   7   s    zTruncatedNormal.lowc             C   s   | j S )N)r   )r)   r/   r/   r0   r-   ;   s    zTruncatedNormal.highc             C   s   | j S )N)r   )r)   r/   r/   r0   r*   ?   s    z"TruncatedNormal.mean_non_truncatedc             C   s   | j S )N)r   )r)   r/   r/   r0   r+   C   s    z$TruncatedNormal.stddev_non_truncatedc             C   s   | j  d¡S )Nr   )r   Úpow)r)   r/   r/   r0   Úvariance_non_truncatedG   s    z&TruncatedNormal.variance_non_truncatedc             C   sX   | j d krR| j| j| j | j¡| j | j¡  | j  | _ | jdkrR| j  	d¡| _ | j S )Nr   r   )
r$   r   r   r   Úprobr   r   r!   r   r=   )r)   r/   r/   r0   ÚmeanK   s
    
0
zTruncatedNormal.meanc             C   s„   | j d kr~| j | j¡}| j | j¡}| j d¡d| j| | j|  | j  || | j  d¡  | _ | jdkr~| j  	d¡| _ | j S )Nr   r   r   )
r%   r   rF   r   r   r   rD   r!   r   r=   )r)   Zstandard_normal_prob_alphaZstandard_normal_prob_betar/   r/   r0   ÚvarianceS   s    
@
zTruncatedNormal.variancec             C   sî   | j  ¡ }d}t t |¡ tdƒ¡¡}d}x¨t |¡s<|rÔ|d7 }|dkrTt	dƒ t t |¡ 
¡ ¡}| j | j|| j| j   ¡| j | j }| | j ¡ | j ¡}| | j¡ | j ¡}tt | |¡¡ƒdk}q.W | jdkrê| d¡}|S )Nr   ÚNaNTr   i'  z“Warning: trying to sample from the tail of a truncated normal distribution, which can take a long time. A more efficient implementation is pending.)r   r   r   r   r   ÚzerosÚfill_Úfloatr>   r?   Úuniform_r   Úicdfr   r    r   r   r9   r:   Últr   Úintr@   r<   r   r=   )r)   ÚshapeZattempt_countÚretZoutside_domainÚrandrA   rB   r/   r/   r0   Úsample]   s     
*

zTruncatedNormal.sample)F)F)Ú__name__Ú
__module__Ú__qualname__r(   r2   r8   Úpropertyr,   r-   r*   r+   rE   rG   rH   rT   Ú__classcell__r/   r/   )r.   r0   r   	   s   

r   )r   Ú	termcolorr   Ú r   r   r   r   r/   r/   r/   r0   Ú<module>   s   