B
    ɒ\F                 @   s&   d dl Z ddlmZ G dd dZdS )    N   )utilc               @   s   e Zd Zde e dfddZedd Zedd Zd	d
 Z	dddZ
dd Zedd Zedd Zedd Zdd Zedd ZdS )Distribution Nc             C   s"   || _ || _|| _|| _|| _d S )N)nameZ_address_suffix_batch_shape_event_shape_torch_dist)selfr   Zaddress_suffixbatch_shapeevent_shapeZ
torch_dist r   e/global/project/projectdirs/dasrepo/etalumis/pyprob_master_mar20/pyprob/distributions/distribution.py__init__   s
    zDistribution.__init__c             C   s   | j d k	r| j jS | jS d S )N)r	   r   r   )r
   r   r   r   r      s    
zDistribution.batch_shapec             C   s   | j d k	r| j jS | jS d S )N)r	   r   r   )r
   r   r   r   r      s    
zDistribution.event_shapec             C   s"   | j d k	r| j  }|S t d S )N)r	   sampleNotImplementedError)r
   sr   r   r   r      s    

zDistribution.sampleFc             C   s8   | j d k	r.| j t|}|r*t|S |S t d S )N)r	   log_probr   	to_tensortorchsumr   )r
   valuer   Zlpr   r   r   r   #   s    
zDistribution.log_probc             C   s   t | t|S )N)r   expr   r   r   )r
   r   r   r   r   prob*   s    zDistribution.probc             C   s   | j d k	r| j jS t d S )N)r	   meanr   )r
   r   r   r   r   -   s    
zDistribution.meanc             C   s   | j d k	r| j jS t d S )N)r	   variancer   )r
   r   r   r   r   4   s    
zDistribution.variancec             C   s
   | j  S )N)r   sqrt)r
   r   r   r   stddev;   s    zDistribution.stddevc             C   s
   t  d S )N)r   )r
   funcr   r   r   expectation?   s    zDistribution.expectationc             C   s0   | j d ks|j d krtdtjj| j |j S )NzHKL divergence is not currently supported for this pair of distributions.)r	   
ValueErrorr   distributionsklkl_divergence)Zdistribution_1Zdistribution_2r   r   r   r#   B   s    zDistribution.kl_divergence)F)__name__
__module____qualname__r   Sizer   propertyr   r   r   r   r   r   r   r   r   staticmethodr#   r   r   r   r   r      s   
r   )r   r   r   r   r   r   r   r   <module>   s   