o
    V=ºiˆ  ã                   @   s\  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mZm	Z	 d dl
mZ d dlmZmZmZ d dlZg d¢Zdd„ Zdd	„ ZG d
d„ dƒZdd„ Zdd„ Zdd„ Zdd„ Zd1dd„Zdd„ Zdadad2dd„Zd1dd„Zedƒd3dd„ƒZ edƒej!fd d!„ƒZ"i Z#e $d"ej%¡Z&edƒ	$	d4d%d&„ƒZ'd'd(„ Z(d)d*„ Z)d+d,„ Z*d-d.„ Z+d/d0„ Z,dS )5é    N)Úissubclass_ÚissubsctypeÚ
issubdtype)Ú
set_module)ÚndarrayÚufuncÚasarray)r   r   r   Ú	deprecateÚdeprecate_with_docÚget_includeÚinfoÚsourceÚwhoÚlookforÚbyte_boundsÚ	safe_evalc                  C   sX   ddl } | jdu rtj tj | j¡dd¡}|S ddlm} tj tj |j¡d¡}|S )a¬  
    Return the directory that contains the NumPy \*.h header files.

    Extension modules that need to compile against NumPy should use this
    function to locate the appropriate include directory.

    Notes
    -----
    When using ``distutils``, for example in ``setup.py``::

        import numpy as np
        ...
        Extension('extension_name', ...
                include_dirs=[np.get_include()])
        ...

    r   NÚcoreÚinclude)	ÚnumpyZshow_configÚosÚpathÚjoinÚdirnameÚ__file__Ú
numpy.corer   )r   Údr   © r   úUC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\numpy/lib/utils.pyr      s   
þr   c                 C   s
   || _ | S ©N)Ú__name__)ÚfuncÚnamer   r   r   Ú_set_function_name0   s   r"   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )Ú
_Deprecatez†
    Decorator class to deprecate old functions.

    Refer to `deprecate` for details.

    See Also
    --------
    deprecate

    Nc                 C   s   || _ || _|| _d S r   )Úold_nameÚnew_nameÚmessage)Úselfr$   r%   r&   r   r   r   Ú__init__A   s   
z_Deprecate.__init__c                    sv  | j }| j}| j}|du rzˆj}W n ty   ˆj}Y nw |du r(d| ‰ nd||f ‰ |dur8ˆ d| 7 ‰ ‡ ‡fdd„}t||ƒ}ˆj}|du rNˆ }nR| ¡  d¡}	t	|	dd… ƒ}
|	d  
¡ rj|
d	 | }n't|	d ƒd }|	dd… D ]}t|ƒ|
kr‚ q‹|t|ƒd 7 }qx||d… }t ˆ d	|
 ¡‰ d
 ˆ |g¡}||_zˆj}W n
 ty²   Y |S w |j |¡ |S )z:
        Decorator call.  Refer to ``decorate``.

        Nz`%s` is deprecated!z%`%s` is deprecated, use `%s` instead!Ú
c                     s   t jˆ tdd� ˆ| i |¤ŽS )z1`arrayrange` is deprecated, use `arange` instead!é   )Ú
stacklevelN)ÚwarningsÚwarnÚDeprecationWarning)ÚargsÚkwds©Zdepdocr    r   r   Únewfunc]   s   z$_Deprecate.__call__.<locals>.newfuncé   r   ú z

)r$   r%   r&   r   ÚAttributeErrorr"   Ú__doc__Ú
expandtabsÚsplitÚ_get_indentÚlstripÚlenÚtextwrapÚindentr   Ú__dict__Úupdate)r'   r    r/   Úkwargsr$   r%   r&   r2   ÚdocÚlinesr=   ÚskipÚliner   r   r1   r   Ú__call__F   sT   

ÿ
ÿ

üz_Deprecate.__call__)NNN)r   Ú
__module__Ú__qualname__r6   r(   rE   r   r   r   r   r#   5   s    
r#   c                 C   sD   t j}| D ]}t| ¡ ƒ}|rt|t|ƒ| ƒ}q|t jkr d}|S )zU
    Determines the leading whitespace that could be removed from all the lines.
    r   N)ÚsysÚmaxsizer;   r:   Úmin)rB   r=   rD   Úcontentr   r   r   r9   �   s   €
