B
    -]B]              	   @   s2  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mZ ejaejaejad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dej0f	ddZ1dd Z2dd Z3dS )    N)colored   )NormalCategoricalUniformTruncatedNormal)VariableTrace)util	TraceModePriorInflationInferenceEngineImportanceWeightingg      ?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$   M/global/project/projectdirs/dasrepo/etalumis/pyprob_saeid-dev/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   7   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%   _inflateY   s    

"
rO   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)rN   rC   address_baseaddressinstancelog_probZtaggedname)r&   !_current_trace_root_function_name_address_dictionaryaddress_to_id_current_tracelast_instancer@   r
   rG   r   add)rC   rT   rQ   rP   rR   variabler$   r$   r%   tagb   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)	rN   rC   rP   rQ   rR   rS   log_importance_weightobservedrT   )r&   rU   _address_suffixrV   rW   rX   rY   r@   !_current_trace_observed_variablesr
   rG   sample_likelihood_importancerS   _inference_enginer   IMPORTANCE_SAMPLING*IMPORTANCE_SAMPLING_WITH_INFERENCE_NETWORKfloatr   rZ   )	rN   rC   rT   rQ   rP   rR   rS   r^   r[   r$   r$   r%   observes   s&    


rh   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 }|tkr|d t| }t| }t j|dd }t tjkst tjkrt|}	nd }	t ||||||	d|d	}
nd}d}ttjkrt tjkrr|d t| }t }|d kr>  } j|dd}d }	n0| } j|dd}t|t|j|dd }	qt tjkrttjkr.|d |rdnt| }|r t d |||d|||||d	}
d}|r|tkrtj|
ttd
t|< d} }ntj|
ttd
}d}| }|  dkr,|d } j|dd}|j|dd}t!"|rt#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| }	|rt ||||||	|||||d}
|
an  } j|dd}d }	|d t| }q|d |r>dnt| }|rt d |||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!"|rlt#t$dddgd t#d| t#d| t#d| t|t| }	|rt ||||||	|||||d}
|
an  } j|dd}d }	|d t| }q|d t| }d }	t%d kr  } j|dd}q|t&krlt!'da(t tjkrPt) t*rH fdd}nt) t+rb fdd}nd }|d k	r8t%j,| j-}t%j,| j}||}d}t.. |k r| }n  } j|dd}||}t/0|t/1|j|dd d| t/1|  | a(t(t/0|t/1|j|dd d| t/1|  | 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 nttj2kr|d t| }n&ttj3kr$|d |rdnt| }t }|d krR  } j|dd}d }	n0| } j|dd}t|t|j|dd }	t ||||||	|||||d}
t	4|
 |
j-S )NFTr   r   )r]   )	rN   rC   rP   rQ   rR   rS   r^   r_   rT   replacedg        )rN   rC   rP   rQ   rR   rS   controlreplacerT   r_   reused)Zprev_variableZproposal_min_train_iterationsr   z.Warning: prior log_prob has NaN, inf, or -inf.redbold)attrsrN   rC   rS   z1Warning: proposal log_prob has NaN, inf, or -inf.)rN   rC   rP   rQ   rR   rS   r^   rj   rk   rT   r_   rl   c                s   t |  jS )N)r   rM   )x)rN   r$   r%   <lambda>      zsample.<locals>.<lambda>c                s    t | d j j   j jdS )Ng?)lowhigh)r   rt   rs   )rp   )rN   r$   r%   rq     rr   g      ?)5rd   r   LIGHTWEIGHT_METROPOLIS_HASTINGSRANDOM_WALK_METROPOLIS_HASTINGSr&   rU   r`   rV   rW   rX   rY   ra   r@   rc   rS   re   rf   rg   r   _trace_moder   	POSTERIORrO   rb   _importance_weightingr   IW07_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_addressrG   -_metropolis_hastings_site_transition_log_probrF   r   r   Zvariables_dict_addressrC   randomrH   logexpPRIORPRIOR_FOR_INFERENCE_NETWORKrZ   )rN   rj   rk   rT   rQ   rP   rR   rC   rS   r^   r[   rl   r_   Zinflated_distributionZupdate_previous_variableZproposal_distributionZproposal_log_probZproposal_kernel_funcZ_metropolis_hastings_site_valueZ"_metropolis_hastings_site_log_probZproposal_kernel_forwardalphaZproposal_kernel_reverser$   )rN   r%   rb      s>   









 







 




4:
 
rb   c
             C   s   |a |a|a|a|	a|a| jja|d kr.i a	n|a	|a
t
d krRttjkrhtdnt
  t
t	 d attjks|t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.)rw   rd   rD   rc   ry   rV   __code__r   rU   ra   r|   r   rf   
ValueErrorevalZ_infer_initr~   ru   rv   r   r   r   choiceZvariables_controlledrQ   r   )funcZ
trace_modeprior_inflationinference_engineinference_networkrh   Zmetropolis_hastings_traceaddress_dictionarylikelihood_importanceZimportance_weightingr[   r$   r$   r%   _init_tracesY  s.    


r   c               C   s   t   at ad ai ad S )N)time_current_trace_execution_startr	   rX   r}   r{   r$   r$   r$   r%   _begin_trace  s    r   c             C   s   t   t }t| | tS )N)r   r   rX   end)resultZexecution_time_secr$   r$   r%   
_end_trace  s    r   )NN)NNN)TFNN)4rH   r   r8   r   r   	termcolorr   distributionsr   r   r   r   tracer   r	    r
   r   r   r   r   r   rw   re   rd   DISABLEDrD   rc   IW1ry   rX   rU   r|   r~   r}   r{   ra   r   r   r   r   rV   r&   r   rO   r\   rh   rb   rz   r   r   r   r$   r$   r$   r%   <module>   sF   "	


 J$+