B
    áÉ’\‘  ã               @   sú   d dl Z d dlZd dlmZmZ d dlZd dlZd dl	m
Z d dlZd dlZddlmZmZ ddlmZ ddlmZ ddlmZ d)d	d
„Zd*dd„Zd+dd„Zd,dd„Zd-dd„Zd.dd„Zdd„ Zd/dd„Zd0d d!„Zd1d"d#„Zd2d$d%„Z d3d'd(„Z!dS )4é    N)ÚOrderedDictÚdefaultdicté   )Ú__version__Úutil)Ú	Empirical)ÚGraph)ÚTraceTc             C   sˆ  i }i }|d k	r"|d }|d }ni }i }xlt | jƒD ]\}|  |¡}t|  |¡ƒ}	x<|jD ]0}
|
j}|
j}|rz|n|}||kr°|| d  d7  < || d  |	7  < q`||krÂ|| }n¶|rô| d¡rÞ|dd … }ndt	t
|ƒd ƒ }n|| d¡r(|dd … d	 |
jrd
nt	|
jƒ }nH||krNdt	t
|ƒd ƒ }|||< || d	 |
jrdd
nt	|
jƒ }|||< d|	||
dœ||< |
||< q`W q8W tt| ¡ dd„ dƒ}tƒ }t|d< tj|d< t
| ƒ|d< t
|ƒ|d< t
dd„ t| ¡ ƒD ƒƒ|d< t
dd„ t| ¡ ƒD ƒƒ|d< t
dd„ t| ¡ ƒD ƒƒ|d< t
dd„ t| ¡ ƒD ƒƒ|d< t
dd„ t| ¡ ƒD ƒƒ|d< |||||dœS )NÚaddress_idsÚaddress_base_idsÚcountr   ÚweightZ__Aé   ÚAÚ__Úreplaced)r   r   Ú
address_idÚvariablec             S   s   t  | d d ¡S )Nr   r   )r   Úaddress_id_to_int)Úv© r   úV/global/project/projectdirs/dasrepo/etalumis/pyprob_master_mar20/pyprob/diagnostics.pyÚ<lambda>7   s    z _address_stats.<locals>.<lambda>)ÚkeyÚpyprob_versionÚtorch_versionZnum_distribution_elementsÚ	addressesc             S   s   g | ]}|d  j rd‘qS )r   r   )Úcontrol)Ú.0Úvaluer   r   r   ú
<listcomp>=   s    z"_address_stats.<locals>.<listcomp>Zaddresses_controlledc             S   s   g | ]}|d  j rd‘qS )r   r   )Úreplace)r   r   r   r   r   r    >   s    Zaddresses_replacedc             S   s   g | ]}|d  j rd‘qS )r   r   )Ú
observable)r   r   r   r   r   r    ?   s    Zaddresses_observablec             S   s   g | ]}|d  j rd‘qS )r   r   )Úobserved)r   r   r   r   r   r    @   s    Zaddresses_observedc             S   s   g | ]}|d  j rd‘qS )r   r   )Útagged)r   r   r   r   r   r    A   s    Zaddresses_tagged)r   Úaddresses_extrar   r
   Úaddress_id_to_variable)ÚrangeÚlengthÚ
_get_valueÚfloatÚ_get_weightÚ	variablesÚaddress_baseÚaddressÚ
startswithÚstrÚlenr!   Úinstancer   ÚsortedÚitemsr   ÚtorchÚlistÚvalues)Ú
trace_distÚuse_address_baseÚreuse_ids_from_address_statsr   r&   r
   r   ÚiÚtraceÚtrace_weightr   r-   r.   r   r   Zaddress_base_idr%   r   r   r   Ú_address_stats   sX    



(
"
r>   c          
      sÜ  t | ˆ|d}|d ‰ i }|d k	r,|d }ni }xÚt| jƒD ]Ì}|  |¡}t|  |¡ƒ}	d ‡fdd„|jD ƒ¡}
|
|krà|
|krŒ||
 }ndtt	|ƒd ƒ }|||
< d	g‡ ‡fd
d„|jD ƒ dg }d|	|||dœ||
< q<||
 d  d7  < ||
 d  |	7  < q<W t
