
    {Kg                        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< ejz                  d      d        Z> G d de      Z?d Z@ej                  j                  d e e              e e              e e              e e        e              e e        e             g      d        ZCej                  j                  dg d      d        ZDej                  j                  dg d      d         ZEd! ZFd" ZGd# ZHd$ ZIej                  j                  d%e!      ej                  j                  d&dd&g g      d'               ZJd( ZKd) ZLd* ZMd+ ZNd, ZOd- ZPd. ZQd/ ZRd0 ZSd1 ZTd2 ZUd3 ZVd4 ZWej                  j                  d5 e#d6d78      j                  d9d:;      d<f e)d6=      d>f e*d6=      j                   e        e+       j                  d?d?@      A      dBfg      dC        ZZej                  j                  dD e+       dEd7dFd@e[dGf e+       dEdFd7d@e[dHf e*d6=      dIdJ e*d6=      ie[dKf e       dLdFdie\dMfg      dN        Z]dO Z^dP Z_dQ Z`dR ZadS ZbdT ZcdU ZddV ZedW ZfdX ZgdY ZhdZ Ziy)[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
   T)autousec               #   V   K   t        d      5  d ddd       y# 1 sw Y   yxY ww)zEnable SLEP006 for all tests.Tenable_metadata_routingNr        g/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/tests/test_metadata_routing.pyenable_slep006r3   A   s      
	5 
6	5	5s   )	)&)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)selfr8   s     r2   __init__zSimplePipeline.__init__Q   s	    
r1   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$   	enumerater8   r   r<   getappend	transform	predictor)	r9   Xy
fit_paramsparamsX_transformedisteptransformers	            r2   r<   zSimplePipeline.fitT   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	
 r1   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predictr=   r>   )r%   r$   r@   r?   rC   rA   rN   rD   )r9   rE   predict_paramsrI   rH   rJ   rK   s          r2   rN   zSimplePipeline.predictf   s     yCNC Sb!12GAt*DNN1R

U1#;0G0Q0QRM 3 't{{2&&}Q8H8H8P8PQQr1   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ownerr=   r>   method_mappingr<   callercalleerC   rN   )rD   rS   r0   )r    	__class____name__r@   r8   addr!   )r9   routerrJ   rK   s       r2   get_metadata_routingz#SimplePipeline.get_metadata_routingo   s    dnn&=&=> CR1GAtFJJ 1#;%,E%0E+6Ik: 2 	

jjn(?SeS,S	)S4	 	 	
 r1   N)rX   
