a
    Dfb;                  5   @   s  d 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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ZddlmZ ddlZddlmZ ddlmZ dZdZi Ze Zed	efi  Zeee e!e"e#edfZ$d
Z%d
Z&d
Z'd
Z(e
j)dkrej*Z+nej,Z+G dd deZ-dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd Z5dd Z6d d! Z7e!e/ed"d# e d$d# e"d%d# edd&d# e8e3ee#fd'd# e9e:e;fe2ej<d(d# ej=e4ej>j?d)d# ej@ejAfe7ejBd*d# d+e6d,e5d-e5d.e5d/e5d0e3d1d2d# d3d4d# d5d6d# d7d8d# ejCd9d# ejDd:d# d;d# d<d# iZEeD ]ZFd=eEeF< q6d>d? ZGd@dA ZHdBdC ZIdDdE ZJdFdG ZKdHdI ZLedJdK ZMdLdM ZNdVdQdRZOe"dSdTdUZPdS )Wz?
Implements memoization for functions with arbitrary arguments
    N)contextmanager)iscoroutinefunction   )states.   panel-93KZ39Q-floatingdangeroushomechose-CYCLE)z_cffi_backend.FFIzbuiltins.CompiledFFIZINDETERMINATEi win32c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_Stackc                 C   s
   i | _ d S N)_stackself r   [/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/io/cache.py__init__<   s    z_Stack.__init__c                 C   s   || j t|< d S r   )r	   idr   valr   r   r   push?   s    z_Stack.pushc                 C   s   | j   d S r   )r	   popitemr
   r   r   r   popB   s    z
_Stack.popc                 C   s   t || jv S r   )r   r	   r   r   r   r   __contains__E   s    z_Stack.__contains__N)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   :   s   r   c                 C   s    t | }|j}|j}d||f S )z&Get module.type_name for a given type.z%s.%s)typer   r   )objZthe_typemodulenamer   r   r   _get_fqnH   s    r   c                 C   s    |   d d }| j|dddS )N   littleT)signed)
bit_lengthto_bytes)i	num_bytesr   r   r   _int_to_bytesO   s    r%   c                 C   s
   t | tS r   )
isinstance_NATIVE_TYPESr   r   r   r   
_is_nativeS   s    r)   c                 C   s   t | totdd | D S )Nc                 s   s   | ]}t |V  qd S r   )_is_native_tuple).0vr   r   r   	<genexpr>W       z#_is_native_tuple.<locals>.<genexpr>)r&   tupleallr(   r   r   r   r*   V   s    r*   c                 C   sV   t d}|tdt| j  t| tr6|  n| D ]}|t| q:|	 S )Nmd5__)
hashlibnewupdate_generate_hashr   r   r&   dictitemsdigest)r   hitemr   r   r   _container_hashY   s
    
