
    {KgFN                     h   d dl Z d dlmZ d dlZd dlZd dlmZ d dlmZ 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 d dlmZm Z  d dl!m"Z"m#Z#m$Z$m%Z% ejL                  jO                  d	 ejP                  g d
      g d
g      d        Z)d Z*e d        Z+e d        Z, G d de      Z-d Z.ejL                  jO                  dddg      d        Z/d Z0ejL                  jO                  d e             ejL                  jO                  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 d)fg d*ddd+d,gfg d
g d
gd dg dfg d-g d.gddddgfd/dd dg d0fdddd1d2gfddgd dg d
fg d ddd3d4gfd#d$gd dg d5fg d&ddd6d7gfddgd dg d8fg d*ddd4d9gfg d
g d
gd dg d:fg d-g d.gddd;d<gfg      d=               Z1ejL                  jO                  d> ed?            d@        Z2ejL                  jO                  d> ed?            ejL                  jO                  dAdddge3dBfd ddgge4e3fdCfd g dDe4dCfd dEdge5dFff      dG               Z6dH Z7dI Z8e ejL                  jO                  dJg dK      ejL                  jO                  dLddejr                  gedfddMejr                   gedMfejt                  ejt                  geejt                  fg d
ejr                  ejr                  ejr                  gg dNg eed O      g dPfg d
ejr                  ejr                  ejr                  gg dNg eedO      dQejr                  dRgfddejr                  gedfddejr                  gedfejt                   ejt                   geejt                   fg d
ejr                  ejr                  ejr                  gg dNg eed O      g dSfg d
ejr                  ejr                  ejr                  gg dNg eedO      dTejr                  dUgfg
      dV                      Z;ejL                  jO                  dW e             dX        Z<e ejL                  jO                  dJg dY      dZ               Z=d[ Z> G d\ d]e
      Z?e ejL                  jO                  d^d_d` fdda fdbdc fg      dd               Z@e de        ZAdf ZBejL                  jO                  dgeeg      dh        ZCejL                  jO                  dW e             di        ZDdj ZEejL                  jO                  d e             ejL                  jO                  dke#      ejL                  jO                  dlg dm      ejL                  jO                  dng do      dp                             ZFy)q    N)partial)assert_allclose)config_context)BaseEstimator)_ArrayAPIWrapper_asarray_with_order_atol_for_type_average_convert_to_numpy_count_nonzero _estimator_with_converted_arrays_is_numpy_namespace_nanmax_nanmin_NumPyAPIWrapper_raveldeviceget_namespaceget_namespace_and_deviceindexing_dtypesupported_float_dtypes)yield_namespace_device_dtype_combinations)_array_api_for_tests'skip_if_array_api_compat_not_configured)	_IS_32BITCSR_CONTAINERS
np_versionparse_versionX         c                 L    t        |       \  }}t        |t              sJ |rJ y)z.Check that get_namespace returns NumPy wrapperN)r   
isinstancer   )r   xp_outis_array_api_compliants      f/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/utils/tests/test_array_api.py"test_get_namespace_ndarray_defaultr)   %   s1     &31%5"F"f.///%%%%    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.r    
          @cpu)
fill_valuer   zUnsupported devicematchcudar   N)	numpyasarrayr   fullr   pytestraises
ValueErrorzeros)r   r&   _
full_arrays       r(   *test_get_namespace_ndarray_creation_devicer=   -   sm    i Aa IFARC>JJ
+	z)=	>R' 
?	>	>s   %BBc                     t        j                  d      } t        j                  g dg      }t	        d      5  t        |      \  }}|sJ t        t        d      k\  r
|t        u sJ || j                  u sJ ddd       y# 1 sw Y   yxY w)z%Test get_namespace on NumPy ndarrays.array_api_compatr    Tarray_api_dispatch2.0.0N)r7   importorskipr4   r5   r   r   r   r   )r?   X_npr&   r'   s       r(   (test_get_namespace_ndarray_with_dispatchrE   9   s     **+=>==)%D	4	0)6t)<&&%%%w//U?"? -33333 
1	0	0s   ?BBc                  `   t        j                  d      } t        j                  g dg      }| j                  |      }t	        d      5  t        |      \  }}|sJ 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)z'Test get_namespace for ArrayAPI arrays.array_api_strictr    Tr@   N)r7   rC   r4   r5   r   r   r8   	TypeError)xprD   X_xpr&   r'   s        r(   test_get_namespace_array_apirK   K   s     
		/	0B==)%D::dD	4	0)6t)<&&%%%]]9%-:4-F*F* &	 
