B
    ɒ\;                 @   s4   d dl Z ddlmZ G dd dZG dd dZdS )    N   )utilc               @   s6   e Zd ZdddZdd Zdd Zd	d
 Zdd ZdS )VariableNFc             C   s   || _ |d krd | _nt|| _|| _|| _|| _|d krDd | _nt|| _|d kr`d | _n
t	|| _|| _
|	| _|
| _| r|
d k	p|| _|| _|| _|| _d S )N)distributionvaluer   	to_tensoraddress_baseaddressinstancelog_problog_importance_weightfloatcontrolreplacename
observableobservedreusedtagged)selfr   r   r   r	   r
   r   r   r   r   r   r   r   r    r   P/global/project/projectdirs/dasrepo/etalumis/pyprob_master_mar20/pyprob/trace.py__init__   s(    
zVariable.__init__c             C   s<   d | j| j| j| j| j| j| jt| j	t| j
t| j
S )NzVariable(name:{}, control:{}, replace:{}, observable:{}, observed:{}, tagged:{}, address:{}, distribution:{}, value:{}: log_prob:{}))formatr   r   r   r   r   r   r	   strr   r   r   )r   r   r   r   __repr__    s    zVariable.__repr__c             C   s   | j d k	r| j j|d d S )N)device)r   to)r   r   r   r   r   r   -   s    
zVariable.toc             C   s<   t | jt| j t| j t| j t| j t| j S )N)hashr	   r   r   r   r   r   r   )r   r   r   r   __hash__3   s    zVariable.__hash__c             C   s   t | t |kS )N)r   )r   otherr   r   r   __eq__6   s    zVariable.__eq__)NNNNNNNFFNFFF)__name__
__module____qualname__r   r   r   r   r!   r   r   r   r   r      s
   
r   c               @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )Tracec             C   sj   g | _ g | _g | _g | _g | _g | _g | _i | _i | _i | _	d | _
d| _d| _d| _d| _d| _d | _d S )Ng        r   )	variablesvariables_controlledvariables_uncontrolledvariables_replacedvariables_observedvariables_observablevariables_taggedvariables_dict_addressvariables_dict_address_basenamed_variablesresultr   log_prob_observedr   lengthlength_controlledexecution_time_sec)r   r   r   r   r   ;   s"    zTrace.__init__c             C   sP   d t| jt| jt| jt| jt| jt| jt| jt	| j
t	| j	S )NzTrace(all:{:,}, controlled:{:,}, replaced:{:,}, observeable:{:,}, observed:{:,}, tagged:{:,}, uncontrolled:{:,}, log_prob:{}, log_importance_weight:{}))r   lenr&   r'   r)   r+   r*   r,   r(   r   r   r   )r   r   r   r   r   N   s    zTrace.__repr__c             C   s(   | j | || j|j< || j|j< d S )N)r&   appendr-   r	   r.   r   )r   variabler   r   r   addZ   s    z	Trace.addc       
      C   s  || _ || _g }xtt| jD ]}| j| }|jd k	rD|| j|j< |jr ||kr |jrxNt|d t| jD ]6}| j| j	|j	krn| j
| | j| }|| qnW | j| q W dd | jD | _dd | jD | _dd | jD | _dd | jD | _tdd | jD | _tdd | jD | _t| j| _t| j| _i }xB| jD ]8}|jd k	rP|jrv|j||j	< n|  j|j7  _qPW x$| D ]\}}	|  j|	7  _qW d S )	Nr   c             S   s"   g | ]}|j s|js|js|qS r   )r   r   r   ).0vr   r   r   
<listcomp>o   s    zTrace.end.<locals>.<listcomp>c             S   s   g | ]}|j r|qS r   )r   )r9   r:   r   r   r   r;   p   s    c             S   s   g | ]}|j r|qS r   )r   )r9   r:   r   r   r   r;   q   s    c             S   s   g | ]}|j r|qS r   )r   )r9   r:   r   r   r   r;   r   s    c             S   s$   g | ]}|j s|jrt|jqS r   )r   r   torchsumr   )r9   r:   r   r   r   r;   s   s    c             S   s   g | ]}t |jqS r   )r<   r=   r   )r9   r:   r   r   r   r;   t   s    )r0   r4   ranger5   r&   r   r/   r   r   r   r)   r6   r'   r(   r*   r+   r,   r=   r   r1   r2   r3   r   items)
r   r0   r4   Zreplaced_indicesir7   jZreplaced_log_importance_weights_r   r   r   r   end_   s>    


z	Trace.endc             C   s   || j kr| j | jS dS d S )Nr   )r.   r
   )r   r   r   r   r   last_instance   s    
zTrace.last_instancec             C   s   x| j D ]}|| qW d S )N)r&   r   )r   r   r7   r   r   r   r      s    zTrace.toc             C   s   dd | j D }tt|S )Nc             S   s   g | ]}t |qS r   )r   )r9   r7   r   r   r   r;      s    z"Trace.__hash__.<locals>.<listcomp>)r&   r   r=   )r   hr   r   r   r      s    zTrace.__hash__c             C   s   t | t |kS )N)r   )r   r    r   r   r   r!      s    zTrace.__eq__N)r"   r#   r$   r   r   r8   rC   rD   r   r   r!   r   r   r   r   r%   :   s   "r%   )r<    r   r   r%   r   r   r   r   <module>   s   4