
    UgFN                     *   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j&        '                    d	 ej(        g d
          g d
g          d             Z)d Z*e d             Z+e d             Z, G d de          Z-d Z.ej&        '                    dddg          d             Z/d Z0ej&        '                    d e                      e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 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j&        '                    d> ed?                    d@             Z2ej&        '                    d> ed?                    ej&        '                    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j&        '                    dJg dK          ej&        '                    dLddej9        gedfddMej9         gedMfej:        ej:        geej:        fg d
ej9        ej9        ej9        gg dNg eed O          g dPfg d
ej9        ej9        ej9        gg dNg eedO          dQej9        dRgfddej9        gedfddej9        gedfej:         ej:         geej:         fg d
ej9        ej9        ej9        gg dNg eed O          g dSfg d
ej9        ej9        ej9        gg dNg eedO          dTej9        dUgfg
          dV                                     Z;ej&        '                    dW e                      dX             Z<e ej&        '                    dJg dY          dZ                         Z=d[ Z> G d\ d]e
          Z?e ej&        '                    d^d_d` fdda fdbdc fg          dd                         Z@e de             ZAdf ZBej&        '                    dgeeg          dh             ZCej&        '                    dW e                      di             ZDdj ZEej&        '                    d e                      ej&        '                    dke#          ej&        '                    dlg dm          ej&        '                    dng do          dp                                                 ZFdS )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                 `    t          |           \  }}t          |t                    sJ |rJ dS )z.Check that get_namespace returns NumPy wrapperN)r   
isinstancer   )r   xp_outis_array_api_compliants      a/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/sklearn/utils/tests/test_array_api.py"test_get_namespace_ndarray_defaultr)   %   s@     &31%5%5"F"f./////%%%%%%    c                  D   t          j        g d          } t          |           \  }}|                    ddd          }t	          |dgdz             t          j        t          d          5  |                    dd	           d
d
d
           d
S # 1 swxY w Y   d
S )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=   -   s    iii  Aa  IFARC>>JJ
+++	z)=	>	>	> ( (R'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s   0BBBc                  8   t          j        d          } t          j        g dg          }t	          d          5  t          |          \  }}|sJ t          t          d          k    r|t          u sJ n|| j        u sJ ddd           dS # 1 swxY w Y   dS )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	0	0 4 4)6t)<)<&&%%%%w////U????? -333334 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s   ABBBc                     t          j        d          } t          j        g dg          }|                     |          }t	          d          5  t          |          \  }}|sJ t          j        t                    5  t          ||          \  }}ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )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   sn    
	/	0	0B=)))%%D::dD	4	0	0	0 G G)6t)<)<&&%%%%]9%% 	G 	G-:4-F-F*F*	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G	G G G G G G G G G G G G G G G G G Gs6   0B9B!B9!B%	%B9(B%	)B99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                 Z    t                                          |           || _        d S )N)array_namespace)super__init____name__)selfrO   name	__class__s      r(   rQ   z&_AdjustableNameAPITestWrapper.__init__]   s)    999r*   )rR   
__module____qualname____doc__rQ   __classcell__)rU   s   @r(   rM   rM   Z   s>        DD        r*   rM   c                  f   t          j        d          } t          | d          }t          |          }|                    g dg dg|j                  }|                    ||j                  }|j        |j        k    sJ |                    ||j                  }|j        |j        k    sJ dS )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
M
MC	#		B


YYY			*2:
>>A))Arz**K
******Qbj*11K
******r*   	array_apir4   rG   c                     t          j        |           }|                    g d          }t          |d|          }t	          j        |          }|j        d         sJ dS )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   se     
	Y	'	'B


???##A444E}U##H>.))))))r*   c                  8   t          j        d          } t          | d          }t          j        g dg dgd          }|                    |          }t          |d|          }t          j        |          }|j        d         sJ |j        d	         rJ d
S )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    		/	0	0B
',>
?
?C8DDDAAA55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                 b   t          | |          }t          j        g dg dg|          }|                    ||          }|-t          j        ||          }|                    ||          }t          d          5  t	          ||||          }	d d d            n# 1 swxY w Y   t
          t          d          k     st
          t          d	          k    r"t          |          t          |	          k    sJ t          |	|          }	t          |	|t          |          
           d S )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	7	7B}iii3:FFFHzz(7z33H-z:::**WW*55	4	0	0	0 U U(w)TTTU U U U U U U U U U U U U U U M'****jM'<R<R.R.R h6&>>1111vr**FFH>*+E+EFFFFFFs   B##B'*B'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|            |                    ||          }d	}t          d
          5  t          j	        t          |          5  t          |           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )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	6	6B}aV:666em	
