B
    ?\C                 @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ ddlmZm	Z	m
Z
mZ ddlmZmZ ddlmZmZmZmZ ejaejaejadadadadadai ada da!da"da#d a$da%dd Z&d	d
 Z'dd Z(dddZ)dddZ*dddZ+ejejejddddfddZ,dd Z-dd Z.dS )    N)colored   )NormalCategoricalUniformTruncatedNormal)VariableTrace)util	TraceModePriorInflationInferenceEnginec             C   s   t d}|j}g }t }|d kr.|d n
|| xB|d k	rz|jj}|dr^|dks^P || || krrP |j}q:W d	|d
t|S )N   ?<z
<listcomp>z{}__{}__)sys	_getframef_lasti_extract_target_of_assignmentappendf_codeco_name
startswithf_backformatjoinreversed)Zroot_function_nameframeipnamesvar_namen r#   N/global/project/projectdirs/dasrepo/etalumis/conda_envs/pyprob/pyprob/state.py_extract_address   s     




r%   c              C   sX  t d} | j}|j| jd  }|j| jd  }tj| }|dkrL|j| S |dkr^|j| S |dkrBtj|j| jd   dkrBtj|j| jd   d	krB|d
kr|jn|j| }tj|j| jd   }|j| jd  }|dkr|j	| }n$|d
kr|j| }	| j
|	 }nd }t|tkr<t|}
|d |
 d S d S n|dkrPdS d S d S )N   r   
STORE_FAST)
STORE_NAMESTORE_GLOBAL)	LOAD_FAST	LOAD_NAMELOAD_GLOBAL   )
LOAD_CONSTr*      STORE_SUBSCRr*      r.   []RETURN_VALUEreturn)r   r   r   co_coder   opcodeopnameco_varnamesco_names	co_constsf_localstypeintstr)r   codeZnext_instructionZinstruction_argZinstruction_name	base_nameZsecond_instructionZ
second_argvaluer!   Z
index_namer#   r#   r$   r   5   s8    







r   c             C   sV   t tjkrRt| tr6ttt| j	
d| j	 S t| trRt| j| jd S d S )Ng      ?r&   )_prior_inflationr   ENABLED
isinstancer   r
   	to_tensortorchzerosnum_categoriesfill_r   meanstddev)distributionr#   r#   r$   _inflateW   s    

"
rN   c          
   C   s~   |d krt td }n|d }td k	r0t|}t|d }|d t| }t| } t	d | |||dd|d}t
| d S )NZ__Noner   r   g        T)rM   rB   address_baseaddressinstancelog_probZtaggedname)r%   !_current_trace_root_function_name_address_dictionaryaddress_to_id_current_tracelast_instancer?   r
   rF   r   add)rB   rS   rP   rO   rQ   variabler#   r#   r$   tag`   s    

r[   c          
   C   s   |d krt td | j }n|d | j }td k	r<t|}t|d }|d t| }|tkrlt| }n$|d k	rt	
|}n| d k	r|  }| j|dd}ttjksttjkrt jt|7  _t| |||||d|d}t| d S )Nr   r   T)sum)rM   rB   rO   rP   rQ   rR   observedrS   )r%   rT   _address_suffixrU   rV   rW   rX   r?   !_current_trace_observed_variablesr
   rF   samplerR   _inference_enginer   IMPORTANCE_SAMPLING*IMPORTANCE_SAMPLING_WITH_INFERENCE_NETWORKlog_importance_weightfloatr   rY   )rM   rB   rS   rP   rO   rQ   rR   rZ   r#   r#   r$   observeq   s$    