r<   c                 C   s   t | j| j| jgS r   )r<   startstepstopxr   r   r   _slice_hash`   s    rB   c                 C   sB   t d}|t| j |t| j |t| j | S Nr1   )r3   r4   r5   r6   argsfunckeywordsr9   r   r:   r   r   r   _partial_hashc   s
    
rH   c                 C   s   dd l }t| |j|jfs$|| } t| tkr>| jtdd} zNt| |jrxd|j	| 
  d|j	| j
   W S d|j	| 
  W S  ty   dt| tj  Y S 0 d S )Nr   )nZrandom_states   %s)Zpandasr&   ZSeriesZ	DataFramelen_PANDAS_ROWS_LARGEsample_PANDAS_SAMPLE_SIZEutilZhash_pandas_objectsumcolumns	TypeErrorpickledumpsHIGHEST_PROTOCOL)r   pdr   r   r   _pandas_hashj   s    
rV   c                 C   s^   t d}|t| j | jtkrHdd l}|j	d}|j
| jtd} ||   | S )Nr1   r   )size)r3   r4   r5   r6   shaperW   _NP_SIZE_LARGEnumpyrandomZRandomStatechoiceZflat_NP_SAMPLE_SIZEtobytesr9   )r   r:   npr   r   r   r   _numpy_hash}   s    

r`   c                 C   s6   t d}|t|   |t|   | S rC   )r3   r4   r5   r6   tellgetvaluer9   rG   r   r   r   _io_hash   s    
rc   c                 C   s   |   S r   )encoder(   r   r   r   <lambda>   r.   re   c                 C   s   t t| S r   )r%   hashr(   r   r   r   re      r.   c                 C   s   | du rdS dS )NT   1   0r   r(   r   r   r   re      r.   c                 C   s   dS )Nrh   r   r(   r   r   r   re      r.   c                 C   s   | S r   r   r(   r   r   r   re      r.   c                 C   s   t |  S r   )strrd   r(   r   r   r   re      r.   c                 C   s   t t| S r   )r%   r   r(   r   r   r   re      r.   c                 C   s   t | j |  dS )Nzutf-8)r   r   rd   r(   r   r   r   re      r.   numpy.ndarrayzpandas.core.series.Seriespandas.core.frame.DataFramezpandas.core.indexes.base.Indexz&pandas.core.indexes.numeric.Int64Indexz$pandas.core.indexes.range.RangeIndexzbuiltins.mappingproxyc                 C   s   t t| S r   r<   r7   r(   r   r   r   re      r.   zbuiltins.dict_itemsc                 C   s   t t| S r   rl   r(   r   r   r   re      r.   zbuiltins.getset_descriptorc                 C   s
   | j  S r   )r   rd   r(   r   r   r   re      r.   znumpy.ufuncc                 C   s
   | j  S r   r   rd   r(   r   r   r   re      r.   c                 C   s
   | j  S r   rm   r(   r   r   r   re      r.   c                 C   s   | j S r   )r   r(   r   r   r   re      r.   c                 C   s   t | do| jdkS )Nr^   r   )hasattrrX   r@   r   r   r   re      r.   c                 C   s   |   S r   )r^   r@   r   r   r   re      r.   rh   c                 C   sx   t | }|tv rt| S t D ]R\}}t|trD||krr|  S q t|r`|| rr|  S q t| |r |  S q d S r   )r   _hash_funcsr8   r&   ri   inspect
isfunction)r   Zfqn_typeZotype	hash_funcr   r   r   _find_hash_func   s    




rs   c                 C   s   t | }|d urpz|| }W nN tyj } z6td|d| dt|j d| d	|W Y d }~n
d }~0 0 |S t| drtd}z|  }W n( ty   tdt| j d Y n0 |D ]}|	t
| q| S tt| S )	NzUser hash function z failed for input z with following error: z("z").
__reduce__r1   zCould not hash object of type )rs   BaseException
ValueErrorr   r   rn   r3   r4   rt   r5   r6   r9   r%   r   )r   rr   outputer:   Zreduce_datar;   r   r   r   _generate_hash_inner   s6    

ry   c                 C   s@   t j}| |v rtS ||  zt| }W |  n
|  0 |S r   )r   Z_current_stack_CYCLE_PLACEHOLDERr   ry   r   )r   Z
hash_stack
hash_valuer   r   r   r6      s    

r6   c                 C   s   | d u rd S t | st| r | S t| trJtdd | D rdg| R S n>t| dkst| dkst| st| st	| rt
| S tS )Nc                 s   s   | ]}t |V  qd S r   )r)   )r+   r;   r   r   r   r-      r.   z_key.<locals>.<genexpr>Z__listrk   rj   )r)   r*   r&   listr0   r   rp   	isbuiltin	isroutineiscoder   _INDETERMINATEr(   r   r   r   _key   s&    


r   c                    s   t | |kr| dkr*t|  d }n`| dkrbt fdd|  D dd dd	 d }n(| d
krt|  dd dd d }| |= q dS )zs
    Deletes items in the cache if the exceed the number of items or
    their TTL (time-to-live) has expired.
    fifor   lruc                 3   s&   | ]\}\}}}}| | fV  qd S r   r   )r+   k_ttimer   r   r-      r.   z!_cleanup_cache.<locals>.<genexpr>c                 S   s   | d S )Nr   r   or   r   r   re      r.   z _cleanup_cache.<locals>.<lambda>)keylfuc                 S   s   | d d S )Nr      r   r   r   r   r   re      r.   N)rJ   lowerr|   keyssortedr8   )cachepolicy	max_itemsr   r   r   r   r   _cleanup_cache   s    r   c                 C   s4   t |  D ]"\}\}}}}|| |kr| |= qdS )zM
    Deletes items in the cache if their TTL (time-to-live) has expired.
    N)r|   r8   )r   ttlr   r   r   tsr   r   r   _cleanup_ttl  s    r   c              	   c   sH   t t}t|  zd V  W t  t| nt  t| 0 d S r   )r7   ro   r5   clear)
