a
    �ù»j3£  ã                   @   s6  d Z ddlZddlZddlZddlmZ ddlmZm	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 dd	lmZ dd
l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,m-Z-m.Z. ddl/m0Z0 ej1 2d¡Z3d\Z4Z5e3 6e4e5¡Z7e3j8dde4d�Z9e3j8dde4d�Z:e3 6e4¡Z;e3 6e4¡Z<G dd„ deƒZ=edd�dd„ ƒZ>ej? @deeƒ d�eeƒ d�eeƒ d�eeƒ eƒ d�eeƒ eƒ d�g¡edd�dd„ ƒƒZAej? @dg d¢¡edd�dd „ ƒƒZBej? @dg d!¢¡edd�d"d#„ ƒƒZCedd�d$d%„ ƒZDedd�d&d'„ ƒZEedd�d(d)„ ƒZFedd�d*d+„ ƒZGej? @d,e!¡ej? @d-dd-g g¡edd�d.d/„ ƒƒƒZHedd�d0d1„ ƒZIedd�d2d3„ ƒZJedd�d4d5„ ƒZKedd�d6d7„ ƒZLedd�d8d9„ ƒZMedd�d:d;„ ƒZNedd�d<d=„ ƒZOedd�d>d?„ ƒZPedd�d@dA„ ƒZQedd�dBdC„ ƒZRedd�dDdE„ ƒZSedd�dFdG„ ƒZTedd�dHdI„ ƒZUedd�ej? @dJe#dKdLdM�jVdNdOdP�dQfe)dKdR�dSfe*dKdR�jWeƒ e+ƒ jWdTdTdU�dV�dWfg¡edd�dXdY„ ƒƒƒZXej? @dZe+ƒ d[dLd\dUœeYd]fe+ƒ d[d\dLdUœeYd^fe*dKdR�d_d`e*dKdR�ieYdafeƒ dbd\dieZdcfg¡edd�ddde„ ƒƒZ[edd�dfdg„ ƒZ\edd�dhdi„ ƒZ]edd�djdk„ ƒZ^edd�dldm„ ƒZ_edd�dndo„ ƒZ`edd�dpdq„ ƒZaedd�drds„ ƒZbedd�dtdu„ ƒZcedd�dvdw„ ƒZdedd�dxdy„ ƒZeedd�dzd{„ ƒZfedd�d|d}„ ƒZgdS )~z 
Metadata Routing Utility Tests
é    N)Úconfig_context)ÚBaseEstimatorÚclone)ÚUnsetMetadataPassedError)ÚLinearRegression)ÚPipeline)ÚConsumingClassifierÚConsumingRegressorÚConsumingTransformerÚMetaRegressorÚMetaTransformerÚNonConsumingClassifierÚWeightedMetaClassifierÚWeightedMetaRegressorÚ	_RegistryÚassert_request_equalÚassert_request_is_emptyÚcheck_recorded_metadata)Úmetadata_routing)ÚCOMPOSITE_METHODSÚMETHODSÚSIMPLE_METHODSÚMethodMetadataRequestÚ
MethodPairÚ_MetadataRequesterÚrequest_is_aliasÚrequest_is_valid)ÚMetadataRequestÚMetadataRouterÚMethodMappingÚ_RoutingNotSupportedMixinÚget_routing_for_objectÚprocess_routing)Úcheck_is_fittedé*   )éd   é   é   )Úsizeé
   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚSimplePipelinezÓA very simple pipeline, assuming the last step is always a predictor.

    Parameters
    ----------
    steps : iterable of objects
        An iterable of transformers with the last step being a predictor.
    c                 C   s
   || _ d S ©N)Ústeps)Úselfr,   © r.   úIE:\soccer\ml_env\Lib\site-packages\sklearn/tests/test_metadata_routing.pyÚ__init__J   s    zSimplePipeline.__init__c           	      K   s¸   g | _ t| dfi |¤Ž}|}t| jd d… ƒD ]Z\}}t|ƒj||fi | d|› �¡j¤Ž}| j  |¡ |j|fi | d|› �¡j¤Ž}q.| j  t| jd ƒj||fi |j	j¤Ž¡ | S )NÚfitéÿÿÿÿÚstep_)
