
    xKg                     B    d Z ddlZddlmZ dZ eddg      Zd	dZd Zy)
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_mergesortc                 6   t        dd      } | di |d        n  | di |      |r | di |fd       n | di |fd        | di |fd        | d      fd	       } | d      fd
       }t        |r|      S |      S )NTF)no_cpython_wrapper_nrtc                     | |k  S N )abs     X/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/numba/misc/mergesort.pyltzmake_mergesort_impl.<locals>.lt   s    q5L    c                 "     ||    ||         S r   r   r   r   valsr   s      r   lessthanz%make_mergesort_impl.<locals>.lessthan   s    d1gtAw''r   c                      | |      S r   r   r   s      r   r   z%make_mergesort_impl.<locals>.lessthan#   s    a8Or   c                 b   | j                   t        kD  r$| j                   dz  } 
| d| ||        
| |d ||       t        |      D ]
  }| |   ||<    |d| }| |d }| }dx}x}}	||j                   k  r^||j                   k  rO ||   ||   |      s||   ||	<   |dz  }n||   ||	<   |dz  }|	dz  }	||j                   k  r||j                   k  rO||j                   k  r"||   ||	<   |dz  }|	dz  }	||j                   k  r"||j                   k  r#||   ||	<   |dz  }|	dz  }	||j                   k  r"yyd}|| j                   k  re|}|dkD  rH | |   | |dz
     |      r5| |   | |dz
     c| |dz
  <   | |<   |dz  }|dkD  r | |   | |dz
     |      r5|dz  }|| j                   k  rdyy)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   s             r   r&   z/make_mergesort_impl.<locals>.argmergesort_inner'   s
    88o%((a-Cs4Cy$3s34y$3 3ZA1   ds8DIECMAMAdii-A

Na$q'48!!WCFFA"1XCFFAQ dii-A

N dii-aAQQ dii-
 ejj.qAQQ ejj. Achh,!eQQUT B),QQU&CAJAFA !eQQUT B Q chh,r   )r   c                 x    t        j                  | j                  dz  | j                        } | d|       | S )Inplacer   dtypeN)npemptyr   r*   )r   r   r&   s     r   	mergesortz&make_mergesort_impl.<locals>.mergesorte   s2     XXchh!m39953b)
r   c                     t        j                  | j                        }t        j                  | j                  dz  |j                        } || |       |S )zOut-of-placer   r)   )r+   aranger   r,   r*   )r   idxsr   r&   s      r   argmergesortz)make_mergesort_impl.<locals>.argmergesortm   sD     yy"XXchh!m4::64b)r   )r   r   )dictr   )wrapr   
is_argsortkwargs_liter-   r1   r&   r   s    `    @@r   make_mergesort_implr6      s    $U;K 
z				 
	 !T K $				( 
	( 
			 
	 
K9 9z 
T" # 
T" # #'1|
 
7@
 
r   c                  ,    ddl m} t        |g| i |S )Nr   )njit)numbar8   r6   )argskwargsr8   s      r   make_jit_mergesortr<   z   s     t5d5f55r   )NF)	__doc__numpyr+   collectionsr   r   r   r6   r<   r   r   r   <module>r@      s>     "  %%>A  
d
N6r   