B
    %g\D                 @   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#   J/global/project/projectdirs/dasrepo/etalumis/pyprob_master/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|}nd }t| ||||||d|d	}t| d S )Nr   r   T)sum)	rM   rB   rO   rP   rQ   rR   log_importance_weightobservedrS   )r%   rT   _address_suffixrU   rV   rW   rX   r?   !_current_trace_observed_variablesr
   rF   samplerR   _inference_enginer   IMPORTANCE_SAMPLING*IMPORTANCE_SAMPLING_WITH_INFERENCE_NETWORKfloatr   rY   )	rM   rB   rS   rP   rO   rQ   rR   r]   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| }d }|tkrt| } j|dd}	t|	}t |||||	|d|d	}
nd}d}d}ttjkrDt }|d kr  } j|dd}	n0| } j|dd}	t|	t|j|dd }nvt tjkrn  } j|dd}	d}nLt 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|	r\t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|	t| }n  } j|dd}	nt!d kr  } j|dd}	n|t"krHt#d	a$t tjkr,t% t&r$ fdd}nt% t'r> 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rp  } 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]   r^   rS   r   g        )rM   rB   rO   rP   rQ   rR   controlreplacerS   r^   reused)Zprev_variableZproposal_min_train_iterationsz.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      ?)rM   rB   rO   rP   rQ   rR   r]   rh   ri   rS   r^   rj   )/rb   r   LIGHTWEIGHT_METROPOLIS_HASTINGSRANDOM_WALK_METROPOLIS_HASTINGSr%   rT   r_   rU   rV   rW   rX   r?   r`   rR   re   r   _trace_moder   PRIORrN   ra   rc   rd   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   r]   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$   ra      s    














4:
 
ra   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   rb   rC   rU   __code__r   rT   r`   rw   r   rd   
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_traceK  s    r   )NN)NNN)TFNN)/rG   r   r7   r   r   	termcolorr   distributionsr   r   r   r   tracer   r	    r
   r   r   r   ru   rt   rc   rb   DISABLEDrC   rW   rT   rw   ry   rx   rv   r`   r   r}   r~   r   rU   r%   r   rN   r[   rf   ra   r   r   r   r#   r#   r#   r$   <module>   sB   "	


 &