r9   c                  O   s8   | r| d }| dd… } t | i |¤Ž|ƒS t | i |¤ŽS )aœ  
    Issues a DeprecationWarning, adds warning to `old_name`'s
    docstring, rebinds ``old_name.__name__`` and returns the new
    function object.

    This function may also be used as a decorator.

    Parameters
    ----------
    func : function
        The function to be deprecated.
    old_name : str, optional
        The name of the function to be deprecated. Default is None, in
        which case the name of `func` is used.
    new_name : str, optional
        The new name for the function. Default is None, in which case the
        deprecation message is that `old_name` is deprecated. If given, the
        deprecation message is that `old_name` is deprecated and `new_name`
        should be used instead.
    message : str, optional
        Additional explanation of the deprecation.  Displayed in the
        docstring after the warning.

    Returns
    -------
    old_func : function
        The deprecated function.

    Examples
    --------
    Note that ``olduint`` returns a value after printing Deprecation
    Warning:

    >>> olduint = np.deprecate(np.uint)
    DeprecationWarning: `uint64` is deprecated! # may vary
    >>> olduint(6)
    6

    r   r3   N©r#   )r/   r@   Úfnr   r   r   r	   �   s
   ,r	   c                 C   s
   t | d�S )a�  
    Deprecates a function and includes the deprecation in its docstring.

    This function is used as a decorator. It returns an object that can be
    used to issue a DeprecationWarning, by passing the to-be decorated
    function as argument, this adds warning to the to-be decorated function's
    docstring and returns the new function object.

    See Also
    --------
    deprecate : Decorate a function such that it issues a `DeprecationWarning`

    Parameters
    ----------
    msg : str
        Additional explanation of the deprecation. Displayed in the
        docstring after the warning.

    Returns
    -------
    obj : object

    )r&   NrL   )Úmsgr   r   r   r
   Ä   s   
r
   c           
      C   s¢   | j }|d d }|d }|d }t| ƒjj}| }}|du r*|| j| 7 }||fS t||ƒD ]\}}	|	dk r@||d |	 7 }q/||d |	 7 }q/||7 }||fS )a#  
    Returns pointers to the end-points of an array.

    Parameters
    ----------
    a : ndarray
        Input array. It must conform to the Python-side of the array
        interface.

    Returns
    -------
    (low, high) : tuple of 2 integers
        The first integer is the first byte of the array, the second
        integer is just past the last byte of the array.  If `a` is not
        contiguous it will not use every byte between the (`low`, `high`)
        values.

    Examples
    --------
    >>> I = np.eye(2, dtype='f'); I.dtype
    dtype('float32')
    >>> low, high = np.byte_bounds(I)
    >>> high - low == I.size*I.itemsize
    True
    >>> I = np.eye(2); I.dtype
    dtype('float64')
    >>> low, high = np.byte_bounds(I)
    >>> high - low == I.size*I.itemsize
    True

    Údatar   ÚstridesÚshapeNr3   )Z__array_interface__r   ÚdtypeÚitemsizeÚsizeÚzip)
ÚaZaiZa_dataZastridesZashapeZbytes_aZa_lowZa_highrQ   Zstrider   r   r   r   ã   s    úr   c                 C   s  | du rt  ¡ j}|j} g }i }|  ¡ D ]D}t| | tƒrX| | }t|ƒ}|| ¡ v r6|d||   }d}n|||< |}d}d t	t
|jƒ¡}	t
|jƒ}
| ||	|
|jj|g¡ qd}d}d}d}|D ]8}|t|d ƒk rst|d ƒ}|t|d ƒk r�t|d ƒ}|t|d ƒk r�t|d ƒ}|d r›|t|d ƒ7 }qct|ƒdkrÎtd|ƒ}td|ƒ}td|ƒ}d	|d
 |d
 |d
 f }t|d dt|ƒd   d ƒ |D ]5}td|d d