t| ¡ dd„ ddƒ}dd„ tt	ˆ ƒƒD ƒ}g }x$ˆ  ¡ D ]\}}| |d ¡ qJW t||dd}dd„ tt	|ƒƒD ƒ}g }x$| ¡ D ]\}}| |d ¡ q˜W t||dd}|  dd„ ¡ ¡  d¡}|  dd„ ¡ ¡  d¡}|  dd„ ¡ ¡  d¡}t
ƒ }t	|ƒ|d< t|jƒ|d< t|jƒ|d < t|jƒ|d!< t|jƒ|d"< t|jƒ|d#< t|jƒ|d$< t|jƒ|d%< t|jƒ|d&< t|jƒ|d'< t|jƒ|d(< t|jƒ|d)< t|jƒ|d*< |||||||||d+œ	S ),N)r9   r:   r   Ú	trace_idsÚ c                s   g | ]}ˆ r|j n|j‘qS r   )r-   r.   )r   r   )r9   r   r   r    P   s    z _trace_stats.<locals>.<listcomp>ÚTr   ZSTARTc                s$   g | ]}ˆ ˆr|j n|j d  ‘qS )r   )r-   r.   )r   r   )r   r9   r   r   r    W   s    ÚEND)r   r   Útrace_idr<   Úaddress_id_sequencer   r   c             S   s   | d d S )Nr   r   r   )r   r   r   r   r   \   s    z_trace_stats.<locals>.<lambda>T)r   Úreversec             S   s   g | ]}|‘qS r   r   )r   r;   r   r   r   r    ]   s    z
Address ID)ÚweightsÚnamec             S   s   g | ]}|‘qS r   r   )r   r;   r   r   r   r    b   s    zUnique trace IDc             S   s   | j S )N)r(   )r<   r   r   r   r   g   s    zTrace length (all)c             S   s   | j S )N)Úlength_controlled)r<   r   r   r   r   h   s    zTrace length (controlled)c             S   s   | j S )N)Úexecution_time_sec)r<   r   r   r   r   i   s    zTrace execution time (s)Ztrace_typesZtrace_length_minZtrace_length_maxZtrace_length_meanZtrace_length_stddevZtrace_length_controlled_minZtrace_length_controlled_maxZtrace_length_controlled_meanZtrace_length_controlled_stddevZtrace_execution_time_minZtrace_execution_time_maxZtrace_execution_time_meanZtrace_execution_time_stddev)	ÚtracesÚtraces_extrar?   Úaddress_statsÚtrace_id_distÚtrace_length_distÚtrace_length_controlled_distÚtrace_execution_time_distÚaddress_id_dist)r>   r'   r(   r)   r*   r+   Újoinr,   r0   r1   r   r3   r4   Úappendr   ÚmapÚ
unweightedÚrenameÚminÚmaxÚmeanÚstddev)r8   r9   r:   Zreuse_ids_from_trace_statsrL   rJ   r?   r;   r<   r=   Z	trace_strrC   rD   r
   Zaddress_weightsr   r   rQ   Zunique_trace_idsZtrace_weightsÚ_rM   rN   rO   rP   rK   r   )r   r9   r   Ú_trace_statsE   s`    


"r\   ©é
   é   é   Fc             C   s"  t | |d}|d }|d }	|r|s:dtjd< t d¡ tjdd|d\}
}|d	  ¡ }|d	  ¡ }|d	 j}|d
 j	||d|d |d
  
|¡ |d
  d¡ |d
 jddd |d  ¡ }|d  ¡ }|d j}|d j	||d|d |d  
|¡ |d jddd |d  ¡ }|d  ¡ }|d j}|d j	||dt|ƒd |d  
|¡ |d  d¡ |d jddd |d  ¡ }|d  ¡ }|d j}|d j	||d|d |d  
|¡ |d jddd tj| jdddddd tjddddgd  |d k	r|d! }td" |¡ƒ t |¡ |d# }td$ |¡ƒ t|d%ƒ:}| d&¡ x(|	 ¡ D ]\}}| d' ||¡¡ qZW W d Q R X |d( }td) |¡ƒ t|d%ƒf}| d*¡ xT| ¡ D ]H\}}| d+ |d, |d- t|d. jƒt|d. jƒd/ |d0 ¡¡¡ qºW W d Q R X |rt ¡  d S )1N)r9   rJ   rK   Fzaxes.unicode_minusÚaggr   )ÚfigsizerN   )r   r   r   )rF   ÚdensityÚbinsÚ	FrequencyÚlogÚclip)ÚnonposyrO   )r   r   rQ   )r   r   rP   )r   r   g        g®Gáz®ï?ÚleftÚtopr^   )ÚxÚyÚhorizontalalignmentÚverticalalignmentÚfontsizer   g¸…ëQ¸ž?gffffffî?)Úrectz.pdfzPlotting to file: {}z.txtzSaving trace report to file: {}Úwzpyprob diagnostics
z{}: {}
z.csvzSaving traces to file: {}z@trace_id, count, length, length_controlled, address_id_sequence
z{}, {}, {}, {}, {}
rC   r   r<   ú rD   )r\   ÚmplÚrcParamsÚpltÚswitch_backendÚsubplotsÚvalues_numpyÚweights_numpyrG   ÚhistÚ
set_xlabelÚ
set_ylabelÚ
set_yscaler1   ÚsuptitleÚtight_layoutÚprintÚformatÚsavefigÚopenÚwriter4   r,   Úvariables_controlledrR   Úshow)r8   r9   rb   rd   ÚplotÚ	plot_showÚ	file_nameZtrace_statsrJ   rK   ÚfigÚaxr7   rF   rG   Úplot_file_nameÚreport_file_nameÚfiler   r   Ztraces_file_namer   r   r   Útrace_histograms{   sl    








"
Nr   ©é   é   c       )         s¢  t | tƒs| g} i }d }	i }
xÖ| D ]Ì}td |j¡ƒ t|||	d}	|	d }x>| ¡ D ]2\}}||
kr„|
| d  |d 7  < qZ||
|< qZW |	d }d}t dt	|ƒd¡ x8| ¡ D ]*\}}t 
|¡ |d	7 }|d
 }|d }d}y¸|r.|j‰| ‡fdd„¡ ‡fdd„¡ dd„ ¡ dd„ ¡}n:|j‰ | ‡ fdd„¡ ‡ fdd„¡ dd„ ¡ dd„ ¡}| |jd kr€|d nd ||j¡¡ |jdkr d}W n tk
r¼   d}Y nX |rº||krÔi ||< ||f|| |j< qºW t ¡  q$W |rž|sdtjd< t d¡ dtjd< t t	|ƒ¡\}}tj|||d\}}| ¡ }d}ttddd d!d"d#d$d%d&d'd(d)gƒƒ}i }t d*t	|ƒd+¡ x~| ¡ D ]p\}}t 
|¡ xP| ¡ D ]B\}}|d }|d	 }| ¡ }| ¡ }||krúd } || }!n|} | ¡ }!|!||< t|jd,ƒr6t |jj!ƒt |jj"ƒf}"nd }"|| j#||d	||!| d-|"d. || j$|jdd/d0 || j%d1d2d3 |d k	r¸d }#|r¸|j‰ˆ|j&krÚt |j&ˆ j'ƒ}#n"|j‰ ˆ |j(krÚt |j(ˆ  j'ƒ}#|#d k	r¸|| j)|#d4d5d-d6 q¸W |d	7 }q˜W t ¡  | *¡  tj+d7d/d7d/d8d9d: |d k	r|d; }$td< |$¡ƒ t ,|$¡ |d= }%td> |%¡ƒ t-|%d?ƒR}&|& .d@¡ |& .|r˜dAnddB ¡ x(| ¡ D ]\}}|& .dC ||¡¡ q¬W W d Q R X |dD }'tdE |'¡ƒ t-|'d?ƒ”}&|& .dF |r
dGndH¡¡ xr|
 ¡ D ]f\}}|d jd kr8dn|d j}(|& .dI |d
 |d |(|d j/|d j0|d j1|d j2|¡¡ qW W d Q R X |ržt 3¡  d S )JNz&Collecting values for distribution: {})r9   r:   r   r   r%   r   zCollecting valuesZ	Addressesr   r   r   Tc                s
   ˆ | j kS )N)Úvariables_dict_address_base)r<   )r-   r   r   r   Ø   s    z$address_histograms.<locals>.<lambda>c                s   t  | jˆ  j¡S )N)r   Ú	to_tensorr“   r   )r<   )r-   r   r   r   Ø   s    c             S   s
   t  | ¡S )N)r5   Ú	is_tensor)r   r   r   r   r   Ø   s    c             S   s   |   ¡ dkS )Nr   )Únelement)r   r   r   r   r   Ø   s    c                s
   ˆ | j kS )N)Úvariables_dict_address)r<   )r.   r   r   r   Û   s    c                s   t  | jˆ  j¡S )N)r   r”   r—   r   )r<   )r.   r   r   r   Û   s    c             S   s
   t  | ¡S )N)r5   r•   )r   r   r   r   r   Û   s    c             S   s   |   ¡ dkS )Nr   )r–   )r   r   r   r   r   Û   s    r@   z{} ({})Fzaxes.unicode_minusra   é   z	font.size)rb   z#1f77b4z#ff7f0ez#2ca02cz#d62728z#9467bdz#8c564bz#e377c2z#7f7f7fz#bcbd22z#17becfÚbÚkzPlotting histogramsZ
HistogramsÚlowg      è?)rF   rc   rd   ÚcolorÚlabelÚalphar'   gffffffî?)ro   rl   g        r   )Úpadr(   ÚdashedÚgray)rk   Ú	linestylerœ   Ú	linewidthgš™™™™™©?g      ø?g333333ë?)ri   ÚrightÚbottomrj   ÚhspaceÚwspacez.pdfzPlotting to file: {}z.txtz!Saving address report to file: {}rq   zpyprob diagnostics
zaggregated zaddress report
z{}: {}
z.csvzSaving addresses to file: {}zHaddress_id, count, name, controlled, replaced, observable, observed, {}
r-   r.   z{}, {}, {}, {}, {}, {}, {}, {}
)4Ú
isinstancer6   r€   r   rG   r>   r4   r   Úprogress_bar_initr1   Úprogress_bar_updater-   ÚfilterrT   r.   rV   r(   Ú	ExceptionÚprogress_bar_endrs   rt   ru   rv   Útile_rows_colsrw   ÚflattenÚreversedrx   ry   ÚpopÚhasattrÚdistributionr*   r›   Úhighrz   Ú	set_titleÚtick_paramsr“   r   r—   ÚaxvlineÚlegendÚsubplots_adjustr‚   rƒ   r„   r   r!   r"   r#   r†   ))Útrace_distsÚground_truth_tracerb   rd   r9   r‡   rˆ   r‰   ÚdistsrL   Zaddress_stats_combinedr8   r   r   Úvalr%   r;   r   r   r   Z
can_renderÚdistÚrowsÚcolsrŠ   r‹   Zhist_color_cycleZhist_colorsZtrace_dist_namer   r7   rF   r   rœ   r'   Zvline_xrŒ   r   rŽ   Zaddresses_file_namerG   r   )r.   r-   r   Úaddress_histograms½   sÐ    

64(




$







"NrÁ   c       $   	   C   s‚  | j | j }| j| j }| j| j  }| jd }| jd }|| }|| j }|| j  }	|| j }
t| jƒdkr¦| jd }| jd }|| }|| j }|| j  }|| j }tƒ }t|d< tj|d< | j	|d< | j
d |d< | j|d< | j|d< | j|d	< t| jƒ|d
< | jd k	|d< | j|d< | j|d< t| jƒ|d< | j|d< | j|d< | j|d< | j|d< | j|d< | j |d< ||d< ||d< ||d< ||d< ||d< ||d< |	|d< |
|d< t| jƒdkræ||d< ||d< ||d< ||d < ||d!< |d k	r~tj |¡std" |¡ƒ t |¡ tj |d#¡}td$ |¡ƒ t|d%ƒZ}| d&¡ x(| ¡ D ]\}}| d' ||¡¡ qRW | d(¡ | tt |  !¡ ƒƒ¡ W d Q R X d)t"j#d*< t$ %d+¡ tj |d,¡}td- |¡ƒ t$j&d.d/}t$ 'd0¡}|j(| j)| jd1d2 |j(| j*| jd3d2 | +¡  t$ ,d4¡ t$ -d5¡ t$ .¡  | /¡  t$ 0|¡ tj |d6¡}td7 |¡ƒ t$j&d.d/}t$ 'd0¡}|j(| j1| j
d1d2 t$ ,d4¡ t$ -d8¡ t$ .¡  | /¡  t$ 0|¡ tj |d9¡}tj |¡sètd" |¡ƒ t |¡ tj |d:¡}t|d%ƒv}| d;¡ tt2|  3¡ ƒƒ}t4 5d<|d=¡ x<t6|  3¡ ƒD ]*\}}t4 7|d> ¡ tƒ  tj |d? |¡¡}|d } | d@ tj 8|¡| ¡¡ tdA || ¡ƒ |d>  9¡  :¡  ;¡ }!|!j<d>krÎt= >|!d>¡}!n8|!j<dBkrtdC | |!j<¡ƒ |!j?d }"t= @|!|"df¡}!t$j&d.d/}t$ 'd0¡}|jA|!t$jBjCdD}#| D¡  t$ ,dE | |!j?¡¡ t$ E|#¡ t$ 0|¡ t$ F¡  q<W t4 G¡  W d Q R X |S )FNr   éÿÿÿÿzpyprob versionztorch versionznetwork typeznumber of parameterszpre-generated layersÚmodifiedZupdatesztrained on devicezdistributed trainingzdistributed backendzdistributed world sizeÚ	optimizerzlearning rateÚmomentumz
batch sizeztotal train. secondsztotal train. tracesztotal train. iterationsztrain. iter. per secondztrain. traces per secondztrain. traces per iter.ztrain. loss initialztrain. loss finalztrain. loss change per secondztrain. loss change per iter.ztrain. loss change per tracezvalid. loss initialzvalid. loss finalzvalid. loss change per secondzvalid. loss change per iter.zvalid. loss change per tracez&Directory does not exist, creating: {}zinference_network_stats.txtz%Saving diagnostics information to {} rq   zpyprob diagnostics report
z{}: {}
zarchitecture:
Fzaxes.unicode_minusra   zloss.pdfzPlotting loss to file: {})r^   é   )rb   éo   ZTraining)r   Z
ValidationzTraining tracesZLossznum_params.pdfz*Plotting number of parameters to file: {} zNumber of parametersÚparamsz
params.csvzfile_name, param_name
z%Plotting inference network parametersZ
Parametersr   zparam_{}.pngz{}, {}
z#Plotting to file: {}  parameter: {}r   z3Warning: reshaping parameter {} to 2D for plotting.)Úcmapz{} {})HÚ_total_train_iterationsÚ_total_train_secondsÚ_total_train_tracesÚ_history_train_lossr1   Ú_history_valid_lossr   r   r5   Ú_network_typeÚ_history_num_paramsÚ_layers_pre_generatedÚ	_modifiedÚ_updatesr0   Ú_deviceÚ_distributed_backendÚ_distributed_world_sizeÚ_optimizer_typeÚ_learning_rateÚ	_momentumÚ_batch_sizeÚosÚpathÚexistsr€   r   ÚmakedirsrR   rƒ   r„   r4   ÚnextÚmodulesrs   rt   ru   rv   ÚfigureÚsubplotr‡   Ú_history_train_loss_traceÚ_history_valid_loss_tracer¸   ÚxlabelÚylabelÚgridr   r‚   Ú_history_num_params_tracer6   Únamed_parametersr   r©   Ú	enumeraterª   ÚbasenameÚcpuÚdetachÚnumpyÚndimÚnpÚexpand_dimsÚshapeÚreshapeÚpcolorÚcmÚjetÚinvert_yaxisÚcolorbarÚcloser­   )$Úinference_networkÚsave_dirZtrain_iter_per_secZtrain_traces_per_secZtrain_traces_per_iterZtrain_loss_initialZtrain_loss_finalZtrain_loss_changeZtrain_loss_change_per_secZtrain_loss_change_per_iterZtrain_loss_change_per_traceZvalid_loss_initialZvalid_loss_finalZvalid_loss_changeZvalid_loss_change_per_secZvalid_loss_change_per_iterZvalid_loss_change_per_traceÚstatsZfile_name_statsrŽ   r   r   Zfile_name_lossrŠ   r‹   Zfile_name_num_paramsZsave_dir_paramsZfile_name_paramsÚ
num_paramsÚindexÚparamZfile_name_paramÚ
param_nameZ	param_valÚcZheatmapr   r   r   Únetwork/  sì    


























 















r  c       	      C   sd   t | ||||d}|d k	r`|j||d x6| ¡ D ]*\}}|jd ||¡|d krT|n|d q2W |S )N)r8   r9   Ún_most_frequentÚ
base_graphÚnormalize_weights)Zbackground_graphz{}_{})r   Zrender_to_fileZtrace_graphsr   )	r8   r9   r  r  r‰   r  ÚgraphrC   Ztrace_graphr   r   r   r  ¯  s    &r  c          	   C   s€   t d |¡ƒ t |¡ t|dƒT}| d¡ xB| j ¡ D ]4\}}| d¡r:| 	dd¡}|}| d ||¡¡ q:W W d Q R X d S )Nz&Saving address_id, address pairs to {}rq   zaddress_id, address
Ú__id__r@   z{}, {}
)
r€   r   r   Úcreate_pathrƒ   r„   Ú_shelfr4   r/   r!   )Úaddress_dictionaryr‰   rŽ   r   r   r   r.   r   r   r   r
  ¸  s    


