
    Yhnk              
          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lZd dlZd dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ 	 d d	lm Z  d
Z!n# e"$ r dZ!Y nw xY w	 d dl#Z#d
Z$n# e%$ r dZ$Y nw xY wd Z&d Z' ej(        dd
          d             Z)e$sej(        d             Z*h dZ+de	iZ, e-            Z. e-            Z/er	 d dl0Z0e,1                    de0i            ej2        e0j3                   ej4        d          k     r e5d           e0j6        d           n# e5$ r Y nw xY w	 d dl7Z7e,1                    de7i            e7j8        e           edk    re.9                    d            ej:        dd          Z;e;dk    r e7j<        e7j=                   ne;dk    r e>de; d           n# e5$ r Y nw xY w	 d dl?Z?e,1                    d!e?i           e.9                    d!            ej@        d"d#eA$           d d%lBmCZC [Cn# e5$ r Y nw xY w	 d dlDZEe,1                    d&eEj        i           eEjF        1                    d'd
           eEjF        1                    d( eEjG        e          d                     edk    re.9                    d&           e/9                    d&           n# e5$ r Y nw xY w	 d dlHmIZJ e,1                    d)eJi           e/9                    d)           n# e5$ r Y nw xY w eKeeL          r[ ejM                    d*vrJ e jN        e          ZOeOd+gk    r3	 d, eOD             Z,n%# eP$ r d- eQe,           d.eO ZR e>eR          w xY w e-e,          e+z
  rJ  e-e,          dhz
  ZS ej(        d/ e,T                                D             0          d1             ZUejV        W                    ed23          ZXd4 ZYd5ejZ        d6ed7         d8dfd9Z[ej(        d:             ZGej\        ]                    ej^        _                     ej`                    d;                     eja        b                    d<dd
=           eja        b                    d>dd
dd
 eQejc                  ?           ejd        e                    d@d>          Zfeja        g                    ef           e!redOdA            Zhehe _i         e-g dB          e _j        e	j3        dCk     r%e jj        1                     e-g dD                     g dEe _k        dFdFdGdHdIdJe _l         e-dKg          e _m        dLg dMie _n        d
e _o        e jp        9                    dN           dS dS )P    N)contextmanager)Literal)get_fpu_mode)SCIPY_ARRAY_APISCIPY_DEVICEarray_namespace
default_xpis_cupyis_daskis_jax)FPUModeChangeWarning)patch_lazy_xp_functions)_pep440)	dt_configTFc                 X   |                      dd           |                      dd           |                      dd           |                      dd           |                      dd           |                      dd           	 dd	l}n&# t          $ r |                      dd
           Y nw xY w	 ddlm} n&# t          $ r |                      dd           Y nw xY wt
          sD|                      dd           |                      dd           |                      dd           d	S d	S )a  
    Add pytest markers to avoid PytestUnknownMarkWarning

    This needs to contain all markers that are SciPy-specific, as well as
    dummy fallbacks for markers defined in optional test packages.

    Note that we need both the registration here *and* in `pytest.ini`.
    markerszslow: Tests that are very slow.zHxslow: mark test as extremely slow (not run unless explicitly requested)z8xfail_on_32bit: mark test as failing on 32-bit platformsz;array_api_backends: test iterates on all array API backendszskip_xp_backends(backends, reason=None, np_only=False, cpu_only=False, eager_only=False, exceptions=None): mark the desired skip configuration for the `skip_xp_backends` fixturezxfail_xp_backends(backends, reason=None, np_only=False, cpu_only=False, eager_only=False, exceptions=None): mark the desired xfail configuration for the `xfail_xp_backends` fixturer   Nz.timeout: mark a test for a non-default timeout)parse_durationz8fail_slow: mark a test for a non-default timeout failurezOparallel_threads(n): run the given test function in parallel using `n` threads.z8thread_unsafe: mark the test function as single-threadedzCiterations(n): run the given test function `n` times in each thread)addinivalue_linepytest_timeout	Exceptionpytest_fail_slowr   PARALLEL_RUN_AVAILABLE)configr   r   s      `/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/scipy/conftest.pypytest_configurer   $   s	    I)+ + +
IRT T T
IBD D D
IEG G G
I
.0 0 0 I
/1 1 1
I I I IG	I 	I 	I 	I 	IIS 	4333333 S S SQ	S 	S 	S 	S 	SS " 
!	" 	" 	" 	F	
 	
 	
 	Q	
 	
 	
 	
 	

 
s$   B  B.-B.2B9 9 CCc                    |                      d          }|W	 t          t          j                            dd                    }n# t
          $ r d}Y nw xY w|st          j        d           |                      d          }|?t          j	        d          j
        dk     r"t          j        d	|j        d                     t          j                    5 }|                    t          j                   	 dd