Ústeps_r"   Ú	enumerater,   r   r1   ÚgetÚappendÚ	transformÚ	predictor)	r-   ÚXÚyZ
fit_paramsÚparamsÚX_transformedÚiÚstepÚtransformerr.   r.   r/   r1   M   s&    ÿÿÿÿ ÿzSimplePipeline.fitc                 K   sv   t | ƒ |}t| dfi |¤Ž}t| jd d… ƒD ](\}}|j|fi | d|› �¡j¤Ž}q0| jd j|fi |jj¤ŽS )NÚpredictr2   r3   )r#   r"   r5   r4   r8   r6   rA   r9   )r-   r:   Zpredict_paramsr=   r<   r>   r?   r.   r.   r/   rA   _   s    "zSimplePipeline.predictc              	   C   sš   t | jjd�}t| jd d… ƒD ]J\}}|jf i d|› �|i¤dtƒ jddd�jddd�jddd�i¤Ž q |j| jd tƒ jddd�jddd�d	� |S )
N©Úownerr2   r3   Úmethod_mappingr1   ©ZcallerZcalleer8   rA   )r9   rD   )r   Ú	__class__Ú__name__r5   r,   Úaddr   )r-   Úrouterr>   r?   r.   r.   r/   Úget_metadata_routingh   s,    ÿÿþýþ
ÿþþz#SimplePipeline.get_metadata_routingN)rG   Ú
__module__Ú__qualname__Ú__doc__r0   r1   rA   rJ   r.   r.   r.   r/   r*   A   s
   	r*   T©Zenable_metadata_routingc                  C   s  t dd�} t| ƒ | jjdd d� t| ƒ | jjddd� t t¡� t| ƒ W d   ƒ n1 sb0    Y  t| dd� | jjd	d
d� t t¡� t| dd� W d   ƒ n1 s´0    Y  t| ddgd� ttdd� 	t
d d�¡jtƒ tƒ jddd�d�ƒ d S )NÚtestrB   Úfoo©ÚparamÚaliasÚbarÚvaluer1   ©ÚexcludeÚcarrotTÚscore©Ú	estimatorrE   ©r[   rD   )r   r   r1   Úadd_requestÚpytestÚraisesÚAssertionErrorrY   r   Úadd_self_requestr   rH   r	   r   )Úrequestsr.   r.   r/   Útest_assert_request_is_empty{   s(    
&*
ÿüÿrc   r[   )Úregistry)r[   rd   c                 C   s   |   tt¡ | | jv sJ ‚dS )z=Check that an estimator puts itself in the registry upon fit.N)r1   r:   r;   rd   rZ   r.   r.   r/   Ú$test_estimator_puts_self_in_registryŸ   s    re   zval, res))FF)TF)NF)ú$UNUSED$F)ú$WARN$F©zinvalid-inputF)Z	valid_argTc                 C   s   t | ƒ|ksJ ‚d S r+   )r   ©ÚvalÚresr.   r.   r/   Útest_request_type_is_alias°   s    rl   ))FT)TT)NT)rf   T)rg   Trh   )Z	alias_argFc                 C   s   t | ƒ|ksJ ‚d S r+   )r   ri   r.   r.   r/   Útest_request_type_is_validÂ   s    rm   c                  C   s¼   G dd„ dt ƒ} t| ƒ ƒ}|jjddiks.J ‚tttƒ ƒjjƒrDJ ‚ttƒ  ¡ ƒ ttƒ ƒ}|jjd d dœksrJ ‚|j	jd d dœksˆJ ‚t|ƒ tt
ƒ ƒ}|jjd d dœks°J ‚t|ƒ d S )Nc                   @   s   e Zd ZddiZdS )z+test_default_requests.<locals>.OddEstimatorÚsample_weightTN)rG   rK   rL   Z$_OddEstimator__metadata_request__fitr.   r.   r.   r/   ÚOddEstimatorÖ   s   þro   rn   T©rn   Úmetadata©rq   rn   )r   r!   r1   rb   Úlenr   r   rJ   r
   r8   r   )ro   Zodd_requestZtrs_requestZest_requestr.   r.   r/   Útest_default_requestsÔ   s$    

þ
þrt   c                  C   sd   G dd„ dt ƒ} G dd„ d| ƒ}G dd„ d| ƒ}t|ƒ  ¡ ddd	iiƒ t|ƒ  ¡ ddd	iiƒ d
S )zþTest that default requests are correctly overridden regardless of the ASCII order
    of the class names, hence testing small and capital letter class name starts.
    Non-regression test for https://github.com/scikit-learn/scikit-learn/issues/28430
    c                   @   s   e Zd ZddiZdS )z+test_default_request_override.<locals>.BaseÚgroupsTN)rG   rK   rL   Z_Base__metadata_request__splitr.   r.   r.   r/   ÚBaseú   s   rv   c                   @   s   e Zd ZddiZdS )z.test_default_request_override.<locals>.class_1ru   Úsample_domainN)rG   rK   rL   Z!_class_1__metadata_request__splitr.   r.   r.   r/   Úclass_1ý   s   rx   c                   @   s   e Zd ZddiZdS )z.test_default_request_override.<locals>.Class_1ru   rw   N)rG   rK   rL   Z!_Class_1__metadata_request__splitr.   r.   r.   r/   ÚClass_1   s   ry   Úsplitru   rw   N)r   r   Ú_get_metadata_request)rv   rx   ry   r.   r.   r/   Útest_default_request_overrideó   s    ÿÿr|   c                   C   sB   t jtdd��  ttƒ dtd� W d   ƒ n1 s40    Y  d S )Nz Can only route and process input©ÚmatchZinvalid_method©ru   )r^   r_   Ú	TypeErrorr"   r   Ú	my_groupsr.   r.   r.   r/   Ú#test_process_routing_invalid_method  s    r‚   c                  C   sP   G dd„ dƒ} t jtdd��  t| ƒ dtd� W d   ƒ n1 sB0    Y  d S )Nc                   @   s   e Zd ZdS )z:test_process_routing_invalid_object.<locals>.InvalidObjectN)rG   rK   rL   r.   r.   r.   r/   ÚInvalidObject  s   rƒ   z#either implement the routing methodr}   r1   r   )r^   r_   ÚAttributeErrorr"   r�   )rƒ   r.   r.   r/   Ú#test_process_routing_invalid_object  s    r…   ÚmethodÚdefaultc                 C   sd   i }t tƒ dfi |¤Ž}||  }t|tƒs.J ‚t| ¡ ƒttƒksFJ ‚|j| |d�}||ks`J ‚d S )Nr1   )r‡   )r"   r   Ú