1	0 &%	 
1	0s$   ,B$7BB$B!	B$$B-c                   "     e Zd ZdZ fdZ xZS )_AdjustableNameAPITestWrapperz:API wrapper that has an adjustable name. Used for testing.c                 4    t         |   |       || _        y )N)array_namespace)super__init____name__)selfrO   name	__class__s      r(   rQ   z&_AdjustableNameAPITestWrapper.__init__]   s    9r*   )rR   
__module____qualname____doc__rQ   __classcell__)rU   s   @r(   rM   rM   Z   s    D r*   rM   c                     t        j                  d      } t        | d      }t        |      }|j	                  g dg dg|j
                        }|j                  ||j                        }|j                  |j                  k(  sJ |j	                  ||j                        }|j                  |j                  k(  sJ y)z6Test _ArrayAPIWrapper for ArrayAPIs that is not NumPy.rG   r    r#         dtypeN)	r7   rC   rM   r   r5   float64astypefloat32r_   )rG   xp_rI   r   X_converteds        r(   test_array_api_wrapper_astypere   b   s    **+=>
'(8:L
MC	#	B


Y	*2::
>A))Arzz*K

*****Qbjj*1K

***r*   	array_apir4   rG   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.333333?333333@gffffff@ForderrI   F_CONTIGUOUSN)r7   rC   r5   r   r4   flags)rf   rI   r   X_newX_new_nps        r(   test_asarray_with_orderrr   p   sP     
		Y	'B


?#A4E}}U#H>>.)))r*   c                  ,   t        j                  d      } t        | d      }t        j                  g dg dgd      }|j	                  |      }t        |d|      }t        j                  |      }|j                  d   sJ |j                  d	   rJ y
)z<Test _asarray_with_order ignores order for Generic ArrayAPI.rG   rh   )rj   g      @ri   Crm   rk   rl   C_CONTIGUOUSrn   N)r7   rC   rM   r4   r5   r   ro   )rI   rc   r   rp   rq   s        r(   test_asarray_with_order_ignoredrw   |   s    			/	0B
',>
?C8DAAA5E}}U#H>>.)))~~n----r*   z$array_namespace, device_, dtype_namez"weights, axis, normalize, expected)NNT      @T)g      @rx         @r!   r"   r]   F)TTF      ?ry   皙?g?)g?g@g@)r{   皙?r|   g      ?g      @r[   )r!   r!   r"   g      @g      @)r!   r"   r!   )r"   r"   r"   )NNF   )r]      	         r#   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	        ||||      }	d d d        t
        t        d      k  st
        t        d	      k\  rt        |      t        	      k(  sJ t        	|      }	t        |	|t        |      
       y # 1 sw Y   jxY w)Nr    r\   r]   r   r^   r3   Tr@   )axisweights	normalizerB   2.1.0)atol)r   r4   r5   r   r
   r   r   r   r   r   r	   )