r
  éè  Ú	IterationúLog probabilityc                sú  t ˆ ƒtkrtdƒ‚|d kr d}g }g }x†ttˆ ƒƒD ]t}t ˆ | d ƒtkrZtdƒ‚|d krnˆ | j}ntˆ | j|ƒ}|| }| tt||t	dt
|| ƒƒƒƒ¡ t ¡ }d}tt|ƒƒ}tdƒ td d |d d ¡¡ƒ g }x²|| D ]¦}| ˆ |  |¡j¡ t ¡ | }|| tjks6||d krô|}|d | }td t |¡t || | ¡t |d |¡t|d ƒ |¡||¡d	d
 tj ¡  qôW tƒ  | |¡ q8W |
ræ|sÒdtjd< t d¡ tj|d}|d kr‡ fdd„tt|ƒƒD ƒ}x>tt|ƒƒD ].}tj|| || f|ž|d|| i—Ž qW |rRt  d¡ |	rftj!ddd |d k	rzt "|¡ |d k	rŽt "|¡ t #|¡ t $|¡ tj%dd | &¡  |d k	rØtd |¡ƒ t '|¡ |ræt (¡  t) *|¡t) *|¡fS )NzbExpecting a list of posterior trace distributions, each from a call to a Model's posterior_traces.r   r   z)Loading trace log-probabilities to memoryzBTime spent  | Time remain.| Progress             | {} | Traces/secr	   r   z%{} | {} | {} | {}/{} | {:,.2f}       ú)ÚendFzaxes.unicode_minusra   )rb   c                s   g | ]}d   ˆ | j¡‘qS )z{})r   rG   )r   r;   )rº   r   r   r    ë  s    zlog_prob.<locals>.<listcomp>r   rf   rg   )rh   Úbest)ÚloczPlotting to file: {})+Útyper6   Ú	TypeErrorr'   r1   r	   r(   rW   rS   rX   ÚintÚtimer0   r€   r   Úljustr)   Úlog_probr   Ú_print_refresh_rateÚdays_hours_mins_secs_strÚprogress_barÚrjustÚsysÚstdoutÚflushrs   rt   ru   rv   rá   r‡   ÚxscaleÚyscaleÚxticksrå   ræ   r¸   r   r‚   r†   rð   Úarray)rº   Ú
resolutionÚnamesrb   rå   ræ   r!  ÚyticksÚ
log_xscaleÚ
log_yscaler‡   rˆ   r‰   Ú	min_indexÚ	max_indexÚargsÚkwargsÚmin_iÚitersÚ	log_probsÚjÚmax_iÚ
num_tracesÚ
time_startÚprev_durationÚlen_str_num_tracesÚvalsr;   ÚdurationÚtraces_per_secondrŠ   r   )rº   r   r  Ä  sr    $J