lm} d}n# t&          $ r d}Y nw xY w|r	 t          t          j        d                   }n# t(          $ r Y d d d            d S w xY wt          j        d          sTt          j                    dz  }t/          ||z  d          }	  ||d           n# t&          $ r Y d d d            d S w xY wd d d            d S # 1 swxY w Y   d S )NxslowSCIPY_XSLOW0Fz@very slow test; set environment variable SCIPY_XSLOW=1 to run itxfail_on_32bitr      z&Fails on our 32-bit test platform(s): )threadpool_limitsTPYTEST_XDIST_WORKER_COUNTOMP_NUM_THREADS      blas)user_api)get_closest_markerintosenvironget
ValueErrorpytestskipnpintpitemsizexfailargsnptsuppress_warningsfilter PytestUnraisableExceptionWarningthreadpoolctlr"   r   KeyErrorgetenv	cpu_countmax)	itemmarkvsupr"   HAS_THREADPOOLCTLxdist_worker_countmax_openmp_threadsthreads_per_workers	            r   pytest_runtest_setuprG   Z   s   ""7++D	BJNN=#6677AA 	 	 	AAA	 	LK K L L L""#344DBGAJJ/!33LdilLLMMM 
		 	  C

6:;;;	&777777 $ 	& 	& 	& %	&  	
%(4O)P%Q%Q""   )       $ 9.// %'\^^q%8"%();?Q)QST%U%U"%%&86JJJJJ     =       67                 s   -A AA G9DGDGDGD76G7
EGEA GFG
F8)G7F88GGGfunction)scopeautousec              #      K   t                      }dV  t                      }||k    r't          j        d|dd|ddt          d           dS dS )z9
    Check FPU mode was not changed during the test.
    NzFPU mode changed from z#xz to z during the testr   )category
stacklevel)r   warningswarnr   )requestold_modenew_modes      r   check_fpu_moderS      s      
 ~~H	EEE~~H8 !xU ! !U ! ! !3	C 	C 	C 	C 	C 	C     c                      dS )Nr&    rV   rT   r   num_parallel_threadsrW      s    qrT   >   cupynumpytorcharray_api_strict	jax.numpy