rO   device_
dtype_namer   r   r   expectedrI   array_inresults
             r(   test_averager      s    F 
ow	7B}}i3:FHzz(7z3H--z:**WW*5	4	0(w)T 
1 M'**jM'<R.R h6&>111vr*FFH>*+EF 
1	0s   5C..C7z#array_namespace, device, dtype_name)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)Nr"   r   r^   y              ?r\   r#   z does not support r3   z;Complex floating point values are not supported by average.Tr@   r0   )r   r4   r5   r_   rT   hasattrr7   skipr   r8   NotImplementedErrorr
   )rO   r   r   rI   r   complex_type_nameerr_msgs          r(   $test_average_raises_with_wrong_dtyper      s    
 
ov	6B}}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%%C.zaxis, weights, error, error_msgzAxis must be specifiedr   )r!   r"   r#   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)	Nr    r   r^   r3   Tr@   r0   )r   r   )r   r4   r5   r   r7   r8   r
   )	rO   r   r   r   r   error	error_msgrI   r   s	            r(   +test_average_raises_with_invalid_parametersr      s    @ 
ov	6B}}i3:FHzz(6z2HmmG:6Gjjj0G	4	0&--Y2Wg6 3X	0	02W2W	0	0s$   3B7B+B7+B4	0B77C c                  D   t        j                  d      } t        j                  t        |       5  t                d d d        t        j                  d      } t        j                  t        |       5  t        d d       d d d        y # 1 sw Y   OxY w# 1 sw Y   y xY w)NzzAt least one input array expected after filtering with remove_none=True, remove_types=[str]. Got none. Original types: [].r0   zAt least one input array expected after filtering with remove_none=True, remove_types=[str]. Got none. Original types: [NoneType, str].rT   )reescaper7   r8   r9   r   )r   s    r(   test_device_raises_if_no_inputr     sy    ii	<G 
z	1 
2 ii	IG 
z	1tV 
2	1 
2	1 
2	1s   B
4B
BBc                      G d d       G fdd      } t        j                  t              5  t         | d      j                         d d d        d}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 y # 1 sw Y   xY w# 1 sw Y   wxY w)
Nc                   $    e Zd Zd Zd Zd Zd Zy)&test_device_inspection.<locals>.Devicec                     || _         y NrT   )rS   rT   s     r(   rQ   z/test_device_inspection.<locals>.Device.__init__  s	    DIr*   c                 4    | j                   |j                   k(  S r   r   )rS   r   s     r(   __eq__z-test_device_inspection.<locals>.Device.__eq__  s    99++r*   c                     t        d      )NzDevice object is not hashable)rH   rS   s    r(   __hash__z/test_device_inspection.<locals>.Device.__hash__  s    ;<<r*   c                     | j                   S r   r   r   s    r(   __str__z.test_device_inspection.<locals>.Device.__str__!  s    99r*   N)rR   rV   rW   rQ   r   r   r    r*   r(   Devicer     s    		,	=	r*   r   c                       e Zd Z fdZy)%test_device_inspection.<locals>.Arrayc                       |      | _         y r   r3   )rS   device_namer   s     r(   rQ   z.test_device_inspection.<locals>.Array.__init__%  s     -DKr*   N)rR   rV   rW   rQ   )r   s   r(   Arrayr   $  s    	.r*   r   r   z.Input arrays use different devices: cpu, mygpur0   r.   mygpu)r7   r8   rH   hashr   r9   )r   r   array1array2r   s       @r(   test_device_inspectionr     s     . . 
y	!U8_##$ 
" ?G	z	1uU|U7^, 
2 8_F8_F==F6N***==F662222==F666:::: 
"	!
 
2	1s   C52D5C>D
library)r4   rG   torchzX,reduction,expected)r\   r]         @)r         ?r-         @r         @)r   g      @r   r   r   c                     t        j                  |       }t        d      5   ||j                  |            }ddd       t	        |      }t        ||       y# 1 sw Y   "xY w)z-Check NaN reductions like _nanmin and _nanmaxTr@   N)r7   rC   r   r5   r   r   )r   r   	reductionr   rI   r   s         r(   test_nan_reductionsr   @  sU    F 
		W	%B	4	02::a=) 
