
    d5                     |   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mZ ddlm	Z
 ddlZddlmZ ddej        d	d
Zej        Zd Zd Zd Zd$dZd Zd%dZd Zd&dZd Zi Zd&dZd Zd'dZej         fdZ!ej         fdZ"ej         fdZ# G d de$          Z% G d d           Z&d! Z'd" Z(e)d#k    r e(             dS dS )(zUtility functions.    N)Path)perf_counter   )array_of_flavorbiglittle
irrelevant)><=|c                     | dv rdS |S )z2Fix the byteorder depending on the PyTables types.)stringboolint8uint8objectr	    )ptype	byteorders     ,lib/python3.11/site-packages/tables/utils.pycorrect_byteorderr      s     ===|    c                    t          |           t          u rdS t          | d          rvt          | d          r| j        dk    rdS 	 |                                  t          | t                    rt          j        dt          d           dS # t          $ r Y dS w xY wt          | t          j                  rdS t          | t          j                  r#| j        dk    r| j        j        d	         d
k    rdS dS )z0Checks if an object can work as an index or not.T	__index__shaper   FzKusing a boolean instead of an integer will result in an error in the future   )
stacklevelr   i)typeinthasattrr   r   
isinstancer   warningswarnDeprecationWarning	TypeErrornpintegerndarraydtypestrindexs    r   is_idxr/   %   s    E{{ct		$	$ E7## 	r(9(95	OO%&& M*+=!M M M M 4 	 	 	55		E2:	&	& t
UBJ
'
' U[B->->
+/!

#
#t5s   AB 
BBc                 \    	 t          |           S # t          $ r t          d          w xY w)z)Convert a possible index into a long int.znot an integer type.)r!   	Exceptionr'   r-   s    r   idx2longr2   A   s=    05zz 0 0 0.///0s    +Fc                 N   t          | d          }|j        dk    rt          j        ||j        |          }nl|j        dt          |j        j                            }t          j        |d|j        fg          }||d         dd<   |                    |j                  }|S )AConvert a generic object into a NumPy object compliant with atom.numpyr   )r+   copyN )r+   f0)r   r   r(   arrayr+   lenemptyview)arratomr6   nparrnewshapenparr2s         r   convert_to_np_atomrB   N   s     C))E zRdjt<<< ;6TZ%5!6!6 667(B
+;*<===tQQQDJ''Lr   c                     |j         dv }t          | ||          }t          |j        j                 }|dv r$|t
          j        k    r|                                }|S )r4   )time64)r   r   )r    rB   
byteordersr+   r   sysbyteswap)r   r>   r6   r?   r   s        r   convert_to_np_atom2rH   k   s^    
 9
"DvtT22E5;01I&&&9+E+E   Lr   rc                 x   t          |                                           }|dk    rt          j        |t          j                  st          d| d          |                                st          d| d          t          j        |t          j                  st          d| d          dS |dk    rt          j        |t          j                  rt          |d           dS t          j        |j        t          j                  st          d|j         d          |j                                        st          d|j         d	          t          j        |j        t          j                  st          d
|j         d          dS |dk    rCt          j        |t          j                  rt          |d           dS t          |d           dS |dk    rDt          |d           t          j        |t          j                  st          d| d          dS t          d|          )a  Check for file access in the specified `mode`.

    `mode` is one of the modes supported by `File` objects.  If the file
    indicated by `filename` can be accessed using that `mode`, the
    function ends successfully.  Else, an ``IOError`` is raised
    explaining the reason of the failure.

    All this paraphernalia is used to avoid the lengthy and scaring HDF5
    messages produced when there are problems opening a file.  No
    changes are ever made to the file system.

    rI   z``z`` does not existz`` is not a regular filezfile ``z `` exists but it can not be readwzr+z`` is not a directoryzdirectory ``z#`` exists but it can not be writtenazinvalid mode: N)r   resolveosaccessF_OKFileNotFoundErroris_fileIsADirectoryErrorR_OKPermissionErrorcheck_file_accessparentis_dirNotADirectoryErrorW_OK
ValueError)filenamemodepaths      r   rV   rV   |   sf    >>!!##Ds{{yrw'' 	B#$@$@$@$@AAA||~~ 	I#$G$G$G$GHHHyrw'' 	T!"RD"R"R"RSSS	T 	T	9T27## 	 dD))))) 9T["'22 M'(KT[(K(K(KLLL;%%'' R()Pdk)P)P)PQQQ9T["'22 %4;      
 
