
    Q3j                        d dl Z d dlm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mZmZ d dlmZ d dlm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 m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d d	lm5Z6 d d
l7m8Z8m9Z9m:Z:m;Z;m<Z< d dl=m>Z>m?Z?m@Z@mAZA ej                  j                  d ej                  g d      g ddg      d        ZEd ZFe<ej                  j                  d ej                  g d      g ddg      d               ZGe<ej                  j                  dg d      d               ZHe<d        ZIe<d        ZJej                  j                  d e3       D  cg c]  }  ej                  | dd d| d   i c}       d        ZLd ZMej                  j                  dddg      d        ZNej                  j                  d e4             ej                  j                  d d!dd d"g d#fdd$d"dd%gfd"d&gd d"g dfg d'd$d"d(d)gfd*d+gd d"g d,fg d-d$d"d.d/gfd$dgd d"g d0fg d1d$d"d2d3gfg dg dgd d"g d#fg d4g d5gd$d"dd%gfd6dd d&g d7fdd$d&d8d9gfd"d&gd d&g dfg d'd$d&d:d;gfd*d+gd d&g d<fg d-d$d&d=d>gfd$dgd d&g d?fg d1d$d&d;d@gfg dg dgd d&g dAfg d4g d5gd$d&dBdCgfg      dD               ZOej                  j                  d e4d&E            dF        ZPej                  j                  d e4d"E            ej                  j                  dGdd$dgeQdHfd d$dggeReQfdIfd g dJeRdIfd dKd$geSdLff      dM               ZTdN ZUe<dO        ZVe<ej                  j                  dPg dQ      ej                  j                  dRd$dej                  ge(d$fd$dSej                   ge(dSfej                  ej                  ge(ej                  fg dej                  ej                  ej                  gg dTg ee(d U      g dVfg dej                  ej                  ej                  gg dTg ee(d$U      dWej                  dXgfd$dej                  ge&dfd$dej                  ge&dfej                   ej                   ge&ej                   fg dej                  ej                  ej                  gg dTg ee&d U      g dYfg dej                  ej                  ej                  gg dTg ee&d$U      dZej                  d[gfd$dej                  ge'd(fd$dSej                   ge'd\fej                   ej                   ge'ej                   fg dej                  ej                  ej                  gg dTg ee'd U      g d#fg dej                  ej                  ej                  gg dTg ee'd$U      d]ej                  d^gfg      d_                      ZYej                  j                  d` e4             da        ZZe<ej                  j                  dPdbdcg      dd               Z[de Z\ G df dge      Z] G dh die      Z^e<ej                  j                  djdcdk fddl fdbdm fg      dn               Z_e<do        Z`e<dp        Zae<dq        Zbe<dr        Zce<ej                  j                  ddsd)gg ej                  dsd)gg      g      dt               Zeej                  j                  d` e4             du        Zfej                  j                  d` e4             dv        Zgej                  j                  d e4             ej                  j                  dwd"d&g      ej                  j                  dxd"d&g      ej                  j                  dyg dz      ej                  j                  d{g d|      d}                                    Zhej                  j                  e j                  j                  d~      dk7  d      d        Zlej                  j                  d e4             ej                  j                  de?      ej                  j                  dg d      ej                  j                  dg d      d                             Zmej                  j                  d ej                  g d      d$df ej                  d$dgd:dgg       ej                  g d      df ej                  d$dgd:dgg      g ddf ej                  d$dgd:dgg       ej                  d$dgd:dgg      dfg      d        Zoej                  j                  dddg      ej                  j                  dd"d&g      d               Zpej                  j                  dg d      ej                  j                  d e4             d               Zqej                  j                  d e4             d        Zrej                  j                  de?      ej                  j                  dd"d&g      d               Zsej                  j                  d` e4             ej                  j                  dg d      d               Ztej                  j                  d` e4             d        Zuej                  j                  d e4             ej                  j                  dg d      d               Zvej                  j                  dg d      d        Zwej                  j                  dg d      d        Zxej                  j                  dd&d"g      ej                  j                  d` e4             d               Zyej                  j                  d` e4             d        Zzyc c} w )    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                 <    t        |       \  }}|t        u sJ |rJ y)z.Check that get_namespace returns NumPy wrapperN)r!   r&   r5   xp_outis_array_api_compliants      O/DATA/.local/lib/python3.12/site-packages/sklearn/utils/tests/test_array_api.py-test_get_namespace_ndarray_or_similar_defaultr?   =   s.     &31%5"F"Y%%%%    c                     t        j                  g d      } t        |       \  }}|j                  ddd      }t	        |dgdz         t        j                  t        d      5  |j                  dd	       d
d
d
       y