1 vr*FFH%	 
1	0s   AA$znamespace, _device, _dtypec                 t   t        | |      }g dg dg dg dg}|j                  ||      }t        d      5  t        |      }d d d        t	        |      }t        j                  |d	      }t        ||       t        |      r%t        j                  |      j                  d
   sJ y y # 1 sw Y   ixY w)Nr    r   )r~   r   r   )r,      r   r3   Tr@   rt   ru   rv   )
r   r5   r   r   r   r4   ravelr   r   ro   )	namespace_device_dtyperI   arrayarray_xpr   r   s           r(   
test_ravelr   l  s     
i	1B	9l;Ezz%z0H	4	0! 
1 vr*F{{5,HHf%2}}V$**>:::  
1	0s   B..B7)cupyr   cupy.array_apic                 \   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   r2   r3   rI   N)
r7   rC   backendsr2   is_builtr   r5   r   r4   r   )r   rI   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   r.   r3   r   N)r7   rC   r5   r   r4   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y)SimpleEstimatorNc                 <    || _         |j                  d   | _        | S )Nr   )X_shapen_features_)rS   r   ys      r(   fitzSimpleEstimator.fit  s    771:r*   r   )rR   rV   rW   r   r   r*   r(   r   r     s    r*   r   zarray_namespace, converterr   c                 >    | j                         j                         S r   )r.   r4   r   s    r(   <lambda>r     s    		 1 1 3r*   c                 ,    t        j                  |       S r   )r4   r5   r   s    r(   r   r     s    5==+?r*   r   c                 6    | j                   j                         S r   )_arraygetr   s    r(   r   r     s    )9)9);r*   c                     t        j                  |       }|j                  ddgg      }t               j	                  |      }t        ||      }t        |j                  t        j                        sJ y)z(Convert estimator attributes to ndarray.r   ry   N)
r7   rC   r5   r   r   r   r%   r   r4   ndarray)rO   	converterrI   r   estnew_ests         r(   !test_convert_estimator_to_ndarrayr     s_     
		_	-B


S#J< A




"C.sI>Ggjj%--000r*   c                      t        j                  d      t        j                  ddgg      } t	               j                  |       }t        |fd      }t        |j                  d      sJ y)z0Convert estimator attributes to ArrayAPI arrays.rG   r   ry   c                 &    j                  |       S r   )r5   )r   rI   s    r(   r   z5test_convert_estimator_to_array_api.<locals>.<lambda>  s    "**UBSr*   __array_namespace__N)	r7   rC   r4   r5   r   r   r   r   r   )rD   r   r   rI   s      @r(   #test_convert_estimator_to_array_apir     s_     
		/	0B==3*&D




%C.s4STG7::4555r*   c                  n   t               } | j                  g dg dg      }| j                  |dd      }|j                  |u sJ | j                  |dd      }|j                  |j                  usJ t	        j
                  t        d	      5  | j                  |d
       ddd       y# 1 sw Y   yxY w)zDCheck reshape behavior with copy and is strict with non-tuple shape.r    r[   )r   F)copy)r   r!   Tzshape must be a tupler0   r   N)r   r5   reshapebaser7   r8   rH   )rI   r   	X_no_copyX_copys       r(   test_reshape_behaviorr     s    		B


Iy)*A

