a
    hW                     @   s<  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+,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d0dd d g d1fddd d2d3gfdd gd d g d
fg d!dd d4d5gfd$d%gd d g d6fg d'dd d7d8gfddgd d g d9fg d+dd d5d:gfg d
g d
gd d g d;fg d.g d/gdd d<d=gfgd>d? Z3ej+,d@e d dAdBdC Z4ej+,d@e ddAej+,dDdddge5dEfd ddgge6e5fdFfd g dGe6dFfd dHdge7dIffdJdK Z8dLdM Z9e%dNdO Z:e%ej+,dPg dQe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 dUg dVfg d
ej;ej;ej;gg dTgeeddU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 dUg dYfg d
ej;ej;ej;gg dTgeeddU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 dUg dfg d
ej;ej;ej;gg dTgeeddUd]ej;d^gfgd_d` Z=ej+,dae  dbdc Z>e%ej+,dPdddegdfdg Z?dhdi Z@G djdk dke
ZAe%ej+,dldedmdn fddodn fdddpdn fgdqdr ZBe%dsdt ZCdudv ZDdwdx ZEej+,dae  dydz ZFej+,dae  d{d| ZGej+,d}e  ej+,d~dd gej+,ddd gej+,dg dej+,dg ddd ZHdd ZIej+,de  ej+,de(ej+,dg dej+,dg ddd ZJej+,de  ej+,ddd gdd ZKej+,de(ej+,ddd gdd ZLd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_is_numpy_namespace_isin_max_precision_float_dtype_nanmax_nanmean_nanmin_NumPyAPIWrapper_raveldeviceget_namespaceget_namespace_and_deviceindexing_dtypesupported_float_dtypes)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|tsJ |r"J dS )z.Check that get_namespace returns NumPy wrapperN)r   
isinstancer   )r#   xp_outis_array_api_compliant r+   ^/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/utils/tests/test_array_api.py"test_get_namespace_ndarray_default*   s    r-   c                  C   sz   t g d} t| \}}|jdddd}t|dgd  tjtdd |jddd	 W d
   n1 sl0    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 d} t| jtdk r(t jdd tg dg}tdd2 t|\}}|sXJ || ju sfJ W d   n1 sz0    Y  dS )	z%Test get_namespace on NumPy ndarrays.array_api_compatz1.9zZarray_api_compat was temporarily reporting NumPy as API compliant and this test would fail)reasonr$   TZarray_api_dispatchN)	r8   importorskipr"   __version__skipr5   r6   r   r   )r>   X_npr)   r*   r+   r+   r,   (test_get_namespace_ndarray_with_dispatch>   s    
rE   c              	   C   s   t d}tg dg}||}tdd t|\}}|sDJ t t t||\}}W d   n1 sr0    Y  dd }| d| t	j
d	d
ksJ t jtdd t| W d   n1 s0    Y  W d   n1 s0    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_getenva   s    z1test_get_namespace_array_api.<locals>.mock_getenvzos.environ.getrG   1z#scipy's own support is not enabled.r1   )r8   rA   r5   r6   r   r   r9   	TypeErrorsetattrosenvirongetRuntimeError)ZmonkeypatchxprD   ZX_xpr)   r*   rJ   r+   r+   r,   test_get_namespace_array_apiS   s     

,rS   	array_apir5   rF   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)orderrR   ZF_CONTIGUOUSN)r8   rA   r6   r   r5   flags)rT   rR   r#   ZX_newZX_new_npr+   r+   r,   test_asarray_with_ordern   s
    

rX   z$array_namespace, device_, dtype_namez"weights, axis, normalize, expected)NNT      @T)g      @rY         @r%   r&      F)TTF      ?rZ   皙?g?)g?g@g@)r]   皙?r^   g      ?g      @r'      r[   )r%   r%   r&   g      @g      @)r%   r&   r%   )r&   r&   r&   )NNF   )r[      	         r'   rc   )皙??g?gffffff?gffffff@)rc      re   ra   )r[               c           
      C   s   t | |}tjg dg dg|d}|j||d}|d urVtj||d}|j||d}tdd  t||||d}	W d    n1 s0    Y  ttdk sttd	krt|t|	ksJ t|	|}	t	|	|t
|d
 d S )Nr$   r`   r[   rd   dtyper4   Tr@   )axisweights	normalize2.0.02.1.0)Zatol)r   r5   r6   r   r   r!   r"   r   r	   r   r   )