rf   TFc                s  |sd}t tjkst tjkr$d}d}|d kr@ttd  j }n|d  j }td k	r`t|}t	
|d }|d |r|dnt| }|tkrt| } j|dd}t	 jt|7  _t |||||d|d}	n$d}
d}d}ttjkrRt }|d kr  } j|dd}n:| } j|dd}t	 jt|t|j|dd 7  _n|t tjkrx  } j|dd}nVt tjkr|rt d |||d|||||
d	}	|r|tkrtj|	ttd
t|< d}t| }ntj|	ttd
}d}| }| dkr|d } j|dd}|j|dd}t|rft t!dddgd t d  t d| t d| t|rt t!dddgd t d| t d| t d| t	 jt|t| 7  _n  } j|dd}nt"d kr  } j|dd}n|t#kr\t$da%t tjkr@t& t'r8 fdd}nt& t(rR fdd}nd }|d k	r(t"j)| j*}t"j)| j}||}d}t++ |k r| }n  } j|dd}||}t,-|t,.|j|dd d| t,.|  | a%t%t,-|t,.|j|dd d| t,.|  | 8 a%n  } j|dd}n  } j|dd}d}
nr|t"j)kr  } j|dd}d}
nJt"j)| j*}d}
y j|dd}W n&     } j|dd}d}
Y nX t ||||||||||
d	}	|r|	at	/|	 |	j*S )NFTr   r   replaced)r\   )rM   rB   rO   rP   rQ   rR   r]   rS   g        )rM   rB   rO   rP   rQ   rR   controlreplacerS   r]   reused)Zprev_variableZproposal_min_train_iterationsr   z.Warning: prior log_prob has NaN, inf, or -inf.redbold)attrsrM   rB   rR   z1Warning: proposal log_prob has NaN, inf, or -inf.c                s   t |  jS )N)r   rL   )x)rM   r#   r$   <lambda>   s    zsample.<locals>.<lambda>c                s    t | d j j   j jdS )Ng?)lowhigh)r   rq   rp   )rn   )rM   r#   r$   ro      s    g      ?)0ra   r   LIGHTWEIGHT_METROPOLIS_HASTINGSRANDOM_WALK_METROPOLIS_HASTINGSr%   rT   r^   rU   rV   rW   rX   r?   r_   rR   rd   re   r   _trace_moder   PRIORrN   r`   rb   rc   7_current_trace_replaced_variable_proposal_distributions _current_trace_inference_networkZ_infer_step _current_trace_previous_variable>_current_trace_inference_network_proposal_min_train_iterationsdimr
   has_nan_or_infprintr   _metropolis_hastings_trace!_metropolis_hastings_site_addressrF   -_metropolis_hastings_site_transition_log_probrE   r   r   Zvariables_dict_addressrB   randomrG   logexprY   )rM   rh   ri   rS   rP   rO   rQ   rB   rR   rZ   rj   r]   Zupdate_previous_variableZinflated_distributionZproposal_distributionZproposal_log_probZproposal_kernel_funcZ_metropolis_hastings_site_valueZ"_metropolis_hastings_site_log_probZproposal_kernel_forwardalphaZproposal_kernel_reverser#   )rM   r$   r`      s    

(












4:

r`   c       	      C   s   |a |a|a|a| jja|d kr&i an|a|atd krJtt	j
krbtdntt ttjd att	jksvtt	jkr|ad atd k	rttj}|jad S )Nz^Cannot run trace with IMPORTANCE_SAMPLING_WITH_INFERENCE_NETWORK without an inference network.
   )rt   ra   rC   rU   __code__r   rT   r_   rw   r   rc   
ValueErrorZ_infer_initr>   Z_total_train_iterationsry   rr   rs   r}   r   r   choiceZvariables_controlledrP   r~   )	funcZ
trace_modeprior_inflationinference_engineinference_networkrf   Zmetropolis_hastings_traceaddress_dictionaryrZ   r#   r#   r$   _init_traces  s(    


r   c               C   s   t   at ad ai ad S )N)time_current_trace_execution_startr	   rW   rx   rv   r#   r#   r#   r$   _begin_trace<  s    r   c             C   s   t   t }t| | tS )N)r   r   rW   end)resultZexecution_time_secr#   r#   r$   
_end_traceG  s    r   )NN)NNN)TFNN)/rG   r   r7   r   r   	termcolorr   distributionsr   r   r   r   tracer   r	    r
   r   r   r   ru   rt   rb   ra   DISABLEDrC   rW   rT   rw   ry   rx   rv   r_   r   r}   r~   r   rU   r%   r   rN   r[   rf   r`   r   r   r   r#   r#   r#   r$   <module>   sB   "	


 %