9T27## 	)dD)))))dC(((((	$$$$yrw'' 	W!"UD"U"U"UVVV	W 	W 2$22333r   c                 N      j          fd}t          |dd j                  S )a/  Create a *lazy attribute* from the result of `fget`.

    This function is intended to be used as a *method decorator*.  It
    returns a *property* which caches the result of calling the `fget`
    instance method.  The docstring of `fget` is used for the property
    itself.  For instance:

    >>> class MyClass(object):
    ...     @lazyattr
    ...     def attribute(self):
    ...         'Attribute description.'
    ...         print('creating value')
    ...         return 10
    ...
    >>> type(MyClass.attribute)
    <class 'property'>
    >>> MyClass.attribute.__doc__
    'Attribute description.'
    >>> obj = MyClass()
    >>> obj.__dict__
    {}
    >>> obj.attribute
    creating value
    10
    >>> obj.__dict__
    {'attribute': 10}
    >>> obj.attribute
    10
    >>> del obj.attribute
    Traceback (most recent call last):
      ...
    AttributeError: can't delete attribute 'attribute'

    .. warning::

        Please note that this decorator *changes the type of the
        decorated object* from an instance method into a property.

    c                 N    | j         }|v r|         S  |           x|<   }|S N)__dict__)selfmydictvaluefgetnames      r   newfgetzlazyattr.<locals>.newfget   s8    6>>$<#tDzz)tur   N)__name__property__doc__)rf   rh   rg   s   ` @r   lazyattrrl      sD    R =D      GT4666r   c                 N   t          d                                                                          D ]q}|                    d          r(t	          |                                d                   }@|                    d          r(t	          |                                d                   }}|                    d          r(t	          |                                d                   }|                    d          r(t	          |                                d                   }|                    d          r)t	          |                                d                   }5|                    d          r't	          |                                d                   }	st          d	| z             t          d
|dd|dd           t          d|dd|dd           t          d|dd|	dd           t                      }
t          d|
|z
  d           |
S )z2Show the used memory (only works for Linux 2.6.x).z/proc/self/statuszVmSize:r   zVmRSS:zVmData:zVmStk:zVmExe:zVmLib:z Memory usage: ******* %s *******zVmSize: z>7z kB	VmRSS: z kBzVmData: z kB	VmStk: zVmExe:  z kB	VmLib: zWallClock time: z.3f)r   	read_text
splitlines
startswithr!   splitprintclock)explaintrefencodinglinevmsizevmrssvmdatavmstkvmexevmlibtnows              r   
show_statsr      s    ())3355@@BB ) )??9%% 	)a))FF__X&& 		)

Q((EE__Y'' 	)a))FF__X&& 	)

Q((EE__X&& 	)

Q((EE__X&& 	)

Q((E	
,w
6777	
9V
9
9
9E
9
9
9
9:::	
9V
9
9
9E
9
9
9
9:::	
8U
8
8
85
8
8
8
899977D	
.TD[
.
.
.///Kr   c                     | }|dk     rt          j        |          nt          j        |          }t          j        t          j        d| z                      }d|z  }t	          j        || z            |z  }|S )zquantize data to improve compression.

    Data is quantized using around(scale*data)/scale, where scale is
    2**bits, and bits is determined from the least_significant_digit.

    For example, if least_significant_digit=1, bits will be 4.

    r   
   r   )mathfloorceillog2r(   around)dataleast_significant_digitexpbitsscaledatouts         r   quantizer     sr     #
"C 1WW$*S///$)C..C9TYrcTz**++DIEYut|$$u,FMr   c                     |S| j         j        }|t          vr
g t          |<   t          |                             t	          j        |                      d S d S ra   )	__class__ri   tracked_classesappendweakrefref)instancerg   s     r   log_instance_creationr     sW    |!*&&$&OD!$$W[%:%:;;;;;	 |r   c                 b    | dk    rt          t                    }|S |                                 S )N*)sortedr   rq   )scs     r   string_to_classesr   "  s+    Cxx?##wwyyr   r   c                 8    t          |           }d |D             S )Nc                 F    g | ]}|t          t          |                   fS r   )r:   r   ).0cns     r   
<listcomp>z*fetch_logged_instances.<locals>.<listcomp>,  s*    @@@rR_R())*@@@r   )r   )classes
classnamess     r   fetch_logged_instancesr   *  s#    "7++J@@Z@@@@r   c           	          t          |           D ]4}|                    d|t          t          |                   fz             5d S )Nz%s: %d
)r   writer:   r   )r   file	classnames      r   count_logged_instancesr   /  sS    &w// N N	

:C	0J,K,K LLMMMMN Nr   c                     t          |           D ][}|                    d|z             t          |         D ]3} |            }|%|                    dt          |          z             4\d S )N
%s:
z    %s
)r   r   r   repr)r   r   r   r   objs        r   list_logged_instancesr   4  s    &w// 3 3	

