3
:Y\(                 @   s  d dl 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Zd dl	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Z ddlmZ e jjd e jdae jZdad	ad
ZdZejeZG dd de	jZ G dd de	jZ!G dd de	jZ"G dd de	jZ#G dd de	jZ$G dd de	jZ%G dd de	jZ&dbddZ'e'  dcddZ(dddd Z)efd!d"Z*d#d$ Z+d%d& Z,d'd( Z-d)d* Z.d+d, Z/da0da1da2da3ded.d/Z4d0d1 Z5dfd2d3Z6d4d5 Z7d6d7 Z8d8d9 Z9dgd:d;Z:dhd<d=Z;d>d? Z<d@dA Z=didCdDZ>dEdF Z?dGdH Z@dIdJ ZAdKdL ZBdjdMdNZCdOdP ZDeD sPeEedQdRdSgdT dUdV ZFdkdWdXZGdYdZ ZHd[d\ ZId]d^ ZJdld`daZKdS )m    N)colored)reduce   )CategoricalZfile_systemcpuF   g      ?g:0yE>c               @   s   e Zd ZdZdZdS )	TraceModer   r   N)__name__
__module____qualname__ZPRIORZ	POSTERIOR r   r   N/global/project/projectdirs/dasrepo/etalumis/pyprob_distributed/pyprob/util.pyr      s   r   c               @   s   e Zd ZdZdZdS )PriorInflationr   r   N)r	   r
   r   ZDISABLEDZENABLEDr   r   r   r   r   "   s   r   c               @   s   e Zd ZdZdZdZdZdS )InferenceEnginer   r   r      N)r	   r
   r   ZIMPORTANCE_SAMPLINGZ*IMPORTANCE_SAMPLING_WITH_INFERENCE_NETWORKZLIGHTWEIGHT_METROPOLIS_HASTINGSZRANDOM_WALK_METROPOLIS_HASTINGSr   r   r   r   r   '   s   r   c               @   s   e Zd ZdZdZdS )InferenceNetworkr   r   N)r	   r
   r   FEEDFORWARDZLSTMr   r   r   r   r   .   s   r   c               @   s   e Zd ZdZdZdZdS )ObserveEmbeddingr   r   r   N)r	   r
   r   r   ZCNN2D5CZCNN3D5Cr   r   r   r   r   3   s   r   c               @   s   e Zd ZdZdZdZdZdS )	Optimizerr   r   r   r   N)r	   r
   r   ZADAMZSGDZ	LARC_ADAMZLARC_SGDr   r   r   r   r   9   s   r   c               @   s    e Zd ZdZdZdZdZdZdS )LRSchedulerr   r   r   r      N)r	   r
   r   ZSTEPZMULTI_STEPSZPOLY_2ZPOLY_1ZCOSINEANNEALINGr   r   r   r   r   ?   s
   r   {   c             C   sZ   | d krt tj d d } | atj|  tjj|  tj|  tjj	 rVtjj|  d S )Ng    .Ag    חA)
inttimeZ_random_seedrandomseednptorchZmanual_seedcudais_available)r   r   r   r   set_random_seedG   s    


r    c             C   sH   t jj r| rt jdadan&t jdada| rDttdddgd d S )	Nr   Tr   FzWarning: cannot enable CUDAredbold)attrs)r   r   r   device_device_cuda_enabledprintr   )enabledr$   r   r   r   set_cudaV   s    

r)   c             C   s   | a d S )N)
_verbosity)vr   r   r   set_verbosityc   s    r,   c             C   s^   t j| sPt| tjkr(t jt| } n(t| tjkrFt jt| } n
t j| } | jt	|dS )N)r$   dtype)
r   	is_tensortyper   Zint64ZtensorfloatZfloat32tor%   )valuer-   r   r   r   	to_tensorh   s    

r3   c          	   C   sJ   t j| r| j j S t| tjr&| S y
tj| S    tdY nX d S )NzCannot convert to Numpy array.)	r   r.   r   numpy
isinstancer   ndarrayarray	TypeError)r2   r   r   r   to_numpys   s    

