ó
    Eñi÷/  ã                   óÒ  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
Jr  SSKrSSKr SSKrSSKJr  SSKJr  Sr\R,                  " \5      \R.                  " \5      :  a  Sr/ SQrSr\R6                  " S	5      =(       d    S
rS\;   a  SrS\R:                  S   ;   r " S S\5      r  " S S5      r! " S S5      r"S r#S r$S r%S r&S r'S r(g! \ a    Sr Nwf = f)z
Generic test utilities.

é    N)Úmodule_from_specÚspec_from_file_location)Úversion)Ú_pep440z3.0.8)ÚPytestTesterÚcheck_free_memoryÚ_TestPythranFuncÚIS_MUSLFÚHOST_GNU_TYPEÚ ÚmuslTÚeditablec                   ó   • \ rS rSrSrSrg)ÚFPUModeChangeWarningé3   zWarning about FPU mode change© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   ó    ÚR/home/mande/repo/quber/.venv/lib/python3.13/site-packages/scipy/_lib/_testutils.pyr   r   3   s   † Ù'Úr   r   c                   ó,   • \ rS rSrSrS r  SS jrSrg)r   é8   a¾  
Run tests for this namespace

``scipy.test()`` runs tests for all of SciPy, with the default settings.
When used from a submodule (e.g., ``scipy.cluster.test()``, only the tests
for that namespace are run.

Parameters
----------
label : {'fast', 'full'}, optional
    Whether to run only the fast tests, or also those marked as slow.
    Default is 'fast'.
verbose : int, optional
    Test output verbosity. Default is 1.
extra_argv : list, optional
    Arguments to pass through to Pytest.
doctests : bool, optional
    Whether to run doctests or not. Default is False.
coverage : bool, optional
    Whether to run tests with code coverage measurements enabled.
    Default is False.
tests : list of str, optional
    List of module names to run tests for. By default, uses the module
    from which the ``test`` function is called.
parallel : int, optional
    Run tests in parallel with pytest-xdist, if number given is larger than
    1. Default is 1.

c                 ó   • Xl         g ©N©Úmodule_name)Úselfr    s     r   Ú__init__ÚPytestTester.__init__V   s   € Ø&Õr   Nc                 óæ  • SS K n[        R                  U R                     n	[        R
                  R                  U	R                  S   5      n
SS/nUc  / nX³-  n[        S U 5       5      (       a  [        S5      eU(       a'  [        U5      S:”  a  USS[        U5      S-
  -  -   /-  nU(       a	  US	U
-   /-  nUS
:X  a  USS/-  nOUS:w  a  USU/-  nUc  U R                  /nUb:  US:”  a4  [        5       (       a  US[        U5      /-  nOSS KnUR                  SSS9  US/[        U5      -   -  n UR!                  U5      nUS:H  $ ! ["         a  nUR$                  n S nAUS:H  $ S nAff = f)Nr   z--showlocalsz
--tb=shortc              3   óB   #   • U  H  oS :H  =(       d    US:H  v •  M     g7f)ú-mz	--markersNr   )Ú.0Úargs     r   Ú	<genexpr>Ú(PytestTester.__call__.<locals>.<genexpr>e   s   é € ÐGºJ°S�d‰{×0˜c [Ñ0Ô0ºJùs   ‚zMust specify -m before --é   Ú-Úvz--cov=Úfastr&   znot slowÚfullz-nzMCould not run tests in parallel because pytest-xdist plugin is not available.é   )Ú
stacklevelz--pyargs)ÚpytestÚsysÚmodulesr    ÚosÚpathÚabspathÚ__path__ÚanyÚ
ValueErrorÚintÚ_pytest_has_xdistÚstrÚwarningsÚwarnÚlistÚmainÚ
SystemExitÚcode)r!   ÚlabelÚverboseÚ
extra_argvÚdoctestsÚcoverageÚtestsÚparallelr2   ÚmoduleÚmodule_pathÚpytest_argsr>   rC   Úexcs                  r   Ú__call__ÚPytestTester.__call__Y   sŽ  € ãä—‘˜T×-Ñ-Ñ.ˆÜ—g‘g—o‘o f§o¡o°aÑ&8Ó9ˆà% |Ð4ˆàÑØˆJØÑ!ˆÜÑG¹JÓG×GÑGäÐ8Ó9Ð9æ”s˜7“| aÓ'Ø˜C #¤s¨7£|°A¡~Ñ"6Ñ6Ð7Ñ7ˆKæØ˜H {Ñ2Ð3Ñ3ˆKà�F‹?Ø˜D *Ð-Ñ-‰KØ�f‹_Ø˜D %˜=Ñ(ˆKà‰=Ø×%Ñ%Ð&ˆEàÑ H¨q£LÜ ×"Ñ"Ø ¤c¨(£mÐ4Ñ4‘ãØ—‘ð Fà)*ð ñ ,ð 	˜
�|¤d¨5£kÑ1Ñ1ˆð	Ø—;‘;˜{Ó+ˆDð ˜‘	Ðøô ó 	Ø—8‘8ŒDà˜‘	Ðûð	ús   Ä6E Å
E0ÅE+Å+E0r   )r.   r+   NFFNN)r   r   r   r   r   r"   rO   r   r   r   r   r   r   8   s   † ñò:'ð KPØ6:÷.r   r   c                   ó*  • \ rS rSrSr\R                  \R                  \R                  \R                  \R                  \R                  /r\R                  \R                  /r\R                   \R"                  /rS rS rS rS rS rS rS	 rS
rg)r	   éŠ   a$  
These are situations that can be tested in our pythran tests:
- A function with multiple array arguments and then
  other positional and keyword arguments.
- A function with array-like keywords (e.g. `def somefunc(x0, x1=None)`.
Note: list/tuple input is not yet tested!

`self.arguments`: A dictionary which key is the index of the argument,
                  value is tuple(array value, all supported dtypes)
`self.partialfunc`: A function used to freeze some non-array argument
                    that of no interests in the original function
c                 ó.   • 0 U l         S U l        S U l        g r   )Ú	argumentsÚpartialfuncÚexpected)r!   s    r   Úsetup_methodÚ_TestPythranFunc.setup_method›   s   € ØˆŒØˆÔØˆ�r   c                 óê   • [         R                  " U5      n0 nUR                  R                  5        H<  u  pEUR                  [         R
                  R                  Ld  M.  UR                  X4'   M>     U$ r   )ÚinspectÚ	signatureÚ
parametersÚitemsÚdefaultÚ	ParameterÚempty)r!   Úfuncr[   Úoptional_argsÚkr-   s         r   Úget_optional_argsÚ"_TestPythranFunc.get_optional_args    s`   € ô ×%Ò% dÓ+ˆ	ØˆØ×(Ñ(×.Ñ.Ö0‰DˆAØ�y‰y¤× 1Ñ 1× 7Ñ 7Ô7Ø#$§9¡9�Ó ñ 1ð Ðr   c                 óx   • SnU R                    H'  n[        U R                   U   S   5      nX1:”  d  M%  UnM)     U$ )Nr   r+   )rT   Úlen)r!   Úmax_lenÚarg_idxÚcur_lens       r   Úget_max_dtype_list_lengthÚ*_TestPythranFunc.get_max_dtype_list_lengthª   s?   € àˆØ—~”~ˆGÜ˜$Ÿ.™.¨Ñ1°!Ñ4Ó5ˆGØÕ Ø!’ñ &ð ˆr   c                 ó8   • U[        U5      S-
  :”  a  US   $ X   $ )Nr+   éÿÿÿÿ)rg   )r!   Ú
dtype_listÚ	dtype_idxs      r   Ú	get_dtypeÚ_TestPythranFunc.get_dtype³   s(   € ð ”s˜:“ qÑ(Ó(Ø˜b‘>Ð!àÑ(Ð(r   c                 ó0  • [        U R                  5       5       Hy  n/ nU R                   HU  nU R                  U R                  U   S   U5      nUR	                  U R                  U   S   R                  U5      5        MW     U R                  " U6   M{     g )Nr+   r   )Úrangerk   rT   rq   ÚappendÚastypeÚpythranfunc)r!   Útype_idxÚ
args_arrayri   Ú	new_dtypes        r   Útest_all_dtypesÚ _TestPythranFunc.test_all_dtypes»   s†   € Ü˜d×<Ñ<Ó>Ö?ˆHØˆJØŸ>œ>�Ø ŸN™N¨4¯>©>¸'Ñ+BÀ1Ñ+EØ+3ó5�	à×!Ñ! $§.¡.°Ñ"9¸!Ñ"<×"CÑ"CÀIÓ"NÖOñ *ð ×Ò˜jÓ)ò @r   c                 ó¦   • / nU R                    H0  nUR                  U R                   U   S   S S S2   S S S2   5        M2     U R                  " U6   g )Nr   rn   )rT   ru   rw   ©r!   ry   ri   s      r   Ú
test_viewsÚ_TestPythranFunc.test_viewsÄ   sQ   € Øˆ
Ø—~”~ˆGØ×Ñ˜dŸn™n¨WÑ5°aÑ8¹¸2¸Ñ>¹tÀ¸tÑDÖEñ &à×Ò˜*Ò%r   c           	      óÂ   • / nU R                    H>  nUR                  [        R                  " U R                   U   S   SSS9S S S2   5        M@     U R                  " U6   g )Nr   r0   )Úaxis)rT   ru   ÚnpÚrepeatrw   r~   s      r   Útest_stridedÚ_TestPythranFunc.test_stridedÊ   s_   € Øˆ
Ø—~”~ˆGØ×ÑœbŸiši¨¯©°wÑ(?ÀÑ(BØ()°ñ3Ù36°Q°3ñ8ö 9ñ &ð 	×Ò˜*Ò%r   )rT   rV   rU   N)r   r   r   r   r   rƒ   Úint8Úint16Úint32Úint64ÚintcÚintpÚALL_INTEGERÚfloat32Úfloat64Ú	ALL_FLOATÚ	complex64Ú
complex128ÚALL_COMPLEXrW   rd   rk   rq   r{   r   r…   r   r   r   r   r	   r	   Š   sz   † ñð —7‘7˜BŸH™H b§h¡h°·±¸"¿'¹'À2Ç7Á7ÐK€KØ—‘˜RŸZ™ZÐ(€IØ—<‘< §¡Ð/€Kòò
òò)ò*ò&õ&r   r	   c                  ó"   • SSK Jn   U " S5      SL$ )zI
Check if the pytest-xdist plugin is installed, providing parallel tests
r   ©Ú	find_specÚxdistN)Úimportlib.utilr–   r•   s    r   r<   r<   Ò   s   € õ
 )Ù�WÓ TÐ)Ð)r   c                 ó2  • SSK n [        [        R                  S   5      nSR	                  U [        R                  S   5      nX S-  :  a  UR                  U5        gg! [
         a,    [        5       nUc  UR                  S5        U  SUS-   S3n NPf = f)	zB
Check *free_mb* of memory is available, otherwise do pytest.skip
r   NÚSCIPY_AVAILABLE_MEMz={} MB memory required, but environment SCIPY_AVAILABLE_MEM={}zlCould not determine available memory; set SCIPY_AVAILABLE_MEM variable to free memory in MB to run the test.z MB memory required, but ç    €„.Az MB available)r2   Ú_parse_sizer5   ÚenvironÚformatÚKeyErrorÚ_get_mem_availableÚskip)Úfree_mbr2   Úmem_freeÚmsgs       r   r   r   Û   s¨   € ó ð	OÜœrŸz™zÐ*?Ñ@ÓAˆØM×TÑTØ”R—Z‘ZÐ 5Ñ6ó8ˆð ˜C‘-ÓØ�‰�CÕð  øô ó OÜ%Ó'ˆØÑØ�K‰Kð Iô Jà�	Ð2°8¸C±<°.ÀÐNŠðOús   †?A  Á 3BÂBc                 ór  • SSSSSSSSSSSSSS	S
.n[         R                  " SR                  SR                  UR	                  5       5      5      U [         R
                  5      nU(       a  UR                  S5      U;  a  [        S5      e[        UR                  S5      5      XR                  S5         -  $ )Nr›   g      ð?ç     @�@g    eÍÍAg   ¢”mBg      �@g      0Ag      ÐAg      pB)r   Úbrc   ÚMÚGÚTÚkbÚMbÚGbÚTbÚkibÚMibÚGibÚTibz^\s*(\d+)\s*({})\s*$Ú|r0   zInvalid size stringr+   )	ÚreÚmatchrž   ÚjoinÚkeysÚIÚgroupr:   Úfloat)Úsize_strÚsuffixesÚms      r   rœ   rœ   ð   s¥   € ØØØ˜s¨°4Ø ¨C°tØ i¸	È)ñ	U€Hô
 	�ŠÐ(×/Ñ/°·±¸¿¹»Ó0IÓJØÜ—‘ó	€Aö �—‘˜“
 (Ó*ÜÐ.Ó/Ð/ä�—‘˜“Ó˜x¯©°«
Ñ3Ñ3Ð3r   c                  óÊ  •  SSK n U R                  5       R                  $ ! [        [        4 a     Of = f[
        R                  R                  S5      (       aŠ  0 n[        S5       nU HF  nUR                  5       n[        US   5      S-  XS   R                  S5      R                  5       '   MH     SSS5        O! , (       d  f       O= fSU;   a  US   $ US	   US
   -   $ g)z<
Get information about memory available, not counting swap.
r   NÚlinuxz/proc/meminfor+   r¦   Ú:ÚmemavailableÚmemfreeÚcached)ÚpsutilÚvirtual_memoryÚ	availableÚImportErrorÚAttributeErrorr3   ÚplatformÚ
startswithÚopenÚsplitrº   ÚstripÚlower)rÄ   ÚinfoÚfÚlineÚps        r   r    r    ÿ   sÒ   € ðÛØ×$Ñ$Ó&×0Ñ0Ð0øÜœÐ(ó Ùðúô ‡|�|×Ñ˜w×'Ñ'ØˆÜ�/Ô" aÛ�Ø—J‘J“L�Ü05°a¸±d³¸cÑ0A��q‘T—Z‘Z “_×*Ñ*Ó,Ó-ñ ÷ #×"Ö"úð
 ˜TÓ!à˜Ñ'Ð'à˜	‘? T¨(¡^Ñ3Ð3às   ‚   3²3Á'AB=Â=
Cc                 ó–  ^^	• SSK n [        R                  " SS/5        U [        [        R                  " 5       5      -  n [        R                  R                  U5      S   n[        R                  " XU-  5        X-  S-  S-  nUS	-  m	[        R                  " T	S
S9  [        US-  5      n[        US5       nUR                  S5        UR                  S[         R"                   S35        SSS5        [         R$                  S:X  a&  [        R                  " SSSSUS[        U5      /T	S9  O#[        R                  " SSSU[        U5      /T	S9  [        R                  " / SQT	S9  [&        R(                  " S5      mUU	4S jnU" S5      U" S5      4$ ! [         a    UR	                  S5         GN–f = f! , (       d  f       NÑ= f)z‰
Helper function to test building and importing Cython modules that
make use of the Cython APIs for BLAS, LAPACK, optimize, and special.
r   NÚmesonz	--versionzNo usable 'meson' foundr+   rI   Ú_cython_examplesÚbuildT)Úexist_okzinterpreter-native-file.iniÚwz[binaries]
z
python = 'Ú'Úwin32Úsetupz--buildtype=releasez--native-filez--vsenv)Úcwd)rÔ   Úcompilez-vvÚ
EXT_SUFFIXc                 ó’   >• TU -  R                  T5      n[        X5      n[        U5      nUR                  R	                  U5        U$ r   )Úwith_suffixr   r   ÚloaderÚexec_module)ÚmodnameÚsoÚspecÚmodÚsuffixÚ
target_dirs       €€r   ÚloadÚ$_test_cython_extension.<locals>.loadE  sC   ø€ Ø˜7Ñ"×/Ñ/°Ó7ˆÜ& wÓ3ˆÜ˜tÓ$ˆØ�‰×Ñ Ô$Øˆ
r   Ú	extendingÚextending_cpp)r2   Ú
subprocessÚ
check_callÚFileNotFoundErrorr¡   r=   Ú	threadingÚ	get_identr5   r6   rÌ   ÚshutilÚcopytreeÚmakedirsrË   Úwriter3   Ú
executablerÉ   Ú	sysconfigÚget_config_var)
Útmp_pathÚsrcdirr2   Úmod_nameÚ	build_dirÚnative_filerÐ   ré   rç   rè   s
           @@r   Ú_test_cython_extensionrþ     s¤  ù€ ó
 ð/Ü×Ò˜w¨Ð4Ô5ð
 œ#œi×1Ò1Ó3Ó4Ñ4€Hô �w‰w�}‰}˜VÓ$ QÑ'€HÜ
‡O‚O�F xÑ/Ô0ØÑ# gÑ-Ð0BÑB€IØ˜WÑ$€JÜ‡K‚K�
 TÒ*ô �iÐ"?Ñ?Ó@€KÜ	ˆk˜3Ô	 1Ø	�‰�ÔØ	�‰�*œSŸ^™^Ð,¨AÐ.Ô/÷ 
 ô ‡|�|�wÓÜ×Ò˜w¨Ø4Ø.°Ø(¬#¨i«.ð:ð #-ó		 ô 	×Ò˜w¨Ø.°¼SÀ»^ðMà",ò	 ô ×ÒÒ5¸:ÒFô ×%Ò% lÓ3€Föñ �Ó™d ?Ó3Ð3Ð3øô[ ó /Ø�‰Ð-×.ð/ú÷  
 Õ	ús   ˆF Â:5F:ÆF7Æ6F7Æ:
Gc           	      ó"  ^^• [         R                  " U 5      mUU4S jn/ n[        SU 5       H,  nUR                  [         R                  " UU4U-   US95        M.     U H  nUR                  5         M     U H  nUR                  5         M     g)a‰  
Run a given function concurrently across a given number of threads.

This is equivalent to using a ThreadPoolExecutor, but using the threading
primitives instead. This function ensures that the closure passed by
parameter gets called concurrently by setting up a barrier before it gets
called before any of the threads.

Arguments
---------
n_workers: int
    Number of concurrent threads to spawn.
fn: callable
    Function closure to execute concurrently. Its first argument will
    be the thread id.
*args: tuple
    Variable number of positional arguments to pass to the function.
**kwargs: dict
    Keyword arguments to pass to the function.
c                 ó>   >• TR                  5         T" U /UQ70 UD6  g r   )Úwait)ÚiÚargsÚkwargsÚbarrierÚfns      €€r   ÚclosureÚ(_run_concurrent_barrier.<locals>.closureg  s   ø€ Ø�‰ŒÙ
ˆ1ÐˆtÒ�vÓr   r   )Útargetr  r  N)rð   ÚBarrierrt   ru   ÚThreadÚstartr¶   )	Ú	n_workersr  r  r  r  Úworkersr  Úworkerr  s	    `      @r   Ú_run_concurrent_barrierr  P  sƒ   ù€ ô* ×Ò 	Ó*€Göð €GÜ�1�iÖ ˆØ�‰”y×'Ò'ØØ�˜‘ Vñ-ö 	.ñ !ó
 ˆØ�‰Žñ ó ˆØ�‰Žò r   ))r   rZ   r5   r´   rò   rí   r3   r÷   rð   r˜   r   r   Únumpyrƒ   ÚscipyÚcythonÚCython.Compiler.Versionr   Úcython_versionÚ
scipy._libr   Úrequired_versionÚparseÚVersionrÇ   Ú__all__r
   rø   Ú_vr8   ÚIS_EDITABLEÚRuntimeWarningr   r   r	   r<   r   rœ   r    rþ   r  r   r   r   Ú<module>r     s  ðñó
 Û 	Û 	Û Û Û 
Û Û ß Dã Û ðãõõ #ØÐØ‡}‚}�^Ó$ w§¢Ð7GÓ'HÓHàˆò O€ð €ð
 ×Ò˜oÓ.×4°"€Ø	ˆRƒ<Ø€Gð ˜EŸN™N¨1Ñ-Ñ-€ô	˜>ô 	÷
Oñ O÷dE&ñ E&òP*òò*4òò254óp%øðo	 ó Ø‚Fðús   ´
C ÃC&Ã%C&