|t|d ƒ d  |d d
|t|d ƒ d  |d d
|t|d ƒ d  |d f ƒ qÐtd| ƒ dS )a%  
    Print the NumPy arrays in the given dictionary.

    If there is no dictionary passed in or `vardict` is None then returns
    NumPy arrays in the globals() dictionary (all NumPy arrays in the
    namespace).

    Parameters
    ----------
    vardict : dict, optional
        A dictionary possibly containing ndarrays.  Default is globals().

    Returns
    -------
    out : None
        Returns 'None'.

    Notes
    -----
    Prints out the name, shape, bytes and type of all of the ndarrays
    present in `vardict`.

    Examples
    --------
    >>> a = np.arange(10)
    >>> b = np.ones(20)
    >>> np.who()
    Name            Shape            Bytes            Type
    ===========================================================
    a               10               80               int64
    b               20               160              float64
    Upper bound on total bytes  =       240

    >>> d = {'x': np.arange(2.0), 'y': np.arange(3.0), 'txt': 'Some str',
    ... 'idx':5}
    >>> np.who(d)
    Name            Shape            Bytes            Type
    ===========================================================
    x               2                16               float64
    y               3                24               float64
    Upper bound on total bytes  =       40

    Nz (%s)r   r3   z x r*   é   é
   zName %s Shape %s Bytes %s Typer4   r)   ú=é   z%s %s %s %s %s %s %sé   z'
Upper bound on total bytes  =       %d)rH   Ú	_getframeÚf_backÚ	f_globalsÚkeysÚ
isinstancer   Úidr   ÚmapÚstrrQ   ÚnbytesÚappendrR   r!   r;   ÚintÚmaxÚprint)ÚvardictÚframeZstaÚcacher!   ÚvarZidvÚnamestrÚoriginalZshapestrZbytestrZmaxnameZmaxshapeZmaxbyteZ
totalbytesÚvalZsp1Zsp2Zsp3Zprvalr   r   r   r     sb   ,

ÿ€€


  
ýr   c           
      C   s�   t | ƒ}|}| }d}| |¡}|D ]4}||krd}	n|}	|t |ƒ t |	ƒ }||kr?|d t |ƒ }|d d|d   | }q||	 | }q|S )Nz, Ú r3   z,