__module____qualname____doc__r:   r<   rN   r[   r0   r1   r2   r5   r5   H   s    $Rr1   r5   c            	         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testrQ   fooparamaliasbarvaluer<   excludecarrotTscore	estimatorrT   rl   rS   )r   r   r<   add_requestpytestraisesAssertionErrorrj   r    add_self_requestr   rY   r   r!   )requestss    r2   test_assert_request_is_emptyrt      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(rl   )registry)rl   ru   c                 X    | j                  t        t               | | j                  v sJ y)z=Check that an estimator puts itself in the registry upon fit.N)r<   rE   rF   ru   rk   s    r2   $test_estimator_puts_self_in_registryrw      s&     MM!Q	*****r1   zval, res))FF)TF)NF)$UNUSED$F)$WARN$Fzinvalid-inputF)	valid_argTc                 $    t        |       |k(  sJ y r7   )r   valress     r2   test_request_type_is_aliasr           C C'''r1   ))FT)TT)NT)rx   T)ry   Trz   )	alias_argFc                 $    t        |       |k(  sJ y r7   )r   r}   s     r2   test_request_type_is_validr      r   r1   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)rX   r\   r]   $_OddEstimator__metadata_request__fitr0   r1   r2   OddEstimatorr      s     T#
r1   r   r   Tr   metadatar   r   )r   r#   r<   rs   lenr   r   r[   r   rC   r
   )r   odd_requesttrs_requestest_requests       r2   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(r1   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)rX   r\   r]   _Base__metadata_request__splitr0   r1   r2   Baser      s    %-t$4!r1   r   c                       e Zd ZddiZy).test_default_request_override.<locals>.class_1r   sample_domainN)rX   r\   r]   !_class_1__metadata_request__splitr0   r1   r2   class_1r          %-$?!r1   r   c                       e Zd ZddiZy).test_default_request_override.<locals>.Class_1r   r   N)rX   r\   r]   !_Class_1__metadata_request__splitr0   r1   r2   Class_1r     r   r1   r   splitr   r   N)r   r   _get_metadata_request)r   r   r   s      r2   test_default_request_overrider      sr    5} 5@$ @@$ @ 	'')Gh5P+Q 	'')Gh5P+Qr1   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   )ro   rp   	TypeErrorr$   r
   	my_groupsr0   r1   r2   #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)rX   r\   r]   r0   r1   r2   InvalidObjectr     s    r1   r   z#either implement the routing methodr   r<   r   )ro   rp   AttributeErrorr$   r   )r   s    r2   #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 )Nr<   )r   )r$   r
   
isinstancedictsetkeysr   rA   )r   r   empty_paramsrouted_paramsparams_for_methoddefault_params_for_methods         r2   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9r1   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       t        t               j                  d            } | j                  t        t        t
               t        | j                  dt
               t        t               j                  d            } | j                  t        t        t
        	       t        | j                  dt
               y # 1 sw Y   %xY w)
Nrk   r   zo[sample_weight] are passed but are not explicitly set as requested or not requested for ConsumingClassifier.fitr   Fr<   Talternative_weight)r   )r   r   r<   rE   rF   
my_weightsr
   ro   rp   
ValueErrorreescapeset_fit_requestr   
estimator_)clferr_messages     r2   test_simple_metadata_routingr   )  se    !+A+C
DCGGAqM !+A+C
DCGGAq
G+ !+>+@
AC	5  
z;)?	@1J/ 
A !%'77e7LC GGAq
G+CNNE2 !%'77d7KC GGAq
G+CNNEL !%'77. 8 
C
 GGAqZG0CNNEL= 
A	@s   '!G++G5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t        d        t        | j                  d   j                  d|d        t        | j                  d
   d|       t        | j                  d
   j                  d|       | j!                  t        |       t        | j                  d   j                  d|d        y )NTFr   r   rL   inner_weightsr   rk   outer_weights   r)      )r   r   r   r   r   r<   rC   )r5   r   r   r   set_transform_requestr   r   set_predict_requestr<   rE   rF   r   r   r?   transformer_r   rN   )pipelinew1w2w3s       r2   test_nested_routingr   ]  sX   02 $eD&&TE&J
 ",. O$$5$9 oOo<	
H qcA3BBLL	1y"TV   ''RV ''BQU HOOA.RHHOOA.995PRSQb)''BQUr1   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   rk   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   )r5   r   r   r   r   r   r   ro   rp   r   r   r   r<   rE   rF   r   )r   r   r   s      r2   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   ro   rp   r   r   r   r<   rE   rF   rC   r   )trss    r2   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   )rX   r\   r]   1_TestDefaultsBadMethodName__metadata_request__fit3_TestDefaultsBadMethodName__metadata_request__score:_TestDefaultsBadMethodName__metadata_request__other_methodr0   r1   r2   TestDefaultsBadMethodNamer     s0    !#

 ""%
! -7+=(r1   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   )rX   r\   r]   $_TestDefaults__metadata_request__fit&_TestDefaults__metadata_request__score(_TestDefaults__metadata_request__predictr0   r1   r2   TestDefaultsr     s0    !"#

 ""%
!
 (24&8#r1   r   z8'MetadataRequest' object has no attribute 'other_method'r   T)r   r   r   )r   r   r   )rj   r<   rN   r   )r   r   )r   ro   rp   r   r[   r   set_score_requestr   )r   r   expectedests       r2   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 r7   r0   r9   rE   rF   kwargss       r2   r<   z:test_setting_default_requests.<locals>.ExplicitRequest.fit      Kr1   )rX   r\   r]   '_ExplicitRequest__metadata_request__fitr<   r0   r1   r2   ExplicitRequestr     s    #)4.	r1   r   r   c                       e Zd ZddiZddZy)?test_setting_default_requests.<locals>.ExplicitRequestOverwriter   TNc                     | S r7   r0   r9   rE   rF   r   r   s        r2   r<   zCtest_setting_default_requests.<locals>.ExplicitRequestOverwrite.fit  r   r1   r7   )rX   r\   r]   0_ExplicitRequestOverwrite__metadata_request__fitr<   r0   r1   r2   ExplicitRequestOverwriter     s     $*4.	r1   r  Tc                       e Zd ZddZy)6test_setting_default_requests.<locals>.ImplicitRequestNc                     | S r7   r0   r  s        r2   r<   z:test_setting_default_requests.<locals>.ImplicitRequest.fit  r   r1   r7   rX   r\   r]   r<   r0   r1   r2   ImplicitRequestr    s    	r1   r	  c                   0    e Zd Zdej                  iZddZy)=test_setting_default_requests.<locals>.ImplicitRequestRemovalr   Nc                     | S r7   r0   r  s        r2   r<   zAtest_setting_default_requests.<locals>.ImplicitRequestRemoval.fit"  r   r1   r7   )rX   r\   r]   r   UNUSED._ImplicitRequestRemoval__metadata_request__fitr<   r0   r1   r2   ImplicitRequestRemovalr    s     $*+;+B+B"C	r1   r  r<   rg   )r   r   itemsr#   r<   rs   r   r[   )
test_casesr   r  r	  r  Klassrs   s          r2   test_setting_default_requestsr    s    J-  $*4.J=  -3D>J'(- 
 $*4.J  *,J%&%++-x%eg.22;;xGGG < < >ND$ .r1   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 r7   r0   r   s       r2   r<   zJtest_removing_non_existing_param_raises.<locals>.InvalidRequestRemoval.fit5  r   r1   N)rX   r\   r]   r   r  -_InvalidRequestRemoval__metadata_request__fitr<   r0   r1   r2   InvalidRequestRemovalr  0  s     $*+;+B+B"C	r1   r  zTrying to remove parameterr   N)r   ro   rp   r   r[   )r  s    r2   'test_removing_non_existing_param_raisesr  -  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`   r<   rR   r   zThe alias you're setting forr   ra   gffffff?rb   FTre   )return_alias)r   ro   rp   r   rn   rs   _get_param_names)mmrs    r2   test_method_metadata_requestr   <  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)rX   r\   r]    _Consumer__metadata_request__fitr0   r1   r2   Consumerr#  Q  s    #)4.r1   r%  r`   rQ   ra   re   rb   r<   rg   r   )r   r   r#   objectr   r<   rn   rs   )r%  mr
mr_factorys      r2   test_get_routing_for_objectr)  P  s    1= 1 2489268<=	v	&BFFU%0'+JJ6>>""uen444	
	+BB.66??vtn,,,r1   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`   rQ   r<   ra   r   rH   Trb   re   N)r    consumesr   r   r<   rn   )requests    r2   %test_metadata_request_consumes_methodr.  b  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Kr1   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   rk   r   r   r<   r+  N)r   r   r   r[   r,  )casesobjinputoutputs       r2   $test_metadata_router_consumes_methodr4  p  s     ",.>>T>R 	
 ",.>>". ? 
 ?+N	
E& $UF'')22%2NRXXXX $r1   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)rX   r\   r]   r   WARN1_WeightedMetaRegressorWarn__metadata_request__fitr0   r1   r2   WeightedMetaRegressorWarnr7        #24D4I4I"Jr1   r:  4Support for .* has recently been added to this classr   Fr   rk   )
r   ro   warnsUserWarningr   r   r<   rE   rF   r   )r:  s    r2   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)rX   r\   r]   r   r8  ._ConsumingRegressorWarn__metadata_request__fitr0   r1   r2   ConsumingRegressorWarnrB    r;  r1   rD  r<  r   rk   r   )	r   ro   r=  r>  r   r<   rE   rF   r   )rD  s    r2   test_estimator_warningsrE    sZ    K!3 K 
Q
 	 6 89==q
 	> 	

 
 
s   0A$$A-zobj, stringr`   r<   r  ra   re   rb   z{'foo': 'bar'}rQ   z{}rN   rT   rm   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 r7   )str)r1  strings     r2   test_string_representationsrI    s    : s8vr1   z%obj, method, inputs, err_cls, err_msgrY   invalidzGiven calleezGiven callerrr   r1  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   r0   )ro   rp   getattr)r1  r   inputserr_clserr_msgs        r2   test_validationsrP    s3    D 
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 )
Nr<   rC   rT   r   )r<   rC   r   )r<   r<   rj   z([{'caller': 'score', 'callee': 'score'}])r!   rY   listr   r   _routesr   repr)mmmm_listr   s      r2   test_methodmappingrW    s    	E+	.	E%	(  2hG1:----1:'''	B
fV,&&)RZZ777  rzz?c'l***			GG		<B8AAAAr1   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nestedrQ   rc   Trb   r`   r   r   )r1  nested_weightsrk   )r   r<   rn   r    rr   rG  _self_requestr   r   r[   r   r   )r-  rZ   r   s      r2   $test_metadatarouter_add_self_requestr\    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Br1   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`   rQ   weightsr   r<   rT   )r   rS   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}}}}rj   T)rS   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    rY   r   r   r!   rG  r   rZ   s    r2   test_metadata_routing_addr`    s    &)-- 00y0I$**%*F . F
 	F		 &)--$**%*H 222F . F
 	F		r1   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`   rQ   rk   self_weightsr   transform_weightsr<   rT   )r   rS   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   rb  rc  >   r   r   rc  r   )
r    rr   r   r   r   rY   r   r!   rG  r  r_  s    r2   %test_metadata_routing_get_param_namesre  9  sp   V$		!,>,@AQQ, R 


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

   	FM	M	M ""4U # 	:; ; ; ""5e # 	;< < < ""5d # 
)	*+ + + ""4T # 		 	 5d 
! 
  r1   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 r7   r0   r9   rE   rF   s      r2   r<   z3test_method_generation.<locals>.SimpleEstimator.fitl      r1   c                      y r7   r0   rj  s      r2   fit_transformz=test_method_generation.<locals>.SimpleEstimator.fit_transformo  rk  r1   c                      y r7   r0   rj  s      r2   fit_predictz;test_method_generation.<locals>.SimpleEstimator.fit_predictr  rk  r1   c                      y r7   r0   rj  s      r2   partial_fitz;test_method_generation.<locals>.SimpleEstimator.partial_fitu  rk  r1   c                      y r7   r0   r9   rE   s     r2   rN   z7test_method_generation.<locals>.SimpleEstimator.predictx  rk  r1   c                      y r7   r0   rs  s     r2   predict_probaz=test_method_generation.<locals>.SimpleEstimator.predict_proba{  rk  r1   c                      y r7   r0   rs  s     r2   predict_log_probazAtest_method_generation.<locals>.SimpleEstimator.predict_log_proba~  rk  r1   c                      y r7   r0   rs  s     r2   decision_functionzAtest_method_generation.<locals>.SimpleEstimator.decision_function  rk  r1   c                      y r7   r0   rj  s      r2   rj   z5test_method_generation.<locals>.SimpleEstimator.score  rk  r1   Nc                      y r7   r0   rj  s      r2   r   z5test_method_generation.<locals>.SimpleEstimator.split  rk  r1   c                      y r7   r0   rs  s     r2   rC   z9test_method_generation.<locals>.SimpleEstimator.transform  rk  r1   c                      y r7   r0   rs  s     r2   inverse_transformzAtest_method_generation.<locals>.SimpleEstimator.inverse_transform  rk  r1   r7   rX   r\   r]   r<   rm  ro  rq  rN   ru  rw  ry  rj   r   rC   r~  r0   r1   r2   SimpleEstimatorrh  j  s>    												r1   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)rh  Nc                      y r7   r0   r9   rE   rF   r   s       r2   r<   z3test_method_generation.<locals>.SimpleEstimator.fit  rk  r1   c                      y r7   r0   r  s       r2   rm  z=test_method_generation.<locals>.SimpleEstimator.fit_transform  rk  r1   c                      y r7   r0   r  s       r2   ro  z;test_method_generation.<locals>.SimpleEstimator.fit_predict  rk  r1   c                      y r7   r0   r  s       r2   rq  z;test_method_generation.<locals>.SimpleEstimator.partial_fit  rk  r1   c                      y r7   r0   r9   rE   r   s      r2   rN   z7test_method_generation.<locals>.SimpleEstimator.predict  rk  r1   c                      y r7   r0   r  s      r2   ru  z=test_method_generation.<locals>.SimpleEstimator.predict_proba  rk  r1   c                      y r7   r0   r  s      r2   rw  zAtest_method_generation.<locals>.SimpleEstimator.predict_log_proba  rk  r1   c                      y r7   r0   r  s      r2   ry  zAtest_method_generation.<locals>.SimpleEstimator.decision_function  rk  r1   c                      y r7   r0   r  s       r2   rj   z5test_method_generation.<locals>.SimpleEstimator.score  rk  r1   c                      y r7   r0   r  s       r2   r   z5test_method_generation.<locals>.SimpleEstimator.split  rk  r1   c                      y r7   r0   r  s      r2   rC   z9test_method_generation.<locals>.SimpleEstimator.transform  rk  r1   c                      y r7   r0   r  s      r2   r~  zAtest_method_generation.<locals>.SimpleEstimator.inverse_transform  rk  r1   r7   NNr  r0   r1   r2   r  z/test_method_generation.<locals>.SimpleEstimator  s>    												r1   )r   r   hasattrr   r   )r  r   s     r2   test_method_generationr  e  s    
$- $L ?,VHH.EFFF $- $N $?,VHH.EFFF $ !(D*ABBB !r1   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 r7   r0   )r9   rE   rF   ra   re   s        r2   r<   z3test_composite_methods.<locals>.SimpleEstimator.fit  rk  r1   c                      y r7   r0   )r9   rE   ra   re   s       r2   rN   z7test_composite_methods.<locals>.SimpleEstimator.predict  rk  r1   c                      y r7   r0   )r9   rE   r   s      r2   rC   z9test_composite_methods.<locals>.SimpleEstimator.transform  rk  r1   r  r7   )rX   r\   r]   r<   rN   rC   r0   r1   r2   r  r    s    			r1   r  )re   ra   r   )re   ra   Tr`   )ra   re   z!Conflicting metadata requests forr   )re   r   )r   r[   rm  rs   ro  r   ro   rp   r   r   r   )r  r   s     r2   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.Fr.   zThis method is only availabler   Tr   N)r   ro   rp   RuntimeErrorr
   r   r0   r1   r2   !test_no_feature_flag_raises_errorr    sK    		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 raiserk   Nr   )r   r   r<   rE   rF   r0   r1   r2   test_none_metadata_passedr    s     .0155a$5Or1   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 r7   r0   )r9   rE   rF   r   s       r2   r<   z4test_no_metadata_always_works.<locals>.Estimator.fit
  r   r1   r7   r  r0   r1   r2   	Estimatorr  	      	r1   r  rk   z3Estimator has not implemented metadata routing yet.r   r   N)
r"   r   r   r<   rE   rF   ro   rp   NotImplementedErrorr   )r  s    r2   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.rk   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
   r5   r   r   ro   rp   r   r<   rE   rF   )weighted_metapipemsgs      r2   %test_unsetmetadatapassederror_correctr    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   ro   rp   r   rm  rE   rF   )r  r  r  s      r2   ;test_unsetmetadatapassederror_correct_for_composite_methodsr  &  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 r7   r0   r  s       r2   r<   z,test_unbound_set_methods_work.<locals>.A.fitB  r   r1   r7   r  r0   r1   r2   Ar  A  r  r1   r  z>set_fit_request() takes 0 positional argument but 1 were givenr   TNr   )r   r   r   ro   rp   r   r   )r  error_messages     r2   test_unbound_set_methods_workr  8  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)jr^   r   numpynpro   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randrE   randintrF   r   r   my_other_weightsfixturer3   r5   rt   markparametrizerw   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r)  r.  r4  r?  rE  rn   rY   rI  r   r   rP  rW  r\  r`  re  r  r  r  r  r  r  r  r  r0   r1   r2   <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
B 7+T9b$9:: ; ,:1Mh FS:=,I?X+ \7>(-$LY6	.	
  "u=II5 J  		
 &)	

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