B
    ɒ\E                 @   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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dfddZ-dd Z.dd Z/dS )    N)colored   )NormalCategoricalUniformTruncatedNormal)VariableTrace)util	TraceModePriorInflationInferenceEngineg      ?c             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#   P/global/project/projectdirs/dasrepo/etalumis/pyprob_master_mar20/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   6   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$   _inflateX   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$   taga   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|  }t| 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   sample_likelihood_importancerR   _inference_enginer   IMPORTANCE_SAMPLING*IMPORTANCE_SAMPLING_WITH_INFERENCE_NETWORKfloatr   rY   )	rM   rB   rS   rP   rO   rQ   rR   r]   rZ   r#   r#   r$   observer   s&    


rg   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   rr   rq   )ro   )rM   r#   r$   rp      s    g      ?)rM   rB   rO   rP   rQ   rR   r]   ri   rj   rS   r^   rk   )/rc   r   LIGHTWEIGHT_METROPOLIS_HASTINGSRANDOM_WALK_METROPOLIS_HASTINGSr%   rT   r_   rU   rV   rW   rX   r?   r`   rR   rf   r   _trace_moder   PRIORrN   ra   rd   re   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   ri   rj   rS   rP   rO   rQ   r]   rB   rR   rZ   rk   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|a| jja|d kr*i an|a|a	t	d krNtt
jkrntdn t	  t	t tt	jd att
jkst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.
   )ru   rc   rC   rb   rU   __code__r   rT   r`   rx   r   re   
ValueErrorevalZ_infer_initr>   Z_total_train_iterationsrz   rs   rt   r~   r   r   choiceZvariables_controlledrP   r   )
funcZ
trace_modeprior_inflationinference_engineinference_networkrg   Zmetropolis_hastings_traceaddress_dictionarylikelihood_importancerZ   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   ry   rw   r#   r#   r#   r$   _begin_traceC  s    r   c             C   s   t   t }t| | tS )N)r   r   rW   end)resultZexecution_time_secr#   r#   r$   
_end_traceN  s    r   )NN)NNN)TFNN)0rG   r   r7   r   r   	termcolorr   distributionsr   r   r   r   tracer   r	    r
   r   r   r   rv   ru   rd   rc   DISABLEDrC   rb   rW   rT   rx   rz   ry   rw   r`   r   r~   r   r   rU   r%   r   rN   r[   rg   ra   r   r   r   r#   r#   r#   r$   <module>   sD   "	


  (