
    bip              
          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 d dlm	Z	 d dl
Zd dlZ	 d dlZdZd dlmZ d dlmZ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#	 d dl%Z%dZ&d Z(d Z) ejT                  dd      d        Z+e&sejT                  d        Z,h dZ- ej\                  edej^                  j`                        gZ1 e2       Z3 e2       Z4er`	 d dl5Z5e1jm                   ej\                  e5dej^                  j`                                e jn                  e5jp                         e jr                  d      k  r ed       e5jt                  d       	 d dl;Z;e1jm                   ej\                  e;dej^                  j`                                e;jx                  e       edk7  re3j{                  d        ej|                  dd      Z?e?dk(  r e;j                  e;j                         ne?dk7  r eBd e? d!      	 d dlCZCe1jm                   ej\                  eCd"ej^                  j`                               e3j{                  d"        ej                  d#d$eE%       d d&lFmGZG [G	 d dlHZIe1jm                   ej\                  eIj                  d'ej^                  j`                  ej^                  j                  g             eIj                  j                  d(d       eIj                  j                  d) eIj                  e      d           edk7  re3j{                  d'       e4j{                  d'       	 d dlNmOZP e1jm                   ej\                  ePd*ej^                  j`                  ej^                  j                  g             e4j{                  d*       e1D  ch c]  } | j                   c} ZReRe-z
  rJ  eSeeT      rd ej                         d+vrQ e2 e j                  e            ZWeWd,hk7  r3eWeRz
  rd-eR d.eW ZX eBeX      e1D cg c]  }|j                  eWv r| c}Z1 ejT                  e1/      d0        ZYej^                  j                  ed12      Z[d3 Z\d4ej                  d5e	d6   d7dfd8Z^ejT                  d9        ZMerej                  j                  ej                  j                   ej                         d:             ej                  j                  d;dd<       ej                  j                  d=dddd efej                        >       ej                  j                  d?d=      Zjej                  j                  ej       e#redNd@       Zlele"_m         e2g dA      e"_n        ejp                  dBk  r#e"j                  j                   e2g dC             g dDe"_o        dEdEdFdGdHdIe"_p         e2dJg      e"_q        dKg dLie"_r        de"_s        e"j                  j{                  dM       yy# e$ r dZY w xY w# e$$ r dZ#Y w xY w# e'$ r dZ&Y w xY w# e$ r Y w xY w# e$ r Y ?w xY w# e$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY wc c} w c c}w )O    N)contextmanager)LiteralTF)get_fpu_mode)SCIPY_ARRAY_APISCIPY_DEVICEarray_namespace
default_xpis_cupyis_daskis_jaxis_torch)FPUModeChangeWarning)patch_lazy_xp_functions)_pep440)	dt_configc                 n   | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       	 dd	l}	 ddlm} t
        s6| j                  dd       | j                  dd       | j                  dd       t        j                  dk(  r,t        j                  dk  rt        j                  dd       y	y	y	# t        $ r | j                  dd
       Y w xY w# t        $ r | j                  dd       Y w xY w)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 failurezUparallel_threads_limit(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posix)      
forkserverT)force)addinivalue_linepytest_timeout	Exceptionpytest_fail_slowr   PARALLEL_RUN_AVAILABLEosnamesysversion_infomultiprocessingset_start_method)configr   r   s      I/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/scipy/conftest.pypytest_configurer'   )   s^    I)+
IRT
IBD
IEG
I
.0 I
/1
IS 	4
 "!	" 	F	
 	Q	

 
ww'c..8 	((TB	 93  IG	II  SQ	SSs$   .C5 3D 5DDD43D4c                 x   | j                  d      }|A	 t        t        j                  j	                  dd            }|st        j                  d       | j                  d      }|Gt        j                  d      j                  dk  r%t        j                  d	|j                  d           t        j                         5  t        j                  d
t        j                          	 ddlm} d}|rc	 t        t        j                  d         }t        j*                  d      s1t        j,                         dz  }t/        ||z  d      }	  |d       d d d        y # t
        $ r d}Y /w xY w# t&        $ r d}Y w xY w# t(        $ r Y d d d        y w xY w# t&        $ r Y d d d        y w xY w# 1 sw Y   y xY w)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): ignore)threadpool_limitsTPYTEST_XDIST_WORKER_COUNTOMP_NUM_THREADS      blas)user_api)get_closest_markerintr   environget
