
    >[g                     	   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jb                  je                  d      Z3d\  Z4Z5e3jm                  e4e5      Z7e3jq                  dde4      Z9e3jq                  dde4      Z:e3jm                  e4      Z;e3jm                  e4      Z< G d de      Z= ed      d        Z>ej~                  j                  d e e              e e              e e              e e        e              e e        e             g       ed      d               ZAej~                  j                  dg d       ed      d               ZBej~                  j                  dg d       ed      d               ZC ed      d         ZD ed      d!        ZE ed      d"        ZF ed      d#        ZGej~                  j                  d$e!      ej~                  j                  d%dd%g g       ed      d&                      ZH ed      d'        ZI ed      d(        ZJ ed      d)        ZK ed      d*        ZL ed      d+        ZM ed      d,        ZN ed      d-        ZO ed      d.        ZP ed      d/        ZQ ed      d0        ZR ed      d1        ZS ed      d2        ZT ed      d3        ZU ed      ej~                  j                  d4 e#d5d67      j                  d8d9:      d;f e)d5<      d=f e*d5<      j                   e        e+       j                  d>d>?      @      dAfg       ed      dB                      ZXej~                  j                  dC e+       dDd6dEd?eYdFf e+       dDdEd6d?eYdGf e*d5<      dHdI e*d5<      ieYdJf e       dKdEdieZdLfg       ed      dM               Z[ ed      dN        Z\ ed      dO        Z] ed      dP        Z^ ed      dQ        Z_ ed      dR        Z` ed      dS        Za ed      dT        Zb ed      dU        Zc ed      dV        Zd ed      dW        Ze ed      dX        Zf ed      dY        Zgy)Zz 
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                   (    e Zd ZdZd Zd Zd Zd Zy)SimplePipelinezA 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                     || _         y N)steps)selfr/   s     ^/var/www/html/bid-api/venv/lib/python3.12/site-packages/sklearn/tests/test_metadata_routing.py__init__zSimplePipeline.__init__J   s	    
    c           	      &   g | _         t        | dfi |}|}t        | j                  d d       D ]  \  }} t	        |      j
                  ||fi |j                  d|       j
                  }| j                   j                  |        |j                  |fi |j                  d|       j                  } | j                   j                   t	        | j                  d         j
                  ||fi |j                  j
                         | S )Nfitstep_)
steps_r#   	enumerater/   r   r5   getappend	transform	predictor)	r0   Xy
fit_paramsparamsX_transformedisteptransformers	            r1   r5   zSimplePipeline.fitM   s    u;
; CR1GAt)%+//q$*JJqc{$;$?$?K KK{+1K11!'eA3K!8!B!BM 2 	%E$**R.!%%mQO&:J:J:N:NO	
 r3   c           	      <   t        |        |}t        | dfi |}t        | j                  d d       D ]4  \  }} |j                  |fi |j                  d|       j                  }6  | j                  d   j                  |fi |j                  j                  S )Npredictr6   r7   )r$   r#   r9   r8   r<   r:   rG   r=   )r0   r>   predict_paramsrB   rA   rC   rD   s          r1   rG   zSimplePipeline.predict_   s     yCNC Sb!12GAt*DNN1R

U1#;0G0Q0QRM 3 't{{2&&}Q8H8H8P8PQQr3   c           
         t        | j                  j                        }t        | j                  d d       D ][  \  }} |j
                  d
i d| |idt               j                  dd      j                  dd      j                  dd      i ] |j                  | j                  d   t               j                  dd      j                  dd      	       |S )Nownerr6   r7   method_mappingr5   callercalleer<   rG   )r=   rL    )r   	__class____name__r9   r/   addr    )r0   routerrC   rD   s       r1   get_metadata_routingz#SimplePipeline.get_metadata_routingh   s    dnn&=&=> CR1GAtFJJ 1#;%,E%0E+6Ik: 2 	

jjn(?SeS,S	)S4	 	 	
 r3   N)rR   
__module____qualname____doc__r2   r5   rG   rU   rP   r3   r1   r,   r,   A   s    $Rr3   r,   Tenable_metadata_routingc            	         t        d      } t        |        | j                  j                  dd        t        |        | j                  j                  dd       t	        j
                  t              5  t        |        d d d        t        | d       | j                  j                  d	d
       t	        j
                  t              5  t        | d       d d d        t        | ddg       t        t        d      j                  t        d             j                  t               t               j                  dd                   y # 1 sw Y   xY w# 1 sw Y   xY w)NtestrJ   fooparamaliasbarvaluer5   excludecarrotTscore	estimatorrM   rh   rL   )r   r   r5   add_requestpytestraisesAssertionErrorrf   r   add_self_requestr   rS   r
   r    )requestss    r1   test_assert_request_is_emptyrp   {   s   V,HH%LL55H%LL58	~	&) 