isinstanceÚdictÚsetÚkeysr   r6   )r†   r‡   Zempty_paramsZrouted_paramsZparams_for_methodZdefault_params_for_methodr.   r.   r/   Ú2test_process_routing_empty_params_get_with_default  s    rŒ   c                  C   s,  t tƒ d�} |  tt¡ t tƒ d�} | jtttd� t tƒ d�} d}tjt	t
 |¡d��  | jtttd� W d   ƒ n1 s~0    Y  t tƒ jdd�d�} | jtttd� t| jddd� t tƒ jdd�d�} | jtttd� t| jddtd	� t tƒ jd
d�d�} | jtttd� t| jddtd	� d S )NrZ   ©rn   zo[sample_weight] are passed but are not explicitly set as requested or not requested for ConsumingClassifier.fitr}   Fr1   )r†   ÚparentT©r†   rŽ   rn   Úalternative_weight)r�   )r   r   r1   r:   r;   Ú
my_weightsr   r^   r_   Ú
ValueErrorÚreÚescapeÚset_fit_requestr   Ú
estimator_)ZclfZerr_messager.   r.   r/   Útest_simple_metadata_routing+  s<    ÿ.ÿÿ
ÿÿÿ
ÿr—   c                  C   sþ   t ttƒ jddd�jddd�d�ttƒ jddd�jdd�d�jd	d�gƒ} d
gdgdg  }}}| jt	t
t|||d� t| jd jddtd� t| jd jdd|d� t| jd
 dd|d� t| jd
 jdd|d� | jt	|d� t| jd jdd|d� d S )NTFrr   rp   ©r@   Úinner_weightsr�   rZ   Úouter_weightsé   r'   é   )rq   rn   rš   r™   r   r1   )r†   rŽ   rq   r8   r�   )r*   r   r
   r•   Úset_transform_requestr   r	   Úset_predict_requestr1   r:   r;   r�   r   r4   Ztransformer_r–   rA   )ÚpipelineÚw1Úw2Zw3r.   r.   r/   Útest_nested_routingd  s`    ÿþÿÿþÿüúÿÿ
ü
üÿÿ
ür¢   c                  C   s˜   t ttƒ jddd�jdd�d�ttƒ jdd�d�jdd�gƒ} dgd	g }}tjt	t
 d
¡d��$ | jttt||d� W d   ƒ n1 sŠ0    Y  d S )NTFrr   r�   r˜   rZ   rš   r›   r'   zñIn WeightedMetaRegressor, there is a conflict on sample_weight between what is requested for this estimator and what is requested by its children. You can resolve this conflict by using an alias for the child estimator(s) requested metadata.r}   )rq   rn   rš   )r*   r   r
   r•   r�   r   r	   r^   r_   r’   r“   r”   r1   r:   r;   r�   )rŸ   r    r¡   r.   r.   r/   Útest_nested_routing_conflict•  s.    ÿþÿÿþúÿÿýr£   c                  C   sÀ   t tƒ jdd�d�} tjtt d¡d��& |  t	t
¡jt	td� W d   ƒ n1 sT0    Y  t tƒ jdd�d�} tjtt d¡d��& |  t	t
¡jt	td� W d   ƒ n1 s²0    Y  d S )	NTr�   r˜   z4transform got unexpected argument(s) {'other_param'}r}   ©Úother_paramFz6transform got unexpected argument(s) {'sample_weight'})r   r
   r�   r^   r_   r€   r“   r”   r1   r:   r;   r8   r‘   )Útrsr.   r.   r/   Útest_invalid_metadata³  s     ÿþ4ÿþr§   c                  C   sþ   G dd„ dt ƒ} G dd„ dt ƒ}tjtdd�� | ƒ  ¡  W d   ƒ n1 sN0    Y  dd d dœd d d	œd
didœ}t|ƒ  ¡ |ƒ |ƒ jdd�}dd d dœd d d	œd
didœ}t| ¡ |ƒ |ƒ jdd�}dd d dœd dd	œd
didœ}t| ¡ |ƒ d S )Nc                   @   s*   e Zd ZdddœZddddœZddiZdS )z<test_get_metadata_routing.<locals>.TestDefaultsBadMethodNameN)rn   Úmy_paramT©rn   r¨   Úmy_other_paramr¨   )rG   rK   rL   Z1_TestDefaultsBadMethodName__metadata_request__fitZ3_TestDefaultsBadMethodName__metadata_request__scoreZ:_TestDefaultsBadMethodName__metadata_request__other_methodr.   r.   r.   r/   ÚTestDefaultsBadMethodNameÌ  s   þýr«   c                   @   s*   e Zd ZdddœZddddœZddiZdS )z/test_get_metadata_routing.<locals>.TestDefaultsN)rn   rª   Tr©   r¨   )rG   rK   rL   Z$_TestDefaults__metadata_request__fitZ&_TestDefaults__metadata_request__scoreZ(_TestDefaults__metadata_request__predictr.   r.   r.   r/   ÚTestDefaultsÙ  s   þýr¬   z8'MetadataRequest' object has no attribute 'other_method'r}   T)r¨   rª   rn   )rª   rn   r¨   )rY   r1   rA   r¥   )r¨   r�   )r   r^   r_   r„   rJ   r   Úset_score_requestr•   )r«   r¬   ÚexpectedÚestr.   r.   r/   Útest_get_metadata_routingÊ  sL    ÿ(ýþöýþöýþör°   c                  C   s¾   t ƒ } G dd„ dtƒ}dd i| |< G dd„ dtƒ}ddi| |< G dd„ dtƒ}dd i| |< G d	d
„ d
tƒ}i | |< |  ¡ D ]>\}}t|ƒ ƒjj|ks˜J ‚t|ƒ  ¡ dd� |ƒ  d d ¡ qzd S )Nc                   @   s   e Zd ZddiZdd„ ZdS )z6test_setting_default_requests.<locals>.ExplicitRequestÚpropNc                 [   s   | S r+   r.   ©r-   r:   r;   Úkwargsr.   r.   r/   r1      s    z:test_setting_default_requests.<locals>.ExplicitRequest.fit)rG   rK   rL   Z'_ExplicitRequest__metadata_request__fitr1   r.   r.   r.   r/   ÚExplicitRequest  s   r´   r±   c                   @   s   e Zd ZddiZddd„ZdS )z?test_setting_default_requests.<locals>.ExplicitRequestOverwriter±   TNc                 [   s   | S r+   r.   ©r-   r:   r;   r±   r³   r.   r.   r/   r1   *  s    zCtest_setting_default_requests.<locals>.ExplicitRequestOverwrite.fit)N)rG   rK   rL   Z0_ExplicitRequestOverwrite__metadata_request__fitr1   r.   r.   r.   r/   ÚExplicitRequestOverwrite%  s   r¶   Tc                   @   s   e Zd Zddd„ZdS )z6test_setting_default_requests.<locals>.ImplicitRequestNc                 [   s   | S r+   r.   rµ   r.   r.   r/   r1   1  s    z:test_setting_default_requests.<locals>.ImplicitRequest.fit)N©rG   rK   rL   r1   r.   r.   r.   r/   ÚImplicitRequest/  s   r¸   c                   @   s    e Zd ZdejiZddd„ZdS )z=test_setting_default_requests.<locals>.ImplicitRequestRemovalr±   Nc                 [   s   | S r+   r.   rµ   r.   r.   r/   r1   ;  s    zAtest_setting_default_requests.<locals>.ImplicitRequestRemoval.fit)N)rG   rK   rL   r   ÚUNUSEDZ._ImplicitRequestRemoval__metadata_request__fitr1   r.   r.   r.   r/   ÚImplicitRequestRemoval6  s   
rº   r1   rV   )r‰   r   Úitemsr!   r1   rb   r   rJ   )Z
test_casesr´   r¶   r¸   rº   ZKlassrb   r.   r.   r/   Útest_setting_default_requests  s    r¼   c                  C   sL   G dd„ dt ƒ} tjtdd�� | ƒ  ¡  W d  ƒ n1 s>0    Y  dS )zFTest that removing a metadata using UNUSED which doesn't exist raises.c                   @   s   e Zd ZdejiZdd„ ZdS )zFtest_removing_non_existing_param_raises.<locals>.InvalidRequestRemovalr±   c                 [   s   | S r+   r.   r²   r.   r.   r/   r1   O  s    zJtest_removing_non_existing_param_raises.<locals>.InvalidRequestRemoval.fitN)rG   rK   rL   r   r¹   Z-_InvalidRequestRemoval__metadata_request__fitr1   r.   r.   r.   r/   ÚInvalidRequestRemovalJ  s   
r½   zTrying to remove parameterr}   N)r   r^   r_   r’   rJ   )r½   r.   r.   r/   Ú'test_removing_non_existing_param_raisesF  s    r¾   c                  C   s  t ddd�} tjtdd�� | jddd� W d   ƒ n1 s>0    Y  | jdd d� | jdd ikshJ ‚| jdd	d� | jdd	iksˆJ ‚| jdd
d� | jdd
iks¨J ‚| jddd� | jdd
iksÈJ ‚| jddd� | jddiksèJ ‚| jd	d�dhksþJ ‚| jd
d�dhk�sJ ‚d S )NrO   r1   ©rC   r†   zThe alias you're setting forr}   rP   gffffffö?rQ   FTrT   )Úreturn_alias)r   r^   r_   r’   r]   rb   Ú_get_param_names)Zmmrr.   r.   r/   Útest_method_metadata_requestV  s    ,rÂ   c                  C   sš   G dd„ dt ƒ} ttd ƒƒ tttƒ ƒƒ tdd�}|jjddd� t|ƒ}t|dd	� |jjddikslJ ‚t| ƒ ƒ}t|dd	� |jjd
d iks–J ‚d S )Nc                   @   s   e Zd ZddiZdS )z-test_get_routing_for_object.<locals>.Consumerr±   N)rG   rK   rL   Z _Consumer__metadata_request__fitr.   r.   r.   r/   ÚConsumerm  s   rÃ   rO   rB   rP   rT   rQ   r1   rV   r±   )r   r   r!   Úobjectr   r1   r]   rb   )rÃ   ÚmrZ
mr_factoryr.   r.   r/   Útest_get_routing_for_objectk  s    

rÆ   c                  C   s’   t dd�} | jddhd�tƒ ks$J ‚tdd�} | jjddd� | jddhd�dhksXJ ‚tdd�} | jjddd� | jdddhd�dhksŽJ ‚d	S )
z@Test that MetadataRequest().consumes() method works as expected.rO   rB   r1   rP   ©r†   r<   TrQ   rT   N)r   ÚconsumesrŠ   r   r1   r]   )Úrequestr.   r.   r/   Ú%test_metadata_request_consumes_method~  s    


rÊ   c                  C   sl   t tƒ jdd�d�dhdhft tƒ jdd�d�ddhdhfg} | D ]$\}}}| ¡ jd|d�|ksBJ ‚qBdS )	z=Test that MetadataRouter().consumes method works as expected.Tr�   rZ   rn   r‘   r1   rÇ   N)r   r	   r•   rJ   rÈ   )ZcasesÚobjÚinputÚoutputr.   r.   r/   Ú$test_metadata_router_consumes_method�  s"    ÿûÿÿùørÎ   c                  C   sb   G dd„ dt ƒ} tjtdd��0 | tƒ jdd�d�jttt	d� W d   ƒ n1 sT0    Y  d S )Nc                   @   s   e Zd ZdejiZdS )z>test_metaestimator_warnings.<locals>.WeightedMetaRegressorWarnrn   N)rG   rK   rL   r   ÚWARNZ1_WeightedMetaRegressorWarn__metadata_request__fitr.   r.   r.   r/   ÚWeightedMetaRegressorWarn«  s   rÐ   ú4Support for .* has recently been added to this classr}   Fr�   rZ   )
r   r^   ÚwarnsÚUserWarningr   r•   r1   r:   r;   r‘   )rÐ   r.   r.   r/   Útest_metaestimator_warnings©  s    ÿÿþrÔ   c                  C   sZ   G dd„ dt ƒ} tjtdd��( t| ƒ d�jtttd� W d   ƒ n1 sL0    Y  d S )Nc                   @   s   e Zd ZdejiZdS )z7test_estimator_warnings.<locals>.ConsumingRegressorWarnrn   N)rG   rK   rL   r   rÏ   Z._ConsumingRegressorWarn__metadata_request__fitr.   r.   r.   r/   ÚConsumingRegressorWarn¸  s   rÕ   rÑ   r}   rZ   r�   )	r	   r^   rÒ   rÓ   r   r1   r:   r;   r‘   )rÕ   r.   r.   r/   Útest_estimator_warnings¶  s    ÿÿrÖ   zobj, stringrO   r1   r¿   rP   rT   rQ   z{'foo': 'bar'}rB   z{}rA   rE   r\   a*  {'estimator': {'mapping': [{'caller': 'predict', 'callee': 'predict'}], 'router': {'fit': {'sample_weight': None, 'metadata': None}, 'partial_fit': {'sample_weight': None, 'metadata': None}, 'predict': {'sample_weight': None, 'metadata': None}, 'score': {'sample_weight': None, 'metadata': None}}}}c                 C   s   t | ƒ|ksJ ‚d S r+   )Ústr)rË   Ústringr.   r.   r/   Útest_string_representationsÃ  s    rÙ   z%obj, method, inputs, err_cls, err_msgrH   ÚinvalidzGiven calleezGiven callerra   rË   z@Given `obj` is neither a `MetadataRequest` nor does it implementr•   zUnexpected argsc                 C   sF   t j||d��$ t| |ƒf i |¤Ž W d   ƒ n1 s80    Y  d S )Nr}   )r^   r_   Úgetattr)rË   r†   ÚinputsZerr_clsÚerr_msgr.   r.   r/   Útest_validationså  s    #rÞ   c                  C   s®   t ƒ jddd�jddd�} t| ƒ}|d dks2J ‚|d dksBJ ‚t ƒ } tD ]&}| j||d� t||ƒ| jv sLJ ‚qLt| jƒttƒksŠJ ‚t ƒ jddd�} t| ƒd	ksªJ ‚d S )
Nr1   r8   rE   r   )r1   r8   r›   )r1   r1   rY   z([{'caller': 'score', 'callee': 'score'}])r   rH   Úlistr   r   Z_routesrs   Úrepr)ÚmmZmm_listr†   r.   r.   r/   Útest_methodmapping  s     ÿþÿrâ   c                  C   s  t dd�} | jjddd� tdd� | ¡}t|jƒt| ƒks@J ‚|j| usNJ ‚tƒ jdd�}tdd�j|d	�}t|jƒt| 	¡ ƒksˆJ ‚|j| 	¡ usšJ ‚t
tƒ jd
d�d�}tdd�j|d	�}t|jƒt| ¡ ƒksÚJ ‚t|jƒt| 	¡ ƒksôJ ‚|j| ¡ u�sJ ‚d S )NÚnestedrB   rR   TrQ   rO   r‘   r�   )rË   Znested_weightsrZ   )r   r1   r]   r   ra   r×   Z_self_requestr	   r•   rJ   r   r{   )rÉ   rI   r¯   r.   r.   r/   Ú$test_metadatarouter_add_self_request"  s     
ÿrä   c                  C   sx   t dd�jtƒ jdd�tƒ jddd�d�} t| ƒdks:J ‚t dd�jtƒ jdd	d�tƒ jd
d�d�} t| ƒdkstJ ‚d S )NrO   rB   Úweightsr�   r1   rE   )r¯   rD   a!  {'est': {'mapping': [{'caller': 'fit', 'callee': 'fit'}], 'router': {'fit': {'sample_weight': 'weights', 'metadata': None}, 'partial_fit': {'sample_weight': None, 'metadata': None}, 'predict': {'sample_weight': None, 'metadata': None}, 'score': {'sample_weight': None, 'metadata': None}}}}rY   T)rD   r¯   a  {'est': {'mapping': [{'caller': 'fit', 'callee': 'score'}], 'router': {'fit': {'sample_weight': None, 'metadata': None}, 'partial_fit': {'sample_weight': None, 'metadata': None}, 'predict': {'sample_weight': None, 'metadata': None}, 'score': {'sample_weight': True, 'metadata': None}}}})r   rH   r	   r•   r   r×   r­   ©rI   r.   r.   r/   Útest_metadata_routing_add@  s     
þÿÿ

þÿÿrç   c                  C   sÌ   t dd� ttƒ d�jdd�¡jtƒ jdd�tƒ jddd�d	�} t| ƒd
ksPJ ‚| j	dddd�h d£kslJ ‚| j	dddd�h d£ksˆJ ‚| j	dddd�ddhks¤J ‚| j	dddd�| j	dddd�ksÈJ ‚d S )NrO   rB   rZ   Úself_weightsr�   Útransform_weightsr1   rE   )r¦   rD   a^  {'$self_request': {'fit': {'sample_weight': 'self_weights'}, 'score': {'sample_weight': None}}, 'trs': {'mapping': [{'caller': 'fit', 'callee': 'fit'}], 'router': {'fit': {'sample_weight': 'transform_weights', 'metadata': None}, 'transform': {'sample_weight': None, 'metadata': None}, 'inverse_transform': {'sample_weight': None, 'metadata': None}}}}TF)r†   rÀ   Zignore_self_request>   ré   rè   rq   >   rq   ré   rn   rq   )
r   ra   r   r	   r•   rH   r
   r   r×   rÁ   ræ   r.   r.   r/   Ú%test_metadata_routing_get_param_names_  sJ    
ÿþÿöÿÿÿ	ÿþÿþÿþÿÿþrê   c                  C   sŠ   G dd„ dt ƒ} tD ]}t| ƒ d|› d�ƒrJ ‚qG dd„ dt ƒ} tD ]}t| ƒ d|› d�ƒrFJ ‚qFtD ]}t| ƒ d|› d�ƒshJ ‚qhd S )Nc                   @   sn   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zddd„Zdd„ Zdd„ ZdS )ú/test_method_generation.<locals>.SimpleEstimatorc                 S   s   d S r+   r.   ©r-   r:   r;   r.   r.   r/   r1   ”  s    ú3test_method_generation.<locals>.SimpleEstimator.fitc                 S   s   d S r+   r.   rì   r.   r.   r/   Úfit_transform—  s    ú=test_method_generation.<locals>.SimpleEstimator.fit_transformc                 S   s   d S r+   r.   rì   r.   r.   r/   Úfit_predictš  s    ú;test_method_generation.<locals>.SimpleEstimator.fit_predictc                 S   s   d S r+   r.   rì   r.   r.   r/   Úpartial_fit�  s    ú;test_method_generation.<locals>.SimpleEstimator.partial_fitc                 S   s   d S r+   r.   ©r-   r:   r.   r.   r/   rA      s    ú7test_method_generation.<locals>.SimpleEstimator.predictc                 S   s   d S r+   r.   rô   r.   r.   r/   Úpredict_proba£  s    ú=test_method_generation.<locals>.SimpleEstimator.predict_probac                 S   s   d S r+   r.   rô   r.   r.   r/   Úpredict_log_proba¦  s    úAtest_method_generation.<locals>.SimpleEstimator.predict_log_probac                 S   s   d S r+   r.   rô   r.   r.   r/   Údecision_function©  s    úAtest_method_generation.<locals>.SimpleEstimator.decision_functionc                 S   s   d S r+   r.   rì   r.   r.   r/   rY   ¬  s    ú5test_method_generation.<locals>.SimpleEstimator.scoreNc                 S   s   d S r+   r.   rì   r.   r.   r/   rz   ¯  s    ú5test_method_generation.<locals>.SimpleEstimator.splitc                 S   s   d S r+   r.   rô   r.   r.   r/   r8   ²  s    ú9test_method_generation.<locals>.SimpleEstimator.transformc                 S   s   d S r+   r.   rô   r.   r.   r/   Úinverse_transformµ  s    úAtest_method_generation.<locals>.SimpleEstimator.inverse_transform)N©rG   rK   rL   r1   rî   rð   rò   rA   rö   rø   rú   rY   rz   r8   rÿ   r.   r.   r.   r/   ÚSimpleEstimator’  s   
r  Úset_Ú_requestc                   @   s„   e 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 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 )&rë   Nc                 S   s   d S r+   r.   ©r-   r:   r;   rn   r.   r.   r/   r1   ½  s    rí   c                 S   s   d S r+   r.   r  r.   r.   r/   rî   À  s    rï   c                 S   s   d S r+   r.   r  r.   r.   r/   rð   Ã  s    rñ   c                 S   s   d S r+   r.   r  r.   r.   r/   rò   Æ  s    ró   c                 S   s   d S r+   r.   ©r-   r:   rn   r.   r.   r/   rA   É  s    rõ   c                 S   s   d S r+   r.   r  r.   r.   r/   rö   Ì  s    r÷   c                 S   s   d S r+   r.   r  r.   r.   r/   rø   Ï  s    rù   c                 S   s   d S r+   r.   r  r.   r.   r/   rú   Ò  s    rû   c                 S   s   d S r+   r.   r  r.   r.   r/   rY   Õ  s    rü   c                 S   s   d S r+   r.   r  r.   r.   r/   rz   Ø  s    rý   c                 S   s   d S r+   r.   r  r.   r.   r/   r8   Û  s    rþ   c                 S   s   d S r+   r.   r  r.   r.   r/   rÿ   Þ  s    r   )N)N)N)N)N)N)N)N)N)NN)N)Nr  r.   r.   r.   r/   r  »  s   










)r   r   Úhasattrr   r   )r  r†   r.   r.   r/   Útest_method_generationŒ  s    &'r  c                  C   s  G dd„ dt ƒ} | ƒ }| ¡ jjd d d dœks2J ‚| ¡ jjd d dœksLJ ‚|jddd� tjtdd	�� | ¡ j W d   ƒ n1 sˆ0    Y  |j	dd
� tjtdd	�� | ¡ j W d   ƒ n1 sÌ0    Y  |j	ddd� | ¡ j |j
dd� | ¡ jjddddœk�sJ ‚d S )Nc                   @   s*   e Zd Zddd„Zd	dd„Zd
dd„ZdS )z/test_composite_methods.<locals>.SimpleEstimatorNc                 S   s   d S r+   r.   )r-   r:   r;   rP   rT   r.   r.   r/   r1   ò  s    z3test_composite_methods.<locals>.SimpleEstimator.fitc                 S   s   d S r+   r.   )r-   r:   rP   rT   r.   r.   r/   rA   õ  s    z7test_composite_methods.<locals>.SimpleEstimator.predictc                 S   s   d S r+   r.   )r-   r:   r¥   r.   r.   r/   r8   ø  s    z9test_composite_methods.<locals>.SimpleEstimator.transform)NN)NN)N)rG   rK   rL   r1   rA   r8   r.   r.   r.   r/   r  ð  s   

r  )rT   rP   r¥   )rT   rP   TrO   )rP   rT   z!Conflicting metadata requests forr}   )rT   r¤   )r   rJ   rî   rb   rð   r•   r^   r_   r’   rž   r�   )r  r¯   r.   r.   r/   Útest_composite_methodsê  s,    
ý((

ýr	  c                	   C   sj   t dd��L tjtdd�� tƒ jdd� W d  ƒ n1 s>0    Y  W d  ƒ n1 s\0    Y  dS )zCTest that when feature flag disabled, set_{method}_requests raises.FrN   zThis method is only availabler}   Tr�   N)r   r^   r_   ÚRuntimeErrorr   r•   r.   r.   r.   r/   Ú!test_no_feature_flag_raises_error  s    r  c                   C   s   t tƒ d�jttdd� dS )zCTest that passing None as metadata when not requested doesn't raiserZ   Nr�   )r   r	   r1   r:   r;   r.   r.   r.   r/   Útest_none_metadata_passed'  s    r  c                  C   sp   G dd„ dt tƒ} t| ƒ d� tt¡ tjtdd��( t| ƒ d�jttt	d� W d  ƒ n1 sb0    Y  dS )zÐTest that when no metadata is passed, having a meta-estimator which does
    not yet support metadata routing works.

    Non-regression test for https://github.com/scikit-learn/scikit-learn/issues/28246
    c                   @   s   e Zd Zddd„ZdS )z0test_no_metadata_always_works.<locals>.EstimatorNc                 S   s   | S r+   r.   )r-   r:   r;   rq   r.   r.   r/   r1   6  s    z4test_no_metadata_always_works.<locals>.Estimator.fit)Nr·   r.   r.   r.   r/   Ú	Estimator5  s   r  rZ   z3Estimator has not implemented metadata routing yet.r}   ©rq   N)
r    r   r   r1   r:   r;   r^   r_   ÚNotImplementedErrorr�   )r  r.   r.   r/   Útest_no_metadata_always_works-  s    ÿr  c                  C   sb   t tƒ d�} t| gƒ}t d¡}tjt|d��  |jt	t
dd� W d  ƒ n1 sT0    Y  dS )z}Test that UnsetMetadataPassedError raises the correct error message when
    set_{method}_request is not set in nested cases.rZ   a  [metadata] are passed but are not explicitly set as requested or not requested for ConsumingClassifier.fit, which is used within WeightedMetaClassifier.fit. Call `ConsumingClassifier.set_fit_request({metadata}=True/False)` for each metadata you want to request/ignore.r}   Úblahr  N)r   r   r*   r“   r”   r^   r_   r   r1   r:   r;   )Zweighted_metaÚpipeÚmsgr.   r.   r/   Ú%test_unsetmetadatapassederror_correctB  s    
ÿr  c                  C   s`   t ƒ } td| fgƒ}t d¡}tjt|d��  |jtt	dd� W d  ƒ n1 sR0    Y  dS )zŒTest that UnsetMetadataPassedError raises the correct error message when
    composite metadata request methods are not set in nested cases.Úconsuming_transformeraA  [metadata] are passed but are not explicitly set as requested or not requested for ConsumingTransformer.fit_transform, which is used within Pipeline.fit_transform. Call `ConsumingTransformer.set_fit_request({metadata}=True/False).set_transform_request({metadata}=True/False)` for each metadata you want to request/ignore.r}   r  r  N)