array_namespacedevice_
dtype_namerq   rp   rr   expectedrR   array_inresultr+   r+   r,   test_averagez   s    #
.
r{   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||sXt|  d|  |j||d}d	}td
dF tj	t
|d t| W d    n1 s0    Y  W d    n1 s0    Y  d S )Nr&   r   rn   y              ?r`   r'   z does not support r4   z;Complex floating point values are not supported by average.Tr@   r1   )r   r5   r6   ro   namehasattrr8   rC   r   r9   NotImplementedErrorr   )ru   r   rw   rR   ry   Zcomplex_type_nameerr_msgr+   r+   r,   $test_average_raises_with_wrong_dtype   s    


r   zaxis, weights, error, error_msgzAxis must be specifiedrq   )r%   r&   r'   r`   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L tj||d t|||d W d    n1 s0    Y  W d    n1 s0    Y  d S )	Nr$   rm   rn   r4   Tr@   r1   )rp   rq   )r   r5   r6   r   r8   r9   r   )	ru   r   rw   rp   rq   error	error_msgrR   ry   r+   r+   r,   +test_average_raises_with_invalid_parameters   s     
r   c                   C   s$   t  d u sJ t d dd u s J d S )Nr|   r4   r+   r+   r+   r,   test_device_none_if_no_input   s    r   c               	      s4  G dd d G  fddd} t t t| dj W d    n1 sN0    Y  t| d| dd u srJ d}td	d
 t jt|d" t| d| d W d    n1 s0    Y  | d}| d}|jt|ksJ |jt||ksJ |jt|||ksJ W d    n1 s&0    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r|   )selfr|   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d S )NzDevice object is not hashable)rL   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   r4   )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   r0   Zmygpuz.Input arrays use different devices: cpu, mygpuTr@   r1   )r8   r9   rL   hashr   r   r:   )r   r   Zarray1Zarray2r+   r   r,   test_device_inspection   s    ,0r   library)r5   rF   torchzX,reduction,expected)r`   r[         @)rp         ?r/         @r         @)r         @r   r   r   g      r/   r   c                 C   sZ   t | }tdd |||}W d   n1 s80    Y  t||}t|| dS )z-Check NaN reductions like _nanmin and _nanmaxTr@   N)r8   rA   r   r6   r	   r   )r   r#   Z	reductionrx   rR   rz   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\0    Y  t||}tj|dd	}t|| t|rt|j	d
 sJ d S )Nr$   rm   )rb   rk   rc   )r.      rh   r4   Tr@   C)rV   ZC_CONTIGUOUS)
r   r6   r   r   r	   r5   Zravelr   r   rW   )	namespace_device_dtyperR   arrayarray_xprz   rx   r+   r+   r,   
test_ravelg  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   r3   r4   rR   N)
r8   rA   backendsr3   Zis_builtrC   r6   r	   r5   r   )r   rR   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   r0   r4   r   N)r8   rA   r6   r	   r5   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.fit)N)r   r   r   r   r+   r+   r+   r,   r     s   r   zarray_namespace, converterc                 C   s   |    S r   )r0   r5   r   r+   r+   r,   <lambda>      r   c                 C   s
   t | S r   )r5   r6   r   r+   r+   r,   r     r   c                 C   s   |   S r   )rP   r   r+   r+   r,   r     r   c                 C   sF   t | }|ddgg}t |}t||}t|jtj	sBJ dS )z(Convert estimator attributes to ndarray.rg   rZ   N)
r8   rA   r6   r   r   r   r(   r   r5   Zndarray)ru   	converterrR   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sHJ dS )z0Convert estimator attributes to ArrayAPI arrays.rF   rg   rZ   c                    s
     | S r   )r6   r   r   r+   r,   r     r   z5test_convert_estimator_to_array_api.<locals>.<lambda>Z__array_namespace__N)	r8   rA   r5   r6   r   r   r   r}   r   )rD   r   r   r+   r   r,   #test_convert_estimator_to_array_api  s
    
r   c                  C   s   t  } | g dg dg}| j|ddd}|j|u s:J | j|ddd}|j|jusZJ tjtdd	 | |d
 W d   n1 s0    Y  dS )zDCheck reshape behavior with copy and is strict with non-tuple shape.r$   r_   )r   F)copy)rd   r%   Tzshape must be a tupler1   r   N)r   r6   reshapebaser8   r9   rL   )rR   r#   Z	X_no_copyZX_copyr+   r+   r,   test_reshape_behavior  s    r   c                  C   s  t  } | | j| jsJ | | jds,J | | jds>J | | jdrPJ t| D ]}| |dsXJ qX| | jdsJ | | jdrJ | | jdsJ | | jdrJ | | j	dsJ | | j