'
 He4NNXT:	~	&%8 
'
 Hug.>? V$		/$?	@	(*(?..eE.J 
 

! 
'	& 
'	&s   6EEEE(rh   )registry)rh   rq   c                 X    | j                  t        t               | | j                  v sJ y)z=Check that an estimator puts itself in the registry upon fit.N)r5   r>   r?   rq   rg   s    r1   $test_estimator_puts_self_in_registryrs      s&     MM!Q	*****r3   zval, res))FF)TF)NF)$UNUSED$F)$WARN$Fzinvalid-inputF)	valid_argTc                 $    t        |       |k(  sJ y r.   )r   valress     r1   test_request_type_is_aliasr|           C C'''r3   ))FT)TT)NT)rt   T)ru   Trv   )	alias_argFc                 $    t        |       |k(  sJ y r.   )r   ry   s     r1   test_request_type_is_validr      r}   r3   c                  N    G d dt               } t         |              }|j                  j                  ddik(  sJ t	        t        t                     j                  j                        rJ t        t               j                                t        t                     }|j                  j                  d d dk(  sJ |j                  j                  d d dk(  sJ t        |       t        t                     }|j                  j                  d d dk(  sJ t        |       y )Nc                       e Zd ZddiZy)+test_default_requests.<locals>.OddEstimatorsample_weightTN)rR   rV   rW   $_OddEstimator__metadata_request__fitrP   r3   r1   OddEstimatorr      s     T#
r3   r   r   Tr   metadatar   r   )r   r"   r5   ro   lenr   r   rU   r   r<   r	   )r   odd_requesttrs_requestest_requests       r1   test_default_requestsr      s   
} 
 )8K??##'>>>> )*@*BCGGPPQQQ24IIKL()=)?@K??##(      ))$QU-VVVVK(()<)>?K??##(    K(r3   c                       G d dt               }  G d d|       } G d d|       }t         |       j                         ddd	ii       t         |       j                         ddd	ii       y
)zTest 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                       e Zd ZddiZy)+test_default_request_override.<locals>.BasegroupsTN)rR   rV   rW   _Base__metadata_request__splitrP   r3   r1   Baser      s    %-t$4!r3   r   c                       e Zd ZddiZy).test_default_request_override.<locals>.class_1r   sample_domainN)rR   rV   rW   !_class_1__metadata_request__splitrP   r3   r1   class_1r          %-$?!r3   r   c                       e Zd ZddiZy).test_default_request_override.<locals>.Class_1r   r   N)rR   rV   rW   !_Class_1__metadata_request__splitrP   r3   r1   Class_1r      r   r3   r   splitr   r   N)r   r   _get_metadata_request)r   r   r   s      r1   test_default_request_overrider      sr    5} 5@$ @@$ @ 	'')Gh5P+Q 	'')Gh5P+Qr3   c                      t        j                  t        d      5  t        t	               dt
               d d d        y # 1 sw Y   y xY w)Nz Can only route and process inputmatchinvalid_methodr   )rk   rl   	TypeErrorr#   r	   	my_groupsrP   r3   r1   #test_process_routing_invalid_methodr     s/    	y(J	K+-/?	R 
L	K	Ks   A  A	c                       G d d      } t        j                  t        d      5  t         |        dt               d d d        y # 1 sw Y   y xY w)Nc                       e Zd Zy):test_process_routing_invalid_object.<locals>.InvalidObjectN)rR   rV   rW   rP   r3   r1   InvalidObjectr     s    r3   r   z#either implement the routing methodr   r5   r   )rk   rl   AttributeErrorr#   r   )r   s    r1   #test_process_routing_invalid_objectr     s8      
~-R	SyA 
T	S	Ss   AAmethoddefaultc                     i }t        t               dfi |}||    }t        |t              sJ t	        |j                               t	        t              k(  sJ |j                  | |      }||k(  sJ y )Nr5   )r   )r#   r	   
isinstancedictsetkeysr   r:   )r   r   empty_paramsrouted_paramsparams_for_methoddefault_params_for_methods         r1   2test_process_routing_empty_params_get_with_defaultr     s     L#$7$95QLQM &f-'... %%'(CL888 !. 1 1&' 1 J$(9999r3   c                     t        t                     } | j                  t        t               t        t                     } | j                  t        t        t
               t        t                     } d}t        j                  t        t        j                  |            5  | j                  t        t        t
               d d d        t        t               j                  d            } | j                  t        t        t
               t        | j                  dd       t        t               j                  d            } | j                  t        t        t
               t        | j                  ddt
        	       t        t               j                  d
            } | j                  t        t        t
               t        | j                  ddt
        	       y # 1 sw Y   )xY w)Nrg   r   zo[sample_weight] are passed but are not explicitly set as requested or not requested for ConsumingClassifier.fitr   Fr5   )r   parentTr   r   r   alternative_weight)r   )r   r   r5   r>   r?   