Aj? ? ? : H !+2()) OMM:KMMNNNzz(6z22HKG$/// )999  		                                s6   #C3?CC3C	C3"C	#C33C7:C7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|          }|                    ||          }t          j        ||          }|                    ||          }t          d          5  t	          j        ||          5  t          |||           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )	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      sf   @ 
ov	6	6B}iii3:FFFHzz(6z22HmG:666Gjjj00G	4	0	0	0 7 7&-Y2W2W2W 7 7g66667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7s6   CB7+C7B;	;C>B;	?CCCc                  `   t          j        d          } t          j        t          |           5  t                       d d d            n# 1 swxY w Y   t          j        d          } t          j        t          |           5  t          d d           d d d            d S # 1 swxY w Y   d S )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     s1   i	< G 
z	1	1	1                 i	I G 
z	1	1	1  tV                 s#   AAAB##B'*B'c                  X    G d d           G fdd          } t          j        t                    5  t           | d          j                   d d d            n# 1 swxY w Y   d}t          j        t
          |          5  t	           | d           | d	                     d d d            n# 1 swxY w Y    | d          } | d          }|j        t	          |          k    sJ |j        t	          ||          k    sJ |j        t	          |||          k    sJ d S )
Nc                   &    e Zd Zd Zd Zd Zd ZdS )&test_device_inspection.<locals>.Devicec                     || _         d S NrT   )rS   rT   s     r(   rQ   z/test_device_inspection.<locals>.Device.__init__  s    DIIIr*   c                 "    | j         |j         k    S r   r   )rS   r   s     r(   __eq__z-test_device_inspection.<locals>.Device.__eq__  s    9++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
    9r*   N)rR   rV   rW   rQ   r   r   r    r*   r(   Devicer     sP        	 	 		, 	, 	,	= 	= 	=	 	 	 	 	r*   r   c                       e Zd Z fdZdS )%test_device_inspection.<locals>.Arrayc                 (     |          | _         d S r   r3   )rS   device_namer   s     r(   rQ   z.test_device_inspection.<locals>.Array.__init__%  s     &--DKKKr*   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	!	! % %UU8__#$$$% % % % % % % % % % % % % % % ?G	z	1	1	1 - -uuU||UU7^^,,,- - - - - - - - - - - - - - - U8__FU8__F=F6NN****=F66222222=F666::::::::s#   A!!A%(A%	#B88B<?B<library)r4   rG   torchzX,reduction,expected)r\   r]         @)r         ?r-         @r         @)r   g      @r   r   r   c                     t          j        |           }t          d          5   ||                    |                    }ddd           n# 1 swxY w Y   t	          ||          }t          ||           dS )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   @  s    F 
	W	%	%B	4	0	0	0 * *2::a==))* * * * * * * * * * * * * * * vr**FFH%%%%%s   AAAznamespace, _device, _dtypec                    t          | |          }g dg dg dg dg}|                    ||          }t          d          5  t          |          }d d d            n# 1 swxY w Y   t	          ||          }t          j        |d	          }t          ||           t          |          r!t          j        |          j	        d
         sJ d S d S )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	1	1BYY			999lll;Ezz%z00H	4	0	0	0 " "!!" " " " " " " " " " " " " " " vr**F{5,,,HHf%%%2 ;}V$$*>::::; ;::s   A""A&)A&)cupyr   cupy.array_apic                 n   t          j        |           }| dk    rL|j        j                                        st          j        d           |                    g dd          }n|                    g d          }t          ||          }t          j        g d          }t          ||           dS )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'{((** 	.K,---

???6
::

???++e+++EmOOO44OE?+++++r*   c                      t          j        d          } |                     g dd          }t          ||           }t	          j        g d          }t          ||           dS )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     sf    ((EmmOOOEm::Gg%000EmOOO44OE?+++++r*   c                       e Zd ZddZdS )SimpleEstimatorNc                 8    || _         |j        d         | _        | S )Nr   )X_shapen_features_)rS   r   ys      r(   fitzSimpleEstimator.fit  s    71:r*   r   )rR   rV   rW   r   r   r*   r(   r   r     s(             r*   r   zarray_namespace, converterr   c                 N    |                                                                  S r   )r.   r4   r   s    r(   <lambda>r     s    		 1 1 3 3 r*   c                 *    t          j        |           S r   )r4   r5   r   s    r(   r   r     s    5=+?+? r*   r   c                 4    | j                                         S r   )_arraygetr   s    r(   r   r     s    )9)9);); r*   c                    t          j        |           }|                    ddgg          }t                                          |          }t          ||          }t          |j        t          j	                  sJ dS )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     ss     
	_	-	-B


S#J<  A





"
"C.sI>>Ggj%-0000000r*   c                      t          j        d          t          j        ddgg          } t	                                          |           }t          |fd          }t          |j        d          sJ dS )z0Convert estimator attributes to ArrayAPI arrays.rG   r   ry   c                 .                         |           S r   )r5   )r   rI   s    r(   r   z5test_convert_estimator_to_array_api.<locals>.<lambda>  s    "**UBSBS r*   __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|     
	/	0	0B=3*&&D





%
%C.s4S4S4S4STTG7:45555555r*   c                     t                      } |                     g dg dg          }|                     |dd          }|j        |u sJ |                     |dd          }|j        |j        usJ t	          j        t          d	          5  |                     |d
           ddd           dS # 1 swxY w Y   dS )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


IIIyyy)**A

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


1b                 s   B44B8;B8wrapperc                 r   | t           k    r$t          j        d          }t          |          }nt                      }|                    |j        |j                  sJ |                    |j        d          sJ |                    |j        d          sJ |                    |j        d          rJ t          |          D ]}|                    |d          sJ |                    |j	        d          sJ |                    |j        d          rJ |                    |j
        d          sJ |                    |j        d          rJ |                    |j        d          sJ |                    |j        d          rJ |                    |j        d          sJ |                    |j        d          sJ |                    |j        d          sJ |                    |j        d          rJ | t          k    rW|                    |j        d          rJ |                    |j        d          sJ |                    |j        d          sJ t          j        t$          d	          5  |                    |j
        d
          sJ 	 ddd           dS # 1 swxY w Y   dS )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    s    """!"455c""::bj"*-----::bj/22222::bj/22222zz"(O44444'++ 2 2zz%111111::bgv&&&&&zz"*f-----::bh 011111zz")%566666::bi!344444zz"($677777::bh	*****::bj),,,,,::bi+++++zz"*&899999"""::bg'9:::::zz",(:;;;;;zz"-);<<<<<	z)A	B	B	B / /zz"(I....../ / / / / / / / / / / / / / / / / /s    J,,J03J0c                     t          | |          }t          rt          |          |j        k    sJ d S t          |          |j        k    sJ d S r   )r   r   r   r  r  )r   r   r   rI   s       r(   test_indexing_dtyper    s]     
i	1	1B .b!!RX------b!!RX------r*   c                     t          j        d          } t          j        d          }|                     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            d S # 1 swxY w Y   d S )	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    sS   ((E"#;<<HQu55|A '??P&Q&Q#I|V&677:::::>>> 
4	0	0	0 2 2*BCT*U*U'	<H$$$$*111111	2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s   +CC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 }	 | ||          ||	          }
|                    ||          }t          d          5  t          |||||	          }d d d            n# 1 swxY w Y   t          t          ||          |
           t          t          d          k     st          t          d          k    r$t          |          t          |          k    sJ d S d S )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OOOOO	ow	7	7BKJJJ			999iiiPQQEU""ooo66	w	&	&&?&?&?zRRR##e4}  H zz%z00H	4	0	0	0 
 
G$m
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 %f444h???M'****jM'<R<R.R.R h6&>>111111 /S.Rs   6CCC)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/     sH
   				         ) ) ) ) ) ) * * * * * * & & & & & &                                       (        U T T T T T T T T T T T }u}YYY77CDD& & ED&	( 	( 	( )4 4 )(4" )G G )(G    $4   + + + w0B&CDD* * ED*. . . *,U,U,W,W  ( 	 	q$(	q$A
4+			aSz2
sQooo.	!TD$<0
QD)))$	AtdD\*
))YYY	D///:
))YYY	D1a&1	q%#	q%!R!
5))),			aA/
sQ/	!US#J/
QE;;;'	Auq"g&
))YYY	E;;;7
))YYY	EAr731 :G G;  @G, )--uMMM  	 * )--tLLL  % F$		
 VH#	
 LL		
 
RG&(RS) 27 73 	 :7   $; $; $;T )$J$J$JKK
Q		GQ'
R%)	gr*
)UY	%)4YYEIuy9;;;GGG!$$$OO	
 YYEIuy9;;;GGG!$$$%)S!	

 Q		GQ'
Q		GQ'9*uyj	!7UYJ7YYEIuy9;;;GGG!$$$OO	
 YYEIuy9;;;GGG!$$$%)S!	
- >& &?  LK )(B&  "K"K"M"M ; ; ;" )$G$G$GHH, , IH )(, , , ,    m    ) 	334	??@	;;< 1 1  )(1 )6 6 )(6   %57G$HII&/ &/ JI&/R  "K"K"M"M . . .2 2 22 *,U,U,W,W  .99!5!5!566-/E/E/EFF2 2 GF 76 :9 2 2 2r*   