o
    iFR                     @   sl  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mZmZm Z  d dl!m"Z"m#Z#m$Z$m%Z% d dl&m'Z'm(Z(m)Z)m*Z* ej+,d	e-g d
g d
gdd Z.dd Z/e%dd Z0e%dd Z1ej+,dddgdd Z2ej+j,de  ed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 d0gdddd gfd1dd d!g d2fddd!d3d4gfdd!gd d!g d
fg d"dd!d5d6gfd%d&gd d!g d7fg d(dd!d8d9gfddgd d!g d:fg d,dd!d6d;gfg d
g d
gd d!g d<fg d/g d0gdd!d=d>gfgd?d@ Z3ej+j,dAe d!dBeddCdD Z4ej+j,dAe ddBedej+,dEdddge5dFfd ddgge6e5fdGfd g dHe6dGfd dIdge7dJffdKdL Z8dMdN Z9e%dOdP Z:e%ej+,dQg dRej+,dSddej;gedfddTej; gedTfej<ej<geej<fg d
ej;ej;ej;gg dUgeed dVg dWfg d
ej;ej;ej;gg dUgeeddVdXej;dYg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 dUgeed dVg dZfg d
ej;ej;ej;gg dUgeeddVd[ej;d\gfddej;ged#fddTej; ged]fej< ej< geej< fg d
ej;ej;ej;gg dUgeed dVg dfg d
ej;ej;ej;gg dUgeeddVd^ej;d_gfgd`da Z=ej+j,dbe  eddcdd Z>e%ej+,dQdedfgdgdh Z?didj Z@G dkdl dle
ZAe%ej+,dmdfdndo fddpdo fdedqdo fgdrds ZBe%dtdu ZCej+j,dbe  eddvdw ZDej+j,dbe  eddxdy ZEej+j,dze  edej+,d{dd!gej+,d|dd!gej+,d}g d~ej+,dg ddd ZFej+jGe jHIddkdddd ZJej+j,de  edej+,de(ej+,dg dej+,dg ddd ZKej+j,de  edej+,ddd!gdd ZLej+,de(ej+,ddd!gdd ZMdS )    N)partial)assert_allclose)config_context)BaseEstimator)_asarray_with_order_atol_for_type_average_convert_to_numpy_count_nonzero _estimator_with_converted_arrays_fill_or_add_to_diagonal_get_namespace_device_dtype_ids_is_numpy_namespace_isin_max_precision_float_dtype_nanmax_nanmean_nanmin_raveldeviceget_namespaceget_namespace_and_deviceindexing_dtype	np_compat)yield_namespace_device_dtype_combinations)SkipTest_array_api_for_testsassert_array_equal'skip_if_array_api_compat_not_configured)	_IS_32BITCSR_CONTAINERS
np_versionparse_versionX         c                 C   s$   t | \}}|tu sJ |rJ dS )z.Check that get_namespace returns NumPy wrapperN)r   r   )r#   xp_outis_array_api_compliant r*   \/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/utils/tests/test_array_api.py"test_get_namespace_ndarray_default*   s   r,   c                  C   s|   t g d} t| \}}|jdddd}t|dgd  tjtdd |jddd	 W d
   d
S 1 s7w   Y  d
S )z;Check expected behavior with device and creation functions.r$   
          @cpu)Z
fill_valuer   zUnsupported devicematchcudar   N)	numpyasarrayr   fullr   pytestraises
ValueErrorzeros)r#   r(   _Z
full_arrayr*   r*   r+   *test_get_namespace_ndarray_creation_device2   s   "r<   c                  C   s`   t g dg} tdd t| \}}|sJ |tu sJ W d   dS 1 s)w   Y  dS )z%Test get_namespace on NumPy ndarrays.r$   TZarray_api_dispatchN)r4   r5   r   r   r   )X_npr(   r)   r*   r*   r+   (test_get_namespace_ndarray_with_dispatch>   s   "r?   c              	   C   s  t d}tg dg}||}tddf t|\}}|s"J t t t||\}}W d   n1 s9w   Y  dd }| d| t	j
d	d
ksRJ t jtdd t| W d   n1 shw   Y  W d   dS W d   dS 1 sw   Y  dS )z'Test get_namespace for ArrayAPI arrays.array_api_strictr$   Tr=   Nc                 S   s   | dkrdS d S )NSCIPY_ARRAY_API0r*   )keyr*   r*   r+   mock_getenv[   s   z1test_get_namespace_array_api.<locals>.mock_getenvzos.environ.getrA   1z#scipy's own support is not enabled.r0   )r7   importorskipr4   r5   r   r   r8   	TypeErrorsetattrosenvirongetRuntimeError)Zmonkeypatchxpr>   ZX_xpr(   r)   rD   r*   r*   r+   test_get_namespace_array_apiM   s*   