r9   c             C   sF   t | tjr| S t | tr&tj| gS t | tr:tj| S tdd S )Nz-Expecting a torch.Size, int, or list of ints.)r5   r   Sizer   listr8   )r2   r   r   r   to_size   s    


r<   c             C   s"   | t tj|tj t| d  S )Nr   )minr   searchsortedr   len)valuesZprobs_cumsumr   r   r   fast_np_random_choice   s    rA   c              G   s   t dttj d d ddgd  tjd}d}x | D ]}t||kr8t|}q8W xJ| D ]B}t||j|j	}t
|tjr|j }t dj|j|t| qZW d S )	Nz

r   r   whiter"   )r#   r   z	  {} = {})r'   r   inspectstacksys	_getframer?   eval	f_globalsf_localsr5   r   r6   tolistformatljustrepr)expressionsframeZmax_str_length
expressionvalr   r   r   
eval_print   s    $


rR   c             C   s,   d}t t||  | }d| d||   S )N   #-)r   round)ir?   Zbar_lenZ
filled_lenr   r   r   progress_bar   s    rX   Itemsc             C   s`   |dk rt d|atj adatttat|  t	j
j  tdj|jtd d | d S )Nr   z$num_iters must be a positive integerr   z>Time spent  | Time remain.| Progress             | {} | {}/secr   )
ValueErrorprogress_bar_num_itersr   progress_bar_time_startprogress_bar_prev_durationr?   strprogress_bar_len_str_num_itersr'   rE   stdoutflushrK   rL   )messageZ	num_itersZ	iter_namer   r   r   progress_bar_init   s    
rc   c             C   s   t j  t }|t tks$| td kr~|a| d | }tdjt|tt|  | t| tt	| d j
tt|dd tjj  d S )Nr   z%{} | {} | {} | {}/{} | {:,.2f}       )end)r   r\   r]   _print_refresh_rater[   r'   rK   days_hours_mins_secs_strrX   r^   rjustr_   rE   r`   ra   )iterZdurationZtraces_per_secondr   r   r   progress_bar_update   s    @rj   c             C   s   t   | d k	rt |  d S )N)r'   )rb   r   r   r   progress_bar_end   s    rk   c             C   sJ   t | d\}}t |d\}}t |d\}}djt|t|t|t|S )NiQ i  <   z{0}d:{1:02}:{2:02}:{3:02})divmodrK   r   )total_secondsdrhmsr   r   r   rg      s    rg   c             C   sp   t j| r@t j| } tt j| dk}tt j| dk}|p>|S t| } | tdkpj| tdkpj| tdkS d S )Nr   infz-infNaN)r   r.   sumr   isnanisinfr0   )r2   rw   rx   r   r   r   has_nan_or_inf   s    

ry   c             C   s,   t j| } t j| tj kr$t| S | S d S )N)r   loganyr   rt   replace_negative_inf)r2   r   r   r   safe_log   s    
r}   c             C   s:   t j| tjkr6| j } d| | tjk< |d k	r6t| | S )Ng        )r   r{   r   rt   cloner'   )r2   replace_messager   r   r   replace_inf   s    r   c             C   s>   t j| tj kr:| j } t| | tj k< |d k	r:t| | S )N)r   r{   r   rt   r~   _log_epsilonr'   )r2   r   r   r   r   r|      s    r|   c          	   C   sV   dj ttdt| d dd ttdt| d dd ttdt| d dd S )Nz#{:02x}{:02x}{:02x}r   r      r   )rK   r   maxr=   )rgbr   r   r   
rgb_to_hex   s    r   c             C   s   t tj| dS )Nr   )r   operatormul)iterabler   r   r   prod   s    r   2   c             C   s    t | |kr| d | d S | S )Nz...)r?   )rs   lengthr   r   r   truncate_str   s    r   c               C   s   t j j jdS )Nz%Y-%m-%d %H:%M:%S)datetimenowstrftimer   r   r   r   get_time_str  s    r   c               C   s   t j jtj jdS )Nz%Y%m%d_%H%M%S)r   fromtimestampr   r   r   r   r   r   get_time_stamp  s    r   c             C   s&   t j| }|jd|djd t|S )Nr   r   )r   zerosZnarrowZfill_r3   )ZdimrW   tr   r   r   one_hot  s    
r   c             C   s&   yt |  W n tk
r    dS X dS )NFT)hashr8   )r+   r   r   r   is_hashable  s
    r   c             C   sn   | j  jt} |d kr t| j}tj|d }x6t| jD ](}| j|}||kr:t	| j