ValueErrorpytestskipnpintpitemsizexfailargswarningscatch_warningssimplefilter PytestUnraisableExceptionWarningthreadpoolctlr/   r   KeyErrorgetenv	cpu_countmax)itemmarkvr/   HAS_THREADPOOLCTLxdist_worker_countmax_openmp_threadsthreads_per_workers           r&   pytest_runtest_setuprR   e   s   ""7+D	BJJNN=#67A KK K L""#34DBGGAJ//!3=diil^LM 
	 	 	" h(O(OP	&7 $
 
%(4O)P%Q"
 99./%'\\^q%8"%();?Q)QST%U"%&86J5   	A	$  	& %	&  ) $ !  = 67 s   )E %F0)E11F04F;F0
FE.-E.1E?<F0>E??F0	FF0FF0	F-"F0,F--F00F9function)scopeautousec              #      K   t               }d t               }||k7  r&t        j                  d|dd|ddt        d       yyw)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   rB   warnr   )requestold_modenew_modes      r&   check_fpu_moder]      sT     
 ~H	~H8.xm4} M! !3	C s   AAc                       y)Nr3    r_       r&   num_parallel_threadsra      s    r`   >   cupynumpytorcharray_api_strict	jax.numpy
dask.arrayrc   )idmarksre   z2.3z'array-api-strict must be >= version 2.3z2024.12)api_versionrd   cpuSCIPY_DEFAULT_DTYPEfloat64)defaultfloat32zUSCIPY_DEFAULT_DTYPE env var, if set, can only be either 'float64' or 'float32'. Got 'z
' instead.rb   r.   z#cupyx.jit.rawkernel is experimentalrW   )signalrf   jax_enable_x64jax_default_devicerg   )1trueallrv   z!'--array-api-backend' must be in z; got )paramsc              #   >  K   t        | d       t        | d       | j                  }t        |j                  d            }t        r9t        | | j                        5  t        |      5  | ddd       ddd       y| y# 1 sw Y   xY w# 1 sw Y   yxY ww)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
    r<   r@   r   rZ   xpN)skip_or_xfail_xp_backendsparamr   emptyr   r   r	   ry   s     r&   rz   rz   &  s      gv. gw/	B	!	%B %WG 	
 B 	 	  	 	s6   ABB*B/B7BB	
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                  j                  | d            }t        D ci c]  }|g  }}|D ]  }t	        |j
                        h dz
  }|rt        d|       t	        |j
                  j                  dg             }|t        z
  }t        |t        z
        x}rt        d| dt        t                     |j
                  j                  dd      rT|j
                  j                  d	      xs d
}	|j                         D ]!  \  }}
|dk7  s||vs|
j                  |	       # n|j
                  j                  dd      rB|j
                  j                  d	      xs d}	t        |z
  D ]  }||   j                  |	        n]|j
                  j                  dd      rA|j
                  j                  d	      xs d}	t        |z
  D ]  }||   j                  |	        t        |j                        dk(  r|j                  d   }|t        vrt        d| dt        t                     |j
                  j                  d	      xs d| }	||   j                  d|	       dD ]   }||j
                  v st        | d|        dt        |j                        dkD  s~t        d|j                          |j                         D 
ci c]  \  }}
|
r||
d    c}
}S c c}w c c}
}w )ztA helper for {skip,xfail}_xp_backends.

    Return dict of {backend to skip/xfail: top reason to skip/xfail it}
    _xp_backends>   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 backendsrc   r   zTno array-agnostic implementation or delegation available for this backend and devicer   z*eager checks not executed on lazy backendsr3   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: )listnodeiter_markersxp_known_backendssetkwargs	TypeErrorr9   r:   itemsappendxp_skip_cpu_only_backendsxp_skip_eager_only_backendslenrA   insert)rZ   skip_or_xfailr   backendreasonsmarkerinvalid_kwargsr   invalid_exceptionsr   backend_reasonskwargs               r&   _backends_kwargs_from_requestr   P  sD   
 7<<,,l-KLMG*;<ww{<G< 2V]]+ /I I.~.>?@@**<<=
'*;;"&z4E'E"FFF34F3G H4489J4K3LN O O ==Y.]]&&x0X4XF,3MMO 3(g%'*C#**623 ]]z51]]&&x0 /.  5zA 0 ''/0 ]]|U3]]&&x0 >< 6C 0 ''/0 v{{q kk!nG// #4WI >3378I3J2K"M N N]]&&x0 A5gY?  G##Av.L VFMM)$w.J7)%TUUV !>v{{mL a2j -4MMO ( _Q''    m =l s   
K>(LrZ   r   )r<   r@   returnc                     | d| j                   vryt        | |      }| j                  }|j                  |v r-||j                     }|sJ t	        t
        |      } ||       yy)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   r|   __name__getattrr;   )rZ   r   skip_xfail_reasonsrz   r   s        r&   r{   r{     ss    ` %W-=-==6} 
