
    Mpj                     T   S SK r S SK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 SKJrJr  S SKJr  S SKJr  S SKJr  S SKJrJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4  S S	KJ5r6  S S
K7J8r8J9r9J:r:J;r;J<r<  S SK=J>r>J?r?J@r@JArA  \R                  R                  S\R                  " / SQ5      / SQS/5      S 5       rES rF\<\R                  R                  S\R                  " / SQ5      / SQS/5      S 5       5       rG\<\R                  R                  S/ SQ5      S 5       5       rH\<S 5       rI\<S 5       rJ\R                  R                  S\3" 5        V s/ s H  n \R                  " U SS SU S   06PM     sn 5      S 5       rLS rM\R                  R                  SSS/5      S 5       rN\R                  R                  S\4" 5       5      \R                  R                  S S!SS S"/ S#Q4SS$S"SS%/4S"S&/S S"/ SQ4/ S'QS$S"S(S)/4S*S+/S S"/ S,Q4/ S-QS$S"S.S//4S$S/S S"/ S0Q4/ S1QS$S"S2S3/4/ SQ/ SQ/S S"/ S#Q4/ S4Q/ S5Q/S$S"SS%/4S6SS S&/ S7Q4SS$S&S8S9/4S"S&/S S&/ SQ4/ S'QS$S&S:S;/4S*S+/S S&/ S<Q4/ S-QS$S&S=S>/4S$S/S S&/ S?Q4/ S1QS$S&S;S@/4/ SQ/ SQ/S S&/ SAQ4/ S4Q/ S5Q/S$S&SBSC/4/5      SD 5       5       rO\R                  R                  S\4" S&SE95      SF 5       rP\R                  R                  S\4" S"SE95      \R                  R                  SGSS$S/\QSH4S S$S//\R\Q4SI4S / SJQ\RSI4S SKS$/\SSL445      SM 5       5       rTSN rU\<SO 5       rV\<\R                  R                  SP/ SQQ5      \R                  R                  SRS$S\R                  /\(S$4S$SS\R                  * /\(SS4\R                  \R                  /\(\R                  4/ SQ\R                  \R                  \R                  // STQ/\" \(S SU9/ SVQ4/ SQ\R                  \R                  \R                  // STQ/\" \(S$SU9SW\R                  SX/4S$S\R                  /\&S4S$S\R                  /\&S4\R                  * \R                  * /\&\R                  * 4/ SQ\R                  \R                  \R                  // STQ/\" \&S SU9/ SYQ4/ SQ\R                  \R                  \R                  // STQ/\" \&S$SU9SZ\R                  S[/4S$S\R                  /\'S(4S$SS\R                  * /\'S\4\R                  * \R                  * /\'\R                  * 4/ SQ\R                  \R                  \R                  // STQ/\" \'S SU9/ S#Q4/ SQ\R                  \R                  \R                  // STQ/\" \'S$SU9S]\R                  S^/4/5      S_ 5       5       5       rY\R                  R                  S`\4" 5       5      Sa 5       rZ\<\R                  R                  SPSbSc/5      Sd 5       5       r[Se r\ " Sf Sg\5      r] " Sh Si\5      r^\<\R                  R                  SjScSk 4SSl 4SbSm 4/5      Sn 5       5       r_\<So 5       r`\<Sp 5       ra\<Sq 5       rb\<Sr 5       rc\<\R                  R                  SSsS)//\R                  " SsS)//5      /5      St 5       5       re\R                  R                  S`\4" 5       5      Su 5       rf\R                  R                  S`\4" 5       5      Sv 5       rg\R                  R                  S\4" 5       5      \R                  R                  SwS"S&/5      \R                  R                  SxS"S&/5      \R                  R                  Sy/ SzQ5      \R                  R                  S{/ S|Q5      S} 5       5       5       5       5       rh\R                  R                  \ R                  R                  S~5      S:g  SS9S 5       rl\R                  R                  S\4" 5       5      \R                  R                  S\?5      \R                  R                  S/ SQ5      \R                  R                  S/ SQ5      S 5       5       5       5       rm\R                  R                  S\R                  " / SQ5      S$S4\R                  " S$S/S:S//5      \R                  " / SQ5      S4\R                  " S$S/S:S//5      / SQS4\R                  " S$S/S:S//5      \R                  " S$S/S:S//5      S4/5      S 5       ro\R                  R                  SSS/5      \R                  R                  SS"S&/5      S 5       5       rp\R                  R                  S/ SQ5      \R                  R                  S\4" 5       5      S 5       5       rq\R                  R                  S\4" 5       5      S 5       rr\R                  R                  S\?5      \R                  R                  SS"S&/5      S 5       5       rs\R                  R                  S`\4" 5       5      \R                  R                  S/ SQ5      S 5       5       rt\R                  R                  S`\4" 5       5      S 5       ru\R                  R                  S\4" 5       5      \R                  R                  S/ SQ5      S 5       5       rv\R                  R                  S/ SQ5      S 5       rw\R                  R                  S/ SQ5      S 5       rx\R                  R                  SS&S"/5      \R                  R                  S`\4" 5       5      S 5       5       ry\R                  R                  S`\4" 5       5      S 5       rzgs  sn f )    N)partial)assert_allclose)expitlogit)config_context)HalfMultinomialLoss)BaseEstimator) _add_to_diagonal_asarray_with_order_atol_for_type_average_convert_to_numpy_count_nonzero _estimator_with_converted_arrays_expit_fill_diagonal_half_multinomial_loss_is_numpy_namespace_isin_logit
_logsumexp_matching_numpy_dtype_max_precision_float_dtype_median_nanmax_nanmean_nanmin_ravel_validate_diagonal_argscheck_same_namespaceget_namespaceget_namespace_and_deviceindexing_dtypemove_estimator_tomove_to	np_compatsupported_float_dtypes(yield_mixed_namespace_input_permutations)yield_namespace_device_dtype_combinationsdevice)SkipTest_array_api_for_tests_convert_containerassert_array_equal'skip_if_array_api_compat_not_configured)	_IS_32BITCSR_CONTAINERS
np_versionparse_versionX         c                 F    [        U 5      u  pU[        L d   eU(       a   eg)z.Check that get_namespace returns NumPy wrapperN)r!   r&   r5   xp_outis_array_api_compliants      ^/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/sklearn/utils/tests/test_array_api.py-test_get_namespace_ndarray_or_similar_defaultr?   =   s+     &31%5"FY%%%%    c                     [         R                  " / SQ5      n [        U 5      u  pUR                  SSSS9n[	        US/S-  5        [
        R                  " [        SS9   UR                  SSS	9  S
S
S
5        g
! , (       d  f       g
= f)z;Check expected behavior with device and creation functions.r6   
          @cpu)
fill_valuer+   zUnsupported devicematchcudar*   N)	numpyasarrayr!   fullr   pytestraises
ValueErrorzeros)r5   r<   _
full_arrays       r>   *test_get_namespace_ndarray_creation_devicerR   E   sk    i Aa IFRC>JJ
+	z)=	>R' 
?	>	>s    A::
Bc                     [        SS9   [        U 5      u  pU[        U [        R                  5      :X  d   eU[
        L d   e SSS5        g! , (       d  f       g= f)z%Test get_namespace on NumPy ndarrays.Tarray_api_dispatchN)r   r!   
isinstancerI   ndarrayr&   r;   s      r>   ;test_get_namespace_ndarray_or_similar_default_with_dispatchrX   Q   sN    
 
4	0)6q)9&%Au}})EEEE """ 
1	0	0   9A
Aconstructor_name)pyarrowpandaspolarsseriesc                     [        / SQ/ SQ/U 5      n[        SS9   [        U5      u  p#U(       a   eU[        L d   e SSS5        g! , (       d  f       g= f)z,Test get_namespace on dataframes and series.)r7      r8   )r9   r9      TrT   N)r.   r   r!   r&   )rZ   dfr<   r=   s       r>   #test_get_namespace_df_with_dispatchrc   _   sP    
 
Y	24D	EB	4	0)6r):&))) """ 
1	0	0s   "A
Ac                      [        SS9   [        [        R                  " / SQ/5      5      u  pU(       a   eU [        L d   e SSS5        g! , (       d  f       g= f)z$Test get_namespace on sparse arrays.TrT   r6   N)r   r!   sp	csr_arrayr&   )r<   r=   s     r>   'test_get_namespace_sparse_with_dispatchrg   n   sI     
4	0)6r||YK7P)Q&))) """ 
1	0	0rY   c                 h   [         R                  " S5      n[        R                  " / SQ/5      nUR                  U5      n[	        SS9   [        U5      u  pEU(       d   e[         R                  " [        5         [        X25      u  pESSS5        S nU R                  SU5        [        R                  R                  S5      S	:w  d   e[         R                  " [        S
S9   [        U5        SSS5        SSS5        g! , (       d  f       N~= f! , (       d  f       N(= f! , (       d  f       g= f)z'Test get_namespace for ArrayAPI arrays.array_api_strictr6   TrT   Nc                     U S:X  a  gg )NSCIPY_ARRAY_API0 )keys    r>   mock_getenv1test_get_namespace_array_api.<locals>.mock_getenv   s    '' (r@   zos.environ.getrk   1z#scipy's own support is not enabled.rF   )rL   importorskiprI   rJ   r   r!   rM   	TypeErrorsetattrosenvirongetRuntimeError)monkeypatchxpX_npX_xpr<   r=   ro   s          r>   test_get_namespace_array_apir}   z   s     
		/	0B==)%D::dD	4	0)6t)<&%%%]]9%-:4-F*F &	 	,k:zz~~/0C777]]7
 $	
 
1	0 &%
 
 
1	0s=   
1D#;D	AD#$D0D#
D	D#
D 	D##
D1zarray_input, referencer8   idc                    [        UR                  UR                  S9u  p#[        U R                  U R                  S9u  pE[        SS9   UR	                  / SQUS9n[        UR	                  SUS95      n[        XbUS9n[        U5      S   U:X  d   e[        U5      U:X  d   e S	S	S	5        g	! , (       d  f       g	= f)
z8Check conversion between various namespace-device-pairs.device_nameTrT   r6   r*   r7   rz   r+   r   N)r-   rz   r+   r   rJ   array_api_devicer%   r!   )	array_input	referencexp_to	device_toxp_fromdevice_fromarray_indevice_reference	array_outs	            r>   "test_move_to_array_api_conversionsr      s     ,ILLiFVFVWE/K$6$6G 
4	0??9[?A+EMM!IM,NOH7GH	Y'*e333	*.>>>> 
1	0	0s   
AB//
B=c            	      
   [        SSS9u  p[        SSS9u  p#[        R                  " / SQ5      n[        R                  " / SQ5      n[        SS	9   Un[        USU SS
9u  pxXtL d   eUb   eSn	[        R                  " [        U	S9   [        XEX&S
9  SSS5        [        R                  " [        U	S9   [        USX&S
9  SSS5        SSS5        g! , (       d  f       ND= f! , (       d  f       N(= f! , (       d  f       g= f)z*Check sparse inputs are handled correctly.rI   Nr   torchrD   )r   r7   r8   r9   r6   TrT   r   z6Sparse arrays are only accepted \(and passed through\)rF   )
r-   re   rf   rI   arrayr   r%   rL   rM   rs   )
xp_numpyrP   xp_torchr+   sparse1numpy_array
device_cpuresult1result2msgs
             r>   test_move_to_sparser      s    &wDAKH+GGHll<(G++i(K	4	0
 #7DXdK!!! H]]9C0GXI 1]]9C0GThB 1 
1	0 1000 
1	0s<   7C4	C!C45C#C4
C 	C4#
C1	-C44
D	array_apirI   ri   c                     [         R                  " U 5      nUR                  / SQ5      n[        USUS9n[        R                  " U5      nUR
                  S   (       d   eg)z=Test _asarray_with_order passes along order for NumPy arrays.)g333333?g333333@gffffff@F)orderrz   F_CONTIGUOUSN)rL   rr   rJ   r   rI   flags)r   rz   r5   X_newX_new_nps        r>   test_asarray_with_orderr      sP     
		Y	'B


?#A4E}}U#H>>.)))r@   z(array_namespace, device_name, dtype_namez"weights, axis, normalize, expected)NNT      @T)g      @r         @r7      F)TTF      ?r   皙?g?)g?g@g@)r   皙?r   g      ?g      @)r9   r`   r   )r7   r7   r8   g      @g      @)r7   r8   r7   )r8   r8   r8   )NNF   )r      	   ra      r9   r   )皙??g?gffffff?gffffff@)r      r   r   )r               c                    [        XU5      u  px[        R                  " / SQ/ SQ/US9n	UR                  XS9n	Ub#  [        R                  " X2S9nUR                  X8S9n[        SS9   [	        XX5S9n
[
        [        S5      :  d  [
        [        S	5      :  a  [        U	5      [        U
5      :X  d   eS S S 5        [        W
[        S
S9n
[        X[        U5      S9  g ! , (       d  f       N1= f)Nr6   r`   r   ra   dtyper*   TrT   )axisweights	normalize2.0.02.1.0rD   r   )atol)r-   rI   rJ   r   r   r3   r4   r   r%   r   r   )array_namespacer   
dtype_namer   r   r   expectedrz   r+   r   results              r>   test_averager      s    H &oJOJB}}i3:FHzz(z2H--:**W*4	4	0(wTg..*g@V2V $H-1A&1IIII 
1 Ve4FF>*+EF 
1	0s   (AC
C,)include_numpy_namespacesc                    [        XU5      u  p4[        R                  " SS/US9S[        R                  " SS/US9-  -   nUR                  R                  n[        X65      (       d  [        R                  " U  SU 35        UR                  XTS9nS	n[        S
S9   [        R                  " [        US9   [        U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr8   r   r   y              ?r`   r9   z does not support r*   z;Complex floating point values are not supported by average.TrT   rF   )r-   rI   rJ   r   namehasattrrL   skipr   rM   NotImplementedErrorr   )r   r   r   rz   r+   r   complex_type_nameerr_msgs           r>   $test_average_raises_with_wrong_dtyper     s    
 &oJOJB}}aV:6emm	
Aj? : H !++2))''9:K9LMNzz(z2HKG$/)9 	: 	0/99 	0/s$   C$6CC$
C!	C$$
C2zaxis, weights, error, error_msgzAxis must be specifiedr   )r7   r8   r9   r`   z(Weights sum to zero, can't be normalizedc                 p   [        XU5      u  px[        R                  " / SQ/ SQ/US9n	UR                  XS9n	[        R                  " XBS9nUR                  XHS9n[        SS9   [        R
                  " XVS9   [        XUS9  S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)	Nr6   r   r   r*   TrT   rF   )r   r   )r-   rI   rJ   r   rL   rM   r   )
r   r   r   r   r   error	error_msgrz   r+   r   s
             r>   +test_average_raises_with_invalid_parametersr     s    @ &oJOJB}}i3:FHzz(z2HmmG6Gjjj0G	4	0&--2Wg6 3X	0	02W2W	0	0s$   %B':BB'
B$	 B''
B5c                  <    [        5       b   e[        S S5      b   eg )Nr   )r   rm   r@   r>   test_device_none_if_no_inputr   K  s$    %%%D&)111r@   c                    ^  " S S5      m " U4S jS5      n [         R                  " [        5         [        U " S5      R                  5        S S S 5        [        U " S5      U " S5      5      b   eSn[        S	S
9   [         R                  " [        US9   [        U " S5      U " S5      5        S S S 5        U " S5      nU " S5      nUR                  [        U5      :X  d   eUR                  [        X#5      :X  d   eUR                  [        X"U5      :X  d   e S S S 5        g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       g = f)Nc                   ,    \ rS rSrS rS rS rS rSrg)&test_device_inspection.<locals>.DeviceiS  c                     Xl         g Nr   )selfr   s     r>   __init__/test_device_inspection.<locals>.Device.__init__T  s    Ir@   c                 4    U R                   UR                   :H  $ r   r   )r   r+   s     r>   __eq__-test_device_inspection.<locals>.Device.__eq__W  s    99++r@   c                     [        S5      e)NzDevice object is not hashable)rs   r   s    r>   __hash__/test_device_inspection.<locals>.Device.__hash__Z  s    ;<<r@   c                     U R                   $ r   r   r   s    r>   __str__.test_device_inspection.<locals>.Device.__str__]  s    99r@   r   N)	__name__
__module____qualname____firstlineno__r   r   r   r   __static_attributes__rm   r@   r>   Devicer   S  s    		,	=	r@   r   c                   "   > \ rS rSrU 4S jrSrg)%test_device_inspection.<locals>.Arrayi`  c                     > T" U5      U l         g r   r*   )r   r   r   s     r>   r   .test_device_inspection.<locals>.Array.__init__a  s     -DKr@   r*   N)r   r   r   r   r   r   )r   s   r>   Arrayr   `  s    	. 	.r@   r   r+   rD   mygpuz.Input arrays use different devices: cpu, mygpuTrT   rF   )rL   rM   rs   hashr+   r   r   rN   )r   r   array1array2r   s       @r>   test_device_inspectionr   Q  s    . . 
y	!U8_##$ 
" E%L%.9AAA ?G	4	0]]:W5U5\5>: 6 xx}} 0 8888}} 0 @@@@}} 0 HHHH 
1	0 
"	! 65 
1	0s0   D$=ED50A*E$
D25
E	?E
Elibrary)rI   ri   r   zX,reduction,expected)r`   r         @r         ?rC         @r         @)r         @r   r   r   g      rC   r   c                     [         R                  " U 5      n[        SS9   U" UR                  U5      5      nSSS5        [	        W[
        SS9n[        XS5        g! , (       d  f       N)= f)z-Check NaN reductions like _nanmin and _nanmaxTrT   NrD   r   )rL   rr   r   rJ   r%   rI   r   )r   r5   	reductionr   rz   r   s         r>   test_nan_reductionsr    sU    ` 
		W	%B	4	02::a=) 
1 Ve4FF%	 
1	0s   A
A)z"namespace, device_name, dtype_namec                    [        XU5      u  p4/ SQ/ SQ/ SQ/ SQ/nUR                  XTS9n[        SS9   [        U5      nS S S 5        [	        W[
        SS	9n[
        R                  " US
S9n[        X5        [        U5      (       a+  [
        R                  " U5      R                  S   (       d   eg g ! , (       d  f       Ny= f)Nr6   r   )r   r   r   )rB      r   r*   TrT   rD   r   C)r   C_CONTIGUOUS)
r-   rJ   r   r   r%   rI   ravelr   r   r   )		namespacer   r   rz   r+   r   array_xpr   r   s	            r>   
test_ravelr	    s    
 &ijIJB	9l;Ezz%z/H	4	0! 
1 Ve4F{{5,HH%2}}V$**>:::  
1	0s   B44
Ccupyr   c                 ^   [         R                  " U 5      nU S:X  aR  UR                  R                  R	                  5       (       d  [         R
                  " S5        UR                  / SQSS9nOUR                  / SQ5      n[        X!S9n[        R                  " / SQ5      n[        X45        g)z0Check convert_to_numpy for GPU backed libraries.r   ztest requires cudar   rH   r*   rz   N)
rL   rr   backendsrH   is_builtr   rJ   r   rI   r   )r   rz   X_gpuX_cpuexpected_outputs        r>   test_convert_to_numpy_gpur    s     
		W	%B'{{((**KK,-

?6
:

?+e+EmmO4OE+r@   c                      [         R                  " S5      n U R                  / SQSS9n[        XS9n[        R                  " / SQ5      n[        X#5        g)z.Check convert_to_numpy for PyTorch CPU arrays.r   r   rD   r*   r  N)rL   rr   rJ   r   rI   r   )r   X_torchr  r  s       r>   test_convert_to_numpy_cpur    sD    (EmmOEm:Gg0EmmO4OE+r@   c                   *    \ rS rSrSS jrS rS rSrg)SimpleEstimatori  Nc                 \    Xl         SU0U l        U/U l        UR                  S   U l        U $ Nr5   r   )X_X_dict_X_list_shapen_features_r   r5   ys      r>   fitSimpleEstimator.fit  s0    Qxs771:r@   c                     [        XSSS9  U$ Nr  predict)	attributemethodr    r   r5   s     r>   r%  SimpleEstimator.predict      QYGr@   c                 N    [         R                  " U R                  5      U l        g r   )re   
csr_matrixr  r   s    r>   sparsifySimpleEstimator.sparsify  s    --(r@   )r  r  r  r  r   )r   r   r   r   r!  r%  r.  r   rm   r@   r>   r  r    s    )r@   r  c                   *    \ rS rSrSS jrS rS rSrg)SimpleEstimatorCustomLogici  Nc                 L    Xl         SU0U l        UR                  S   U l        U $ r  )r  r  r  r  r  s      r>   r!  SimpleEstimatorCustomLogic.fit  s'    Qx771:r@   c                     [        XSSS9  U$ r$  r(  r)  s     r>   r%  "SimpleEstimatorCustomLogic.predict  r+  r@   c                     U" U R                   5      U l         U R                  R                  5        VVs0 s H  u  p#X!" U5      _M     snnU l        SU l        U $ s  snnf )NT)r  r  items
converted_)r   	converterkvs       r>   __sklearn_array_api_convert__8SimpleEstimatorCustomLogic.__sklearn_array_api_convert__	  sU    DGG$48LL4F4F4HI4HDA9Q<4HI 	 Js   A)r  r  r8  r  r   )r   r   r   r   r!  r%  r<  r   rm   r@   r>   r1  r1    s    r@   r1  zarray_namespace, converterc                 >    U R                  5       R                  5       $ r   )rD   rI   r   s    r>   <lambda>r@    s    		 1 1 3r@   c                 .    [         R                  " U 5      $ r   )rI   rJ   r?  s    r>   r@  r@    s    5==+?r@   c                 "    U R                  5       $ r   )rw   r?  s    r>   r@  r@    s
    uyy{r@   c                    [         R                  " U 5      nUR                  SS//5      n[        SS9   [	        5       R                  U5      nUR                  U5        [        XA5      n[        UR                  [        R                  5      (       d   e[        U[        SS9n[        UR                  [        R                  5      (       d   e SSS5        g! , (       d  f       g= f)z(Convert estimator attributes to ndarray.r   r   TrT   rD   r*   N)rL   rr   rJ   r   r  r!  r%  r   rV   r  rI   rW   r$   )r   r9  rz   r5   estnew_ests         r>   !test_convert_estimator_to_ndarrayrF    s     
		_	-B


S#J< A	4	0##A&A23B'**emm4444#Cu='**emm4444 
1	0	0s   BC
C'c                    ^ [         R                  " S5      m[        R                  " SS//5      n [	        5       R                  U 5      n[        UU4S j5      n[        UR                  S5      (       d   e[        SS9   [        UTS S9n[        UR                  5      S	   T:X  d   e[        UR                  S
   5      S	   T:X  d   e[        UR                  S	   5      S	   T:X  d   e S S S 5        g ! , (       d  f       g = f)Nri   r   r   c                 &   > TR                  U 5      $ r   )rJ   )r   rz   s    r>   r@  :test_convert_estimator_with_custom_logic.<locals>.<lambda>1  s    "**UBSr@   __array_namespace__TrT   r*   r   r5   )rL   rr   rI   rJ   r  r!  r   r   r  r   r$   r!   r  r  )r{   rD  rE  rz   s      @r>   (test_convert_estimator_with_custom_logicrK  *  s    			/	0B==3*&D




%C.s4STG7::45555	4	0#CD9WZZ(+r111W__S1215;;;W__Q/03r999 
1	0	0s    A,C66
Dc                     [         R                  " S5      n [        R                  " SS//5      n[	        5       R                  U5      n[        SS9   [        X S S9nUR                  U R                  SS//5      5        [        UR                  5      S   U :X  d   e[        UR                  S   5      S   U :X  d   eUR                  (       d   e S S S 5        g ! , (       d  f       g = f	Nri   r   r   TrT   r*   r   r5   )rL   rr   rI   rJ   r1  r!  r   r$   r%  r!   r  r  r8  rz   r{   rD  rE  s       r>   4test_custom_conversion_estimator_to_array_api_strictrO  ;  s    			/	0B==3*&D
$
&
*
*4
0C	4	0#CD9

S#J<01WZZ(+r111W__S1215;;;!!!! 
1	0	0s   B C
C*c                  n   [         R                  " S5      n [        R                  " SS//5      n[	        5       R                  U5      n[        SS9   [        X S S9n[        UR                  5      S   U :X  d   e[        UR                  S   5      S   U :X  d   e S S S 5        g ! , (       d  f       g = frM  )rL   rr   rI   rJ   r  r!  r   r$   r!   r  r  rN  s       r>   *test_convert_estimator_to_array_api_strictrQ  L  s    			/	0B==3*&D




%C	4	0#CD9WZZ(+r111W__S1215;;;	 
1	0	0s   A
B&&
B4c                  ~   [         R                  " S5      n [        SS9   [        5       R	                  U R                  SS//5      5      n[         R                  " [        SS9   UR                  [        R
                  " S/5      5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)	Nri   TrT   r   r   z.*must use the same namespacerF   r   )
rL   rr   r   r  r!  rJ   rM   rN   r%  rI   )rz   rD  s     r>   test_check_fitted_attributerS  Z  s    			/	0B	4	0##BJJc
|$<=]]:-LMKKqc*+ N 
1	0 NM 
1	0s$   AB.%'BB.
B+	'B..
B<r   c                 h   [         R                  " S5      n[        SS9   [        5       R	                  [
        R                  " SS//5      5      nUR                  U 5        UR                  5         UR                  U 5        UR                  [
        R                  " SS//5      5        [        5       R	                  UR                  SS//5      5      n[         R                  " [        SS9   UR                  U 5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)	zCheck validation of non-array input against fitted attribute ``X_``.

``SimpleEstimator.predict`` calls ``check_same_namespace`` with
``attribute="X_"`` to compare the input with the fitted data.
ri   TrT   r   r   zArray namespace.*not compatiblerF   N)rL   rr   r   r  r!  rI   rJ   r%  r.  rM   rN   )r5   rz   rD  s      r>   0test_check_fitted_attribute_with_non_array_inputrU  e  s     
		/	0B	4	0##EMMC:,$?@AAEMMC:,/0##BJJc
|$<=]]:-NOKKN P 
1	0 PO 
1	0s$   CD#/DD#
D 	D##
D1c                     [        XU5      u  p4[        (       a  [        U5      UR                  :X  d   eg [        U5      UR                  :X  d   eg r   )r-   r1   r#   int32int64)r  r   r   rz   r+   s        r>   test_indexing_dtyperY  ~  sE    
 &ijIJByb!RXX---b!RXX---r@   c                     [        X5      u  p4 UR                  S/UR                  US9  UR                  n[        X45      U:X  d   eg ! [         a    UR                  n N*f = f)N        )r   r+   )r-   rJ   float64	Exceptionfloat32r   )r  r   r   rz   r+   expected_dtypes         r>   test_max_precision_float_dtyper`    sg    
 &i=JB$


C5

6
: &b1^CCC  $ $s   (A	 	A"!A"invertassume_uniqueelement_size)ra   rB   r   	int_dtype)int16rW  rX  uint8c           	         [        XU5      u  pxUS-  n	S[        R                  " U5      R                  U	S45      R	                  U5      -  n
[        R
                  " [        R                  " S5      US9nUR                  XS9nUR                  XS9n[        R                  " U
UUUS9n[        SS9   [        UUUUUS9nS S S 5        [        [        W[        S	S
9U5        g ! , (       d  f       N(= f)Nr8   r   r   r*   )elementtest_elementsrb  ra  TrT   )rh  ri  rz   rb  ra  rD   r   )r-   rI   arangereshapeastyper   rJ   isinr   r   r/   r%   )r   r   r   ra  rb  rc  rd  rz   r+   rrh  ri  
element_xptest_elements_xpr   r   s                   r>   	test_isinrq    s    " &oJOJBA%,,|,44aV<CCINNGKKR 0	BMG3Jzz-z?zz##	H 
4	0*'
 
1 wv%>I 
1	0s   4C$$
C2rk   rq   zSCIPY_ARRAY_API not set to 1.)reasonc                     [         R                  " S5      n SSKJn  U R	                  SSS9n[
        R                  " S5      n[        U5      u  pEnU[        U5      S   L d   eU(       a   eUb   e[        SS9   [        U5      u  pEnXAL d   eU(       d   eXbR                  :X  d   e S S S 5        g ! , (       d  f       g = f)	Nr   r   )r   r9   rD   r*   TrT   )
rL   rr   "sklearn.externals.array_api_compatr   rj  rI   r"   r!   r   r+   )r   torch_compatsome_torch_tensorsome_numpy_arrayr  is_array_apir+   s          r>   test_get_namespace_and_devicery    s    
 (EHQu5||A '??P&Q#IV&67::::>> 
4	0*BCT*U'	(((|11111	 
1	0	0s   ;/B44
Ccsr_containerr   )r   r7   Nr   r   sample_weight_type)Nintfloatc           	      <   SSK Jn  [        XU5      u  px[        R                  " / SQ/ SQ/ SQ/ SQ/ SQ/5      n	US:X  a  [        R
                  " / S	Q5      n
O US
:X  a  [        R
                  " / SQUS9n
OS n
U" U" U	5      XJS9nUR                  XS9n[        SS9   [        XXUS9nS S S 5        [        [        W[        SS9U5        [        [        S5      :  d  [        [        S5      :  a  [        U5      [        U5      :X  d   eg g ! , (       d  f       Ni= f)Nr   )count_nonzero)r   r9   r   )r8   r   r   )r   r   r   )r   r   r   r`   r   r   r|  )r7   r8   r8   r9   r7   r}  )g      ?r   r   g	@g333333@r   )r   sample_weightr*   TrT   )r   r  rz   r+   rD   r   r   r   )sklearn.utils.sparsefuncsr  r-   rI   r   rJ   r   r   r   r%   r3   r4   r   )r   r   r   rz  r   r{  sparse_count_nonzerorz   r+   r   r  r   r  r   s                 r>   test_count_nonzeror    s     P%oJOJBKKJ	9iPQEU"o6	w	&&?zR#e4H zz%z/H	4	0}F
 
1
 GFuU;XFM'**jM'<R.R  )-=f-EEEE /S 
1	0s   D
Dzarray, value, matchz`array` should be 2Dr`   z`value` needs to bez`value` needs to be ac                     [        SSS9u  p4[        R                  " [        US9   [	        XU5        SSS5        g! , (       d  f       g= f)z:Check `_validate_diagonal_args` raises the correct errors.rI   Nr   rF   )r-   rL   rM   rN   r   )r   valuerG   rz   rP   s        r>   test_validate_diagonal_argsr    s6     !d;EB	z	/b1 
0	/	/s	   <
A
functionfilladdc_contiguityc                     [        SSS9u  p#U (       a  [        R                  " S5      nO [        R                  " S5      R                  nUR                  S   U :X  d   eUS:X  a  [
        nO[        nU" USU5        [        UR                  5       [        R                  " S5      5        U" U/ S	QU5        US:X  a  [        R                  " S
5      nO-[        R                  " S5      [        R                  " S
5      -   n[        UR                  5       U5        [        R                  " / SQ5      nU" XGU5        US:X  a  UnO0U[        R                  " S
5      -   [        R                  " S5      -   n[        UR                  5       U5        g)zBCheck `_fill/add_to_diagonal` behaviour correct with numpy arrays.rI   Nr   r9   r`   r  r  r7   )r9   )r   r7   r8   r9   )r  r      )r-   rI   rO   Tr   r   r
   r   diagonalonesrj  r   )r  r  rz   rP   r   funcexpected_diag
fill_arrays           r>   test_fill_and_add_to_diagonalr  "  s)    !d;EBF#F#%%;;~&,66662ENN$ejj&67	26Q

4(5<<?:ENN$m4\*JB6""U\\!_4uzz$7GGENN$m4r@   r   )standard
transposednon-contiguousc                 .   [        XU5      u  pE[        R                  " SUS9nU S:X  a5  UR                  UR	                  5       US9R
                  nUR
                  nO[U S:X  a7  UR                  UR	                  5       US9SSS2SSS24   nUSSS2SSS24   nOUR                  UR	                  5       US9n[        R                  " USS	9  [        S
S9   [        USUS9  SSS5        [        [        U[        SS9U5        g! , (       d  f       N(= f)zHCheck array API `_fill_diagonal` consistent with `numpy._fill_diagonal`.)r`   r   r   r  r*   r  Nr8   r7   )valTrT   r  rz   rD   r   )r-   rI   rO   rJ   copyr  fill_diagonalr   r   r/   r%   )r   r   r   r   rz   r+   array_npr  s           r>   test_fill_diagonalr  E  s     &oJOJB{{64H::hmmof:=??::	"	"::hmmof:=cc3Q3hGCaC1H%::hmmof:=	a(	4	0xqR0 
1 wxE%@(K 
1	0s   D
Dc                 F   [        XU5      u  p4[        SSS9u  pV[        R                  " SUS9nUR                  UR	                  5       US9n/ SQn	[        XyUS9  [        S	S
9   [        XUS9  SSS5        [        [        U[        SS9U5        g! , (       d  f       N(= f)zMCheck `_add_to_diagonal` consistent between array API xp and numpy namespace.rI   Nr   r  r   r*   r6   r  TrT   rD   r   )	r-   rI   rO   rJ   r  r   r   r/   r%   )
r   r   r   rz   r+   np_xprP   r  r  add_vals
             r>   test_add_to_diagonalr  _  s     &oJOJB#G>HE{{64Hzz(--/&z9HG8u5	4	0x26 
1 wxE%@(K 
1	0s   %B
B dispatchc                    [         R                  " S/5      nU(       a  [        USS 5      OS nU " [         R                  " S//5      5      U " [         R                  " S//5      5      pTU(       a+  [        R                  R                  S5      c  [        S5      e[        US9   [        XE5      b   e[        XB5      U:X  d   e[        XE5      S   b   e[        XB5      S   U:X  d   e S S S 5        g ! , (       d  f       g = f)Nr7   r+   r8   rk   z8SCIPY_ARRAY_API is not set: not checking array_api inputrT   )
rI   r   getattrru   rv   rw   r,   r   r   r"   )rz  r  np_arrexpected_numpy_array_deviceabs         r>   test_sparse_devicer  s  s     [[!FEM'&(D"ASWqcU+,mEKK!<N.OqBJJNN#45=QRR	8	4%---*.IIII'-a0888'2159TTTT	 
5	4	4s   $AC33
D)Nr   r7   c           	         [        XU5      u  pE[        R                  R                  S5      nUR	                  SSSS9R                  U5      n[        R                  " XsS9nUR                  XuS9n	[        SS	9   [        XS9n
UR                  S
:w  a0  [        U
5      S   U:X  d   eU
R                  U	R                  :X  d   eS S S 5        [        U[        W
[        SS95        g ! , (       d  f       N(= f)Nr   r[  r   )r   r`   )lowhighsizer   r*   TrT   ri   rD   r   )r-   rI   randomRandomStateuniformrl  medianrJ   r   r   r   r!   r+   r   r%   )r  r   r   r   rz   r+   rngr{   	result_npr|   	result_xps              r>   test_medianr    s     &ijIJB
,,
"
"1
%C;;3Sv;6==jIDT-I::d:*D	4	0D,	;;,, !+A."444##t{{222 
1 IwyU5IJ 
1	0s   :A
C&&
C4c           	         S[        U5      ;   a  SOSn[        XU5      u  pE[        SS9   [        R                  " SSS5      R                  U5      nUR                  XeS	9n[        [        [        U5      [        S
S9[        U5      US9  [        R                  " SSS5      R                  U5      nUR                  XeS	9n[        [        [        U5      [        S
S9[        U5      US9  S S S 5        g ! , (       d  f       g = f)Nr^  ư>-q=TrT   i     r*   rD   r   rtolr   r7   )strr-   r   rI   linspacerl  rJ   r   r%   r   r   r   r   )r  r   r   r  rz   r+   x_npx_xps           r>   test_expit_logitr    s    
 J/4UD%ijIJB	4	0~~c2t,33J?zz$z.F4LU59$K	
 ~~aD)00<zz$z.F4LU59$K	
 
1	0	0s   CC55
D)r   r7   Nc                 z   [        XU5      u  pE[        R                  " / SQ/ SQ/ SQSS[        R                  * // SQ/US9nUR                  XeS9n[        R
                  R                  XcS	9nS
[        U5      ;   a  SOSn	U S:X  a  US:X  d  U S:X  a   S[        U5      ;   a  [        [        XsS	9XS9  [        SS9   [        XsS	9n
[        U
[        SS9n
[        XU	S9  S S S 5        [        R                  " S[        R                  S// SQ[        R                  SS/SS[        R                  * // SQ/US9nUR                  XS9n[        R
                  R                  XS	9n[        SS9   [        XS	9n[        U[        SS9n[        XU	S9  S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   r9   r  r8   r   r  ir   r   ir   r  r   r*   r   r^  r  r  r   rD   ri   CPUr  TrT   r   r   r  )r-   rI   rJ   infscipyspecial	logsumexpr  r   r   r   r%   nan)r   r   r   r   rz   r+   r  r  res_npr  res_xp
array_np_2
array_xp_2res_np_2res_xp_2s                  r>   #test_logsumexp_like_scipy_logsumexpr    s    &oJOJB}}!eiiZ 	
 	H zz(z2H]]$$X$9FJ/4UD 	7"{e';--%3{;K2K
87K	4	0H0E%8T2 
1 		4 YY1!eiiZ 	
 	J J6J}}&&z&=H	4	0j48e<6 
1	0) 
1	0( 
1	0s   =#F/#F,
F),
F:c                    [        SSSS9u  p[        R                  " / SQ/ SQ/ SQ/[        R                  S9nUR                  X2S	9n[	        S
S9   [        X@S9nS S S 5        WR                  UR                  :X  d   e[        [        U[        SS9[        R                  R                  X0S9SS9  g ! , (       d  f       N^= f)Nr   mpsr^  )r   r   r  r  r  r   r*   TrT   r   rD   r   r  r  )r-   rI   rJ   rX  r   r   r   r^  r   r%   r  r  r  )r   rz   r+   r  r  r  s         r>   7test_logsumexp_integer_array_api_on_float32_only_devicer    s    %g5YWJB }}	}k2%++H zz(z2H	4	0H0 
1 <<2::%%%5/4	 
1	0s   
B44
C)r  device_expected_types))rI   Nr\  r^  float16)ri   N)r\  r^  )r   rD   r  )r   rH   r  )r   r  )r^  r  c                 j   ^ [        XS9u  mn[        TUS9n[        U4S jU 5       5      nXE:X  d   eg )Nr   r*   c              3   <   >#    U  H  n[        TU5      v   M     g 7fr   )r  ).0r   rz   s     r>   	<genexpr>-test_supported_float_types.<locals>.<genexpr>  s     N~WR,,~s   )r-   r'   tuple)r  r  r  r+   float_typesr   rz   s         @r>   test_supported_float_typesr    s;     &iEJB(F;KN~NNH"""r@   use_sample_weightc                 H   SnSn[         R                  R                  S5      nUR                  SXT5      R	                  U5      nUR                  XE5      R	                  U5      n[        XU5      u  pU	R                  XzS9nU	R                  XS9nU (       a.  [         R                  " U5      nSUSSS2'   U	R                  XS9nOS	u  p[        US
9" XxUS9n[        SS9   [        XXS9nSSS5        [         R                  " UW5      (       d   eg! , (       d  f       N-= f)zCheck that the array API version of :func:`_half_multinomial_loss` works
correctly and matches the results produced by :class:`HalfMultinomialLoss`
of the private `_loss` module.
r   r9   *   r   r*   r8   r7   N)NN)	n_classes)y_trueraw_predictionr  TrT   )r   predr  rz   )rI   r  r  randintrl  randr-   rJ   	ones_liker   r   r   isclose)r  r  r   r   	n_samplesr  r  r   r  rz   r+   y_xppred_xpr  sample_weight_xpnp_lossxp_losss                    r>   test_half_multinomial_lossr    s    II
,,
"
"2
&CAy,33J?A88I)00<D%ijIJB::a:'Djjj-G*add::m:C*4'!I6]G 
4	0(0@
 
1
 =='**** 
1	0s   !D
D!c                    [        XU5      u  p4[        R                  " S5      R                  U5      nUR	                  XTS9n[        SS9   [        XcS9nS S S 5        WUR                  :X  d   eg ! , (       d  f       N!= f)Nr  r*   TrT   r  )r-   rI   rj  rl  rJ   r   r   r   )r  r   r   rz   r+   r{   r|   	ret_dtypes           r>   test_matching_numpy_dtyper  =  sm    
 &ijIJB<<$$Z0D::d:*D	4	0)$6	 
1

""" 
1	0s   
A11
A?){ru   	functoolsr   rI   rL   r  scipy.sparsesparsere   numpy.testingr   scipy.specialr   r   sklearn._configr   sklearn._lossr   sklearn.baser	   sklearn.utils._array_apir
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r+   r   sklearn.utils._testingr,   r-   r.   r/   r0   sklearn.utils.fixesr1   r2   r3   r4   markparametrizerJ   r?   rR   rX   rc   rg   r}   paramr   r   r   r   r   rs   rN   ZeroDivisionErrorr   r   r   r  r  r  r	  r  r  r  r1  rF  rK  rO  rQ  rS  rf   rU  rY  r`  rq  skipifrv   rw   ry  r  r   r  r  r  r  r  r  r  r  r  r  r  r  )argss   0r>   <module>r
     s>   	      ) & * - &! ! ! ! ! ! ! ! !D  U T u}}Y7INO& P&	( )u}}Y7INO	# P )	# )+-VW
# X )
# )# )# )  ) 4  =>>D 	d2Ah+47+>??C0 w0B&CD* E* .-/ ( 	 	q$(	q$A
4+	aSz2
sQo.	!TD$<0
QD)$	AtdD\*
Y	D/:
Y	D1a&1	q%#	q%!R!
5),	aA/
sQ/	!US#J/
QE;'	Auq"g&
Y	E;7
Y	EAr731:G;	BG, .-uM	* .-tL % F$		
 VH#	
 		
 
RG&(RS)273	:72 ),I ),Id )$JK
Q			GQ'
R%))	gr*
))UYY	%))4EIIuyy9;GG!$	
 EIIuyy9;GG!$%))S!	

 Q			GQ'
Q			GQ'99*uyyj	!7UYYJ7EIIuyy9;GG!$	
 EIIuyy9;GG!$%))S!	

 Q			Hc*
R%))	h-99*uyyj	!8eiiZ8EIIuyy9;GH1%	
 EIIuyy9;GH1%%))S!	
G(+X&Y+ L )\& (-/;	;" )VW$56, 7 ), ,)m )  ( ) 	34	?@	*+5 )5 ): ):  )" )"  )
< )
< ), ), )c
|R\\C:,-GHI J ). (-/.	. (-/
D	
D .-/ D%=14-85&JKJ L 6 9 2	JB JJNN$%,5T  226 .-/ .9!56-/EF!F G 7 :	!FH 	Y	$:;	q!fq!f%	&I(>@UV	q!fq!f%	&	3HIKK!Q!Q()KK!Q!Q()#	
		22 fe_5$75 8 65B "NO.-/L	 P
L* .-/L	L  .9dE]3U 4 :U (-/ .K /	
K0 (-/
	
, .-/ .07 /	
07f . /* .	#	# ,udm<(-/+	 =
+> (-/#	#Us   3"n%