.








r  c       	         sè   t tƒ}ˆ d kr| j‰ t dˆ d¡ xTtˆ ƒD ]H}|  |¡}t |¡ x.|jD ]$}|j	 
¡ dkrN||j  d7  < qNW q.W t ¡  ‡ fdd„| ¡ D ƒ}tt| ¡ dd„ dd	ƒ}g }x,t|ƒD ] \}}| |¡ |d |krÀP qÀW |S )
Nz"Collecting most frequent addressesÚTracesr   c                s   i | ]\}}|ˆ kr||“qS r   r   )r   rš   r   )r1  r   r   ú
<dictcomp>  s    z._n_most_frequent_addresses.<locals>.<dictcomp>c             S   s   | d S )Nr   r   )rk   r   r   r   r     s    z,_n_most_frequent_addresses.<locals>.<lambda>T)r   rE   )r   r  r(   r   r©   r'   r)   rª   r,   r   r–   r.   r­   r4   r   r3   rê   rS   )	r8   r  r1  Zaddress_countsr;   r<   r   Úretr.   r   )r1  r   Ú_n_most_frequent_addresses  s&    


r;  c                s  ˆd kr| j ‰|d krrttƒ‰ x>tˆƒD ]2}|  |¡}x"|j ¡ D ]}ˆ |  d7  < qBW q(W ‡ ‡fdd„ˆ D ƒ}t‡fdd„ƒ}x6|D ].}| d j| }|j ¡ dkrˆ|||j	 d< qˆW |d k	rt
| |ˆƒ}	x6|	D ].}
| d j|
 }|j ¡ dkrÖ|||j	 d< qÖW t|ƒdkrtdƒ‚t d	ˆd