"rN   	array_apir4   r@   c                 C   sB   t | }|g d}t|d|d}t|}|jd sJ dS )z=Test _asarray_with_order passes along order for NumPy arrays.)g333333?g333333@gffffff@F)orderrM   ZF_CONTIGUOUSN)r7   rF   r5   r   r4   flags)rO   rM   r#   ZX_newZX_new_npr*   r*   r+   test_asarray_with_orderh   s
   

rS   z$array_namespace, device_, dtype_name)Zidsz"weights, axis, normalize, expected)NNT      @T)g      @rT         @r%   r&      F)TTF      ?rU   皙?g?)g?g@g@)rX   皙?rY   g      ?g      @)r'      rV   )r%   r%   r&   g      @g      @)r%   r&   r%   )r&   r&   r&   )NNF   )rV      	         r'   r]   )皙??g?gffffff?gffffff@)r]      r_   r[   )rV               c           
      C   s   t | |}tjg dg dg|d}|j||d}|d ur+tj||d}|j||d}tdd t||||d}	W d    n1 sCw   Y  ttdk sTttd	kr^t|t|	ks^J t|	|}	t	|	|t
|d
 d S )Nr$   rZ   rV   r^   dtyper3   Tr=   )axisweights	normalize2.0.02.1.0)Zatol)r   r4   r5   r   r   r!   r"   r   r	   r   r   )
array_namespacedevice_
dtype_namerk   rj   rl   expectedrM   array_inresultr*   r*   r+   test_averaget   s   
%
ru   z#array_namespace, device, dtype_name)Zinclude_numpy_namespacesc              	   C   s   t | |}tjddg|ddtjddg|d  }|jj}t||s,t|  d|  |j||d}d	}td
d, tj	t
|d t| W d    n1 sQw   Y  W d    d S W d    d S 1 siw   Y  d S )Nr&   r   rh   y              ?rZ   r'   z does not support r3   z;Complex floating point values are not supported by average.Tr=   r0   )r   r4   r5   ri   namehasattrr7   skipr   r8   NotImplementedErrorr   )ro   r   rq   rM   rs   Zcomplex_type_nameerr_msgr*   r*   r+   $test_average_raises_with_wrong_dtype   s   



Pr{   zaxis, weights, error, error_msgzAxis must be specifiedrk   )r%   r&   r'   rZ   z(Weights sum to zero, can't be normalizedc           	   	   C   s   t | |}tjg dg dg|d}|j||d}tj||d}|j||d}tdd/ tj||d t|||d W d    n1 sFw   Y  W d    d S W d    d S 1 s^w   Y  d S )	Nr$   rg   rh   r3   Tr=   r0   )rj   rk   )r   r4   r5   r   r7   r8   r   )	ro   r   rq   rj   rk   error	error_msgrM   rs   r*   r*   r+   +test_average_raises_with_invalid_parameters   s   
!Pr   c                   C   s$   t  d u sJ t d dd u sJ d S )Nrv   r3   r*   r*   r*   r+   test_device_none_if_no_input   s   r   c               	      s2  G dd d G  fddd} t t t| dj W d    n1 s'w   Y  t| d| dd u s9J d}td	d
O t jt|d t| d| d W d    n1 s\w   Y  | d}| d}|jt|ksrJ |jt||ks|J |jt|||ksJ W d    d S 1 sw   Y  d S )Nc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z&test_device_inspection.<locals>.Devicec                 S   s
   || _ d S Nrv   )selfrv   r*   r*   r+   __init__   s   