# 1 sw Y   y
xY w)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   sm    i Aa IFARC>JJ
+	z)=	>R' 
?	>	>s   %BBc                     t        d      5  t        |       \  }}|t        | t        j                        k(  sJ |t
        u sJ 	 ddd       y# 1 sw Y   yxY w)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   sQ    
 
4	0)6q)9&&%Au}})EEEE """ 
1	0	0s   8AAconstructor_name)pyarrowpandaspolarsseriesc                     t        g dg dg|       }t        d      5  t        |      \  }}|rJ |t        u sJ 	 ddd       y# 1 sw Y   yxY w)z,Test get_namespace on dataframes and series.)r7      r8   )r9   r9      TrT   N)r.   r   r!   r&   )rY   dfr<   r=   s       r>   #test_get_namespace_df_with_dispatchrb   _   sS    
 
Y	24D	EB	4	0)6r):&&))) """ 
1	0	0s   AAc                      t        d      5  t        t        j                  g dg            \  } }|rJ | t        u sJ 	 ddd       y# 1 sw Y   yxY w)z$Test get_namespace on sparse arrays.TrT   r6   N)r   r!   sp	csr_arrayr&   )r<   r=   s     r>   'test_get_namespace_sparse_with_dispatchrf   n   sL     
4	0)6r||YK7P)Q&&))) """ 
1	0	0s   3A

Ac                 H   t        j                  d      }t        j                  g dg      }|j                  |      }t	        d      5  t        |      \  }}|sJ t        j                  t              5  t        ||      \  }}ddd       d }| j                  d|       t        j                  j                  d      d	k7  sJ t        j                  t        d
      5  t        |       ddd       ddd       y# 1 sw Y   zxY w# 1 sw Y   xY w# 1 sw Y   yxY w)z'Test get_namespace for ArrayAPI arrays.array_api_strictr6   TrT   Nc                     | dk(  ryy )NSCIPY_ARRAY_API0 )keys    r>   mock_getenvz1test_get_namespace_array_api.<locals>.mock_getenv   s    '' (r@   zos.environ.getrj   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=   rn   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=   ,D7D AD#D/D D		DD	DD!zarray_input, referencer8   idc                    t        |j                  |j                        \  }}t        | j                  | j                        \  }}t        d      5  |j	                  g d|      }t        |j	                  d|            }t        |||      }t        |      d   |k(  sJ t        |      |k(  sJ 	 d	d	d	       y	# 1 sw Y   y	xY w)
z8Check conversion between various namespace-device-pairs.device_nameTrT   r6   r*   r7   rx   r+   r   N)r-   rx   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E9/K$6$6G[ 
4	0??9[?A+EMM!IM,NOH7GH	Y'*e333	*.>>>> 
1	0	0s   A#CCc                     t        dd      \  } }t        dd      \  }}t        j                  g d      }t        j                  g d      }t        d	      5  |}t        |d| d
      \  }}||u sJ |J d}	t        j                  t        |	      5  t        ||||
       ddd       t        j                  t        |	      5  t        |d||
       ddd       ddd       y# 1 sw Y   ExY w# 1 sw Y   xY w# 1 sw Y   yxY w)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-   rd   re   rI   arrayr   r%   rL   rM   rq   )
xp_numpyrP   xp_torchr+   sparse1numpy_array
device_cpuresult1result2msgs
             r>   test_move_to_sparser      s    &wDAKHa+GGHfll<(G++i(K	4	0
 #7DXdK'!!! H]]9C0G[XjI 1]]9C0GThzB 1 
1	0 1000 
1	0s<   <DC+'#D
C7D+C4	0D7D 	<DD	array_apirI   rh   c                     t        j                  |       }|j                  g d      }t        |d|      }t	        j                  |      }|j
                  d   sJ y)z=Test _asarray_with_order passes along order for NumPy arrays.)g333333?g333333@gffffff@F)orderrx   F_CONTIGUOUSN)rL   rp   rJ   r   rI   flags)r   rx   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      	   r`      r9   r   )皙??g?gffffff?gffffff@)r      r   r   )r               c                    t        | ||      \  }}t        j                  g dg dg|      }	|j                  |	|      }	|*t        j                  ||      }|j                  ||      }t        d      5  t	        |	|||      }
t
        t        d      k  st
        t        d	      k\  rt        |	      t        |
      k(  sJ d d d        t        
t        d
      }
t        |
|t        |             y # 1 sw Y   3xY w)Nr6   r_   r   r`   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   expectedrx   r+   r   results              r>   test_averager      s    H &o{JOJB}}i3:FHzz(6z2H--z:**WV*4	4	0(w)Tg..*g@V2V $H-1A&1IIII 
1 Ve4FFH>*+EF 
1	0s   9AC88D)include_numpy_namespacesc                    t        | ||      \  }}t        j                  ddg|      dt        j                  ddg|      z  z   }|j                  j                  }t        ||      st        j                  |  d|        |j                  ||      }d	}t        d
      5  t        j                  t        |      5  t        |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)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   rx   r+   r   complex_type_nameerr_msgs           r>   $test_average_raises_with_wrong_dtyper     s    
 &o{JOJB}}aV:6emm	
Aj? : H !++2()''9:K9LMNzz(6z2HKG$/)9 	: 	0/99 	0/s$   $C) 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                    t        | ||      \  }}t        j                  g dg dg|      }	|j                  |	|      }	t        j                  ||      }|j                  ||      }t        d      5  t	        j
                  ||      5  t        |	||       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)	Nr6   r   r   r*   TrT   rF   )r   r   )r-   rI   rJ   r   rL   rM   r   )
r   r   r   r   r   error	error_msgrx   r+   r   s
             r>   +test_average_raises_with_invalid_parametersr     s    @ &o{JOJB}}i3:FHzz(6z2HmmG:6Gjjj0G	4	0&--Y2Wg6 3X	0	02W2W	0	0s$   7B;B/B;/B8	4B;;Cc                  8    t               J t        d d      J y )Nr   )r   rl   r@   r>   test_device_none_if_no_inputr   K  s$    %%%D&)111r@   c                      G d d       G fdd      } t        j                  t              5  t         | d      j                         d d d        t         | d       | d            J d}t        d	
      5  t        j                  t        |      5  t         | d       | d             d d d         | d      } | d      }|j                  t        |      k(  sJ |j                  t        ||      k(  sJ |j                  t        |||      k(  sJ 	 d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nc                   $    e Zd Zd Zd Zd Zd Zy)&test_device_inspection.<locals>.Devicec                     || _         y Nr   )selfr   s     r>   __init__z/test_device_inspection.<locals>.Device.__init__T  s	    DIr@   c                 4    | j                   |j                   k(  S r   r   )r   r+   s     r>   __eq__z-test_device_inspection.<locals>.Device.__eq__W  s    99++r@   c                     t        d      )NzDevice object is not hashable)rq   r   s    r>   __hash__z/test_device_inspection.<locals>.Device.__hash__Z  s    ;<<r@   c                     | j                   S r   r   r   s    r>   __str__z.test_device_inspection.<locals>.Device.__str__]  s    99r@   N)__name__
__module____qualname__r   r   r   r   rl   r@   r>   Devicer   S  s    		,	=	r@   r   c                       e Zd Z fdZy)%test_device_inspection.<locals>.Arrayc                       |      | _         y r   r*   )r   r   r   s     r>   r   z.test_device_inspection.<locals>.Array.__init__a  s     -DKr@   N)r   r   r   r   )r   s   r>   Arrayr   `  s    	.r@   r   r+   rD   mygpuz.Input arrays use different devices: cpu, mygpuTrT   rF   )rL   rM   rq   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%=D=D12A)D=%D.1D:	6D==Elibrary)rI   rh   r   zX,reduction,expected)r_   r         @r         ?rC         @r         @)r         @r   r   r   g      rC   r   c                     t        j                  |       }t        d      5   ||j                  |            }ddd       t	        t
        d      }t        ||       y# 1 sw Y   (xY w)z-Check NaN reductions like _nanmin and _nanmaxTrT   NrD   r   )rL   rp   r   rJ   r%   rI   r   )r   r5   	reductionr   rx   r   s         r>   test_nan_reductionsr     sW    ` 
		W	%B	4	02::a=) 
1 Ve4FFH%	 
1	0s   A!!A*z"namespace, device_name, dtype_namec                    t        | ||      \  }}g dg dg dg dg}|j                  ||      }t        d      5  t        |      }d d d        t	        t
        d	      }t        j                  |d
      }t        ||       t        |      r%t        j                  |      j                  d   sJ y y # 1 sw Y   oxY w)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   rx   r+   r   array_xpr   r   s	            r>   
test_ravelr     s    
 &ijIJB	9l;Ezz%z/H	4	0! 
1 Ve4F{{5,HHf%2}}V$**>:::  
1	0s   B88Ccupyr   c                 \   t        j                  |       }| dk(  rO|j                  j                  j	                         st        j
                  d       |j                  g dd      }n|j                  g d      }t        ||      }t        j                  g d      }t        ||       y)z0Check convert_to_numpy for GPU backed libraries.r   ztest requires cudar   rH   r*   rx   N)
rL   rp   backendsrH   is_builtr   rJ   r   rI   r   )r   rx   X_gpuX_cpuexpected_outputs        r>   test_convert_to_numpy_gpur	    s     
		W	%B'{{((*KK,-

?6
:

?+e+EmmO4OE?+r@   c                      t        j                  d      } | j                  g dd      }t        ||       }t	        j                  g d      }t        ||       y)z.Check convert_to_numpy for PyTorch CPU arrays.r   r   rD   r*   r  N)rL   rp   rJ   r   rI   r   )r   X_torchr  r  s       r>   test_convert_to_numpy_cpur    sH    (EmmOEm:Gg%0EmmO4OE?+r@   c                        e Zd ZddZd Zd Zy)SimpleEstimatorNc                 ^    || _         d|i| _        |g| _        |j                  d   | _        | S Nr5   r   )X_X_dict_X_list_shapen_features_r   r5   ys      r>   fitzSimpleEstimator.fit  s2    Qxs771:r@   c                 $    t        || dd       |S Nr  predict)	attributemethodr    r   r5   s     r>   r  zSimpleEstimator.predict      QYGr@   c                 L    t        j                  | j                        | _        y r   )rd   
csr_matrixr  r   s    r>   sparsifyzSimpleEstimator.sparsify  s    --(r@   r   )r   r   r   r  r  r#  rl   r@   r>   r  r    s    )r@   r  c                        e Zd ZddZd Zd Zy)SimpleEstimatorCustomLogicNc                 N    || _         d|i| _        |j                  d   | _        | S r  )r  r  r  r  r  s      r>   r  zSimpleEstimatorCustomLogic.fit  s)    Qx771:r@   c                 $    t        || dd       |S r  r  r  s     r>   r  z"SimpleEstimatorCustomLogic.predict  r   r@   c                      || j                         | _         | j                  j                         D ci c]  \  }}| ||       c}}| _        d| _        | S c c}}w )NT)r  r  items
converted_)r   	converterkvs       r>   __sklearn_array_api_convert__z8SimpleEstimatorCustomLogic.__sklearn_array_api_convert__	  sW    DGG$48LL4F4F4HI4HDAq9Q<4HI 	 Js   Ar   )r   r   r   r  r  r.  rl   r@   r>   r%  r%    s    r@   r%  zarray_namespace, converterc                 >    | j                         j                         S r   )rD   rI   r   s    r>   <lambda>r1    s    		 1 1 3r@   c                 ,    t        j                  |       S r   )rI   rJ   r0  s    r>   r1  r1    s    5==+?r@   c                 "    | j                         S r   )ru   r0  s    r>   r1  r1    s
    uyy{r@   c                    t        j                  |       }|j                  ddgg      }t        d      5  t	               j                  |      }|j                  |       t        ||      }t        |j                  t        j                        sJ t        |t        d      }t        |j                  t        j                        sJ 	 ddd       y# 1 sw Y   yxY w)z(Convert estimator attributes to ndarray.r   r   TrT   rD   r*   N)rL   rp   rJ   r   r  r  r  r   rV   r  rI   rW   r$   )r   r+  rx   r5   estnew_ests         r>   !test_convert_estimator_to_ndarrayr7    s     
		_	-B


S#J< A	4	0##A&A23	B'**emm444#Cu='**emm444 
1	0	0s   BCCc                     t        j                  d      t        j                  ddgg      } t	               j                  |       }t        |fd      }t        |j                  d      sJ t        d      5  t        |d       }t        |j                        d	   k(  sJ t        |j                  d
         d	   k(  sJ t        |j                  d	         d	   k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nrh   r   r   c                 &    j                  |       S r   )rJ   )r   rx   s    r>   r1  z:test_convert_estimator_with_custom_logic.<locals>.<lambda>1  s    "**UBSr@   __array_namespace__TrT   r*   r   r5   )rL   rp   rI   rJ   r  r  r   r   r  r   r$   r!   r  r  )ry   r5  r6  rx   s      @r>   (test_convert_estimator_with_custom_logicr;  *  s    			/	0B==3*&D




%C.s4STG7::4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,C11C:c                     t        j                  d      } t        j                  ddgg      }t	               j                  |      }t        d      5  t        || d       }|j                  | j                  ddgg             t        |j                        d   | k(  sJ t        |j                  d         d   | k(  sJ |j                  sJ 	 d d d        y # 1 sw Y   y xY w	Nrh   r   r   TrT   r*   r   r5   )rL   rp   rI   rJ   r%  r  r   r$   r  r!   r  r  r*  rx   ry   r5  r6  s       r>   4test_custom_conversion_estimator_to_array_api_strictr?  ;  s    			/	0B==3*&D
$
&
*
*4
0C	4	0#CD9

S#J<01WZZ(+r111W__S1215;;;!!!! 
1	0	0s   A=CC#c                  j   t        j                  d      } t        j                  ddgg      }t	               j                  |      }t        d      5  t        || d       }t        |j                        d   | k(  sJ t        |j                  d         d   | k(  sJ 	 d d d        y # 1 sw Y   y xY wr=  )rL   rp   rI   rJ   r  r  r   r$   r!   r  r  r>  s       r>   *test_convert_estimator_to_array_api_strictrA  L  s    			/	0B==3*&D




%C	4	0#CD9WZZ(+r111W__S1215;;;	 
1	0	0s   AB))B2c                  p   t        j                  d      } t        d      5  t               j	                  | j                  ddgg            }t        j                  t        d      5  |j                  t        j
                  dg             d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)	Nrh   TrT   r   r   z.*must use the same namespacerF   r   )
rL   rp   r   r  r  rJ   rM   rN   r  rI   )rx   r5  s     r>   test_check_fitted_attributerC  Z  s    			/	0B	4	0##BJJc
|$<=]]:-LMKKqc*+ N 
1	0 NM 
1	0s$   AB,)&B B, B)	%B,,B5r   c                 X   t        j                  d      }t        d      5  t               j	                  t        j                  ddgg            }|j                  |        |j                          |j                  |        |j                  t        j                  ddgg             t               j	                  |j                  ddgg            }t        j                  t        d      5  |j                  |        ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)	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.
    rh   TrT   r   r   zArray namespace.*not compatiblerF   N)rL   rp   r   r  r  rI   rJ   r  r#  rM   rN   )r5   rx   r5  s      r>   0test_check_fitted_attribute_with_non_array_inputrE  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 1DD D	D  D)c                     t        | ||      \  }}t        rt        |      |j                  k(  sJ y t        |      |j                  k(  sJ y r   )r-   r1   r#   int32int64)r   r   r   rx   r+   s        r>   test_indexing_dtyperI  ~  sG    
 &ijIJBb!RXX---b!RXX---r@   c                     t        | |      \  }}	 |j                  dg|j                  |       |j                  }t        ||      |k(  sJ y # t        $ r |j                  }Y )w xY w)N        )r   r+   )r-   rJ   float64	Exceptionfloat32r   )r   r   r   rx   r+   expected_dtypes         r>   test_max_precision_float_dtyperP    sm    
 &i=JB$


C5

6
: &b&1^CCC  $ $s   +A A&%A&invertassume_uniqueelement_size)r`   rB   r   	int_dtype)int16rG  rH  uint8c                 
   t        | ||      \  }}|dz  }	dt        j                  |      j                  |	df      j	                  |      z  }
t        j
                  t        j                  d      |      }|j                  |
|      }|j                  ||      }t        j                  |
|||      }t        d      5  t        |||||      }d d d        t        t        t        d	
      |       y # 1 sw Y   &xY w)Nr8   r   r   r*   )elementtest_elementsrR  rQ  TrT   )rX  rY  rx   rR  rQ  rD   r   )r-   rI   arangereshapeastyper   rJ   isinr   r   r/   r%   )r   r   r   rQ  rR  rS  rT  rx   r+   rrX  rY  
element_xptest_elements_xpr   r   s                   r>   	test_isinra    s    " &o{JOJBA%,,|,44aV<CCINNGKKR 0	BMGF3Jzz-z?zz##	H 
4	0*'
 
1 wv%>I 
1	0s   C99Drj   ro   zSCIPY_ARRAY_API not set to 1.)reasonc                  t   t        j                  d      } ddlm} | j	                  dd      }t        j                  d      }t        |      \  }}}|t        |      d   u sJ |rJ |J t        d      5  t        |      \  }}}||u sJ |sJ ||j                  k(  sJ 	 d d d        y # 1 sw Y   y xY w)	Nr   r   )r   r9   rD   r*   TrT   )
rL   rp   "sklearn.externals.array_api_compatr   rZ  rI   r"   r!   r   r+   )r   torch_compatsome_torch_tensorsome_numpy_arrayr   is_array_apir+   s          r>   test_get_namespace_and_deviceri    s    
 (EHQu5||A '??P&Q#I|V&67::::>> 
4	0*BCT*U'	<L(((|*11111	 
1	0	0s   9+B..B7csr_containerr   )r   r7   Nr   r   sample_weight_type)Nintfloatc                 R   ddl m} t        | ||      \  }}t        j                  g dg dg dg dg dg      }	|dk(  rt        j
                  g d	      }
n!|d
k(  rt        j
                  g d|      }
nd }
 | ||	      ||
      }|j                  |	|      }t        d      5  t        |||
||      }d d d        t        t        t        d      |       t        t        d      k  st        t        d      k\  rt        |      t        |      k(  sJ y y # 1 sw Y   dxY w)Nr   )count_nonzero)r   r9   r   )r8   r   r   )r   r   r   )r   r   r   r_   r   r   rl  )r7   r8   r8   r9   r7   rm  )g      ?r   r   g	@g333333@r   )r   sample_weightr*   TrT   )r   rq  rx   r+   rD   r   r   r   )sklearn.utils.sparsefuncsro  r-   rI   r   rJ   r   r   r   r%   r3   r4   r   )r   r   r   rj  r   rk  sparse_count_nonzerorx   r+   r   rq  r   r   r   s                 r>   test_count_nonzerort    s    P%o{JOJBKKJ	9iPQEU"o6	w	&&?zR#e4}H zz%z/H	4	04}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                     t        dd      \  }}t        j                  t        |      5  t	        | ||       ddd       y# 1 sw Y   yxY w)z:Check `_validate_diagonal_args` raises the correct errors.rI   Nr~   rF   )r-   rL   rM   rN   r   )r   valuerG   rx   rP   s        r>   test_validate_diagonal_argsrw    s:     !d;EB	z	/ub1 
0	/	/s   AAfunctionfilladdc_contiguityc                    t        dd      \  }}| rt        j                  d      }nt        j                  d      j                  }|j                  d   | k(  sJ |dk(  rt
        }nt        } ||d|       t        |j                         t        j                  d              ||g d	|       |dk(  rt        j                  d
      }n+t        j                  d      t        j                  d
      z   }t        |j                         |       t        j                  g d      } ||||       |dk(  r|}n.|t        j                  d
      z   t        j                  d      z   }t        |j                         |       y)zBCheck `_fill/add_to_diagonal` behaviour correct with numpy arrays.rI   Nr~   r9   r_   r   ry  r7   )r9   )r   r7   r8   r9   )r   r      )r-   rI   rO   Tr   r   r
   r   diagonalonesrZ  r   )r{  rx  rx   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                 P   t        |||      \  }}t        j                  d|      }| dk(  r8|j                  |j	                         |      j
                  }|j
                  }n`| dk(  r:|j                  |j	                         |      ddddddf   }|ddddddf   }n!|j                  |j	                         |      }t        j                  |d	       t        d
      5  t        |d|       ddd       t        t        |t        d      |       y# 1 sw Y   &xY w)zHCheck array API `_fill_diagonal` consistent with `numpy._fill_diagonal`.)r_   r   r   r  r*   r  Nr8   r7   )valTrT   rv  rx   rD   r   )r-   rI   rO   rJ   copyr  fill_diagonalr   r   r/   r%   )r   r   r   r   rx   r+   array_npr   s           r>   test_fill_diagonalr  E  s     &o{J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                 n   t        | ||      \  }}t        dd      \  }}t        j                  d|      }|j                  |j	                         |      }g d}	t        ||	|       t        d	
      5  t        ||	|       ddd       t        t        |t        d      |       y# 1 sw Y   &xY w)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   rx   r+   np_xprP   r  r   add_vals
             r>   test_add_to_diagonalr  _  s     &o{JOJB#G>HE1{{64Hzz(--/&z9HG87u5	4	0xw26 
1 wxE%@(K 
1	0s   7B++B4dispatchc                    t        j                  dg      }|rt        |dd       nd } | t        j                  dgg             | t        j                  dgg            }}|r*t        j                  j                  d      t        d      t        |      5  t        ||      J t        ||      |k(  sJ t        ||      d   J t        ||      d   |k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr7   r+   r8   rj   z8SCIPY_ARRAY_API is not set: not checking array_api inputrT   )
rI   r   getattrrs   rt   ru   r,   r   r   r"   )rj  r  np_arrexpected_numpy_array_deviceabs         r>   test_sparse_devicer  s  s     [[!FEM'&(D"ASWqcU+,mEKK!<N.OqABJJNN#45=QRR	8	41%---6*.IIII'1-a0888'62159TTTT	 
5	4	4s   AC))C2)Nr   r7   c                 
   t        | ||      \  }}t        j                  j                  d      }|j	                  ddd      j                  |      }t        j                  ||      }|j                  ||      }	t        d	      5  t        |	|      }
|j                  d
k7  r.t        |
      d   |k(  sJ |
j                  |	j                  k(  sJ d d d        t        |t        
t        d             y # 1 sw Y   &xY w)Nr   rK  r   )r   r_   )lowhighsizer   r*   TrT   rh   rD   r   )r-   rI   randomRandomStateuniformr\  medianrJ   r   r   r   r!   r+   r   r%   )r   r   r   r   rx   r+   rngry   	result_nprz   	result_xps              r>   test_medianr    s     &ijIJB
,,
"
"1
%C;;3Sv;6==jIDT-I::d6:*D	4	0Dt,	;;,, !+A."444##t{{222 
1 IwyU5IJ 
1	0s   	AC99Dc                 ,   dt        |      v rdnd}t        | ||      \  }}t        d      5  t        j                  ddd      j                  |      }|j                  ||	      }t        t        t        |      t        d
      t        |      |       t        j                  ddd      j                  |      }|j                  ||	      }t        t        t        |      t        d
      t        |      |       d d d        y # 1 sw Y   y xY w)NrN  ư>-q=TrT   i     r*   rD   r   rtolr   r7   )strr-   r   rI   linspacer\  rJ   r   r%   r   r   r   r   )r   r   r   r  rx   r+   x_npx_xps           r>   test_expit_logitr    s    
 J/4UD%ijIJB	4	0~~c2t,33J?zz$vz.F4LU59$K	
 ~~aD)00<zz$vz.F4LU59$K	
 
1	0	0s   CD

D)r   r7   Nc                    t        | ||      \  }}t        j                  g dg dg dddt        j                   gg dg|      }|j                  ||      }t        j
                  j                  ||	      }d
t        |      v rdnd}	| dk(  r|dk(  s| dk(  r&dt        |      v rt        t        ||	      ||	       t        d      5  t        ||	      }
t        |
t        d      }
t        ||
|	       d d d        t        j                  dt        j                  dgg dt        j                  ddgddt        j                   gg dg|      }|j                  ||      }t        j
                  j                  ||	      }t        d      5  t        ||	      }t        |t        d      }t        |||	       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r9   r  r8   r   r  ir   r   ir   rp  r   r*   r   rN  r  r  r   rD   rh   CPUr  TrT   r   r   r  )r-   rI   rJ   infscipyspecial	logsumexpr  r   r   r   r%   nan)r   r   r   r   rx   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    &o{JOJB}}!eiiZ 	
 	H zz(6z2H]]$$XD$9FJ/4UD 	7"{e';--%3{;K2K
8$7dK	4	0H40E%8T2 
1 		4 YY1!eiiZ 	
 	J Jv6J}}&&z&=H	4	0jt48e<(6 
1	0) 
1	0( 
1	0s   .G.GGG#c                    t        ddd      \  }}t        j                  g dg dg dgt        j                        }|j                  ||	      }t	        d
      5  t        ||       }d d d        j                  |j                  k(  sJ t        t        |t        d      t        j                  j                  ||       d       y # 1 sw Y   bxY w)Nr   mpsrN  )r   r   r  r  r  r   r*   TrT   r   rD   r   r  r  )r-   rI   rJ   rH  r   r   r   rN  r   r%   r  r  r  )r   rx   r+   r  r   r  s         r>   7test_logsumexp_integer_array_api_on_float32_only_devicer    s    %g5YWJB }}	}k2%++H zz(6z2H	4	0H40 
1 <<2::%%%5/t4	 
1	0s   CC)r   device_expected_types))rI   NrL  rN  float16)rh   N)rL  rN  )r   rD   r  )r   rH   r  )r   r  )rN  r  c                 v    t        | |      \  }t        |      }t        fd|D              }||k(  sJ y )Nr~   r*   c              3   6   K   | ]  }t        |        y wr   )r  ).0r   rx   s     r>   	<genexpr>z-test_supported_float_types.<locals>.<genexpr>  s     N~WR,~s   )r-   r'   tuple)r   r  r  r+   float_typesr   rx   s         @r>   test_supported_float_typesr    s?     &iWEJB(F;KN~NNH("""r@   use_sample_weightc                 f   d}d}t         j                  j                  d      }|j                  d||      j	                  |      }|j                  ||      j	                  |      }t        |||      \  }	}
|	j                  ||
      }|	j                  ||
      }| r1t        j                  |      }d|ddd<   |	j                  ||
      }nd	\  }} t        |
      |||      }t        d      5  t        ||||	      }ddd       t        j                  |      sJ y# 1 sw Y   "xY w)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_predictionrq  TrT   )r  predrq  rx   )rI   r  r  randintr\  randr-   rJ   	ones_liker   r   r   isclose)r  r   r   r   	n_samplesr  r  r  r  rx   r+   y_xppred_xprq  sample_weight_xpnp_lossxp_losss                    r>   test_half_multinomial_lossr    s*    II