9y()))"9- 	3 	3C#%%C

:S		1222	33 3r   c           
      :   t          |           D ]}|                    d|z             t          |         D ]b} |            }|T|                    d|z             |j                                        D ]"\  }}|                    d|dd| d           #cd S )Nr   z    %s:
z        z>20z : 
)r   r   r   rb   items)r   r   r   r   r   keyre   s          r   dump_logged_instancesr   =  s    &w// A A	

9y()))"9- 	A 	AC#%%C

;,---"%,"4"4"6"6 A AJCJJ?#???e???@@@@	AA Ar   c                   ,     e Zd ZdZ fdZ fdZ xZS )	CacheDictz8A dictionary that prevents itself from growing too much.c                 X    || _         t                                          |            d S ra   )
maxentriessuper__init__)rc   r   r   s     r   r   zCacheDict.__init__N  s(    $r   c                    t          |           | j        k    rE| j        dz  }t          |           d |         D ]#}t                                          |           $t                                          ||           d S )Nr   )r:   r   listr   __delitem____setitem__)rc   r   re   entries_to_removekr   s        r   r   zCacheDict.__setitem__R  s    t99t&& $" 4$ZZ 2!2 23 ' '##A&&&&C'''''r   )ri   
__module____qualname__rk   r   r   __classcell__)r   s   @r   r   r   K  sW        BB    ( ( ( ( ( ( ( ( (r   r   c                   D    e Zd ZdZd Zd Zd Zd Zd Zd Z	dd	Z
d
 ZdS )
NailedDictz=A dictionary which ignores its items when it has nails on it.c                 0    || _         i | _        d| _        d S Nr   )r   _cache
_nailcount)rc   r   s     r   r   zNailedDict.__init___  s    $r   c                 8    | j                                          d S ra   )r   clearrc   s    r   r   zNailedDict.clearj  s    r   c                 &    | xj         dz  c_         d S Nr   r   r   s    r   nailzNailedDict.nailm      1r   c                 &    | xj         dz  c_         d S r   r   r   s    r   unnailzNailedDict.unnailp  r   r   c                 .    | j         dk    rdS || j        v S )Nr   F)r   r   rc   r   s     r   __contains__zNailedDict.__contains__v  s!    ?Q5dk!!r   c                 P    | j         dk    rt          |          | j        |         S r   )r   KeyErrorr   r   s     r   __getitem__zNailedDict.__getitem__{  s(    ?Q3--{3r   Nc                 R    | j         dk    r|S | j                            ||          S r   )r   r   get)rc   r   defaults      r   r   zNailedDict.get  s*    ?QN{sG,,,r   c                     | j         dk    rd S | j        }t          |          | j        k    r5t	          | j        dz  d          }t          |          d |         D ]}||= |||<   d S )Nr   r   r   )r   r   r:   r   maxr   )rc   r   re   cacher   r   s         r   r   zNailedDict.__setitem__  s|    ?QFu::'' #DOr$91 = =%[[!3"3!34  !HHc


r   ra   )ri   r   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   \  s        GG        " " "
     
- - - -

 
 
 
 
r   r   c                     t          t          d          rydt          j        v r2t          j        d          } t	          | t
                    r| dk    r| S n9t          t          j        d          d                                                   S dt          j        v r't          t          j        d                   } | dk    r| S dS )zDDetects the number of cores on a system.

    Cribbed from pp.

    sysconfSC_NPROCESSORS_ONLNr   zsysctl -n hw.ncpur   NUMBER_OF_PROCESSORS)	r"   rN   sysconf_namesr   r#   r!   popen2readenviron)ncpuss    r   detect_number_of_coresr     s     r9 A B$444J455E%%% %!))ry!455a8==??@@@++BJ5677199L1r   c                  6    ddl } |                                  dS )zRun ``doctest`` on this module.r   N)doctesttestmod)r   s    r   _testr     s#     NNNOOr   __main__)F)rI   ra   )r   )*rk   r   rN   rF   r$   r   pathlibr   timer   rs   r5   r(   flavorr   r   rE   int64SizeTyper   r/   r2   rB   rH   rV   rl   r   r   r   r   r   r   stdoutr   r   r   dictr   r   r   r   ri   r   r   r   <module>r      sg      				 



         & & & & & &     # # # # # # 
				 
 8    80 0 0   :  "34 34 34 34l27 27 27j   6  * < < < <  A A A A
 *- N N N N
 ),
 3 3 3 3 ),
 A A A A( ( ( ( ( ( ( ("3 3 3 3 3 3 3 3l  0   z	EGGGGG r   