z/test_device_inspection.<locals>.Device.__init__c                 S   s   | j |j kS r   r   )r   r   r*   r*   r+   __eq__   s   z-test_device_inspection.<locals>.Device.__eq__c                 S   s   t d)NzDevice object is not hashable)rG   r   r*   r*   r+   __hash__  s   z/test_device_inspection.<locals>.Device.__hash__c                 S   s   | j S r   r   r   r*   r*   r+   __str__  s   z.test_device_inspection.<locals>.Device.__str__N)__name__
__module____qualname__r   r   r   r   r*   r*   r*   r+   Device   s
    r   c                       s   e Zd Z fddZdS )z%test_device_inspection.<locals>.Arrayc                    s    || _ d S r   r3   )r   Zdevice_namer   r*   r+   r   	  s   z.test_device_inspection.<locals>.Array.__init__N)r   r   r   r   r*   r   r*   r+   Array  s    r   r   r/   Zmygpuz.Input arrays use different devices: cpu, mygpuTr=   r0   )r7   r8   rG   hashr   r   r9   )r   rz   Zarray1Zarray2r*   r   r+   test_device_inspection   s"   "r   library)r4   r@   torchzX,reduction,expected)rZ   rV         @)rj         ?r.         @r         @)r         @r   r   r   g      r.   r   c                 C   sZ   t | }tdd |||}W d   n1 sw   Y  t||}t|| dS )z-Check NaN reductions like _nanmin and _nanmaxTr=   N)r7   rF   r   r5   r	   r   )r   r#   Z	reductionrr   rM   rt   r*   r*   r+   test_nan_reductions,  s   
0
r   znamespace, _device, _dtypec                 C   s   t | |}g dg dg dg dg}|j||d}tdd t|}W d    n1 s.w   Y  t||}tj|dd	}t|| t|rRt|j	d
 sTJ d S d S )Nr$   rg   )r\   re   r]   )r-      rb   r3   Tr=   C)rQ   ZC_CONTIGUOUS)
r   r5   r   r   r	   r4   Zravelr   r   rR   )	namespace_device_dtyperM   arrayarray_xprt   rr   r*   r*   r+   
test_ravele  s   



r   Zcupyr   c                 C   sr   t | }| dkr|jj st d |jg ddd}n|g d}t||d}tg d}t	|| dS )z0Check convert_to_numpy for GPU backed libraries.r   ztest requires cudar   r2   r3   rM   N)
r7   rF   backendsr2   Zis_builtrx   r5   r	   r4   r   )r   rM   ZX_gpuX_cpuexpected_outputr*   r*   r+   test_convert_to_numpy_gpu{  s   

r   c                  C   sD   t d} | jg ddd}t|| d}tg d}t|| dS )z.Check convert_to_numpy for PyTorch CPU arrays.r   r   r/   r3   r   N)r7   rF   r5   r	   r4   r   )r   ZX_torchr   r   r*   r*   r+   test_convert_to_numpy_cpu  s
   
r   c                   @   s   e Zd ZdddZdS )SimpleEstimatorNc                 C   s   || _ |jd | _| S )Nr   )X_shapeZn_features_)r   r#   yr*   r*   r+   fit  s   zSimpleEstimator.fitr   )r   r   r   r   r*   r*   r*   r+   r     s    r   zarray_namespace, converterc                 C   s   |    S r   )r/   r4   r   r*   r*   r+   <lambda>  s    r   c                 C   s
   t | S r   )r4   r5   r   r*   r*   r+   r        
 c                 C   s   |   S r   )rK   r   r*   r*   r+   r     s    c                 C   sF   t | }|ddgg}t |}t||}t|jtj	s!J dS )z(Convert estimator attributes to ndarray.ra   rU   N)
r7   rF   r5   r   r   r   
isinstancer   r4   Zndarray)ro   	converterrM   r#   estnew_estr*   r*   r+   !test_convert_estimator_to_ndarray  s
   

r   c                     sL   t d tddgg} t | }t| fdd}t|jds$J dS )z0Convert estimator attributes to ArrayAPI arrays.r@   ra   rU   c                    s
     | S r   )r5   r   r   r*   r+   r     r   z5test_convert_estimator_to_array_api.<locals>.<lambda>Z__array_namespace__N)	r7   rF   r4   r5   r   r   r   rw   r   )r>   r   r   r*   r   r+   #test_convert_estimator_to_array_api  s
   
