
    ri@              
       z   d dl 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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 ej8                  j:                  Z ee	        ee
       ej8                  j?                  e d	       G d
 d             Z g dZ!dgdgdggZ"djG                         Z$e$D  cg c]  }  ejJ                  dg e&e|               c} Z'd Z(d Z)ej8                  jU                  de!e"z   e$z   e'z         ej8                  jU                  de!e"z   e$z   e'z         d               Z+ej8                  jU                  de!e"z   e$z   e'z         ej8                  jU                  de!e"z   e$z   e'z         d               Z,dgZ-d Z.ej8                  jU                  d e.             d        Z/yc c} w )    N)import_module)SCIPY_ARRAY_APIarray_namespace_asarrayxp_copyxp_assert_equalis_numpy	np_compatxp_default_dtypexp_result_typeis_torchxp_capabilities_table_xp_copy_to_numpy)is_named_function_like_object)array_api_extra)r   )lazy_xp_functionzDArray API test; set environment variable SCIPY_ARRAY_API=1 to run it)reasonc            
       x   e Zd Zd Zd Zej                  j                  d      d        Zej                  j                  dd      d        Z
d	 Zd
 Zd Zd Zd Zej                  j!                  dg d      ej                  j!                  dg dg dddgddggg      d               Zej                  j!                  dg d      ej                  j!                  dddg      d               Zej                  j                  dd      d        Zej                  j                  dd      d        Zd Zy) TestArrayAPIc                     t        j                  g d      t        j                  g d      }}t        ||      }d|j                  v sJ y )Nr         zarray_api_compat.numpy)nparrayr   __name__)selfxyxps       ]/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/scipy/_lib/tests/test_array_api.pytest_array_namespacez!TestArrayAPI.test_array_namespace   s;    xx	"BHHY$71Q"'2;;666    c                     t        g d|      t        t        j                  d      |      }}|j                  g d      }t	        ||       t	        ||       y )Nr   r       )r   r   arangeasarrayr   )r   r    r   r   refs        r!   test_asarrayzTestArrayAPI.test_asarray#   sC    	b)8BIIaLR+H1jj#33r#   zignore: the matrix subclassc                    d}t        j                  t        |      5  t        t        j
                  j                  d      t	        j                  d             d d d        d}t        j                  t        |      5  t        t	        j                  d      t	        j                  d             d d d        d}t        j                  t        |      5  t        t               g       d d d        t        j                  t        |      5  t        d       d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   QxY w# 1 sw Y   y xY w)Nz0of type `numpy.ma.MaskedArray` are not supportedmatchr   z(of type `numpy.matrix` are not supported/only boolean and numerical dtypes are supportedabc)	pytestraises	TypeErrorr   r   mar   matrixobjectr   msgs     r!   test_raiseszTestArrayAPI.test_raises)   s    @]]9C0 	9BEEKKNBHHQK8	9 9]]9C0 	7BHHQK16	7 @]]9C0 	(VXJ'	(]]9C0 	#E"	# 	#	9 	9	7 	7	( 	(	# 	#s/   =D% 3D1D=E	%D.1D:=E	ETzArray-likes)np_onlyr   c                    t        g d      |u sJ t        d      |u sJ t        ddd      |u sJ t        d      |u sJ t        t        j                  d            |u sJ t        g dd      |u sJ t               |u sJ t        d      |u sJ t        dd      |u sJ t        dd      |u sJ t        t        j                  ddg      ddg      |u sJ t        t        j                  d      ddg      |u sJ y)zuTest that if all parameters of array_namespace are Array-likes,
        the output is array_api_compat.numpy
        r   r   r   r&   N   )r   r   int64r(   r   r    s     r!   test_array_likeszTestArrayAPI.test_array_likes9   s   
 y)R///y)R///q!Q'2---q!R'''rxx{+r111y!,222 B&&&t$***q$'2---tQ'2--- rzz1a&1Aq6:b@@@rxx{QF3r999r#   c                 6   |j                  d      }t        |      |u sJ t        |d      |u sJ t        d|      |u sJ t        d|      |u sJ t        |      rt        |ddg      |u sJ yt        j                  t
        d      5  t        |ddg       ddd       t        j                  t
        d      5  t        |t        j                  d             ddd       t        j                  t
        d      5  t        |t        j                  d             ddd       t        j                  t
        d      5  t        |t        j                  d             ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   exY w# 1 sw Y   yxY w)a  Test that if there is at least one Array API object among
        the parameters of array_namespace, and all other parameters
        are scalars, the output is its namespace.

        If there are non-scalar Array-Likes, raise as in array-api-compat.
        r   Nr   zMultiple namespacesr,   )