r4   r*   )r;   r8   )
r!   Ú	argumentsÚwidthZ
firstwidthÚkZnewstrZsepstrZarglistZargumentZaddstrr   r   r   Ú_split_lineƒ  s   
rt   r   c                 C   s¨   t | tƒ tƒ g ƒ} | j| ji}| jg}| jg}	 t|ƒdkr#	 ||fS | d¡}| ¡ D ]&}t|| t	j
ƒrR|| j}||vrR|| j}| |¡ | |¡ |||< q,q)NTr   )Ú
__import__ÚglobalsÚlocalsr   r>   r;   Úpopr_   r`   ÚtypesÚ
ModuleTypere   )ÚmoduleZthedictZdictlistZ
totraverseZthisdictÚxÚmodnameZmoddictr   r   r   Ú_makenamedict›  s&   

÷



€õr~   c           
      C   s‚  d}d}dd„ }t | dt| ƒƒ}t |d|ƒ}| j}| jj}|du r$tj}td||d� td	| j|d� td
||d� td| j	|d� td|| j
jƒ|d� td|| j
jƒ|d� td| j
j|d� tdt| jjjƒ|f |d� tdd|d� |dv rŠtd|tj|f |d� d}	n#|dkržtd||f |d� tjdk}	ntd||f |d� tjdk}	td||	ƒ|d� td| j |d� dS )aO  Provide information about ndarray obj.

    Parameters
    ----------
    obj : ndarray
        Must be ndarray, not checked.
    output
        Where printed output goes.

    Notes
    -----
    Copied over from the numarray module prior to its removal.
    Adapted somewhat as only numpy is an option now.

    Called by info.

    rp   c                 S   s   | S r   r   )r|   r   r   r   Ú<lambda>Ã  s    z_info.<locals>.<lambda>Ú	__class__r   Nzclass: ©Úfilezshape: z	strides: z
itemsize: z	aligned: zcontiguous: z	fortran: zdata pointer: %s%szbyteorder: r4   )Úendr‚   )ú|rY   z%s%s%sFú>z%sbig%sÚbigz
%slittle%sÚlittlez
byteswap: ztype: %s)ÚgetattrÚtyperP   rR   Ú	byteorderrH   Ústdoutrh   rQ   rS   ÚflagsZalignedÚ
contiguousZfortranÚhexÚctypesZ_as_parameter_Úvalue)
ÚobjÚoutputÚextraZticZbpÚclsÚnmrP   ZendianZbyteswapr   r   r   Ú_info¯  s>   þ
r–   éL   c              	   C   sT  ddl }ddl}t| dƒst| dƒr| j} nt| dƒr| j} |du r%tj}| du r/ttƒ dS t| t	ƒr<t
| |d� dS t| tƒr«tdu rKt|ƒ\aad}g }tD ]A}z6t| |  }	t|	ƒ|v ritd| |d� n| t|	ƒ¡ td	| |d� t|	ƒ td
| |d� |d7 }W qQ ty’   Y qQw |dkr¡td|  |d� dS td| |d� dS | | ¡sµ| | ¡rõ| j}
z	t| | ¡ƒ}W n tyÌ   d}Y nw t|
| ƒ|krÜt|
||ƒ}n|
| }td| d |d� t| | ¡|d� dS | | ¡�r—| j}
z	t| | ¡ƒ}W n t�y   d}Y nw t|
| ƒ|k�r$t|
||ƒ}n|
| }td| d |d� | | ¡}|du �rMt| dƒ�rLt| | j¡|d� n	t| | ¡|d� | | ¡}dd„ |D ƒ}|�r“td|d� |D ]'}t| |dƒ}|du�r‡| | |¡�pƒd¡\}}td||f |d� �qmdS dS t| dƒ�r¨t| | ¡|d� dS dS )a¼  
    Get help information for a function, class, or module.

    Parameters
    ----------
    object : object or str, optional
        Input object or name to get information about. If `object` is a
        numpy object, its docstring is given. If it is a string, available
        modules are searched for matching objects.  If None, information
        about `info` itself is returned.
    maxwidth : int, optional
        Printing width.
    output : file like object, optional
        File like object that the output is written to, default is
        ``None``, in which case ``sys.stdout`` will be used.
        The object has to be opened in 'w' or 'a' mode.
    toplevel : str, optional
        Start search at this level.

    See Also
    --------
    source, lookfor

    Notes
    -----
    When used interactively with an object, ``np.info(obj)`` is equivalent
    to ``help(obj)`` on the Python prompt or ``obj?`` on the IPython
    prompt.

    Examples
    --------
    >>> np.info(np.polyval) # doctest: +SKIP
       polyval(p, x)
         Evaluate the polynomial p at x.
         ...

    When using a string for `object` it is possible to get multiple results.

    >>> np.info('fft') # doctest: +SKIP
         *** Found in numpy ***
    Core FFT routines
    ...
         *** Found in numpy.fft ***
     fft(a, n=None, axis=-1)
    ...
         *** Repeat reference found in numpy.fft.fftpack ***
         *** Total of 3 references found. ***

    r   NZ_ppimport_importerÚ_ppimport_moduleÚ_ppimport_attr)r’   z+
     *** Repeat reference found in %s *** r�   z     *** Found in %s ***ú-r3   zHelp for %s not found.z+
     *** Total of %d references found. ***z()r4   r)   r(   c                 S   s   g | ]
}|d  dkr|‘qS )r   Ú_r   )Ú.0Úmethr   r   r   Ú
<listcomp>l  s    zinfo.<locals>.<listcomp>z

Methods:
ÚNonez  %s  --  %sr6   ) ÚpydocÚinspectÚhasattrr˜   r™   rH   r‹   r   r`   r   r–   rc   Ú	_namedictr~   Ú	_dictlistra   rh   re   ÚKeyErrorÚ
isfunctionÚismethodr   Ú	signatureÚ	Exceptionr;   rt   ÚgetdocÚisclassr(   Z
allmethodsrˆ   Zsplitdoc)ÚobjectZmaxwidthr’   Útoplevelr    r¡   ZnumfoundZobjlistrm   r‘   r!   rq   ZargstrZdoc1ÚmethodsZpublic_methodsr�   ZthisobjZmethstrÚotherr   r   r   r   å  s°   5
ÿ


ÿþÿÿ
þÿÿ

€