my_weightsr	   rk   rl   
ValueErrorreescapeset_fit_requestr   
estimator_)clferr_messages     r1   test_simple_metadata_routingr   +  sr   
 !+A+C
DCGGAqM !+A+C
DCGGAq
G+ !+>+@
AC	5  
z;)?	@1J/ 
A !%'77e7LC GGAq
G+CNN5G !%'77d7KC GGAq
G+uU*
 !%'77. 8 
C
 GGAqZG0uU*A 
A	@s   '!G//G9c            	         t        t        t               j                  dd      j	                  dd            t        t               j                  dd      j                  d            j                  d	      g      } d
gdgdg}}}| j                  t        t        t        |||       t        | j                  d   j                  ddt               t        | j                  d   j                  dd|       t        | j                  d
   dd|       t        | j                  d
   j                  dd|       | j!                  t        |       t        | j                  d   j                  dd|       y )NTFr   r   rE   inner_weightsr   rg   outer_weights   r(      )r   r   r   r   r   r5   )r   r   r   r<   r   )r,   r   r   r   set_transform_requestr   r
   set_predict_requestr5   r>   r?   r   r   r8   transformer_r   rG   )pipelinew1w2w3s       r1   test_nested_routingr   d  sn    02 $eD&&TE&J
 ",. O$$5$9 oOo<	
H qcA3BBLL	1y"TV   ''	 ''	 5b %%eEQS Qb)''	r3   c                     t        t        t               j                  dd      j	                  d            t        t               j                  d            j                  d      g      } dgd	g}}t        j                  t        t        j                  d
            5  | j                  t        t        t        ||       d d d        y # 1 sw Y   y xY w)NTFr   r   r   rg   r   r   r(   zIn 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   )r   r   r   )r,   r   r   r   r   r   r
   rk   rl   r   r   r   r5   r>   r?   r   )r   r   r   s      r1   test_nested_routing_conflictr     s     02 $eD&&T&:
 ",.>>T>RoOo<		
H S1#B	II:

 	QIRrR

 

 

s   '#CCc                  l   t        t               j                  d            } t        j                  t
        t        j                  d            5  | j                  t        t              j                  t        t               d d d        t        t               j                  d            } t        j                  t
        t        j                  d            5  | j                  t        t              j                  t        t               d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)	NTr   r   z4transform got unexpected argument(s) {'other_param'}r   other_paramFz6transform got unexpected argument(s) {'sample_weight'})r   r   r   rk   rl   r   r   r   r5   r>   r?   r<   r   )trss    r1   test_invalid_metadatar     s     (*@@t@TC 
yyOP
 	1z:	
 (*@@u@UC 
yyQR
 	1<	
 

 

 
s   4D!4D*D'*D3c                  &    G d dt               }  G d dt               }t        j                  t        d      5   |        j	                          d d d        dd d dd d d	d
did}t         |       j	                         |        |       j                  d      }dd d dd d d	d
did}t        |j	                         |        |       j                  d      }dd d dd dd	d
did}t        |j	                         |       y # 1 sw Y   xY w)Nc                   *    e Zd ZdddZddddZddiZy)<test_get_metadata_routing.<locals>.TestDefaultsBadMethodNameN)r   my_paramTr   r   my_other_paramr   )rR   rV   rW   1_TestDefaultsBadMethodName__metadata_request__fit3_TestDefaultsBadMethodName__metadata_request__score:_TestDefaultsBadMethodName__metadata_request__other_methodrP   r3   r1   TestDefaultsBadMethodNamer     s0    !#

 ""%