B	{{((#BKK0v6V$	 )r`   c                 L   t        |       rt        j                  d       t        |       rddgS t	        |       rt        j                  d       t        |       r'| j                         j                         }d |D        S | j                         j                         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~   rk   Nzjax-ml/jax#26000c              3   @   K   | ]  }|j                   d k7  s|  yw)metaN)type).0devices     r&   	<genexpr>zdevices.<locals>.<genexpr>  s     F6v0EFs   )r
   r;   r@   r   r   r   __array_namespace_info__devices)rz   r   s     r&   r   r     s     r{ 	<=r{t}bz 	./|--/779FWFF&&(002dV;;r`   z.hypothesisnondeterministic)r    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 ]  }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}|j                  |       t        d      }	ddl
m}
 ddl} |
       5  |j                  j                  d       t        j                          5  | r5| j"                  |v r't        j$                  di || j"                      d nN| r| j"                  |	v rd n9t        j&                  dt(               t        j$                  ddt               d ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY ww)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)rW   messagerp   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   rW   z"The maximum number of subdivisions)r   z
linalg.rstz	stats.rstscipy.signal.normalize)_fixed_default_rngNr.   errorz.*odr.*)r.   )dictRuntimeWarningDeprecationWarningscipyr   IntegrationWarningUserWarningPendingDeprecationWarningupdater   scipy._lib._utilr   rc   randomseedrB   rC   r    filterwarningsrD   Warning)testknown_warningsdivide_by_zeror    
deprecatedr   integration_wuser_wdctlegitr   r=   s               r&   warnings_errors_and_rngr     s       !?
 # 	BD#'0@$BN4 	B
 
 	ED#'1C#DN4 	E 	$55
 " 	ND#'1M1M0L$NN4 	N
H 	>D#'#=N4 	> k3HI 979 A'::<

 	c" ,- 	8! 	IINN4 ((* 	DII7++Rtyy8QRdii50))'7;++HiAST		 		 		 	s7   C5G70G
'BF>-G
5	G>G	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)ujsonr#   r   r!   rB   tempfile
contextlibr   typingr   rc   r=   r;   
hypothesishypothesis_availableImportErrorscipy._lib._fpumoder   scipy._lib._array_apir   r   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'   rR   fixturer]   ra   r   r|   rL   array_api_backendsxp_available_backendsr   r   r   re   r   parse__version__Versionset_array_api_strict_flagsrd   set_default_deviceaddrH   rn   set_default_dtyperm   r:   rb   r   FutureWarningcupyx.scipyrq   	jax.numpyjaxthread_unsafer%   r   r   
dask.arrayarraydarh   xp_available_backend_ids
isinstancestrlowerloadsSCIPY_ARRAY_API_msgrz   skipifskip_xp_invalid_argr   FixtureRequestr{   configurationset_hypothesis_home_dirpathjoin
gettempdirsettingsregister_profiler   HealthCheckr8   r9   r   load_profiler   user_context_mgrskiplistpytest_extra_ignorepytest_extra_xfail
pseudocodelocal_resourcesstrict_check	stopwords)pr|   s   00r&   <module>r     s$     	 
   %   ! -   7 F 0J#!
9Cx.b j$/C 0C ^^ 
#  FLLv{{'E'EF   E !e $$FLL).@%{{==?	@ 7==)5569OOGHH333!	
$$FLL7++002	3 	!  .5 %))'2 "))19Ei#E##EMM2	!%%,IZ9  	$$FLL&++002	3 	"%%f- 	 ;m	
 	'$$FLL{;;11;;,,./	0 	

*D1

.L0I!0LM5 %))+6 	$''4$$FLL;;11;;,,./	0 	$''5 /DDD'*;;;; 	?C(!O!!#+??ztzz/:;w&":::236:J9KM o% $9%88// %! ,-! .!H kk((I ) K 
> B;%v'<'< ;%-4_-E;%JN;%| #< #<L  44
(X((*M: (($4 )  (($4":#9#9: )   "zz~~.H.= ?$$%=>  I IV "9I  I( 
~~!!# ' # 	,%I!>  8&><2)>$I   789I 
!I "I H%] K  ! !  J  #"#v  *  $  &  (    E%s   X !X% *X3 $BY +B+Y A)Y CY% A%Y1 9Y=)ZX"!X"%X0/X03X>=X>Y
	Y
YYY"!Y"%Y.-Y.1Y:9Y: