o
    1&iZ                     @   s>   d Z ddlZddlmZ dZeddgZddd	Zd
d ZdS )z
The same algorithm as translated from numpy.
See numpy/core/src/npysort/mergesort.c.src.
The high-level numba code is adding a little overhead comparing to
the pure-C implementation in numpy.
    N)
namedtuple   MergesortImplementationrun_mergesortFc                    s   t ddd}d u r| di |dd n	| di ||r/| di |fddn| di |fdd| di | fd	d
 | dd fdd}| dd fdd}t|rg|dS |dS )NTF)no_cpython_wrapperZ_nrtc                 S   s   | |k S N )abr   r   ?C:\wamp64\www\opt\env\Lib\site-packages\numba/misc/mergesort.pylt   s   zmake_mergesort_impl.<locals>.ltc                    s    ||  || S r   r   r	   r
   valsr   r   r   lessthan   s   z%make_mergesort_impl.<locals>.lessthanc                    s
    | |S r   r   r   r   r   r   r   #   s   
c           
         s  | j tkr| j d } | d| ||  | |d || t|D ]}| | ||< q"|d| }| |d }| }d } }}	||j k rv||j k rv|| || |s^|| ||	< |d7 }n
|| ||	< |d7 }|	d7 }	||j k rv||j k sI||j k r|| ||	< |d7 }|	d7 }	||j k s{||j k r|| ||	< |d7 }|	d7 }	||j k sdS dS d}|| j k r|}|dkr| | | |d  |r| | | |d  | |d < | |< |d8 }|dkr| | | |d  |s|d7 }|| j k sdS dS )a  The actual mergesort function

        Parameters
        ----------
        arr : array [read+write]
            The values being sorted inplace.  For argsort, this is the
            indices.
        vals : array [readonly]
            ``None`` for normal sort.  In argsort, this is the actual array values.
        ws : array [write]
            The workspace.  Must be of size ``arr.size // 2``
           Nr      )sizeSMALL_MERGESORTrange)
arrr   wsmidileftrightoutjk)argmergesort_innerr   r   r   r   '   sJ   







 " z/make_mergesort_impl.<locals>.argmergesort_inner)r   c                    s&   t j| jd | jd} | d| | S )ZInplacer   dtypeN)npemptyr   r!   )r   r   r   r   r   	mergesorte   s   z&make_mergesort_impl.<locals>.mergesortc                    s2   t | j}t j| jd |jd} || | |S )zOut-of-placer   r    )r"   Zaranger   r#   r!   )r   Zidxsr   r$   r   r   argmergesortm   s   z)make_mergesort_impl.<locals>.argmergesort)r   r   )dictr   )wrapr   Z
is_argsortZkwargs_liter%   r&   r   )r   r   r   r   make_mergesort_impl   s*   =r)   c                  O   s"   ddl m} t|g| R i |S )Nr   )njit)Znumbar*   r)   )argskwargsr*   r   r   r   make_jit_mergesortz   s   r-   )NF)	__doc__numpyr"   collectionsr   r   r   r)   r-   r   r   r   r   <module>   s    
g