r   c                 C   s:   t | |}trt||jksJ d S t||jksJ d S r   )r   r   r   int32int64)r   r   r   rM   r*   r*   r+   test_indexing_dtype  s   
r   c                 C   s4   t | |}|dkr|jn|j}t|||ksJ d S )NZmps)r   Zfloat32Zfloat64r   )r   r   r   rM   Zexpected_dtyper*   r*   r+   test_max_precision_float_dtype  s   
r   zarray_namespace, device, _invertassume_uniqueelement_size)r^   r-   rc   	int_dtype)Zint16r   r   Zuint8c                 C   s   t | |}|d }dt||df| }	tjtd|d}
|j|	|d}|j|
|d}tj|	|
||d}tdd t	|||||d}W d    n1 sRw   Y  t
t||d	| d S )
Nr&   rc   rh   r3   )elementtest_elementsr   r   Tr=   )r   r   rM   r   r   r   )r   r4   arangeZreshapeZastyper   r5   isinr   r   r   r	   )ro   r   r;   r   r   r   r   rM   rr   r   Z
element_xpZtest_elements_xprr   rt   r*   r*   r+   	test_isin  s,   
	r   rA   rE   zSCIPY_ARRAY_API not set to 1.)reasonc                  C   s   t d} ddlm} | jddd}td}t|\}}}|t|d u s(J |r,J |d u s2J tdd! t|\}}}||u sEJ |sIJ ||j	ksPJ W d    d S 1 s[w   Y  d S )	Nr   r   )r   r'   r/   r3   Tr=   )
r7   rF   Z"sklearn.externals.array_api_compatr   r   r4   r   r   r   r   )r   Ztorch_compatZsome_torch_tensorZsome_numpy_arrayr   Zis_array_apir   r*   r*   r+   test_get_namespace_and_device  s   

"r   csr_containerrj   )r   r%   Nr|   r   sample_weight_type)Nintfloatc                 C   s  ddl m} t| |}tg dg dg dg dg dg}|dkr+tg d	}	n|d
kr9tjg d|d}	nd }	|||||	d}
|j||d}tdd t|||	||d}W d    n1 sdw   Y  tt	||d|
 t
tdk s~t
tdkrt|t|ksJ d S d S )Nr   )count_nonzero)r   r'   r   )r&   r|   r   )r   r   r   )r]   re   r\   )rZ   r   rV   r   )r%   r&   r&   r'   r%   r   )g      ?rW   r`   g	@g333333@rh   )rj   sample_weightr3   Tr=   )rj   r   rM   r   r   rm   rn   )Zsklearn.utils.sparsefuncsr   r   r4   r   r5   r   r
   r   r	   r!   r"   r   )ro   rp   rq   r   rj   r   Zsparse_count_nonzerorM   r   r   rr   r   rt   r*   r*   r+   test_count_nonzero  s*   
(

r   wrapc                 C   s   t | |}tjd|d}|j| |d}tj|d|d tdd t|d|d|d	 W d    n1 s6w   Y  tt	||d
| d S )N)rV   rZ   rh   r3   r%   )valr   Tr=   F)valuerM   Z	add_valuer   r   )
r   r4   r:   r5   copyZfill_diagonalr   r   r   r	   )ro   rp   rq   r   rM   Zarray_npr   r*   r*   r+   test_fill_or_add_to_diagonal@  s   
r   dispatchc                 C   s   | t dgg| t dgg}}|r!tjdd u r!tdt|d9 t||d u s0J t|t dgd u s=J t||d d u sHJ t|t dgd d u sWJ W d    d S 1 sbw   Y  d S )Nr%   r&   rA   z8SCIPY_ARRAY_API is not set: not checking array_api inputr=   )	r4   r   rI   rJ   rK   r   r   r   r   )r   r   abr*   r*   r+   test_sparse_deviceS  s   & "r   )NrI   	functoolsr   r4   r7   Znumpy.testingr   Zsklearn._configr   Zsklearn.baser   Zsklearn.utils._array_apir   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsklearn.utils._testingr   r   r   r   Zsklearn.utils.fixesr   r    r!   r"   markZparametrizer5   r,   r<   r?   rN   rS   ru   r{   rG   r9   ZeroDivisionErrorr   r   r   naninfr   r   r   r   r   r   r   r   r   r   ZskipifrJ   rK   r   r   r   r   r*   r*   r*   r+   <module>   s   \





2








,






	

