U
    _»{jî%  ã                	   @   s¨  d dl Z d dlZd dlmZ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 d dlmZ ej d¡Zej de  d	d
dg¡d	d
dgg¡dd„ ƒZdd„ Zedd„ ƒZedd„ ƒZG dd„ de
ƒZdd„ Zdd„ Zdd„ Zej dddg¡dd „ ƒZd!d"„ Z eej d#d$d%d&g¡d'd(„ ƒƒZ!d)d*„ Z"G d+d,„ d,eƒZ#eej d-d%d.d/„ fdd0d/„ fd&d1d/„ fg¡d2d3„ ƒƒZ$ed4d5„ ƒZ%d6d7„ Z&ej d8e
eg¡d9d:„ ƒZ'dS );é    N)Úassert_allcloseÚassert_array_equal)Úconfig_context)ÚBaseEstimator)Ú_ArrayAPIWrapperÚ_asarray_with_orderÚ_convert_to_numpyÚ _estimator_with_converted_arraysÚ_NumPyAPIWrapperÚget_namespace)Ú'skip_if_array_api_compat_not_configuredz0ignore:The numpy.array_api submodule:UserWarningÚXé   é   é   c                 C   s&   t | ƒ\}}t|tƒst‚|r"t‚dS )z.Check that get_namespace returns NumPy wrapperN)r   Ú
isinstancer
   ÚAssertionError)r   Úxp_outÚis_array_api_compliant© r   úa/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sklearn/utils/tests/test_array_api.pyÚ"test_get_namespace_ndarray_default   s    r   c               	   C   sh   t  dddg¡} t| ƒ\}}|jdddd�}t|dgd ƒ tjtdd	�� |jdd
d� W 5 Q R X dS )z;Check expected behavior with device and creation functions.r   r   r   é
   ç       @Úcpu)Z
fill_valueÚdevicezUnsupported device©ÚmatchÚcuda©r   N)	ÚnumpyÚasarrayr   Úfullr   ÚpytestÚraisesÚ
ValueErrorZzeros)r   r   Ú_Z
full_arrayr   r   r   Ú*test_get_namespace_ndarray_creation_device   s    r'   c               	   C   sX   t  d¡} t dddgg¡}tdd��( t|ƒ\}}|s<t‚|| jksJt‚W 5 Q R X dS )z%Test get_namespace on NumPy ndarrays.Úarray_api_compatr   r   r   T©Zarray_api_dispatchN)r#   Úimportorskipr    r!   r   r   r   )r(   ÚX_npr   r   r   r   r   Ú(test_get_namespace_ndarray_with_dispatch*   s    
r,   c               
   C   s†   t  d¡} t dddgg¡}|  |¡}tdd��L t|ƒ\}}|sFt‚t|tƒsTt‚t  	t
¡� t||ƒ\}}W 5 Q R X W 5 Q R X dS )z'Test get_namespace for ArrayAPI arrays.únumpy.array_apir   r   r   Tr)   N)r#   r*   r    r!   r   r   r   r   r   r$   Ú	TypeError)Úxpr+   ZX_xpr   r   r   r   r   Útest_get_namespace_array_api7   s    

r0   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú_AdjustableNameAPITestWrapperz:API wrapper that has an adjustable name. Used for testing.c                    s   t ƒ j|d� || _d S )N)Úarray_namespace)ÚsuperÚ__init__Ú__name__)Úselfr2   Úname©Ú	__class__r   r   r4   J   s    z&_AdjustableNameAPITestWrapper.__init__)r5   Ú
__module__Ú__qualname__Ú__doc__r4   Ú__classcell__r   r   r8   r   r1   G   s   r1   c                  C   s~   t  d¡} t| dƒ}t|ƒ}|jdddgdddgg|jd�}| ||j¡}|j|jksZt	‚|j||jd�}|j|jkszt	‚d	S )
z6Test _ArrayAPIWrapper for ArrayAPIs that is not NumPy.r-   úwrapped_numpy.array_apir   r   r   é   é   ©ÚdtypeN)
r#   r*   r1   r   r!   Úfloat64ZastypeÚfloat32rB   r   )Únumpy_array_apiÚxp_r/   r   ZX_convertedr   r   r   Útest_array_api_wrapper_astypeO   s    

 rG   c                  C   s~   t  d¡} t| dƒ}t|ƒ}|jdddgdddgg|jd�}|j|| dg¡dd	�}t|d