¡ xVtˆƒD ]J}|  |¡}t |¡ x.| ¡ D ]"\}
}t|j|
 jƒ|d |< qXW q6W t ¡  |S )Nr   c                s   g | ]}ˆ | ˆkr|‘qS r   r   )r   rG   )Úname_countsr1  r   r   r    "  s    z$_variable_values.<locals>.<listcomp>c                  s   d t  ˆ ¡t j dœS )N)r   r7   )rð   ÚonesÚnanr   )r1  r   r   r   $  s    z"_variable_values.<locals>.<lambda>r   r   zNo variables with scalar value.z$Loading selected variables to memoryr8  r7   )r(   r   r  r'   r)   Únamed_variablesÚkeysr   r–   r.   r;  r—   r1   ÚRuntimeErrorr   r©   rª   r4   r*   r­   )r8   r$  r  r1  r;   r<   rG   Úvariable_valuesr   r   r.   r   r   )r<  r1  r   Ú_variable_values  s<    





$rC  c          	   O   s2  t | ƒtkrtdƒ‚t | d ƒtkr,tdƒ‚dd„ }| j}|d krdt t dt |d ¡¡ 	t
¡¡}t| ||ƒ}xVt| ¡ ƒD ]F\}\}}td |d j|d j|d t|ƒ¡ƒ ||d	 |ƒ|d
< q~W |r*|	sædtjd< t d¡ tj|d}tjdddd d}x’| ¡ D ]†\}}|d j}|d
 }|d krrd }|sPd t|ƒ¡}d}tj||f|ž|dd|dœ—Ž n"tj||f|ž|d|d ji—Ž qW |rªt d¡ |d k	r¾t |¡ |d k	rÒt |¡ t d¡ t d¡ tjdd | ¡  |