dask.arrayrY   r[   z2.3z'array-api-strict must be >= version 2.3z2024.12)api_versionrZ   cpuSCIPY_DEFAULT_DTYPEfloat64)defaultfloat32zUSCIPY_DEFAULT_DTYPE env var, if set, can only be either 'float64' or 'float32'. Got 'z
' instead.rX   ignorez#cupyx.jit.rawkernel is experimentalrL   )signalr\   jax_enable_x64jax_default_devicer]   )1trueallrk   c                 *    i | ]}|t           |         S rV   )xp_available_backends.0backends     r   
<dictcomp>rq      s0     ) ) ) 27;) ) )rT   z!'--array-api-backend' must be in z; got c                 `    g | ]+\  }}t          j        ||t           j        j                   ,S ))idmarks)r/   paramr@   array_api_backends)ro   krA   s      r   
<listcomp>rx     sB       1 Lq >???  rT   )paramsc              #   <  K   t          | d           t          | d           | j        }t          |                    d                    }t          rEt          | j        | |           t          |          5  |V  ddd           dS # 1 swxY w Y   dS |V  dS )a  Run the test that uses this fixture on each available array API library.

    You can select all and only the tests that use the `xp` fixture by
    passing `-m array_api_backends` to pytest.

    You can select where individual tests run through the `@skip_xp_backends`,
    `@xfail_xp_backends`, and `@skip_xp_invalid_arg` pytest markers.

    Please read: https://docs.scipy.org/doc/scipy/dev/api-dev/array_api.html#adding-tests
    r0   r4   r   )xprP   monkeypatchN)skip_or_xfail_xp_backendsru   r   emptyr   r   r	   )rP   r|   r{   s      r   r{   r{     s      " gv... gw///	B	!	%	%B }g;	
 	
 	
 	
 ^^ 	 	HHH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 s   9BBBzsTest involves masked arrays, object arrays, or other types that are not valid input when `SCIPY_ARRAY_API` is used.reasonc           	         t          | j                            | d                    }d t          D             }|D ]}t	          |j                  h dz
  }|rt          d|           t	          |j                            dg                     }|t          z
  }t          |t          z
            x}r't          d| dt          t                               |j                            dd	          rE|j                            d
          pd}t          |z
  D ]}	||	         
                    |           n|j                            dd	          rE|j                            d
          pd}t          |z
  D ]}	||	         
                    |           n_|j                            dd	          rD|j                            d
          pd}t          |z
  D ]}	||	         
                    |           t          |j                  dk    r|j        d         }	|	t          vr't          d|	 dt          t                               |j                            d
          pd|	 }||	                             d|           dD ]}
|
|j        v rt          |
 d|	            ut          |j                  dk    rt          d|j                   d |                                D             S )ztA helper for {skip,xfail}_xp_backends.

    Return dict of {backend to skip/xfail: top reason to skip/xfail it}
    _xp_backendsc                     i | ]}|g S rV   rV   rn   s     r   rq   z1_backends_kwargs_from_request.<locals>.<dictcomp>=  s    <<<ww<<<rT   >   r   np_onlycpu_only
eager_only
exceptionszInvalid kwargs: r   zUnknown backend(s): z; must be a subset of r   Fr   z"do not run with non-NumPy backendsr   zTno array-agnostic implementation or delegation available for this backend and devicer   z*eager checks not executed on lazy backendsr&   r   zUnknown backend: z; must be one of z#do not run with array API backend: )r   r   r   r   z is mutually exclusive with z,Please specify only one backend per marker: c                 *    i | ]\  }}|||d          S )r   rV   )ro   rp   backend_reasonss      r   rq   z1_backends_kwargs_from_request.<locals>.<dictcomp>r  s8          ( G_Q'      rT   )listnodeiter_markersxp_known_backendssetkwargs	TypeErrorr-   r.   xp_skip_np_only_backendsappendxp_skip_cpu_only_backendsxp_skip_eager_only_backendslenr5   insertitems)rP   skip_or_xfailr   reasonsmarkerinvalid_kwargsr   invalid_exceptionsr   rp   kwargs              r   _backends_kwargs_from_requestr   7  s   
 7<,,-K-K-KLLMMG<<*;<<<G 1 1V]++ /I /I /I I 	A?~??@@@**<<<==
'*;;"&z4E'E"F"FF 	O N4F N N489J4K4KN N O O O =Y.. 	0]&&x00X4XF3j@ 0 0 ''////0 ]z511 	0]&&x00 /.  5zA 0 0 ''////0 ]|U33 	0]&&x00 >< 6C 0 0 ''//// v{q  k!nG///  "MW "M "M378I3J3J"M "M N N N]&&x00 A?g??  G##Av...L V VFM))$%T%T7%T%TUUU *V !!Lv{LL   "
   ,3MMOO       rT   rP   r   )r0   r4   returnc                     | d| j         vrdS t          | |          }| j        }|j        |v r4||j                 }|sJ t	          t
          |          } ||           dS dS )aP  
    Helper of the `xp` fixture.
    Skip or xfail based on the ``skip_xp_backends`` or ``xfail_xp_backends`` markers.

    See the "Support for the array API standard" docs page for usage examples.

    Usage
    -----
    ::
        skip_xp_backends = pytest.mark.skip_xp_backends
        xfail_xp_backends = pytest.mark.xfail_xp_backends
        ...

        @skip_xp_backends(backend, *, reason=None)
        @skip_xp_backends(*, cpu_only=True, exceptions=(), reason=None)
        @skip_xp_backends(*, eager_only=True, exceptions=(), reason=None)
        @skip_xp_backends(*, np_only=True, exceptions=(), reason=None)

        @xfail_xp_backends(backend, *, reason=None)
        @xfail_xp_backends(*, cpu_only=True, exceptions=(), reason=None)
        @xfail_xp_backends(*, eager_only=True, exceptions=(), reason=None)
        @xfail_xp_backends(*, np_only=True, exceptions=(), reason=None)

    Parameters
    ----------
    backend : str, optional
        Backend to skip/xfail, e.g. ``"torch"``.
        Mutually exclusive with ``cpu_only``, ``eager_only``, and ``np_only``.
    cpu_only : bool, optional
        When ``True``, the test is skipped/xfailed on non-CPU devices,
        minus exceptions. Mutually exclusive with ``backend``.
    eager_only : bool, optional
        When ``True``, the test is skipped/xfailed for lazy backends, e.g. those
        with major caveats when invoking ``__array__``, ``__bool__``, ``__float__``,
        or ``__complex__``, minus exceptions. Mutually exclusive with ``backend``.
    np_only : bool, optional
        When ``True``, the test is skipped/xfailed for all backends other
        than the default NumPy backend and the exceptions.
        Mutually exclusive with ``backend``. Implies ``cpu_only`` and ``eager_only``.
    reason : str, optional
        A reason for the skip/xfail. If omitted, a default reason is used.
    exceptions : list[str], optional
        A list of exceptions for use with ``cpu_only``, ``eager_only``, or ``np_only``.
        This should be provided when delegation is implemented for some,
        but not all, non-CPU/non-NumPy backends.
    r   N)r   r   )keywordsr   ru   __name__getattrr/   )rP   r   skip_xfail_reasonsr{   r   s        r   r}   r}   w  s    ` %%%W-===6}   