ƒsbt‚t	|t
j|dgdd	�ƒ dS )z2Test that fast path is called for numpy.array_api.r-   r   r   r   r?   r@   rA   r   ©ZaxisÚ__array_namespace__N)r#   r*   r1   r   r!   rC   ÚtakeÚhasattrr   r   r    )rE   rF   r/   r   ÚX_taker   r   r   Ú)test_array_api_wrapper_take_for_numpy_api]   s    

 rM   c               	   C   s„  t  d¡} t| dƒ}t|ƒ}|jdddg|jd�}|j|| dg¡dd�}t|d	ƒsXt‚t	|t
j|dgdd�ƒ |jdddgdd
dgg|jd�}|j|| dg¡dd�}t|d	ƒs¶t‚t	|t
j|dgdd�ƒ |j|| ddg¡dd�}t|d	ƒsöt‚t	|t
j|ddgdd�ƒ t jtdd�� |j|| dg¡dd� W 5 Q R X t jtdd��* |j| dggg¡| dg¡dd� W 5 Q R X dS )z#Test _ArrayAPIWrapper API for take.r-   r>   r   r   r   rA   r   rH   rI   r?   r@   z"Only axis in \(0, 1\) is supportedr   z$Only X.ndim in \(1, 2\) is supportedN)r#   r*   r1   r   r!   rC   rJ   rK   r   r   r    r$   r%   )rE   rF   r/   ZX_1drL   r   r   r   r   Útest_array_api_wrapper_takej   s$    

 "rN   Ú	array_apir    r-   c                 C   sD   t  | ¡}| dddg¡}t|d|d�}t |¡}|jd s@t‚dS )z=Test _asarray_with_order passes along order for NumPy arrays.ç333333ó?ç333333@çffffff@ÚF©Úorderr/   ÚF_CONTIGUOUSN)r#   r*   r!   r   r    Úflagsr   )rO   r/   r   ÚX_newÚX_new_npr   r   r   Útest_asarray_with_order‡   s
    

rZ   c                  C   st   t  d¡} t| dƒ}tjdddgdddggdd�}| |¡}t|d	|d
�}t |¡}|jd sbt‚|jd rpt‚dS )z<Test _asarray_with_order ignores order for Generic ArrayAPI.r-   zwrapped.array_apirP   rQ   rR   g      @ÚC)rU   rS   rT   ZC_CONTIGUOUSrV   N)r#   r*   r1   r    r!   r   rW   r   )r/   rF   r   rX   rY   r   r   r   Útest_asarray_with_order_ignored“   s    



r\   ÚlibraryZcupyÚtorchzcupy.array_apic                 C   sr   t  | ¡}| dkr8|js"t  d¡ |jdddgdd�}n| dddg¡}t||d�}t dddg¡}t||ƒ d	S )
z0Check convert_to_numpy for GPU backed libraries.r^   ztest requires cudaç      ð?r   ç      @r   r   ©r/   N)r#   r*   Zhas_cudaÚskipr!   r   r    r   )r]   r/   ZX_gpuÚX_cpuÚexpected_outputr   r   r   Útest_convert_to_numpy_gpu¢   s    