! -7+=(r3   r   c                   *    e Zd ZdddZddddZddiZy)/test_get_metadata_routing.<locals>.TestDefaultsN)r   r   Tr   r   )rR   rV   rW   $_TestDefaults__metadata_request__fit&_TestDefaults__metadata_request__score(_TestDefaults__metadata_request__predictrP   r3   r1   TestDefaultsr     s0    !"#

 ""%
!
 (24&8#r3   r   z8'MetadataRequest' object has no attribute 'other_method'r   T)r   r   r   )r   r   r   )rf   r5   rG   r   )r   r   )r   rk   rl   r   rU   r   set_score_requestr   )r   r   expectedests       r1   test_get_metadata_routingr     sG   >$6 >
9) 
9 
X
 	"#88:
 "!
 #!
 %H <<>I
.
*
*M
*
BC &"!
 #!
 %H 113X>
.
(
(t
(
<C "!
 #!
 %H 113X>_
 
s   DDc                     t               }  G d dt              }dd i| |<    G d dt              }ddi| |<    G d dt              }dd i| |<    G d	 d
t              }i | |<   | j                         D ]e  \  }}t         |             j                  j
                  |k(  sJ t         |       j                         d        |       j	                  d d        g y )Nc                       e Zd ZddiZd Zy)6test_setting_default_requests.<locals>.ExplicitRequestpropNc                     | S r.   rP   r0   r>   r?   kwargss       r1   r5   z:test_setting_default_requests.<locals>.ExplicitRequest.fit       Kr3   )rR   rV   rW   '_ExplicitRequest__metadata_request__fitr5   rP   r3   r1   ExplicitRequestr     s    #)4.	r3   r   r   c                       e Zd ZddiZddZy)?test_setting_default_requests.<locals>.ExplicitRequestOverwriter   TNc                     | S r.   rP   r0   r>   r?   r   r   s        r1   r5   zCtest_setting_default_requests.<locals>.ExplicitRequestOverwrite.fit*  r   r3   r.   )rR   rV   rW   0_ExplicitRequestOverwrite__metadata_request__fitr5   rP   r3   r1   ExplicitRequestOverwriter   %  s     $*4.	r3   r  Tc                       e Zd ZddZy)6test_setting_default_requests.<locals>.ImplicitRequestNc                     | S r.   rP   r   s        r1   r5   z:test_setting_default_requests.<locals>.ImplicitRequest.fit1  r   r3   r.   rR   rV   rW   r5   rP   r3   r1   ImplicitRequestr  /  s    	r3   r  c                   0    e Zd Zdej                  iZddZy)=test_setting_default_requests.<locals>.ImplicitRequestRemovalr   Nc                     | S r.   rP   r   s        r1   r5   zAtest_setting_default_requests.<locals>.ImplicitRequestRemoval.fit;  r   r3   r.   )rR   rV   rW   r   UNUSED._ImplicitRequestRemoval__metadata_request__fitr5   rP   r3   r1   ImplicitRequestRemovalr	  6  s     $*+;+B+B"C	r3   r  r5   rc   )r   r   itemsr"   r5   ro   r   rU   )
test_casesr   r  r  r  Klassro   s          r1   test_setting_default_requestsr    s     J-  $*4.J=  -3D>J'(- 
 $*4.J  *,J%&%++-x%eg.22;;xGGG < < >ND$ .r3   c                       G d dt               } t        j                  t        d      5   |        j	                          ddd       y# 1 sw Y   yxY w)zFTest that removing a metadata using UNUSED which doesn't exist raises.c                   .    e Zd Zdej                  iZd Zy)Ftest_removing_non_existing_param_raises.<locals>.InvalidRequestRemovalr   c                     | S r.   rP   r   s       r1   r5   zJtest_removing_non_existing_param_raises.<locals>.InvalidRequestRemoval.fitO  r   r3   N)rR   rV   rW   r   r  -_InvalidRequestRemoval__metadata_request__fitr5   rP   r3   r1   InvalidRequestRemovalr  J  s     $*+;+B+B"C	r3   r  zTrying to remove parameterr   N)r   rk   rl   r   rU   )r  s    r1   'test_removing_non_existing_param_raisesr  F  s;      
z)E	F446 
G	F	Fs   A