r(   r   r	   r0   r1   r2   r   r<   float64
complex128)r   r    r   s      r!   test_array_and_array_likes_mixz+TestArrayAPI.test_array_and_array_likes_mixM   s_    JJqMq!R'''q!$***q!$***tQ'2---B<"1q!f-333y0EF +Aq6*+y0EF 0288A;/0y0EF 22::a=12 y0EF 52==#345 5+ +0 02 25 5s0   
E+< E7? F F+E47F FFc                     d}t        j                  t        |      5  t        j                  dd       ddd       y# 1 sw Y   yxY w)znTest that the `array_namespace` function used by
        array-api-extra has been overridden by scipy
        r.   r,   r/   r   )ndimN)r0   r1   r2   xpx
atleast_ndr6   s     r!   test_array_api_extra_hookz&TestArrayAPI.test_array_api_extra_hookh   s;     @]]9C0 	*NN5q)	* 	* 	*s	   ?Ac                     t        j                  d      }t        j                  d      } |j                  |j                  |j                  d            |j                  d            }t        |      |u sJ y)zTest array_namespace special case for JAX zero-gradient arrays, which are
        numpy arrays but must be treated as JAX arrays.
        See matching code and tests in array_api_compat.
        jaxz	jax.numpyT)	allow_intr;   N)r0   importorskipvmapgradfloat32r'   r   )r   rI   r    jax_zeros       r!   test_jax_zero_gradient_arrayz)TestArrayAPI.test_jax_zero_gradient_arrayp   se    
 !!%(  -A388CHHRZZ4H@A"))A,Ox(B...r#   c                 H   t        j                  dt        j                  g             }t        j                  t
        d      5  t        |       ddd       t        j                  t
        d      5  t        ||g       ddd       y# 1 sw Y   ;xY w# 1 sw Y   yxY w)z{A void dtype that is not a jax.float0 must not be caught in the
        special case for JAX zero-gradient arrays.
        r   dtypez!only boolean and numerical dtypesr,   N)r   emptyrS   r0   r1   r2   r   )r   voids     r!   )test_void_but_not_jax_zero_gradient_arrayz6TestArrayAPI.test_void_but_not_jax_zero_gradient_array{   s}     xx".]]9,OP 	"D!	"]]9,OP 	*T4L)	* 	*	" 	"	* 	*s   B5BBB!c                     |d fD ]N  }|j                  g d      }t        ||      }t        |      t        |      k7  sJ 	 d|d<   |d   |d   k7  rNJ  y # t        t        f$ r Y cw xY w)Nr   r   r&   r%   
   r   )r(   r   idr2   
ValueError)r   r    _xpr   r   s        r!   	test_copyzTestArrayAPI.test_copy   s    : 	$C

9%Ac"A a5BqE>!>$! tqt|#|	$ z* s   AA)(A)rS   )rN   r@   	complex64rA   int32r<   datar   rX   r   r&   c                    t        ||      }t        t        |      }|j                  ||      }t        |      }t	        |t        j
                        sJ |j                  |k(  sJ |j                  |j                  k(  sJ t        j                  j                  |t        j                  ||             t        |      rt        |      t        |      k7  sJ y y )NrR   )getattrr   r(   r   
isinstancendarrayrS   shapetestingassert_equalr	   rZ   )r   r    r`   rS   xp_dtypenp_dtyper   r   s           r!   test_copy_to_numpyzTestArrayAPI.test_copy_to_numpy   s     2u%2u%JJt8J,a !RZZ(((ww("""ww!''!!!


2::d(#CDB<a5BqE>!> r#   )r_   r<   rN   r@   re    )r&   c                 X   t        ||      }|j                  |j                  d|      |      }|r|n|d   }t        j                  d      d   }g d}t	        t        |g d            }t        |      rt        ||fi | nbt        j                  t        d      5  t        ||fi | d d d        t        j                  t        d      5  t        ||fi | d d d        t	        t        |g d	            }|j                  j                  t        |j                        v rt        ||fi | n1t        j                  t        d
      5  t        ||fi | d d d        t	        t        |g d            }|j                  |j                  k(  rt        ||fi | n@t        j                  t        d      5  t        ||j                  |      fi | d d d        t	        t        |g d            }t        |      r'|j                  |j                  k(  rt        ||fi | y t        |      r2t        j                  t        d      5  t        ||fi | d d d        y y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   )xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr   rR   rk   )check_namespacecheck_dtypecheck_shapecheck_0d)TFFFz)Namespace of desired array does not matchr,   z3Namespace of actual and desired arrays do not match)FTFFzdtypes do not match.)FFTFzShapes do not match.)FFFTzArray-ness does not match.)rb   broadcast_tor(   r
   dictzipr	   r   r0   r1   AssertionErrorrS   namestrre   )r   r    rS   re   r   r   kwarg_namesoptionss           r!   test_strict_checkszTestArrayAPI.test_strict_checks   sG    E"OOBJJqJ6>AAbEa $Ss;(CDEB<Aq,G,A 1  100	1
 K 1  100	1 s;(CDE77<<3qww<'Aq,G,~5KL 11001 s;(CDE77aggAq,G,~5KL =2::a=<G<= s;(CDEB<AGGqww.Aq,G,b\~5QR 11001 1 91 1
1 11 1= =1 1s<    I-I:JJJ -I7:JJJ J)zScalars only exist in NumPyc                 *   t        |j                  d      |j                  d             t        |j                  d      |j                  d             t        |j                  d      |j                  d      d       t        |j                  d      |j                  d      d       d}t        j                  t
        |      5  t        |j                  d      |j                  d             d d d        t        j                  t
        |      5  t        |j                  d      |j                  d             d d d        t        j                  t
        |      5  t        |j                  d      |j                  d             d d d        t        j                  t
        |      5  t        |j                  d      |j                  d             d d d        t        |j                  d      |j                  d      d       t        |j                  d      |j                  d      d       t        |j                  d      dd       t        d|j                  d      d       t        |j                  d      dd       t        d|j                  d      d       t        |j                  d      |j                  d      d          y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   lxY w# 1 sw Y   +xY w)	Nr           Frp   Array-ness does not match:.*r,   *   rk   )r   r@   r(   r0   r1   rt   r<   r   r    messages      r!   test_check_scalarzTestArrayAPI.test_check_scalar   s    	

1rzz!}5

2

27

1rzz!}uE

2

2G 1]]>9 	;BJJrNBJJqM:	;]]>9 	;BJJqM2::b>:	;]]>9 	:BJJrNBHHRL9	:]]>9 	:BHHRL"**R.9	: 	

2

1F

1rzz"~F

2U;BJJrNU;

2U;BJJrNU; 	

1rzz"~b'9:'	; 	;	; 	;	: 	:	: 	:s0   
+K!+K.&+K;4+L!K+.K8;LLc                 *   t        |j                  d      |j                  d             t        |j                  d      |j                  d      d       t        |j                  d      |j                  d      d       d}t        j                  t
        |      5  t        |j                  d      |j                  d             d d d        t        j                  t
        |      5  t        |j                  d      |j                  d             d d d        t        j                  t
        |      5  t        |j                  d      |j                  d             d d d        t        |j                  d      |j                  d             t        |j                  d      |j                  d             d}t        j                  t
        |      5  t        |j                  d      |j                  d      d       d d d        t        j                  t
        |      5  t        |j                  d      |j                  d      d       d d d        t        j                  t
        |      5  t        |j                  d      |j                  d      d       d d d        t        j                  t
        |      5  t        |j                  d      |j                  d      d       d d d        t        d|j                  d             t        d|j                  d             y # 1 sw Y   sxY w# 1 sw Y   2xY w# 1 sw Y   xY w# 1 sw Y   XxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)	Nr   Tr|   r{   zResult is a NumPy 0d-array.*r,   r~   r}   )xp_assert_equal_no_0dr@   r(   r0   r1   rt   r<   r   s      r!   test_check_scalar_no_0dz$TestArrayAPI.test_check_scalar_no_0d   s    	bjjmRZZ];bjjmRZZ]TJbjjnbjjntL 1]]>9 	B!"**R."**R.A	B]]>9 	A!"**R."**Q-@	A]]>9 	@!"**R."((2,?	@ 	bjjmRZZ^<bhhrlBJJrN; 1]]>9 	P!"**R."**Q-$O	P]]>9 	P!"**Q-B$O	P]]>9 	N!"**R."((1+M	N]]>9 	N!"((1+rzz"~M	N 	b"**R.1b"**R.11	B 	B	A 	A	@ 	@	P 	P	P 	P	N 	N	N 	NsT    +L<.+M	<+M -M#0-M0 -M=-N	<M	MM #M-0M:=N	Nc                 V    t        |      |j                  d      j                  k(  sJ y )N      ?)r   r(   rS   r=   s     r!   test_default_dtypezTestArrayAPI.test_default_dtype  s#    #rzz"~';';;;;r#   N)r   
__module____qualname__r"   r*   r0   markfilterwarningsr8   skip_xp_backendsr>   rB   rG   rP   rV   r]   parametrizerj   ry   r   r   r   rk   r#   r!   r   r      sn   7
  [[ =># ?# [[!!$}!E: F:&56*	/*$ [[K [[Q	QFQF#34"	" [[W&NO[[Wr4j1*1 2 P*1X [[!!$7T!U; V;< [[!!$7T!U 2 V 2D<r#   r   )r   r         ?      ?r   r   r   zVint8 int16 int32 int64 uint8 uint16 uint32 uint64 float32 float64 complex64 complex128rR   c                     t        | t        j                        r|j                  |       S t        | t              rt        ||       S | S N)rc   r   rd   r(   rv   rb   )r   r    s     r!   convert_typer   $  s;     !RZZ zz!}	As	r1~Hr#   c                     t        j                  |       st        | t              r|j	                  |       n| } t        | d|       }|j                  |d      S )NrS   )zreal floatingzcomplex floating)r   isscalarrc   listr(   rb   isdtype)r   r    rS   s      r!   
is_inexactr   /  sD    Q:a+>

1AAAw"E::eBCCr#   r   r   c                    t        | |      } t        ||      }t        | t              r|j                  |       n| }t        |t              r|j                  |      n|}	 |j	                  ||      }d }|Ht        j                  |d   t        j                  |d               5  t        | ||       d d d        y t        | ||      }|k(  sJ y # t
        $ r }t        |      t        |      f}Y d }~d }~ww xY w# 1 sw Y   y xY w)Nr   r   r,   r%   )r   rc   r   r(   result_type	Exceptiontyperv   r0   r1   reescaper   )	r   r   r    x_refy_ref	dtype_refexpected_errore	dtype_ress	            r!   test_xp_result_type_no_forcer   6  s     	QAQA'40BJJqMaE'40BJJqMaE+NN5%0	 !]]>!,BIInQ>O4PQ 	(1aB'	(q!+I	!!!  +q'3q6*+	(s$    C &D 	C=C88C= D	c                    t        |      r_t        | t              sOt        |t              s?t        j                  |       r*t        j                  |      rt        j                  d       t        | |      } t        ||      }t        | t              r|j                  |       n| }t        |t              r|j                  |      n|}d }	 |j                  ||d      }|5t        j                   |d   |d         5  t#        | ||       d d d        y t#        | |d|      }	|	k(  sJ y # t        $ rb g }t        ||      r|j                  |       t        ||      r|j                  |        |j                  g ||j                  d       }Y t        $ r }t        |      t        |      f}Y d }~d }~ww xY w# 1 sw Y   y xY w)	Nz8See 3/27/2024 comment at  data-apis/array-api-compat#277r   r   r   r,   r%   T)force_floatingr    )r   rc   rv   r   r   r0   skipr   r   r(   r   r2   r   appendr   r   r1   r   )
r   r   r    r   r   r   r   argsr   r   s
             r!   "test_xp_result_type_force_floatingr   P  s    	Z3/:a3EA2;;q>NOQAQA'40BJJqMaE'40BJJqMaEN
+NN5%5	 !]]>!,N14EF 	(1aB'	(q!DR@I	!!!!  ;eR KKeR KK"BNN:D:"**S/:	 +q'3q6*+	(s+   D- >G-A(F?F?F::F?Gzscipy.statsc            
          g } t         D ]a  }t        |      }|j                  D ]E  }t        ||      }t	        |      s| j                  t        j                  || d|              G c | S )N.)rZ   )tested_modulesr   __all__rb   r   r   r0   param)	functionsmodule_namemoduleru   objs        r!   collect_public_functionsr     sz    I% L{+NN 	LD&$'C05V\\#[M4&2IJK		LL r#   funcc                     | t         v sJ y r   )r   )r   s    r!   test_xp_capabilities_coverager     s    ((((r#   )0r   numpyr   r0   	importlibr   scipy._lib._array_apir   r   r   r   r   r	   r
   r   r   r   r   r   !scipy._lib._array_api_docs_tablesr   
scipy._libr   rE   scipy._lib._array_api_no_0dr   "scipy._lib.array_api_extra.testingr   r   array_api_backends
pytestmarkskipifr   scalarslistssplittypesr(   rb   arraysr   r   r   r   r   r   r   r   )ts   0r!   <module>r      s   	   #   
 L - P ? [[++
     'U  W}< }<W}<@ 
rdWI
016  :?	?A*"**aSA
/	?D go5>?go5>?" @ @"0 go5>?go5>?$" @ @$"Z  	 !9!;<) =)] 
@s   8#F8