B	{(((#BK066V$$$$$$	 )(rT   c                    t          |           rt          j        d           t          |           rddgS t	          |           rt          j        d           |                                                                 dgz   S )ao  Fixture that returns a list of all devices for the backend, plus None.
    Used to test input->output device propagation.

    Usage
    -----
    from scipy._lib._array_api import xp_device

    def test_device(xp, devices):
        for d in devices:
            x = xp.asarray(..., device=d)
            y = f(x)
            assert xp_device(y) == xp_device(x)
    zdata-apis/array-api-compat#293r   r_   Nzjax-ml/jax#26000)r
   r/   r4   r   r   __array_namespace_info__devices)r{   s    r   r   r     s     r{{ > 	<====r{{ t}bzz 0 	.////&&((0022dV;;rT   z.hypothesisnondeterministic)namedeadline
print_blobdeterministic)r   r   r   databasederandomizesuppress_health_checkSCIPY_HYPOTHESIS_PROFILEc              #     K   t                      }ddg}|D ]}t          t          d          ||<   g d}|D ]}t          t                    ||<   ddlm} d	d
g}|D ]}t          |j        d          ||<   g d}|D ]}t          t                    ||<   t          t          d          t          dt                    t          d|j                  d}|                    |           t          d          }	ddl
m}
 ddl} |
            5  |j                            d           t          j                    5  | r*| j        |v r!t          j        di || j                  dV  n.| r| j        |	v rdV  nt          j        dt(                     dV  ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zmTemporarily turn (almost) all warnings to errors.

        Filter out known warnings which we allow.
        zscipy.linalg.normzscipy.ndimage.center_of_masszdivide by zero)rL   message)zscipy.signal.cwtzscipy.signal.morletzscipy.signal.morlet2zscipy.signal.rickerzscipy.integrate.simpsonzscipy.interpolate.interp2dzscipy.linalg.kronre   r   )	integratezscipy.special.ellip_normalzscipy.special.ellip_harm_2zThe occurrence of roundoff)zscipy.stats.anderson_ksampzscipy.stats.kurtosistestzscipy.stats.normaltestscipy.sparse.linalg.normzExited at iterationzthe matrix subclass is not)r   rL   z"The maximum number of subdivisions)r   z