Ac                     t        dd      } t        j                  t        d      5  | j	                  dd       d d d        | j	                  dd        | j
                  dd ik(  sJ | j	                  dd	       | j
                  dd	ik(  sJ | j	                  dd
       | j
                  dd
ik(  sJ | j	                  dd       | j
                  dd
ik(  sJ | j	                  dd       | j
                  ddik(  sJ | j                  d	      dhk(  sJ | j                  d
      dhk(  sJ y # 1 sw Y   xY w)Nr\   r5   rK   r   zThe alias you're setting forr   r]   gffffff?r^   FTra   )return_alias)r   rk   rl   r   rj   ro   _get_param_names)mmrs    r1   test_method_metadata_requestr  V  s9   
fU
;C	z)G	He3/ 
I OO%tO,<<E4=(((OO%uO-<<E5>)))OO%tO,<<E4=(((OO%uO-<<E4=(((OO%uO-<<E5>)))U3w>>>T2ug=== 
I	Hs   D44D=c                      G d dt               } t        t        d              t        t        t                            t	        d      }|j
                  j                  dd       t        |      }t        |d	       |j
                  j                  ddik(  sJ t         |              }t        |d	       |j
                  j                  d
d ik(  sJ y )Nc                       e Zd ZddiZy)-test_get_routing_for_object.<locals>.Consumerr   N)rR   rV   rW    _Consumer__metadata_request__fitrP   r3   r1   Consumerr!  m  s    #)4.r3   r#  r\   rJ   r]   ra   r^   r5   rc   r   )r   r   r"   objectr   r5   rj   ro   )r#  mr
mr_factorys      r1   test_get_routing_for_objectr'  k  s    1= 1 2489268<=	v	&BFFU%0'+JJ6>>""uen444	
	+BB.66??vtn,,,r3   c                  l   t        d      } | j                  ddh      t               k(  sJ t        d      } | j                  j                  dd       | j                  ddh      dhk(  sJ t        d      } | j                  j                  dd       | j                  dddh      dhk(  sJ y	)
z@Test that MetadataRequest().consumes() method works as expected.r\   rJ   r5   r]   r   rA   Tr^   ra   N)r   consumesr   r   r5   rj   )requests    r1   %test_metadata_request_consumes_methodr,  ~  s     6*G5%9SUBBBF+GKK%t45%9eWDDDF+GKK%u55%@UGKKKr3   c                     t        t               j                  d            dhdhft        t               j                  d            ddhdhfg} | D ],  \  }}}|j                         j	                  d|      |k(  r,J  y)	z=Test that MetadataRouter().consumes method works as expected.Tr   rg   r   r   r5   r)  N)r   r
   r   rU   r*  )casesobjinputoutputs       r1   $test_metadata_router_consumes_methodr2    s     ",.>>T>R 	
 ",.>>". ? 
 ?+N	
E& $UF'')22%2NRXXXX $r3   c                       G d dt               } t        j                  t        d      5   | t	               j                  d            j                  t        t        t               d d d        y # 1 sw Y   y xY w)Nc                   (    e Zd Zdej                  iZy)>test_metaestimator_warnings.<locals>.WeightedMetaRegressorWarnr   N)rR   rV   rW   r   WARN1_WeightedMetaRegressorWarn__metadata_request__fitrP   r3   r1   WeightedMetaRegressorWarnr5        #24D4I4I"Jr3   r8  4Support for .* has recently been added to this classr   Fr   rg   )
r   rk   warnsUserWarningr   r   r5   r>   r?   r   )r8  s    r1   test_metaestimator_warningsr=    sc    K$9 K 
Q
 	"&(88u8M	

#a*#
-
 
 
s   A A44A=c                       G d dt               } t        j                  t        d      5  t	         |              j                  t        t        t               d d d        y # 1 sw Y   y xY w)Nc                   (    e Zd Zdej                  iZy)7test_estimator_warnings.<locals>.ConsumingRegressorWarnr   N)rR   rV   rW   r   r6  ._ConsumingRegressorWarn__metadata_request__fitrP   r3   r1   ConsumingRegressorWarnr@    r9  r3   rB  r:  r   rg   r   )	r
   rk   r;  r<  r   r5   r>   r?   r   )rB  s    r1   test_estimator_warningsrC    sZ    K!3 K 
Q
 	 6 89==q
 	> 	

 
 
s   0A$$A-zobj, stringr\   r5   r  r]   ra   r^   z{'foo': 'bar'}rJ   z{}rG   rM   ri   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                 $    t        |       |k(  sJ y r.   )str)r/  strings     r1   test_string_representationsrG    s    > s8vr3   z%obj, method, inputs, err_cls, err_msgrS   invalidzGiven calleezGiven callerrn   r/  z@Given `obj` is neither a `MetadataRequest` nor does it implementr   zUnexpected argsc                     t        j                  ||      5   t        | |      di | d d d        y # 1 sw Y   y xY w)Nr   rP   )rk   rl   getattr)r/  r   inputserr_clserr_msgs        r1   test_validationsrN    s3    F 
wg	.V&v& 
/	.	.s   4=c                     t               j                  dd      j                  dd      } t        |       }|d   dk(  sJ |d   dk(  sJ t               } t        D ]/  }| j                  ||       t	        ||      | j
                  v r/J  t        | j
                        t        t              k(  sJ t               j                  dd      } t        |       d	k(  sJ y )
