U
    }h&*                     @   s$  U d dl Z 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
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 d dlmZmZmZ d d	lmZ ejd
Zd\ZZ e!ee Z"ej#d dedZ$ej#d dedfdZ%ej#d dedZ&e!eZ'ej(dddd Z)eeddZ*G dd de+Z,G dd dee
Z-G dd dee
Z.ede-e"e%ddgdede.e"e%ddgdede.e"e$dgdd ed!e.e"e%dgded!e-e"e%dgdgZ/e+e0d"< d#d$ e/D Z1d%d& Z2ej3j4d'e/e1d(d)d* Z5ej3j4d'e/e1d(d+d, Z6ej3j4d'e/e1d(d-d. Z7dS )/    N)partialconfig_context)BaseEstimatorClassifierMixinRegressorMixin)CalibratedClassifierCV)UnsetMetadataPassedError)ClassifierChainMultiOutputClassifierMultiOutputRegressorRegressorChain)assert_request_is_emptycheck_recorded_metadatarecord_metadata)MetadataRouter*   )d         )size   
   T)Zautousec                	   c   s    t dd dV  W 5 Q R X dS )zEnable SLEP006 for all tests.T)Zenable_metadata_routingNr    r   r   V/tmp/pip-unpacked-wheel-ig1s1lm8/sklearn/tests/test_metaestimators_metadata_routing.pyenable_slep006"   s    r   F)Zrecord_defaultc                   @   s   e Zd Zdd Zdd ZdS )	_Registryc                 C   s   | S Nr   )selfmemor   r   r   __deepcopy__2   s    z_Registry.__deepcopy__c                 C   s   | S r   r   )r   r   r   r   __copy__5   s    z_Registry.__copy__N)__name__
__module____qualname__r    r!   r   r   r   r   r   ,   s   r   c                   @   s8   e Zd ZdZdddZdddZddd	Zdd
dZdS )ConsumingRegressorad  A regressor consuming metadata.

    Parameters
    ----------
    registry : list, default=None
        If a list, the estimator will append itself to the list in order to have
        a reference to the estimator later on. Since that reference is not
        required in all tests, registration can be skipped by leaving this value
        as None.

    Nc                 C   s
   || _ d S r   registryr   r'   r   r   r   __init__F   s    zConsumingRegressor.__init__defaultc                 C   s*   | j d k	r| j |  t| d||d | S )Npartial_fitsample_weightmetadatar'   appendrecord_metadata_not_defaultr   Xyr-   r.   r   r   r   r+   I   s    
   zConsumingRegressor.partial_fitc                 C   s*   | j d k	r| j |  t| d||d | S )Nfitr,   r/   r2   r   r   r   r5   R   s    
   zConsumingRegressor.fitc                 C   s   d S r   r   r   r3   r-   r.   r   r   r   predict[   s    zConsumingRegressor.predict)N)r*   r*   )r*   r*   )r*   r*   )r"   r#   r$   __doc__r)   r+   r5   r7   r   r   r   r   r%   9   s
   

	
	r%   c                   @   sL   e Zd ZdZdddZdddZddd	Zdd
dZdddZdddZ	dS )ConsumingClassifierae  A classifier consuming metadata.

    Parameters
    ----------
    registry : list, default=None
        If a list, the estimator will append itself to the list in order to have
        a reference to the estimator later on. Since that reference is not
        required in all tests, registration can be skipped by leaving this value
        as None.

    Nc                 C   s
   || _ d S r   r&   r(   r   r   r   r)   u   s    zConsumingClassifier.__init__r*   c                 C   s4   | j d k	r| j |  t| d||d ddg| _| S )Nr+   r,   r      r'   r0   r1   Zclasses_r2   r   r   r   r+   x   s    
   
zConsumingClassifier.partial_fitc                 C   s4   | j d k	r| j |  t| d||d ddg| _| S )Nr5   r,   r   r:   r;   r2   r   r   r   r5      s    
   
zConsumingClassifier.fitc                 C   s   d S r   r   r6   r   r   r   r7      s    zConsumingClassifier.predictc                 C   s>   | j d k	r| j |  t| d||d tddggt| S )Npredict_probar,   g        g      ?)r'   r0   r1   npZasarraylenr6   r   r   r   r<      s    
   z!ConsumingClassifier.predict_probac                 C   s   d S r   r   r6   r   r   r   predict_log_proba   s    z%ConsumingClassifier.predict_log_proba)N)r*   r*   )r*   r*   )r*   r*   )r*   r*   )r*   r*   )
r"   r#   r$   r8   r)   r+   r5   r7   r<   r?   r   r   r   r   r9   h   s   






	r9   	estimatorr5   r+   )metaestimatorestimator_namer@   r3   r4   routing_methods)rA   rB   r@   r3   r4   rC   preserves_metadataZbase_estimatorMETAESTIMATORSc                 C   s   g | ]}t |d  jqS )rA   )strr"   ).0rowr   r   r   
<listcomp>   s     rI   c                  C   s@   t  } t  }| |k	st| t| ks*t| t| ks<td S r   )r   AssertionErrorcopydeepcopy)abr   r   r   test_registry_copy   s
    rO   rA   )idsc                 C   sJ   | d }| d  }| d }|f ||i}t |  t| tsFtd S )NrA   r@   rB   )r   Zget_metadata_routing
isinstancer   rJ   )rA   clsr@   rB   instancer   r   r   test_default_request   s    
rT   c                 C   s   | d }| d  }| d }| d }| d }| d }|D ]}dD ]}t td| }	||	i}
d| d	|jj d
| }|f ||i}d|kr||| tjtt	|d t
||}|||f|
 W 5 Q R X q>q6d S )NrA   r@   rB   r3   r4   rC   r,   [z@] are passed but are not explicitly set as requested or not for .r5   )match)r-   r.   	__class__r"   r5   pytestZraisesr	   reescapegetattr)rA   rR   r@   rB   r3   r4   rC   method_namekeyvalkwargsmsgrS   methodr   r   r   test_error_on_missing_requests  s$    

rc   c                 C   s   dd }| d }| d }| d }| d }| d }|  dd	}|D ]}d
D ]}	ttd
|	 }
|	|
i}t }| d |d}||| |f ||i}t||}|||f| |rH|st|D ]}t||f| qqHq@d S )Nc                 S   s"   t | d| d}|ddd d S )Nset__requestTr,   )r\   )r@   r]   Zset_request_for_methodr   r   r   set_request,  s    z7test_setting_request_removes_error.<locals>.set_requestrA   rB   r3   r4   rC   rD   Tr,   r@   r&   )getr-   r.   r   r\   rJ   r   )rA   rf   rR   rB   r3   r4   rC   rD   r]   r^   r_   r`   r'   r@   rS   rb   r   r   r   "test_setting_request_removes_error%  s*    

rh   )8rK   rZ   	functoolsr   Znumpyr=   rY   Zsklearnr   Zsklearn.baser   r   r   Zsklearn.calibrationr   Zsklearn.exceptionsr	   Zsklearn.multioutputr
   r   r   r   Z#sklearn.tests.test_metadata_routingr   r   r   Zsklearn.utils.metadata_routingr   randomZRandomStaterngNMZrandr3   randintr4   Zy_multir.   r-   Zfixturer   r1   listr   r%   r9   rE   __annotations__ZMETAESTIMATOR_IDSrO   markZparametrizerT   rc   rh   r   r   r   r   <module>   s    


/H		
	=	