,,
"
"2
&CAy),33J?A88Iy)00<D%ijIJB::a:'Djjfj-G*add::mF:C*4''6!I6]G 
4	0(0@R
 
1
 =='*** 
1	0s   6D''D0c                    t        | ||      \  }}t        j                  d      j                  |      }|j	                  ||      }t        d      5  t        ||      }d d d        |j                  k(  sJ y # 1 sw Y   xY w)Nr  r*   TrT   r  )r-   rI   rZ  r\  rJ   r   r   r   )r   r   r   rx   r+   ry   rz   	ret_dtypes           r>   test_matching_numpy_dtyper  =  su    
 &ijIJB<<$$Z0D::d6:*D	4	0)$26	 
1

""" 
1	0s   A<<B){rs   	functoolsr   rI   rL   r  scipy.sparsesparserd   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   rb   rf   r{   paramr   r   r   r   r   rq   rN   ZeroDivisionErrorr   r   r   r  r  r   r   r	  r  r  r%  r7  r;  r?  rA  rC  re   rE  rI  rP  ra  skipifrt   ru   ri  rt  r   rw  r  r  r  r  r  r  r  r  r  r  r  )argss   0r>   <module>r     sR   	      ) & * - &! ! ! ! ! ! ! ! !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EKK!Q!Q()EKK!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=
