B
    -],                 @   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Z ddlmZ e jd e dae jZdad	ad
ZdZe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&G dd de	jZ'diddZ(e(  djddZ)dkd d!Z*efd"d#Z+d$d% Z,d&d' Z-d(d) Z.d*d+ Z/d,d- Z0da1da2da3da4dld/d0Z5d1d2 Z6dmd3d4Z7d5d6 Z8d7d8 Z9d9d: Z:dnd;d<Z;dod=d>Z<d?d@ Z=dAdB Z>dCdD Z?dpdFdGZ@dHdI ZAdJdK ZBdLdM ZCdNdO ZDdqdPdQZEdRdS ZFeF sreGedTdUdVgdW dXdY ZHdrdZd[ZId\d] ZJd^d_ ZKd`da ZLdsdcddZMdedf ZNdgdh ZOdS )t    N)colored)reduce   )Categoricalfile_systemcpuF   g      ?g:0yE>c               @   s   e Zd ZdZdZdZdS )	TraceModer   r      N)__name__
__module____qualname__ZPRIORZ	POSTERIORZPRIOR_FOR_INFERENCE_NETWORK r   r   L/global/project/projectdirs/dasrepo/etalumis/pyprob_saeid-dev/pyprob/util.pyr	      s   r	   c               @   s   e Zd ZdZdZdS )PriorInflationr   r   N)r   r   r   DISABLED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   r
   N)r   r   r   IMPORTANCE_SAMPLING*IMPORTANCE_SAMPLING_WITH_INFERENCE_NETWORKZLIGHTWEIGHT_METROPOLIS_HASTINGS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   FEEDFORWARDLSTMr   r   r   r   r   0   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CNN2D5CCNN3D5Cr   r   r   r   r   5   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   ADAMSGD	ADAM_LARCSGD_LARCr   r   r   r   r   ;   s   r   c               @   s   e Zd ZdZdZdZdS )LearningRateSchedulerr   r   r   N)r   r   r   NONEPOLY1POLY2r   r   r   r   r!   B   s   r!   c               @   s   e Zd ZdZdZdS )ImportanceWeightingr   r   N)r   r   r   ZIW0ZIW1r   r   r   r   r%   H   s   r%   c             C   sZ   | d krt t d d } | at|  tj|  t|  tj	 rVtj|  d S )Ng    .Ag    חA)
inttimeZ_random_seedrandomseednptorchmanual_seedcudais_available)r)   r   r   r   set_random_seedM   s    


r/   c          
   C   s   |  dr:tj r| adaqBttd| ddgd n| adayt	d}|
d	 W n8 tk
r } zt| td
| W d d }~X Y nX d S )Nr-   Tz&Warning: cannot enable CUDA device: {}redbold)attrsFg      ?r   zCannot set device: {})
startswithr+   r-   r.   _device_cuda_enabledprintr   format	to_tensorto	ExceptionRuntimeError)devicetester   r   r   
set_device\   s    

r?   c             C   s   | a d S )N)
_verbosity)vr   r   r   set_verbosityp   s    rB   c             C   s^   t | sPt| tjkr(t t| } n(t| tjkrFt t| } n
t | } | jt	|dS )N)r<   dtype)
r+   	is_tensortyper*   int64tensorfloatfloat32r9   r4   )valuerC   r   r   r   r8   u   s    

r8   c          
   C   sh   t | r|   S t| tjr&| S y
t| S  tk
rb } zt	| t
dW d d }~X Y nX d S )NzCannot convert to Numpy array.)r+   rD   r   numpy
isinstancer*   ndarrayarrayr:   r6   	TypeError)rJ   r>   r   r   r   to_numpy   s    

rP   c             C   sF   t | tjr| S t | tr&t| gS t | tr:t| S tdd S )Nz-Expecting a torch.Size, int, or list of ints.)rL   r+   Sizer&   listrO   )rJ   r   r   r   to_size   s    


rS   c             C   s"   | t t|t t| d  S )Nr   )minr*   searchsortedr(   len)valuesZprobs_cumsumr   r   r   fast_np_random_choice   s    rX   c              G   s   t dtt d d ddgd  td}d}x | D ]}t||kr8t|}q8W xJ| D ]B}t||j|j	}t
|tjr| }t d||t| qZW d S )	Nz

r   r
   Zwhiter1   )r2   r   z	  {} = {})r6   r   inspectstacksys	_getframerV   eval	f_globalsf_localsrL   r*   rM   tolistr7   ljustrepr)ZexpressionsframeZmax_str_lengthZ
expressionvalr   r   r   
eval_print   s    $


re   c             C   s,   d}t t||  | }d| d||   S )N   #-)r&   round)irV   Zbar_lenZ
filled_lenr   r   r   progress_bar   s    rk   Itemsc             C   s`   |dk rt d|at adatttat|  t	j
  td|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_durationrV   strprogress_bar_len_str_num_itersr6   r[   stdoutflushr7   ra   )messageZ	num_itersZ	iter_namer   r   r   progress_bar_init   s    