hash_funcsbackupr   r   r   _override_hash_funcs	  s    
r   c                 C   s   | t |t |f}t|vr*|tv r*t| S td}t|4 |rP|t| |rb|t| W d   n1 sv0    Y  | }t|vr|t|< |S )a<  
    Computes a hash given a function and its arguments.

    Arguments
    ---------
    func: callable
        The function to cache.
    hash_funcs: dict
        A dictionary of custom hash functions indexed by type
    args: tuple
        Arguments to hash
    kwargs: dict
        Keyword arguments to hash
    r1   N)	r   r   	_HASH_MAPr3   r4   r   r5   r6   	hexdigest)rE   r   rD   kwargsr   Zhasherr{   r   r   r   compute_hash  s    

,r   LRUF./cachec           
   
      s    dvrtd dp"i du rB 	
fddS dgt  	
f
ddtrtfd	d
ntfdd
f 	fdd	}|_rtj	rtj	j
r|fdd}	tj	|	 zjj W n ty   Y n0 S )a  
    Memoizes functions for a user session. Can be used as function annotation or just directly.

    For global caching across user sessions use `pn.state.as_cached`.

    Arguments
    ---------
    func: callable
        The function to cache.
    hash_funcs: dict or None
        A dictionary mapping from a type to a function which returns
        a hash for an object of that type. If provided this will
        override the default hashing function provided by Panel.
    max_items: int or None
        The maximum items to keep in the cache. Default is None, which does
        not limit number of items stored in the cache.
    policy: str
        A caching policy when max_items is set, must be one of:
          - FIFO: First in - First out
          - LRU: Least recently used
          - LFU: Least frequently used
    ttl: float or None
        The number of seconds to keep an item in the cache, or None if
        the cache should not expire. The default is None.
    to_disk: bool
        Whether to cache to disk using diskcache.
    cache_dir: str
        Directory to cache to on disk.
    per_session: bool
        Whether to cache data only for the current session.
    )r   r   r   z8Cache policy must be one of 'FIFO', 'LRU' or 'LFU', not .Nc              	      s   t |  dS )N)rE   r   r   r   to_disk
cache_pathper_session)r   )f)r   r   r   r   r   r   r   r   re   _  s   zcache.<locals>.<lambda>c                     s  j } o.t d to.tt d |d 
u } | }}|rt d tjrt
di }t fdd|ddD  dd   }t	|di fi |}t
||}t }tjj }	jd	krd	n|	j}
|r|
t d j j f}n
|
j f}r|ttjf7 }tt| }|d< tj|}|d u rtrbdd
lm} |tj|}ni }| tj|< }	d urt|	| ||v r|||fS d urt|| |||fS )Nr   Z_dinfoc                 3   s   | ]}t  d  |V  qdS )r   N)getattr)r+   drD   r   r   r-   v  r.   z+cache.<locals>.hash_func.<locals>.<genexpr>Zdependenciesr   r   kw__main__Index)r   r&   objectr   r   paramZParameterizedr/   getr7   r   _TIME_FNsysmodulesr   __file__r   r   curdocr3   sha256r6   r   _memoize_cache	diskcacher   ospathjoinr   r   )rD   r   	func_nameZ	is_methodZ	hash_argsZhash_kwargsZdinfor{   r   r   fname	func_hash
func_cacher   r   )
r   rE   func_hashesr   r   r   r   r   r   wrapped_funcr   r   rr   l  sD    
*





zcache.<locals>.hash_funcc            	         s   | i |\}}}||v rf4 || \}}}}|||d |f||< W d    q1 sZ0    Y  nH | i |I d H }  ||d|f||< W d    n1 s0    Y  |S Nr   r   r   	rD   r   r   r{   r   retr   countr   rE   rr   lockr   r   r     s    4.zcache.<locals>.wrapped_funcc            	         s   | i |\}}}||v rf4 || \}}}}|||d |f||< W d    q1 sZ0    Y  nB | i |}  ||d|f||< W d    n1 s0    Y  |S r   r   r   r   r   r   r     s    4.c                    s^   | d d u rd S | d }rDddl m} |tj |}|  ntj|i }|  d S )Nr   r   )	r   r   r   r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   r     s    
zcache.<locals>.clearc                 S   s
   |  d S r   r   )session_contextr   r   r   r   server_clear  s    zcache.<locals>.server_clear)r   rv   	threadingRLockr   	functoolswrapsr   r   r   r   Zon_session_destroyed__dict__r5   AttributeError)
rE   r   r   r   r   r   r   r   r   r   r   )r   rE   r   rr   r   r   r   r   r   r   r   r   r   r   5  s2    #
	3r   )returnc                 C   s   | |u pt | t |kS )z[Returns True if value and other are equal

    Supports complex values like DataFrames
    )r6   )valueotherr   r   r   is_equal  s    r   )NNNr   NFr   F)Q__doc__datetimedtr   r3   rp   ior   pathlibrR   r   r   r   ZunittestZunittest.mockweakref
contextlibr   r   Zparam.parameterizedr   r   rz   Z_FFI_TYPE_NAMESr   WeakKeyDictionaryZ_HASH_STACKSr   r   r   bytesri   floatintbool	bytearrayr'   rY   r]   rK   rM   platformperf_counterr   	monotonicr   r   r%   r)   r*   r<   rB   rH   rV   r`   rc   slicer|   r/   r7   PathpartialZmockZMockStringIOBytesIOdater}   ismodulero   r   rs   ry   r6   r   r   r   r   r   r   r   r   r   r   r   <module>   s   






 
  
 !