|||< q:W t|S )Nr   )Zcombine_duplicatesmapr   r   r   r   ranger   
_get_valuer0   Z_get_weightr   )Zempirical_distZmax_valprobsrW   rQ   r   r   r   empirical_to_categorical  s    

r   c              C   s&   ydd l } W n tk
r    dS X dS )Nr   FT)Zdbm.gnuModuleNotFoundError)dbmr   r   r   check_gnu_dbm%  s
    r   zWarning: Empirical distributions on disk may perform slow because GNU DBM is not available. Please install and configure gdbm library for Python for better speed.r!   r"   )r#   c             C   s:   t jt j| }d}x| dkr0|d7 }| |8 } qW ||fS )Nr   r   )mathceilsqrt)Z	num_itemscolsrowsr   r   r   tile_rows_cols1  s    
r   c             C   s>   |r
| }nt jj| }t jj|s:tdj| t j| d S )Nz{} does not exist, creating)ospathdirnameexistsr'   rK   makedirs)r   Z	directorydirr   r   r   create_path:  s    r   c             C   s.   d| krdS | j d}| d| }t|S d S )N__g        r   )findr   )Z
address_idZ	divider_iZvalue_idr   r   r   address_id_to_intD  s
    
r   c             c   s0   x*t dt| |D ]}| |||  V  qW dS )z'Yield successive n-sized chunks from l.r   N)r   r?   )lnrW   r   r   r   chunksM  s    r   c             C   s    t j| jj}| j|d| dS )Nr   )r=   r   )r   finfor-   epsZclamp)r   r   r   r   r   clamp_probsT  s    r   Tc                sR   |s*| dkrNt tjdt_t tjdt_n$tj G  fddd}|| |t_d S )Nr   wc                   s    e Zd Zdd Z fddZdS )z-init_distributed_print.<locals>.LabeledStdoutc             S   s   || _ || _tjj| _d S )N)_rank_world_sizerE   r`   ra   )selfrank
world_sizer   r   r   __init__c  s    z6init_distributed_print.<locals>.LabeledStdout.__init__c                s0   |dkr j | n j d| j| j|f  d S )N
z[r%d/ws%d] %s)writer   r   )r   x)old_outr   r   r   h  s    z3init_distributed_print.<locals>.LabeledStdout.writeN)r	   r
   r   r   r   r   )r   r   r   LabeledStdoutb  s   r   )openr   devnullrE   r`   stderr)r   r   Zdebug_printr   r   )r   r   init_distributed_printY  s    r   )r   )N)r   )rY   )N)N)N)r   )N)F)T)Lr   r4   r   r   Z	termcolorr   rC   r   rE   enumr   r   	functoolsr   r   r   Ztorch.multiprocessingdistributionsr   multiprocessingZset_sharing_strategyr$   r%   r0   Z_dtyper&   r*   rf   Z_epsilonrz   r   Enumr   r   r   r   r   r   r   r    r)   r,   r3   r9   r<   rA   rR   rX   r[   r_   r\   r]   rc   rj   rk   rg   ry   r}   r   r|   r   r   r   r   r   r   r   r   r   r'   r   r   r   r   r   r   r   r   r   r   <module>   s   








	
	

	

	