linalg.rstz	stats.rstscipy.signal.normalize)_fixed_default_rngNrd   error)rd   )dictRuntimeWarningDeprecationWarningscipyr   IntegrationWarningUserWarningPendingDeprecationWarningupdater   scipy._lib._utilr   rY   randomseedrN   catch_warningsr   filterwarningssimplefilterWarning)testknown_warningsdivide_by_zeror   
deprecatedr   integration_wuser_wdctlegitr   r1   s               r   warnings_errors_and_rngr     s7        !?
 # 	B 	BD#'0@$B $B $BN4  
 
 

  	E 	ED#'1C#D#D#DN4  ######55
 " 	N 	ND#'1M0L$N $N $NN4  H H H 	> 	>D#'#=#=#=N4  
 k3HIII 979 9 9 A':< < <

 

 	c""" ,-- 	877777!! 	 	INN4   (** 	 	 DI77+ I I.<TY.GI I IEEEE di500EEEE)'7;;;EEE	 	 	 	 	 	 	 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s7   .GAF, G,F0	0G3F0	4GGG)zscipy.linalg.LinAlgErrorzscipy.fftpack.fftshiftzscipy.fftpack.ifftshiftzscipy.fftpack.fftfreqzscipy.special.sinczscipy.optimize.show_optionsr   r   z$scipy.io.matlab.MatlabObject.stridesz"scipy.io.matlab.MatlabObject.dtypez"scipy.io.matlab.MatlabOpaque.dtypez$scipy.io.matlab.MatlabOpaque.stridesz&scipy.io.matlab.MatlabFunction.stridesz$scipy.io.matlab.MatlabFunction.dtype2)zscipy.io.hb_readzscipy.io.hb_writez)scipy.sparse.csgraph.connected_componentsz&scipy.sparse.csgraph.depth_first_orderz"scipy.sparse.csgraph.shortest_pathz#scipy.sparse.csgraph.floyd_warshallzscipy.sparse.csgraph.dijkstraz!scipy.sparse.csgraph.bellman_fordzscipy.sparse.csgraph.johnsonzscipy.sparse.csgraph.yenz(scipy.sparse.csgraph.breadth_first_orderz*scipy.sparse.csgraph.reverse_cuthill_mckeez$scipy.sparse.csgraph.structural_rankz*scipy.sparse.csgraph.construct_dist_matrixz%scipy.sparse.csgraph.reconstruct_pathzscipy.ndimage.value_indiceszscipy.stats.mstats.describe)zscipy.stats.distributionszscipy.optimize.cython_optimizez
scipy.testzscipy.show_configzscipy/special/_precomputez#scipy/interpolate/_interpnd_info.pyz'scipy/interpolate/_rbfinterp_pythran.pyzscipy/_build_utils/tempita.pyzscipy/_lib/array_api_compatzscipy/_lib/highszscipy/_lib/unuranzscipy/_lib/_gcutils.pyzscipy/_lib/doccer.pyzscipy/_lib/_uarrayz+scipy/linalg/_cython_signature_generator.pyzscipy/linalg/_generate_pyx.pyzscipy/linalg/_linalg_pythran.pyz$scipy/linalg/_matfuncs_sqrtm_triu.pyz1scipy/ndimage/utils/generate_label_testvectors.pyz scipy/optimize/_group_columns.pyz$scipy/optimize/_max_len_seq_inner.pyz"scipy/signal/_max_len_seq_inner.pyz%scipy/sparse/_generate_sparsetools.pyzscipy/special/_generate_pyx.pyzscipy/stats/_stats_pythran.pyzReST parser limitationz__cinit__ unexpected argumentznan in scalar_powerzintegration warning)zND_regular_grid.rstzextrapolation_examples.rstzsampling_pinv.rstzsampling_srou.rstzprobability_distributions.rstzintegrate.nquad(func,zio.rst)zoctave_a.matzoctave_cells.matzoctave_struct.matz.text()N)qjsonr+   rN   tempfile
contextlibr   typingr   rY   r1   numpy.testingtestingr6   r/   
hypothesisscipy._lib._fpumoder   scipy._lib._array_apir   r   r   r	   r
   r   r   scipy._lib._testutilsr   "scipy._lib.array_api_extra.testingr   
scipy._libr   scipy_doctest.conftestr   
HAVE_SCPDTModuleNotFoundErrorpytest_run_parallelr   r   r   rG   fixturerS   rW   r   rm   r   r   r   r[   r   parse__version__VersionImportErrorset_array_api_strict_flagsrZ   set_default_deviceaddr<   rb   set_default_dtypera   r.   rX   r   FutureWarningcupyx.scipyrf   	jax.numpyjaxr   r   
dask.arrayarrayda
isinstancestrlowerloadsSCIPY_ARRAY_API_r;   r   msgr   r   r{   r@   skipifskip_xp_invalid_argr   FixtureRequestr}   configurationset_hypothesis_home_dirpathjoin
gettempdirsettingsregister_profileHealthCheckr,   r-   r   load_profiler   user_context_mgrskiplistpytest_extra_ignorepytest_extra_xfail
pseudocodelocal_resourcesstrict_check	stopwordsrV   rT   r   <module>r     s	    				   % % % % % %                      , , , , , ,                  7 6 6 6 6 6 F F F F F F      000000JJ   JJJ#! # # #"#3
 3
 3
l. . .b j$///C C 0/C  ^  ^
# # #  " CEE !cee  [&	$$&8:J%KLLL7=)5669O9OOO+GHHH33!	
 	
 	
 	
 	
    $$gu%5666  ...5  %))'222 ")19EEEi#E#EM2222	!!*9%,9 9 9       	$$fd^444!%%f--- 	 ;m	
 	
 	
 	
 	'&&&&&F   $$k39%=>>>
*D111
.L0I0I!0LMMM5  %))+666 	$''4444   $$lB%7888 	$''5555   
 	
?C((&!O!##+???%4:o66w&&&) )#3) ) )%%  & & &P$455P P=MP P joo%&
 3$%%(99 9 9 93455	A    %++--     # #	 #L k((I ) K K 
=  =  = @;%v'< ;%-4_-E;%JN;% ;% ;% ;%| < < <J   0 0GLL$$&&66     $ $	dt %      $ $	dTt$z566 %    :>>*D*9; ;  
     !9 : : :  t& O O O ^Ob "9I     I( 
~!!## ' ' ' # # 	 	 	,% % %I!>  8&><2)>$ $I  3 7899I 
 
 
!I "I H%%%%%it& t&s   A# #A-,A-1A8 8BBAD7 7D?>D?B	G GGA
H$ $H,+H,0BK KK2L
 
LL
M "M9