rv   c          	   C   s~   t   t }|t tks$| td krz|a| d | }tdt|tt|  | t| tt	| 
tt|dd tj  d S )Nr   z%{} | {} | {} | {}/{} | {:,.2f}       )end)r'   ro   rp   _print_refresh_ratern   r6   r7   days_hours_mins_secs_strrk   rq   rjustrr   r[   rs   rt   )iterZdurationZtraces_per_secondr   r   r   progress_bar_update   s    <r}   c             C   s"   t t t  | d k	rt|  d S )N)r}   rn   r6   )ru   r   r   r   progress_bar_end   s    r~   c             C   sJ   t | d\}}t |d\}}t |d\}}dt|t|t|t|S )NiQ i  <   z{0}d:{1:02}:{2:02}:{3:02})divmodr7   r&   )total_secondsdrhmsr   r   r   rz      s    rz   c             C   sp   t | r@t | } tt | dk}tt | dk}|p>|S t| } | tdkpj| tdkpj| tdkS d S )Nr   infz-infNaN)r+   rD   sumr&   isnanisinfrH   )rJ   r   r   r   r   r   has_nan_or_inf   s    

r   c             C   s,   t | } t | tj kr$t| S | S d S )N)r+   loganyr*   r   replace_negative_inf)rJ   r   r   r   safe_log   s    
r   c             C   s:   t | tjkr6|  } d| | tjk< |d k	r6t| | S )Ng        )r+   r   r*   r   cloner6   )rJ   replace_messager   r   r   replace_inf   s    r   c             C   s>   t | tj kr:|  } t| | tj k< |d k	r:t| | S )N)r+   r   r*   r   r   _log_epsilonr6   )rJ   r   r   r   r   r      s    r   c          
   C   sV   d 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   )r7   r&   maxrT   )Zrgbr   r   r   
rgb_to_hex  s    r   c                s"   t  fddtt d D S )Nc             3   s"   | ]} |  |d   kV  qdS )r   Nr   ).0rj   )lstr   r   	<genexpr>  s    zis_sorted.<locals>.<genexpr>r   )allrangerV   )r   r   )r   r   	is_sorted
  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...)rV   )r   lengthr   r   r   truncate_str  s    r   c               C   s   t 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 t 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 | }|d|dd t|S )Nr   r   )r+   zerosnarrowfill_r8   )dimrj   tr   r   r   one_hot  s    
r   c             C   s&   yt |  W n tk
r    dS X dS )NFT)hashrO   )rA   r   r   r   is_hashable$  s
    r   c             C   sn   |   t} |d kr t| j}t|d }x6t| jD ](}| |}||kr:t	| 
|||< q:W t|S )Nr   )Zcombine_duplicatesmapr&   r   r+   r   r   r   
_get_valuerH   Z_get_weightr   )Zempirical_distmax_valprobsrj   rd   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_dbm8  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.r0   r1   )r2   c             C   s:   t t | }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_colsD  s    
r   c             C   s>   |r
| }nt j| }t j|s:td| t | d S )Nz{} does not exist, creating)ospathdirnameexistsr6   r7   makedirs)r   	directorydirr   r   r   create_pathM  s    r   c             C   s.   d| krdS |  d}| d| }t|S d S )N__g        r   )findr&   )Z
address_idZ	divider_iZvalue_idr   r   r   address_id_to_intW  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   rV   )lnrj   r   r   r   chunks`  s    r   c             C   s    t | jj}| j|d| dS )Nr   )rT   r   )r+   finforC   epsclamp)r   r   r   r   r   clamp_probsg  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_sizer[   rs   rt   )selfrank
world_sizer   r   r   __init__v  s    z6init_distributed_print.<locals>.LabeledStdout.__init__c                s0   |dkr  | n  d| j| j|f  d S )N
z[r%d/ws%d] %s)writer   r   )r   x)old_outr   r   r   {  s    z3init_distributed_print.<locals>.LabeledStdout.writeN)r   r   r   r   r   r   )r   r   r   LabeledStdoutu  s   r   )openr   devnullr[   rs   stderr)r   r   debug_printr   r   )r   r   init_distributed_printl  s    r   c             C   sB   |t | krtd|  }x t|D ]}|tt |= q&W |S )Nz+Cannot drop more items than the list length)rV   rm   copyr   r(   	randrange)r   Znum_items_to_dropret_r   r   r   
drop_items  s    r   c             C   s   y
t | S    | jS d S )N)rY   	getsourcer   )objr   r   r   
get_source  s    
r   )N)r   )r   )rl   )N)N)N)r   )N)F)T)Pr+   rK   r*   r(   Z	termcolorr   rY   r   r[   enumr'   r   	functoolsr   r   r   torch.multiprocessingdistributionsr   multiprocessingset_sharing_strategyr<   r4   rH   _dtyper5   r@   ry   Z_epsilonr   r   Enumr	   r   r   r   r   r   r!   r%   r/   r?   rB   r8   rP   rS   rX   re   rk   rn   rr   ro   rp   rv   r}   r~   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   







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

	
	