d k	rtd |
¡ƒ t  |
¡ |	r*t !¡  ||fS )NzExpecting a trace distribution.r   c                s   t  ‡ fdd„|D ƒ¡}|S )Nc                s>   g | ]6}|d krdn$t  ˆ |d… ˆ d| … ¡d  d ‘qS )r   g      ð?Nr   )rð   Úcorrcoef)r   Úlag)r7   r   r   r    G  s    z=autocorrelation.<locals>._autocorrelation.<locals>.<listcomp>)rð   r"  )r7   Úlagsr:  r   )r7   r   Ú_autocorrelationF  s    z)autocorrelation.<locals>._autocorrelationr   zGComputing autocorrelation for variable address: {}, name: {} ({} of {})r   r   r7   ÚautocorrelationFzaxes.unicode_minusra   )rb   Úblack)rl   r£   rœ   z{} most frequent addressesTr¡   )r£   rœ   r   r   rf   ZLagZAutocorrelationr  )r  zPlotting to file: {})"r  r   r  r	   r(   rð   ÚuniqueÚlogspaceÚlog10Úastyper  rC  rê   r4   r€   r   r.   rG   r1   rs   rt   ru   rv   rá   Úaxhliner‡   r  r!  rå   ræ   r¸   r   r‚   r†   )r8   r$  rF  r  rb   r!  r%  r&  r‡   rˆ   r‰   r*  r+  rG  r1  rB  r;   r.   r   rŠ   Úother_legend_addedrG   rH  r   r   r   r   rH  @  sZ    "(