r
   r   r“   r”   r^   r_   r   rî   r:   r;   )r  r  r  r.   r.   r/   Ú;test_unsetmetadatapassederror_correct_for_composite_methodsS  s    ÿr  c                  C   s¨   G dd„ dt ƒ} t d¡}tjt|d�� | ƒ  d¡ W d  ƒ n1 sJ0    Y  | j| _| ƒ jdd� tjt|d�� | ƒ  d¡ W d  ƒ n1 sš0    Y  dS )a  Tests that if the set_{method}_request is unbound, it still works.

    Also test that passing positional arguments to the set_{method}_request fails
    with the right TypeError message.

    Non-regression test for https://github.com/scikit-learn/scikit-learn/issues/28632
    c                   @   s   e Zd Zddd„ZdS )z(test_unbound_set_methods_work.<locals>.ANc                 S   s   | S r+   r.   r  r.   r.   r/   r1   q  s    z,test_unbound_set_methods_work.<locals>.A.fit)Nr·   r.   r.   r.   r/   ÚAp  s   r  z>set_fit_request() takes 0 positional argument but 1 were givenr}   TNr�   )r   r“   r”   r^   r_   r€   r•   )r  Úerror_messager.   r.   r/   Útest_unbound_set_methods_workf  s    
ÿ*r  )hrM   r“   ÚnumpyÚnpr^   Zsklearnr   Zsklearn.baser   r   Zsklearn.exceptionsr   Zsklearn.linear_modelr   Zsklearn.pipeliner   Z%sklearn.tests.metadata_routing_commonr   r	   r
   r   r   r   r   r   r   r   r   r   Zsklearn.utilsr   Z sklearn.utils._metadata_requestsr   r   r   r   r   r   r   r   Zsklearn.utils.metadata_routingr   r   r   r    r!   r"   Zsklearn.utils.validationr#   ÚrandomZRandomStateÚrngÚNÚMZrandr:   Úrandintr;   r�   r‘   Zmy_other_weightsr*   rc   ÚmarkZparametrizere   rl   rm   rt   r|   r‚   r…   rŒ   r—   r¢   r£   r§   r°   r¼   r¾   rÂ   rÆ   rÊ   rÎ   rÔ   rÖ   r]   rH   rÙ   r’   r€   rÞ   râ   rä   rç   rê   r  r	  r  r  r  r  r  r  r.   r.   r.   r/   Ú<module>   s>  8(
 

:
#


ûþ
þþ




8
0


L
.






ÿüþ
þúõþûûûûêþ!



,
]
4