re   c                  C   sH   t  d¡} | jdddgdd�}t|| d�}t dddg¡}t||ƒ dS )	z.Check convert_to_numpy for PyTorch CPU arrays.r^   r_   r   r`   r   r   ra   N)r#   r*   r!   r   r    r   )r^   ZX_torchrc   rd   r   r   r   Útest_convert_to_numpy_cpu´   s
    
rf   c                   @   s   e Zd Zddd„ZdS )ÚSimpleEstimatorNc                 C   s   || _ |jd | _| S )Nr   )ÚX_ÚshapeZn_features_)r6   r   Úyr   r   r   Úfit¿   s    zSimpleEstimator.fit)N)r5   r:   r;   rk   r   r   r   r   rg   ¾   s   rg   zarray_namespace, converterc                 C   s   |   ¡  ¡ S ©N)r   r    ©Úarrayr   r   r   Ú<lambda>É   ó    ro   c                 C   s
   t  | ¡S rl   )r    r!   rm   r   r   r   ro   Ê   rp   c                 C   s
   | j  ¡ S rl   )Z_arrayÚgetrm   r   r   r   ro   Ë   rp   c                 C   sF   t  | ¡}| ddgg¡}tƒ  |¡}t||ƒ}t|jtj	ƒsBt
‚dS )z(Convert estimator attributes to ndarray.çÍÌÌÌÌÌô?ç      @N)r#   r*   r!   rg   rk   r	   r   rh   r    Zndarrayr   )r2   Ú	converterr/   r   ÚestÚnew_estr   r   r   Ú!test_convert_estimator_to_ndarrayÅ   s
    

rw   c                     sL   t  d¡‰ t ddgg¡} tƒ  | ¡}t|‡ fdd„ƒ}t|jdƒsHt	‚dS )z0Convert estimator attributes to ArrayAPI arrays.r-   rr   rs   c                    s
   ˆ   | ¡S rl   )r!   rm   ra   r   r   ro   á   rp   z5test_convert_estimator_to_array_api.<locals>.<lambda>rI   N)
r#   r*   r    r!   rg   rk   r	   rK   rh   r   )r+   ru   rv   r   ra   r   Ú#test_convert_estimator_to_array_apiÙ   s
    
rx   c               	   C   sˆ   t ƒ } |  dddgdddgg¡}| j|ddd�}|j|ks>t‚| j|d	d
d�}|j|jk	s^t‚tjtdd�� |  |d¡ W 5 Q R X dS )zDCheck reshape behavior with copy and is strict with non-tuple shape.r   r   r   r?   r@   )éÿÿÿÿF)Úcopy)é   r   Tzshape must be a tupler   ry   N)r
   r!   ZreshapeÚbaser   r#   r$   r.   )r/   r   Z	X_no_copyZX_copyr   r   r   Útest_reshape_behaviorå   s    r}   Úwrapperc              	   C   sœ  | t krt d¡}t |ƒ}ntƒ }| |j|j¡s6t‚| |jd¡sHt‚| |jd¡sZt‚| |jd¡rlt‚| |j	d¡s~t‚| |jd¡r�t‚| |j
d¡s¢t‚| |jd¡r´t‚| |jd¡sÆt‚| |jd¡rØt‚| |jd¡sêt‚| |jd¡süt‚| |jd¡�st‚| |jd¡�r$t‚| tk�rj| |jd¡�rBt‚| |jd¡�sVt‚| |jd¡�sjt‚tjtdd	�� | |j
d
¡�sŽt‚W 5 Q R X dS )zGTest isdtype implementation from _ArrayAPIWrapper and _NumPyAPIWrapper.r-   zreal floatingÚboolzsigned integerzunsigned integerÚnumericzcomplex floatingzUnrecognized data typer   ÚunknownN)r   r#   r*   r
   ZisdtyperD   r   rC   Zint32r   Zint16Zuint32Zuint16Zint64Zint8Z	complex64Z
complex128r$   r%   )r~   rF   r/   r   r   r   Ú$test_get_namespace_array_api_isdtypeô   s0    


r‚   )(r    r#   Znumpy.testingr   r   Zsklearn._configr   Zsklearn.baser   Zsklearn.utils._array_apir   r   r   r	   r
   r   Zsklearn.utils._testingr   ÚmarkÚfilterwarningsZ
pytestmarkZparametrizer!   r   r'   r,   r0   r1   rG   rM   rN   rZ   r\   re   rf   rg   rw   rx   r}   r‚   r   r   r   r   Ú<module>   sT    ÿ"







ýþ