Nr5   r<   rM   r   )r5   r<   r   )r5   r5   rf   z([{'caller': 'score', 'callee': 'score'}])r    rS   listr   r   _routesr   repr)mmmm_listr   s      r1   test_methodmappingrU    s     		E+	.	E%	(  2hG1:----1:'''	B
fV,&&)RZZ777  rzz?c'l***			GG		<B8AAAAr3   c                  |   t        d      } | j                  j                  dd       t        d      j	                  |       }t        |j                        t        |       k(  sJ |j                  | usJ t               j                  d      }t        d      j	                  |	      }t        |j                        t        |j                               k(  sJ |j                  |j                         usJ t        t               j                  d
            }t        d      j	                  |	      }t        |j                        t        |j                               k(  sJ t        |j                        t        |j                               k7  sJ |j                  |j                         usJ y )NnestedrJ   r_   Tr^   r\   r   r   )r/  nested_weightsrg   )r   r5   rj   r   rn   rE  _self_requestr
   r   rU   r   r   )r+  rT   r   s      r1   $test_metadatarouter_add_self_requestrZ  "  s    H-GKK'6&)::7CFv##$G444w... 

.
.\
.
JC&)::s:CFv##$C,D,D,F(GGGGs'?'?'AAAA  $&66EU6VC &)::s:CFv##$C,E,E,G(HHHH v##$C,D,D,F(GGGGs'@'@'BBBBr3   c                  |   t        d      j                  t               j                  d      t	               j                  dd            } t        |       dk(  sJ t        d      j                  t	               j                  dd	      t               j                  d
            } t        |       dk(  sJ y )Nr\   rJ   weightsr   r5   rM   )r   rL   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}}}}rf   T)rL   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   rS   r
   r   r    rE  r   rT   s    r1   test_metadata_routing_addr^  @  s     &)-- 00y0I$**%*F . F
 	F		 &)--$**%*H 222F . F
 	F		r3   c                     t        d      j                  t        t                     j	                  d            j                  t               j	                  d      t               j                  dd      	      } t        |       d
k(  sJ | j                  ddd      h dk(  sJ | j                  ddd      h dk(  sJ | j                  ddd      ddhk(  sJ | j                  ddd      | j                  ddd      k(  sJ y )Nr\   rJ   rg   self_weightsr   transform_weightsr5   rM   )r   rL   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  ignore_self_request>   r   r`  ra  >   r   r   ra  r   )
r   rn   r   r
   r   rS   r   r    rE  r  r]  s    r1   %test_metadata_routing_get_param_namesrc  _  sr    	V$		!,>,@AQQ, R 


 
$&661 7  )?..eE.J	 
 

   	FM	M	M ""4U # 	:; ; ; ""5e # 	;< < < ""5d # 
)	*+ + + ""4T # 		 	 5d 
! 
  r3   c                      G d dt               } t        D ]  }t         |        d| d      sJ   G d dt               } t        D ]  }t         |        d| d      sJ  t        D ]  }t         |        d| d      rJ  y )Nc                   V    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 ZddZd Zd Zy
)/test_method_generation.<locals>.SimpleEstimatorc                      y r.   rP   r0   r>   r?   s      r1   r5   z3test_method_generation.<locals>.SimpleEstimator.fit      r3   c                      y r.   rP   rh  s      r1   fit_transformz=test_method_generation.<locals>.SimpleEstimator.fit_transform  ri  r3   c                      y r.   rP   rh  s      r1   fit_predictz;test_method_generation.<locals>.SimpleEstimator.fit_predict  ri  r3   c                      y r.   rP   rh  s      r1   partial_fitz;test_method_generation.<locals>.SimpleEstimator.partial_fit  ri  r3   c                      y r.   rP   r0   r>   s     r1   rG   z7test_method_generation.<locals>.SimpleEstimator.predict  ri  r3   c                      y r.   rP   rq  s     r1   predict_probaz=test_method_generation.<locals>.SimpleEstimator.predict_proba  ri  r3   c                      y r.   rP   rq  s     r1   predict_log_probazAtest_method_generation.<locals>.SimpleEstimator.predict_log_proba  ri  r3   c                      y r.   rP   rq  s     r1   decision_functionzAtest_method_generation.<locals>.SimpleEstimator.decision_function  ri  r3   c                      y r.   rP   rh  s      r1   rf   z5test_method_generation.<locals>.SimpleEstimator.score  ri  r3   Nc                      y r.   rP   rh  s      r1   r   z5test_method_generation.<locals>.SimpleEstimator.split  ri  r3   c                      y r.   rP   rq  s     r1   r<   z9test_method_generation.<locals>.SimpleEstimator.transform  ri  r3   c                      y r.   rP   rq  s     r1   inverse_transformzAtest_method_generation.<locals>.SimpleEstimator.inverse_transform  ri  r3   r.   rR   rV   rW   r5   rk  rm  ro  rG   rs  ru  rw  rf   r   r<   r|  rP   r3   r1   SimpleEstimatorrf    s>    												r3   r~  set__requestc                   l    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ZddZddZy)rf  Nc                      y r.   rP   r0   r>   r?   r   s       r1   r5   z3test_method_generation.<locals>.SimpleEstimator.fit  ri  r3   c                      y r.   rP   r  s       r1   rk  z=test_method_generation.<locals>.SimpleEstimator.fit_transform  ri  r3   c                      y r.   rP   r  s       r1   rm  z;test_method_generation.<locals>.SimpleEstimator.fit_predict  ri  r3   c                      y r.   rP   r  s       r1   ro  z;test_method_generation.<locals>.SimpleEstimator.partial_fit  ri  r3   c                      y r.   rP   r0   r>   r   s      r1   rG   z7test_method_generation.<locals>.SimpleEstimator.predict  ri  r3   c                      y r.   rP   r  s      r1   rs  z=test_method_generation.<locals>.SimpleEstimator.predict_proba  ri  r3   c                      y r.   rP   r  s      r1   ru  zAtest_method_generation.<locals>.SimpleEstimator.predict_log_proba  ri  r3   c                      y r.   rP   r  s      r1   rw  zAtest_method_generation.<locals>.SimpleEstimator.decision_function  ri  r3   c                      y r.   rP   r  s       r1   rf   z5test_method_generation.<locals>.SimpleEstimator.score  ri  r3   c                      y r.   rP   r  s       r1   r   z5test_method_generation.<locals>.SimpleEstimator.split  ri  r3   c                      y r.   rP   r  s      r1   r<   z9test_method_generation.<locals>.SimpleEstimator.transform  ri  r3   c                      y r.   rP   r  s      r1   r|  zAtest_method_generation.<locals>.SimpleEstimator.inverse_transform  ri  r3   r.   NNr}  rP   r3   r1   r~  z/test_method_generation.<locals>.SimpleEstimator  s>    												r3   )r   r   hasattrr   r   )r~  r   s     r1   test_method_generationr    s    $- $L ?,VHH.EFFF $- $N $?,VHH.EFFF $ !(D*ABBB !r3   c                  ,    G d dt               }  |        }|j                         j                  j                  d d d dk(  sJ |j                         j                  j                  d d dk(  sJ |j                  dd       t        j                  t        d	      5  |j                         j                   d d d        |j                  d
       t        j                  t        d	      5  |j                         j                   d d d        |j                  dd       |j                         j                   |j                  d       |j                         j                  j                  ddddk(  sJ y # 1 sw Y   xY w# 1 sw Y   xY w)Nc                   $    e Zd ZddZddZddZy)/test_composite_methods.<locals>.SimpleEstimatorNc                      y r.   rP   )r0   r>   r?   r]   ra   s        r1   r5   z3test_composite_methods.<locals>.SimpleEstimator.fit  ri  r3   c                      y r.   rP   )r0   r>   r]   ra   s       r1   rG   z7test_composite_methods.<locals>.SimpleEstimator.predict  ri  r3   c                      y r.   rP   )r0   r>   r   s      r1   r<   z9test_composite_methods.<locals>.SimpleEstimator.transform  ri  r3   r  r.   )rR   rV   rW   r5   rG   r<   rP   r3   r1   r~  r    s    			r3   r~  )ra   r]   r   )ra   r]   Tr\   )r]   ra   z!Conflicting metadata requests forr   )ra   r   )r   rU   rk  ro   rm  r   rk   rl   r   r   r   )r~  r   s     r1   test_composite_methodsr    su   	- 	 
C ##%33<<A   
 ##%11::dSW>XXXX Df-	z)L	M  ".. 
N
 %	z)L	M  ".. 
N
 &1** $/##%33<<A   # 
N	M 
N	Ms   E>.F
>F
Fc                      t        d      5  t        j                  t        d      5  t	               j                  d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zCTest that when feature flag disabled, set_{method}_requests raises.FrY   zThis method is only availabler   Tr   N)r   rk   rl   RuntimeErrorr	   r   rP   r3   r1   !test_no_feature_flag_raises_errorr    sM     
	6]]</NO!111E P 
7	6OO 
7	6s"   A!AA!A	A!!A*c                  `    t        t                     j                  t        t        d       y)zCTest that passing None as metadata when not requested doesn't raiserg   Nr   )r   r
   r5   r>   r?   rP   r3   r1   test_none_metadata_passedr  '  s"     .0155a$5Or3   c                  <    G d dt         t              } t         |              j                  t        t
               t        j                  t        d      5  t         |              j                  t        t
        t               ddd       y# 1 sw Y   yxY w)zTest 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                       e Zd ZddZy)0test_no_metadata_always_works.<locals>.EstimatorNc                     | S r.   rP   )r0   r>   r?   r   s       r1   r5   z4test_no_metadata_always_works.<locals>.Estimator.fit6  r   r3   r.   r  rP   r3   r1   	Estimatorr  5      	r3   r  rg   z3Estimator has not implemented metadata routing yet.r   r   N)
r!   r   r   r5   r>   r?   rk   rl   NotImplementedErrorr   )r  s    r1   test_no_metadata_always_worksr  -  sj    -} 
 IK(,,Q2	#X
 		,00A	0J
 
 
s   0BBc                     t        t                     } t        | g      }t        j                  d      }t        j                  t        |      5  |j                  t        t        d       ddd       y# 1 sw Y   yxY w)z}Test that UnsetMetadataPassedError raises the correct error message when
    set_{method}_request is not set in nested cases.rg   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   rk   rl   r   r5   r>   r?   )weighted_metapipemsgs      r1   %test_unsetmetadatapassederror_correctr  B  s`     +5H5JKM=/*D
))	0C 
/s	;A' 
<	;	;s   A77B c                      t               } t        d| fg      }t        j                  d      }t	        j
                  t        |      5  |j                  t        t        d       ddd       y# 1 sw Y   yxY w)zTest 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   rk   rl   r   rk  r>   r?   )r  r  r  s      r1   ;test_unsetmetadatapassederror_correct_for_composite_methodsr  S  sf     12-/DEFGD
))	9C 
/s	;1a&1 
<	;	;s   	A//A8c                      G d dt               } t        j                  d      }t        j                  t
        |      5   |        j                  d       ddd       | j                  | _         |        j                  d       t        j                  t
        |      5   |        j                  d       ddd       y# 1 sw Y   lxY w# 1 sw Y   yxY w)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                       e Zd ZddZy)(test_unbound_set_methods_work.<locals>.ANc                     | S r.   rP   r  s       r1   r5   z,test_unbound_set_methods_work.<locals>.A.fitq  r   r3   r.   r  rP   r3   r1   Ar  p  r  r3   r  z>set_fit_request() takes 0 positional argument but 1 were givenr   TNr   )r   r   r   rk   rl   r   r   )r  error_messages     r1   test_unbound_set_methods_workr  f  s    M  IIHM
 
y	6	D! 
7 ))A Cd+ 
y	6	D! 
7	6 
7	6 
7	6s    C"CCC)hrX   r   numpynprk   sklearnr   sklearn.baser   r   sklearn.exceptionsr   sklearn.linear_modelr   sklearn.pipeliner   %sklearn.tests.metadata_routing_commonr	   r
   r   r   r   r   r   r   r   r   r   r   sklearn.utilsr    sklearn.utils._metadata_requestsr   r   r   r   r   r   r   r   sklearn.utils.metadata_routingr   r   r    r!   r"   r#   sklearn.utils.validationr$   randomRandomStaterngNMrandr>   randintr?   r   r   my_other_weightsr,   rp   markparametrizers   r|   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r'  r,  r2  r=  rC  rj   rS   rG  r   r   rN  rU  rZ  r^  rc  r  r  r  r  r  r  r  r  rP   r3   r1   <module>r     s   
   " 8 1 %    +	 	 	  5iiB1HHQNKK11KKK2AK&	XXa[
88A; 7] 7t -  . F Y[1IK0ik2)<)>U(:(<y{S	 -+ .	+  -( .(
  -( .(
 -) .)< - .. -S .S
 -B .B 7+T9b$9:-: . ; ,: -5 .5p -- .-` -S .S: -= .=, -I? .I?X -+  .+ \ -7 .7 -> .>( -- .-$ -L .L -Y .Y6 -	. .	. -	
 .	
 - "u=II5 J  		
 &)	

 (,,,.,22)I2V - 
@	
8 - .9 .< + O	2	
 O E2	
 (N01N	
  !	
- B -' .C D'
 -B .B* -C .C: - .< -) .)X -ZC .ZCz -1 .1h -F .F -P .P
 -K .K( -( .(  -2 .2$ -" ."r3   