U
    3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   F/tmp/pip-unpacked-wheel-zrfo1fqw/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	stt	|t
j|dgdd |j||ddgdd}t|d	st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   