"(








rH  é2   c          	      s¬  dd„ ‰ ‡ fdd„}dd„ | D ƒ}t |ƒ}t|ƒ|krDtd |¡ƒ |d krjt t dt |¡¡ t	¡¡}i }xd| D ]\}t
||||ƒ}xH| ¡ D ]<\}}||krÄt || d	 |d	 f¡|| d	< q|||< qW qtW xVt| ¡ ƒD ]F\}\}}td
 |d j|d j|d t|ƒ¡ƒ ||d	 |ƒ|d< qâW |	r¤|
sLdtjd< t d¡ tj|d}tjdddd d}x’| ¡ D ]†\}}|d j}|d }|d krØd }|s¶d t|ƒ¡}d}tj||f|ž|dd|dœ—Ž n"tj||f|ž|d|d ji—Ž qvW |rt d¡ |r$tjddd |d k	r8t |¡ |d k	rLt |¡ t d¡ t d¡ tjdd | ¡  |d k	r–td  |¡ƒ t |¡ |
r¤t  ¡  ||fS )!Nc             S   sˆ   | j d | j d  }}|dk r&tdƒ‚|tjtj| ddddd }tjtj| ddddd}|d | | ||  }t || ¡}|S )Nr   r   r   z4Gelman-Rubin diagnostic requires at least two chains)Úaxis)rQ  Úddof)rò   Ú
ValueErrorrð   ÚvarrY   Úsqrt)r7   ÚmÚnr™   rq   Zv_hatZr_hatr   r   r   Ú_r_hat{  s    zgelman_rubin.<locals>._r_hatc                sD   t j|td}x0t|ƒD ]$\}}ˆ | d d …d |…f ƒ||< qW |S )N)Údtype)rð   Ú
zeros_liker*   rê   )r7   r-  r:  r;   Úiter)rX  r   r   Ú_r_hats…  s     zgelman_rubin.<locals>._r_hatsc             S   s   g | ]
}|j ‘qS r   )r(   )r   r<   r   r   r   r    ‹  s    z gelman_rubin.<locals>.<listcomp>zDDistributions have unequal length, setting the length to minimum: {}r   r7   z=Computing R-hat for variable address: {}, name: {} ({} of {})r   r   ÚrhatFzaxes.unicode_minusra   )rb   rI  )rl   r£   rœ   z{} most frequent addressesTr¡   )r£   rœ   r   r   rf   rg   )rh   r  zR-hatr  )r  zPlotting to file: {})!rW   rX   r€   r   rð   rJ  rK  rL  rM  r  rC  r4   Úvstackrê   r.   rG   r1   rs   rt   ru   rv   rá   rN  r‡   r  r   r!  rå   ræ   r¸   r   r‚   r†   )rº   r$  r-  r  rb   r!  r%  r&  r'  r‡   rˆ   r‰   r*  r+  r\  Ztrace_lengthsr1  rB  r8   Úvvr.   r   r;   rŠ   rO  rG   r]  r   r   )rX  r   Úgelman_rubinz  sj    

$(



"(








r`  )TN)TNN)Tr]   r`   FTN)Nr   r`   TFTN)N)TNNNT)r  Nr]   r  r  NNFFFTNNN)N)NNN)
NNNr]   NNTFTN)NNrP  r]   NNFTFTN)"r5   rÛ   Úcollectionsr   r   rî   rð   Ú
matplotlibrs   Úmatplotlib.pyplotÚpyplotru   r  r  r@   r   r   Údistributionsr   r  r   r<   r	   r>   r\   r   rÁ   r  r
  r  r;  rC  rH  r`  r   r   r   r   Ú<module>   s0   
5
6
B
r
 
	
?

'
: