U
    ½mœd5  ã                   @   s   d dl Z d dlm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	 d dlm
Z
 d dlmZ d d	lmZ d d
lmZ ej d¡Zdd„ Z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dd „ ZG d!d"„ d"eƒZej d#d$d%g¡d&d'„ ƒZd(d)„ ZdS )*é    N)Úassert_array_equal)ÚBaseEstimator)Úget_namespace)Ú_NumPyApiWrapper)Ú_ArrayAPIWrapper)Ú_asarray_with_order)Ú_convert_to_numpy)Ú _estimator_with_converted_arrays)Úconfig_contextz0ignore:The numpy.array_api submodule:UserWarningc               
   C   sb   t  d¡ t dddgg¡} dD ]<}t|d��( t| ƒ\}}|rDt‚t|tƒsRt‚W 5 Q R X q dS )z%Test get_namespace on NumPy ndarrays.únumpy.array_apié   é   é   )TF©Úarray_api_dispatchN)	ÚpytestÚimportorskipÚnumpyÚasarrayr
   r   ÚAssertionErrorÚ
isinstancer   )ÚX_npr   Úxp_outÚis_array_api© r   ú[/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/utils/tests/test_array_api.pyÚtest_get_namespace_ndarray   s    
r   c               
   C   s¨   t  d¡} t dddgg¡}|  |¡}tdd��n t|ƒ\}}|sFt‚t|tƒsTt‚t j	t
dd�� t||ƒ W 5 Q R X t j	t
d	d�� tdƒ W 5 Q R X W 5 Q R X d
S )z'Test get_namespace for ArrayAPI arrays.r   r   r   r   Tr   zMultiple namespaces©ÚmatchzUnrecognized array inputN)r   r   r   r   r
   r   r   r   r   ÚraisesÚ
ValueError)Úxpr   ZX_xpr   r   r   r   r   Útest_get_namespace_array_api!   s    

r"   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__)Úselfr$   Úname©Ú	__class__r   r   r&   7   s    z&_AdjustableNameAPITestWrapper.__init__)r'   Ú
__module__Ú__qualname__Ú__doc__r&   Ú__classcell__r   r   r*   r   r#   4   s   r#   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   r#   r   r   Úfloat64ZastypeZfloat32r4   r   )Únumpy_array_apiÚxp_r!   ÚXZX_convertedr   r   r   Útest_array_api_wrapper_astype<   s    

 r9   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   r1   r2   r3   r   ©ZaxisÚ__array_namespace__N)r   r   r#   r   r   r5   ÚtakeÚhasattrr   r   r   )r6   r7   r!   r8   ÚX_taker   r   r   Ú)test_array_api_wrapper_take_for_numpy_apiJ   s    

 r?   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   r0   r   r   r   r3   r   r:   r;   r1   r2   z"Only axis in \(0, 1\) is supportedr   z$Only X.ndim in \(1, 2\) is supportedN)r   r   r#   r   r   r5   r<   r=   r   r   r   r   r    )r6   r7   r!   ZX_1dr>   r8   r   r   r   Útest_array_api_wrapper_takeW   s$    

 "r@   r   TFc                 C   sL   | rt  d¡}nt}| dddg¡}t|dd�}t |¡}|jd sHt‚dS )	z=Test _asarray_with_order passes along order for NumPy arrays.r   ç333333ó?ç333333@çffffff@ÚF©ÚorderÚF_CONTIGUOUSN)r   r   r   r   r   Úflagsr   )r   r!   r8   ÚX_newÚX_new_npr   r   r   Útest_asarray_with_ordert   s    
rK   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   úwrapped.array_apirA   rB   rC   g      @ÚCrE   rD   )rF   r!   ZC_CONTIGUOUSrG   N)r   r   r#   r   r   r   rH   r   )r!   r7   r8   rI   rJ   r   r   r   Útest_asarray_with_order_ignoredƒ   s    



rN   c               	   C   sL   t  d¡} t| dƒ}| ddg¡}t jtdd�� t||d� W 5 Q R X dS )	z8Test convert to numpy errors for unsupported namespaces.r   rL   rA   rB   zSupported namespaces are:r   ©r!   N)r   r   r#   r   r   r    r   )r!   r7   r8   r   r   r   Útest_convert_to_numpy_error’   s
    

rP   c                   @   s   e Zd Zddd„ZdS )ÚSimpleEstimatorNc                 C   s   || _ |jd | _| S )Nr   )ÚX_ÚshapeZn_features_)r(   r8   Úyr   r   r   Úfitž   s    zSimpleEstimator.fit)N)r'   r,   r-   rU   r   r   r   r   rQ   �   s   rQ   r$   r   zcupy.array_apic                 C   s`   t  | ¡}| dkrdd„ }ndd„ }| ddgg¡}tƒ  |¡}t||ƒ}t|jtj	ƒs\t
‚dS )z(Convert estimator attributes to ndarray.r   c                 S   s
   t  | ¡S ©N)r   r   ©Úarrayr   r   r   Ú<lambda>ª   ó    z3test_convert_estimator_to_ndarray.<locals>.<lambda>c                 S   s
   | j  ¡ S rV   )Z_arrayÚgetrW   r   r   r   rY   ¬   rZ   çÍÌÌÌÌÌô?ç      @N)r   r   r   rQ   rU   r	   r   rR   r   Zndarrayr   )r$   r!   Ú	converterr8   ÚestÚnew_estr   r   r   Ú!test_convert_estimator_to_ndarray¤   s    


ra   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   r\   r]   c                    s
   ˆ   | ¡S rV   )r   rW   rO   r   r   rY   ¼   rZ   z5test_convert_estimator_to_array_api.<locals>.<lambda>r;   N)
r   r   r   r   rQ   rU   r	   r=   rR   r   )r   r_   r`   r   rO   r   Ú#test_convert_estimator_to_array_apiµ   s
    
rb   )r   Znumpy.testingr   r   Zsklearn.baser   Zsklearn.utils._array_apir   r   r   r   r   r	   Zsklearn._configr
   ÚmarkÚfilterwarningsZ
pytestmarkr   r"   r#   r9   r?   r@   ZparametrizerK   rN   rP   rQ   ra   rb   r   r   r   r   Ú<module>   s6   ÿ