ÿøÿr   c                 C   sX   ddl }ztd| | ¡ |d� t| | ¡|d� W dS  ty+   td|d� Y dS w )aí  
    Print or write to a file the source code for a NumPy object.

    The source code is only returned for objects written in Python. Many
    functions and classes are defined in C and will therefore not return
    useful information.

    Parameters
    ----------
    object : numpy object
        Input object. This can be any object (function, class, module,
        ...).
    output : file object, optional
        If `output` not supplied then source code is printed to screen
        (sys.stdout).  File object must be created with either write 'w' or
        append 'a' modes.

    See Also
    --------
    lookfor, info

    Examples
    --------
    >>> np.source(np.interp)                        #doctest: +SKIP
    In file: /usr/lib/python2.6/dist-packages/numpy/lib/function_base.py
    def interp(x, xp, fp, left=None, right=None):
        """.... (full docstring printed)"""
        if isinstance(x, (float, int, number)):
            return compiled_interp([x], xp, fp, left, right).item()
        else:
            return compiled_interp(x, xp, fp, left, right)

    The source code is only returned for objects written in Python.

    >>> np.source(np.array)                         #doctest: +SKIP
    Not available for this object.

    r   NzIn file: %s
r�   zNot available for this object.)r¡   rh   ÚgetsourcefileÚ	getsourcer©   )r¬   r’   r¡   r   r   r   r   {  s   )ÿr   z[a-z0-9_]+\(.*[,=].*\)TFc              	      sº  ddl }t|||ƒ‰ g }t| ƒ ¡  ¡ ‰ˆsdS ˆ  ¡ D ] \}\}}	}
|	dv r(q| ¡ ‰t‡fdd„ˆD ƒƒr<| |¡ qdddddœ‰‡‡fd	d
„‰‡ ‡fdd„}|j|d� dd 	ˆ¡ }|dt
|ƒ g}|ddd… D ]=}ˆ | \‰}	}dd„ ˆ ¡  d¡D ƒ}z|d  ¡ }t |¡r•|d  ¡ }W n ty¡   d}Y nw | d||f ¡ qn|s³| d¡ |durÁ| d 	|¡¡ dS t
|ƒdkrÔ| ¡ }|d 	|¡ƒ dS td 	|¡ƒ dS )aº  
    Do a keyword search on docstrings.

    A list of objects that matched the search is displayed,
    sorted by relevance. All given keywords need to be found in the
    docstring for it to be returned as a result, but the order does
    not matter.

    Parameters
    ----------
    what : str
        String containing words to look for.
    module : str or list, optional
        Name of module(s) whose docstrings to go through.
    import_modules : bool, optional
        Whether to import sub-modules in packages. Default is True.
    regenerate : bool, optional
        Whether to re-generate the docstring cache. Default is False.
    output : file-like, optional
        File-like object to write the output to. If omitted, use a pager.

    See Also
    --------
    source, info

    Notes
    -----
    Relevance is determined only roughly, by checking if the keywords occur
    in the function name, at the start of a docstring, etc.

    Examples
    --------
    >>> np.lookfor('binary representation') # doctest: +SKIP
    Search results for 'binary representation'
    ------------------------------------------
    numpy.binary_repr
        Return the binary representation of the input number as a string.
    numpy.core.setup_common.long_double_representation
        Given a binary dump as given by GNU od -b, look for long double
    numpy.base_repr
        Return a string representation of a number in the given base system.
    ...

    r   N)r{   r¬   c                 3   s   � | ]}|ˆ v V  qd S r   r   ©rœ   Úw)rA   r   r   Ú	<genexpr>ö  s   € zlookfor.<locals>.<genexpr>iè  éüÿÿ)r    Úclassr{   r¬   c                    s¦   d}d  | ¡  ¡  d¡d d… ¡‰ |t‡ fdd„ˆD ƒƒ7 }|t‡fdd„ˆD ƒƒ7 }|tˆƒ d 7 }|ˆ |d¡7 }|ˆ d	¡ d
 7 }|t| d dƒ7 }|S )Nr   r)   r[   c                    ó   g | ]}|ˆ v rd ‘qS )éÈ   r   r²   )Ú	first_docr   r   rž     ó    z.lookfor.<locals>.relevance.<locals>.<listcomp>c                    r·   )é   r   r²   )r!   r   r   rž     rº   rZ   rµ   Ú.rX   éd   iœÿÿÿ)	r   ÚlowerÚstripr8   Úsumr;   ÚgetÚcountrg   )r!   ZdocstrÚkindÚindexÚr)Úkind_relevanceÚwhats)r¹   r!   r   Ú	relevance   s    zlookfor.<locals>.relevancec                    s   ˆ| gˆ |  ¢R Ž S r   r   )rV   )rk   rÈ   r   r   Úrelevance_value  s   z lookfor.<locals>.relevance_value)ÚkeyzSearch results for '%s'r4   rš   éÿÿÿÿc                 S   s   g | ]
}|  ¡ r|  ¡ ‘qS r   )r¿   )rœ   rD   r   r   r   rž     s    ÿzlookfor.<locals>.<listcomp>r)   r3   rp   z	%s
    %szNothing found.rX   )r    Ú_lookfor_generate_cacherc   r¾   r8   ÚitemsÚallre   Úsortr   r;   r¿   Ú_function_signature_reÚsearchÚ
