B
    8\Z                 @   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|| _|| _|| _	|	| _
| rp|	d k	pr|
| _|
| _|| _|| _d S )N)distributionvaluer   	to_tensoraddress_baseaddressinstancelog_probcontrolreplacename
observableobservedreusedtagged)selfr   r   r   r	   r
   r   r   r   r   r   r   r    r   N/global/project/projectdirs/dasrepo/etalumis/conda_envs/pyprob/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__/   s    zVariable.__hash__c             C   s   t | t |kS )N)r   )r   otherr   r   r   __eq__2   s    zVariable.__eq__)NNNNNNFFNFFF)__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_observedlog_importance_weightlengthlength_controlledexecution_time_sec)r   r   r   r   r   7   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   r0   )r   r   r   r   r   J   s    zTrace.__repr__c             C   s(   | j | || j|j< || j|j< d S )N)r$   appendr+   r	   r,   r   )r   variabler   r   r   addV   s    z	Trace.addc             C   sH  || _ || _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| _d S )	Nr   c             S   s"   g | ]}|j s|js|js|qS r   )r   r   r   ).0vr   r   r   
<listcomp>k   s    zTrace.end.<locals>.<listcomp>c             S   s   g | ]}|j r|qS r   )r   )r8   r9   r   r   r   r:   l   s    c             S   s   g | ]}|j r|qS r   )r   )r8   r9   r   r   r   r:   m   s    c             S   s   g | ]}|j r|qS r   )r   )r8   r9   r   r   r   r:   n   s    c             S   s$   g | ]}|j s|jrt|jqS r   )r   r   torchsumr   )r8   r9   r   r   r   r:   o   s    c             S   s   g | ]}t |jqS r   )r;   r<   r   )r8   r9   r   r   r   r:   p   s    )r.   r3   ranger4   r$   r   r-   r   r   r   r'   r5   r%   r&   r(   r)   r*   r<   r   r/   r1   r2   )r   r.   r3   Zreplaced_indicesir6   jr   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_instancet   s    
zTrace.last_instancec             C   s   x| j D ]}|| qW d S )N)r$   r   )r   r   r6   r   r   r   r   z   s    zTrace.toc             C   s   dd | j D }tt|S )Nc             S   s   g | ]}t |qS r   )r   )r8   r6   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   r7   r@   rA   r   r   r   r   r   r   r   r#   6   s   r#   )r;    r   r   r#   r   r   r   r   <module>   s   0