drJ | | j
dsJ | | jdsJ | | jdsJ | | jdr&J | | jdr:J | | jdsNJ | | jdsbJ tjtdd$ | | jd	sJ W d
   n1 s0    Y  d
S )z2Test isdtype implementation from _NumPyAPIWrapper.zreal floatingboolzsigned integerzunsigned integernumericzcomplex floatingzUnrecognized data typer1   unknownN)r   Zisdtypefloat32float64int32r   r   int16Zuint32Zuint16int64Zint8Z	complex64Z
complex128r8   r9   r:   )rR   ro   r+   r+   r,   $test_get_namespace_array_api_isdtype  s,    r   c                 C   s8   t | |}tr"t||jks4J nt||jks4J d S r   )r   r   r   r   r   )r   r   r   rR   r+   r+   r,   test_indexing_dtype  s    
r   c                 C   s4   t | |}|dkr|jn|j}t|||ks0J d S )NZmps)r   r   r   r   )r   r   r   rR   Zexpected_dtyper+   r+   r,   test_max_precision_float_dtype  s    
r   zarray_namespace, device, _invertassume_uniqueelement_size)rd   r.   ri   	int_dtype)r   r   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 s0    Y  t
t||d	| d S )
Nr&   ri   rn   r4   )elementtest_elementsr   r   Tr@   )r   r   rR   r   r   r   )r   r5   aranger   Zastyper   r6   isinr   r   r   r	   )ru   r   r<   r   r   r   r   rR   rr   r   Z
element_xpZtest_elements_xprx   rz   r+   r+   r,   	test_isin  s*    

$r   c                  C   s   t d} t d}| jddd}td}t|\}}}|t|d u sNJ |rVJ |d u sbJ tdd@ t|\}}}||u sJ |sJ ||jksJ W d    n1 s0    Y  d S )	Nr   zarray_api_compat.torchr'   r0   r4   r   Tr@   )r8   rA   r   r5   r   r   r   r   )r   Zxp_torchZsome_torch_tensorZsome_numpy_arrayr   Zis_array_apir   r+   r+   r,   test_get_namespace_and_device'  s    


r   csr_containerrp   )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rVtg d	}	n |d
krrtjg d|d}	nd }	|||||	d}
|j||d}tdd" t|||	||d}W d    n1 s0    Y  tt	||d|
 t
tdk st
tdkrt|t|ksJ d S )Nr   )count_nonzero)r   r'   r   )r&   r   r   )r   r   r   )rc   rk   rb   )r`   r   r[   r   )r%   r&   r&   r'   r%   r   )g      ?r\   rf   g	@g333333@rn   )rp   sample_weightr4   Tr@   )rp   r   rR   r   r   rs   rt   )Zsklearn.utils.sparsefuncsr   r   r5   r   r6   r   r
   r   r	   r!   r"   r   )ru   rv   rw   r   rp   r   Zsparse_count_nonzerorR   r   r   rx   r   rz   r+   r+   r,   test_count_nonzero@  s&    	
(

$r   wrapc                 C   s\   t | |}tjdtjd}||}t|d|d|d tj|d|d tt||d| d S )N)r[   r`   rn   r%   F)valuerR   Z	add_valuer   )valr   r   )	r   r5   r;   r   r6   r   Zfill_diagonalr   r	   )ru   rv   rw   r   rR   Zarray_npr   r+   r+   r,   test_fill_or_add_to_diagonale  s    

r   dispatchc                 C   s   | t dgg| t dgg }}zt|dp t||d u sFJ t|t dgd u s`J t||d d u svJ t|t dgd d u sJ W d    n1 s0    Y  W n ty   tdY n0 d S )Nr%   r&   r@   z!array_api_compat is not installed)r5   r   r   r   r   ImportErrorr   )r   r   abr+   r+   r,   test_sparse_devicer  s    &@r   )MrN   	functoolsr   r5   r8   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parametrizer6   r-   r=   rE   rS   rX   r{   r   rL   r:   ZeroDivisionErrorr   r   r   naninfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r+   r+   r,   <module>   s^  \





2








,





#
	
	