IndexErrorÚwriteZgetpagerrh   )Úwhatr{   Úimport_modulesÚ
regenerater’   r    Úfoundr!   Ú	docstringrÃ   rÄ   rÉ   ÚsÚ	help_textÚixZdoclinesr¹   Zpagerr   )rk   rA   rÆ   rÈ   rÇ   r   r   ¶  sR   /
€ÿ
€ÿ
r   c              
   C   s¨  ddl }ddlm} | du rd} t| tƒr-zt| ƒ W n ty&   i  Y S w tj|  } nt| t	ƒs7t| t
ƒrIi }| D ]}| t|||ƒ¡ q;|S t| ƒtv rW|sWtt| ƒ S i }|tt| ƒ< i }d}| j| fg}	|	�rÒ|	 d¡\}
}t|ƒ|v rzqid|t|ƒ< |d7 }d}| |¡�r‹d}z|j}W n tyž   d}Y nw |�r t|d	ƒ�r |jD ]t}t |¡D ]l}tj ||¡}tj ||d
¡}tj |¡rÕ| d¡rÕ|dd… }n
tj |¡rÞ|}nq²|dkräq²z(tj}tj}z|ƒ t_|ƒ t_td|
|f ƒ W |t_|t_n|t_|t_w W q² t�y   ‚  t�y   Y q²w q«t |ƒD ]‹\}}zt!|dd|
|f ƒ}t!|ddƒ}W n t"�yL   d|
|f }d}Y nw d|v�r[|�r[d||f }| #|
d ¡�slt|t$ƒ�rjn�q$| |¡�s~|du �s~||v �s~�q$|	 %d|
|f |f¡ �q$| &|¡�r¨d}t |ƒD ]\}}|	 %d|
|f |f¡ �q—t|dƒ�r°d}z| '|¡}W n t"�yÃ   d}Y nw |du�rÐ|||f||
< |	sl|S )aõ  
    Generate docstring cache for given module.

    Parameters
    ----------
    module : str, None, module
        Module for which to generate docstring cache
    import_modules : bool
        Whether to import sub-modules in packages.
    regenerate : bool
        Re-generate the docstring cache

    Returns
    -------
    cache : dict {obj_full_name: (docstring, kind, index), ...}
        Docstring cache for the module, either cached one (regenerate=False)
        or newly generated.

    r   N)ÚStringIOr   Tr3   r¬   r{   Ú__path__z__init__.pyz.pyéýÿÿÿr(   z%s.%sr   rF   r¼   r¶   rE   r    )(r¡   ÚiorÜ   r`   rc   ru   ÚImportErrorrH   ÚmodulesÚlistÚtupler?   rÌ   ra   Ú_lookfor_cachesr   rx   ÚismoduleÚ__all__r5   r¢   rÝ   r   Úlistdirr   r   ÚisfileÚendswithr‹   ÚstderrÚKeyboardInterruptÚBaseExceptionÚ_getmembersrˆ   Ú	NameErrorÚ
startswithr   re   r«   rª   )r{   rÕ   rÖ   r¡   rÜ   rk   ÚmodÚseenrÄ   Ústackr!   ÚitemrÃ   Z_allÚpthZmod_pathZthis_pyZinit_pyZ	to_importZ
old_stdoutZ
old_stderrÚnÚvZ	item_nameÚmod_namerA   r   r   r   rÌ   2  sÌ   
ÿ
ÿ
ÿ
ÿÿýæü þ
«WrÌ   c                    sD   dd l }z| ˆ ¡}W |S  ty!   ‡ fdd„tˆ ƒD ƒ}Y |S w )Nr   c                    s$   g | ]}t ˆ |ƒr|tˆ |ƒf‘qS r   )r¢   rˆ   )rœ   r|   ©ró   r   r   rž   Â  s    ÿz_getmembers.<locals>.<listcomp>)r¡   Ú
getmembersr©   Údir)ró   r¡   Úmembersr   rø   r   rí   ½  s   ýýrí   c                 C   s   ddl }| | ¡S )au  
    Protected string evaluation.

    Evaluate a string containing a Python literal expression without
    allowing the execution of arbitrary non-literal code.

    .. warning::

        This function is identical to :py:meth:`ast.literal_eval` and
        has the same security implications.  It may not always be safe
        to evaluate large input strings.

    Parameters
    ----------
    source : str
        The string to evaluate.

    Returns
    -------
    obj : object
       The result of evaluating `source`.

    Raises
    ------
    SyntaxError
        If the code has invalid Python syntax, or if it contains
        non-literal code.

    Examples
    --------
    >>> np.safe_eval('1')
    1
    >>> np.safe_eval('[1, 2, 3]')
    [1, 2, 3]
    >>> np.safe_eval('{"foo": ("bar", 10.0)}')
    {'foo': ('bar', 10.0)}

    >>> np.safe_eval('import os')
    Traceback (most recent call last):
      ...
    SyntaxError: invalid syntax

    >>> np.safe_eval('open("/home/user/.ssh/id_dsa").read()')
    Traceback (most recent call last):
      ...
    ValueError: malformed node or string: <_ast.Call object at 0x...>

    r   N)ÚastÚliteral_eval)r   rü   r   r   r   r   Ç  s   2
r   c                 C   sr   | j dkr|S t | jd|d�¡}tj |¡r| d¡}t | ¡ ¡dkr7t	|tj
ƒr2| j tj¡S tj||< |S )a{  
    Utility function to check median result from data for NaN values at the end
    and return NaN in that case. Input result can also be a MaskedArray.

    Parameters
    ----------
    data : array
        Sorted input data to median function
    result : Array or MaskedArray
        Result of median function.
    axis : int
        Axis along which the median was computed.

    Returns
    -------
    result : scalar or ndarray
        Median or NaN in axes which contained NaN in the input.  If the input
        was an array, NaN will be inserted in-place.  If a scalar, either the
        input itself or a scalar NaN.
    r   rË   )ÚaxisFN)rT   ÚnpÚisnanZtakeÚmaZisMaskedArrayZfilledZcount_nonzeroZravelr`   ZgenericrR   r‰   Únan)rO   Úresultrþ   rõ   r   r   r   Ú_median_nanchecký  s   


r  c                  C   sr   ddl m} m}m} t|ƒdkrt|ƒdkrdS d |¡}|D ]}| | r.|d|› d�7 }q|d|› d�7 }q|S )a‰  
    Returns a string contains the supported CPU features by the current build.

    The string format can be explained as follows:
        - dispatched features that are supported by the running machine
          end with `*`.
        - dispatched features that are "not" supported by the running machine
          end with `?`.
        - remained features are representing the baseline.
    r   )Ú__cpu_features__Ú__cpu_baseline__Ú__cpu_dispatch__rp   r4   Ú*ú?N)Znumpy.core._multiarray_umathr  r  r  r;   r   )r  r  r  Zenabled_featuresÚfeaturer   r   r   Ú	_opt_info!  s   
r  r   )r   )Nr—   Nr   )NTFN)-r   rH   r<   ry   Úrer,   Znumpy.core.numerictypesr   r   r   Znumpy.core.overridesr   r   r   r   r   r   rÿ   ræ   r   r"   r#   r9   r	   r
   r   r   rt   r£   r¤   r~   r–   r   r‹   r   rä   ÚcompileÚIrÐ   r   rÌ   rí   r   r  r  r   r   r   r   Ú<module>   sR    L5
9g

6 3ÿ{ 
6$