1e%
0I>>QZZ6Z-F;;aff$$$	y(?	@


1b 
A	@	@s   B++B4wrapperc                 t   | t         k(  r!t        j                  d      }t        |      }n
t               }|j	                  |j
                  |j
                        sJ |j	                  |j
                  d      sJ |j	                  |j                  d      sJ |j	                  |j                  d      rJ t        |      D ]  }|j	                  |d      rJ  |j	                  |j                  d      sJ |j	                  |j
                  d      rJ |j	                  |j                  d      sJ |j	                  |j                  d      rJ |j	                  |j                  d      sJ |j	                  |j                  d      rJ |j	                  |j                  d      sJ |j	                  |j
                  d      sJ |j	                  |j                  d      sJ |j	                  |j
                  d      rJ | t        k(  rZ|j	                  |j                  d      rJ |j	                  |j                  d      sJ |j	                  |j                   d      sJ t        j"                  t$        d	      5  |j	                  |j                  d
      sJ 	 ddd       y# 1 sw Y   yxY w)zGTest isdtype implementation from _ArrayAPIWrapper and _NumPyAPIWrapper.rG   zreal floatingboolzsigned integerzunsigned integernumericzcomplex floatingzUnrecognized data typer0   unknownN)r   r7   rC   r   isdtyperb   r`   int32r   r  int16uint32uint16int64int8	complex64
complex128r8   r9   )r  rc   rI   r_   s       r(   $test_get_namespace_array_api_isdtyper    s6    ""!!"45c"::bjj"**---::bjj/222::bjj/222zz"((O444'+zz%111 , ::bggv&&&zz"**f---::bhh 0111zz"))%5666::bii!3444zz"(($6777::bhh	***::bjj),,,::bii+++zz"**&8999""::bgg'9:::zz",,(:;;;zz"--);<<<	z)A	Bzz"((I... 
C	B	Bs   J..J7c                     t        | |      }t        rt        |      |j                  k(  sJ y t        |      |j                  k(  sJ y r   )r   r   r   r  r  )r   r   r   rI   s       r(   test_indexing_dtyper    sA     
i	1Bb!RXX---b!RXX---r*   c                     t        j                  d      } t        j                  d      }| 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   zarray_api_compat.torchr#   r.   r3   r   Tr@   )r7   rC   aranger4   r   r   r   r   )r   xp_torchsome_torch_tensorsome_numpy_arrayr   is_array_apir   s          r(   test_get_namespace_and_devicer    s    (E""#;<HQu5||A '??P&Q#I|V&67::::>> 
4	0*BCT*U'	<H$$$|*11111	 
1	0	0s   +B==Ccsr_containerr   )r   r!   Nr   r   sample_weight_type)Nintfloatc                 @   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        t        d      k  st        t        d      k\  rt        |      t        |      k(  sJ y y # 1 sw Y   _xY w)Nr   )count_nonzero)r   r#   r   )r"   r   r   )r   r   r   )r   r   r~   )r\   r   r]   r  )r!   r"   r"   r#   r!   r  )g      ?rz   r   g	@g333333@r^   )r   sample_weightr3   Tr@   )rI   r   r   r  r   rB   r   )sklearn.utils.sparsefuncsr  r   r4   r   r5   r   r   r   r   r   r   r   )rO   r   r   r  r   r  sparse_count_nonzerorI   r   r  r   r   r   s                r(   test_count_nonzeror"  !  s    P	ow	7BKKJ	9iPQEU"o6	w	&&?zR#e4}H zz%z0H	4	0G$m
 
1
 %f4h?M'**jM'<R.R h6&>111 /S 
1	0s   %DD)Gr   	functoolsr   r4   r7   numpy.testingr   sklearn._configr   sklearn.baser   sklearn.utils._array_apir   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   sklearn.utils._testingr   r   sklearn.utils.fixesr   r   r   r   markparametrizer5   r)   r=   rE   rK   rM   re   rr   rw   r   r   rH   r9   ZeroDivisionErrorr   r   r   naninfr   r   r   r   r   r   r   r   r  r  r  r"  r   r*   r(   <module>r/     s   	    ) * &    ( U T }u}}Y7CD& E&	( )4 )4" )G )G$4 + w0B&CD* E*. *,U,W ( 	 	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;@G, )-uM	* )-tL % F$		
 VH#	
 		
 
RG&(RS)273	:7 $;T )$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!	
->&? L )B&  "K"M;;" )$GH, I ), ,m  ) 	34	?@	;<1 )1 )6 )6 %57G$HI&/ J&/R  "K"M..22 *,U,W .9!56-/EF2 G 7 :2r*   