
    -iN                     f   S SK r S SKJr  S SKJr  S SKrS SKJr  S SK	J
r
JrJrJrJrJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJrJr  S SKJr  S2S jr\ " 5       4S jr!\" \SS9r"S3S jr#S r$ " S S\%5      r& " S S\\
5      r' " S S\\
5      r( " S S\\
5      r) " S S\\
5      r* " S S\*5      r+ " S S\*5      r, " S  S!\*5      r- " S" S#\\
5      r. " S$ S%\
5      r/ " S& S'\5      r0 " S( S)\\5      r1 " S* S+\\\
5      r2 " S, S-\\\
5      r3 " S. S/\\\
5      r4 " S0 S1\\\
5      r5g)4    N)defaultdict)partial)assert_array_equal)BaseEstimatorClassifierMixinMetaEstimatorMixinRegressorMixinTransformerMixinclone)_Scorermean_squared_error)BaseCrossValidator)GroupsConsumerMixin)SIMPLE_METHODS)MetadataRouterMethodMappingprocess_routing)_check_partial_fit_first_callc                    [         R                  " 5       nUS   R                  nUS   R                  n[        U S5      (       d  [	        S 5      U l        U(       dA  UR                  5        VVs0 s H$  u  pg[        U[        5      (       a  US:w  d  M"  Xg_M&     nnnU R
                  U   U   R                  U5        gs  snnf )zUtility function to store passed metadata to a method of obj.

If record_default is False, kwargs whose values are "default" are skipped.
This is so that checks on keyword arguments whose default was not changed
are skipped.

      _recordsc                       [        [        5      $ N)r   list     X/var/www/html/venv/lib/python3.13/site-packages/sklearn/tests/metadata_routing_common.py<lambda>!record_metadata.<locals>.<lambda>*   s	    ;t+<r   defaultN)
inspectstackfunctionhasattrr   r   items
isinstancestrappend)objrecord_defaultkwargsr#   calleecallerkeyvals           r   record_metadatar1      s     MMOE1XF1XF3
##"#<= #LLN
*c3''C9,< CH* 	 

 LL ''/
s   0!C C c           	      ~   [        U S[        5       5      R                  U[        5       5      R                  U[        5       5      nU H  n[	        UR                  5       5      [	        UR                  5       5      :X  d)   SUR                  5        SUR                  5        35       eUR                  5        H~  u  pxXg   n	Xs;   a0  U	b-  [        R                  " X5      R                  5       (       d   eM>  [        U	[        R                  5      (       a  [        X5        Mj  XL a  Mp   SU	 SU SU 35       e   M     g)an  Check whether the expected metadata is passed to the object's method.

Parameters
----------
obj : estimator object
    sub-estimator to check routed params for
method : str
    sub-estimator's method where metadata is routed to, or otherwise in
    the context of metadata routing referred to as 'callee'
parent : str
    the parent method which should have called `method`, or otherwise in
    the context of metadata routing referred to as 'caller'
split_params : tuple, default=empty
    specifies any parameters which are to be checked as being a subset
    of the original values
**kwargs : dict
    passed metadata
r   z	Expected z vs Nz
. Method: )getattrdictgetr   setkeysr&   npisinallr'   ndarrayr   )
r*   methodparentsplit_paramsr,   all_recordsrecordr/   valuerecorded_values
             r   check_recorded_metadatarC   4   s   ( 	Z(,,VTV<@@P   6;;=!S%77 	
d6;;=/:	
7 !,,.JC#[N "~'Aww~599;;;;nbjj99&~=)2 #N#34wjQ2 ) r   F)r+   c           	         [        U [        5      (       a/  U  H(  u  p#Ub
  X!;   a  X   nOSn[        UR                  US9  M*     gUc  / OUn[         Hf  nXQ;   a  M
  [        X5      nUR                  R                  5        VVs/ s H!  u  px[        U[        5      (       d  Uc  M  UPM#     n	nnU	(       d  Mf   e   gs  snnf )zCheck if a metadata request dict is empty.

One can exclude a method or a list of methods from the check using the
``exclude`` parameter. If metadata_request is a MetadataRouter, then
``exclude`` can be of the form ``{"object" : [method, ...]}``.
N)exclude)	r'   r   assert_request_is_emptyrouterr   r3   requestsr&   r(   )
metadata_requestrE   nameroute_mapping_excluder<   mmrpropaliaspropss
             r   rF   rF   b   s     "N33#3D"t"=#M$8$8(K $4 	ObG &/  #||113
3%%% 3 	 

 5y !
s   B=&B=c                    UR                  5        H"  u  p#[        X5      nUR                  U:X  a  M"   e   [         Vs/ s H  o"U;  d  M
  UPM     nnU H(  n[	        [        X5      R                  5      (       d  M(   e   g s  snf r   )r&   r3   rH   r   len)request
dictionaryr<   rH   rM   empty_methodss         r   assert_request_equalrV      s{    &,,.g&||x''' / +9U.*<TV.MUww/889999   Vs   	BBc                        \ rS rSrS rS rSrg)	_Registry   c                     U $ r   r   )selfmemos     r   __deepcopy___Registry.__deepcopy__       r   c                     U $ r   r   r[   s    r   __copy___Registry.__copy__   r_   r   r   N)__name__
__module____qualname____firstlineno__r]   rb   __static_attributes__r   r   r   rX   rX      s    r   rX   c                   J    \ rS rSrSrS
S jrSS jrSS jrSS jrSS jr	S	r
g)ConsumingRegressor   aC  A regressor consuming metadata.

Parameters
----------
registry : list, default=None
    If a list, the estimator will append itself to the list in order to have
    a reference to the estimator later on. Since that reference is not
    required in all tests, registration can be skipped by leaving this value
    as None.
Nc                     Xl         g r   registryr[   rn   s     r   __init__ConsumingRegressor.__init__        r   c                 j    U R                   b  U R                   R                  U 5        [        XUS9  U $ Nsample_weightmetadatarn   r)   record_metadata_not_defaultr[   Xyrv   rw   s        r   partial_fitConsumingRegressor.partial_fit   2    ==$MM  &#	
 r   c                 j    U R                   b  U R                   R                  U 5        [        XUS9  U $ rt   rx   rz   s        r   fitConsumingRegressor.fit   r   r   c                 R    [        XUS9  [        R                  " [        U5      4S9$ )Nru   shape)ry   r8   zerosrR   rz   s        r   predictConsumingRegressor.predict   s&    #	
 xxs1vi((r   c                     [        XUS9  gNru   r   ry   rz   s        r   scoreConsumingRegressor.score       #	
 r   rm   r   r!   r!   Nr!   r!   )rd   re   rf   rg   __doc__rp   r}   r   r   r   rh   r   r   r   rj   rj      s     	!)r   rj   c                   J    \ rS rSrSrSS jrS rSS jrS rS r	S	 r
S
 rSrg)NonConsumingClassifier   5A classifier which accepts no metadata on any method.c                     Xl         g r   )alpha)r[   r   s     r   rp   NonConsumingClassifier.__init__   s    
r   c                 r    [         R                  " U5      U l        [         R                  " U5      U l        U $ r   )r8   uniqueclasses_	ones_likecoef_r[   r{   r|   s      r   r   NonConsumingClassifier.fit   s%    		!\\!_
r   Nc                     U $ r   r   )r[   r{   r|   classess       r   r}   "NonConsumingClassifier.partial_fit   r_   r   c                 $    U R                  U5      $ r   )r   r[   r{   s     r   decision_function(NonConsumingClassifier.decision_function   s    ||Ar   c                     [         R                  " [        U5      4S9nSUS [        U5      S-  & SU[        U5      S-  S & U$ )Nr   r   r   r   )r8   emptyrR   )r[   r{   y_preds      r   r   NonConsumingClassifier.predict   sC    Q	* !}Q1 !s1v{}r   c                 *   [         R                  " [        U5      [        U R                  5      4[         R                  S9n[         R
                  R                  [         R                  " [        U R                  5      5      [        U5      S9US S & U$ )Nr   dtyper   size)r8   r   rR   r   float32random	dirichletones)r[   r{   y_probas      r   predict_proba$NonConsumingClassifier.predict_proba   sc    ((#a&#dmm*<!=RZZPYY((rwws4==7I/JQTUVQW(X
r   c                 $    U R                  U5      $ r   )r   r   s     r   predict_log_proba(NonConsumingClassifier.predict_log_proba   s    !!!$$r   )r   r   r   )        r   )rd   re   rf   rg   r   rp   r   r}   r   r   r   r   rh   r   r   r   r   r      s(    ?
%r   r   c                   *    \ rS rSrSrS rS rS rSrg)NonConsumingRegressor   r   c                     U $ r   r   r   s      r   r   NonConsumingRegressor.fit   r_   r   c                     U $ r   r   r   s      r   r}   !NonConsumingRegressor.partial_fit   r_   r   c                 @    [         R                  " [        U5      5      $ r   )r8   r   rR   r   s     r   r   NonConsumingRegressor.predict   s    wws1vr   r   N)	rd   re   rf   rg   r   r   r}   r   rh   r   r   r   r   r      s    ?r   r   c                   j    \ rS rSrSrSS jr SS jrSS jrSS jrSS jr	SS	 jr
SS
 jrSS jrSrg)ConsumingClassifier   a  A classifier consuming metadata.

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

alpha : float, default=0
    This parameter is only used to test the ``*SearchCV`` objects, and
    doesn't do anything.
Nc                     X l         Xl        g r   )r   rn   )r[   rn   r   s      r   rp   ConsumingClassifier.__init__  s    
 r   c                     U R                   b  U R                   R                  U 5        [        XUS9  [        X5        U $ rt   )rn   r)   ry   r   )r[   r{   r|   r   rv   rw   s         r   r}   ConsumingClassifier.partial_fit  s<     ==$MM  &#	
 	&d4r   c                     U R                   b  U R                   R                  U 5        [        XUS9  [        R                  " U5      U l        [        R                  " U5      U l        U $ rt   )rn   r)   ry   r8   r   r   r   r   rz   s        r   r   ConsumingClassifier.fit  sP    ==$MM  &#	
 		!\\!_
r   c                     [        XUS9  [        R                  " [        U5      4SS9nSU[        U5      S-  S & SUS [        U5      S-  & U$ )Nru   int8r   r   r   r   ry   r8   r   rR   r[   r{   rv   rw   y_scores        r   r   ConsumingClassifier.predict   sT    #	
 ((#a&&9!"A!!"#a&A+r   c                 >   [        XUS9  [        R                  " [        U5      [        U R                  5      4[        R
                  S9n[        R                  R                  [        R                  " [        U R                  5      5      [        U5      S9US S & U$ )Nru   r   r   )	ry   r8   r   rR   r   r   r   r   r   )r[   r{   rv   rw   r   s        r   r   !ConsumingClassifier.predict_proba)  sr    #	
 ((#a&#dmm*<!=RZZPYY((rwws4==7I/JQTUVQW(X
r   c                 8    [        XUS9  U R                  U5      $ rt   )ry   r   r[   r{   rv   rw   s       r   r   %ConsumingClassifier.predict_log_proba2  s"    #	
 !!!$$r   c                     [        XUS9  [        R                  " [        U5      4S9nSU[        U5      S-  S & SUS [        U5      S-  & U$ )Nru   r   r   r   r   r   r   s        r   r   %ConsumingClassifier.decision_function8  sR    #	
 ((#a&+!"A!!"#a&A+r   c                     [        XUS9  gr   r   rz   s        r   r   ConsumingClassifier.scoreA  r   r   )r   r   r   rn   )Nr   r   r   )rd   re   rf   rg   r   rp   r}   r   r   r   r   r   r   rh   r   r   r   r   r      s6    !
 EN

%r   r   c                   (    \ rS rSrSr\S 5       rSrg)&ConsumingClassifierWithoutPredictProbaiH  zConsumingClassifier without a predict_proba method, but with predict_log_proba.

Used to mimic dynamic method selection such as in the `_parallel_predict_proba()`
function called by `BaggingClassifier`.
c                     [        S5      eNz-This estimator does not support predict_probaAttributeErrorra   s    r   r   4ConsumingClassifierWithoutPredictProba.predict_probaO      LMMr   r   N)rd   re   rf   rg   r   propertyr   rh   r   r   r   r   r   H  s     N Nr   r   c                   (    \ rS rSrSr\S 5       rSrg))ConsumingClassifierWithoutPredictLogProbaiT  zConsumingClassifier without a predict_log_proba method, but with predict_proba.

Used to mimic dynamic method selection such as in
`BaggingClassifier.predict_log_proba()`.
c                     [        S5      eNz1This estimator does not support predict_log_probar   ra   s    r   r   ;ConsumingClassifierWithoutPredictLogProba.predict_log_proba[      PQQr   r   N)rd   re   rf   rg   r   r   r   rh   r   r   r   r   r   T  s     R Rr   r   c                   8    \ rS rSrSr\S 5       r\S 5       rSrg)"ConsumingClassifierWithOnlyPredicti`  zConsumingClassifier with only a predict method.

Used to mimic dynamic method selection such as in
`BaggingClassifier.predict_log_proba()`.
c                     [        S5      er   r   ra   s    r   r   0ConsumingClassifierWithOnlyPredict.predict_probag  r   r   c                     [        S5      er   r   ra   s    r   r   4ConsumingClassifierWithOnlyPredict.predict_log_probak  r   r   r   N)	rd   re   rf   rg   r   r   r   r   rh   r   r   r   r   r   `  s3     N N R Rr   r   c                   J    \ rS rSrSrS
S jrSS jrSS jrSS jrSS jr	S	r
g)ConsumingTransformerip  a^  A transformer which accepts metadata on fit and transform.

Parameters
----------
registry : list, default=None
    If a list, the estimator will append itself to the list in order to have
    a reference to the estimator later on. Since that reference is not
    required in all tests, registration can be skipped by leaving this value
    as None.
Nc                     Xl         g r   rm   ro   s     r   rp   ConsumingTransformer.__init__|  rr   r   c                 x    U R                   b  U R                   R                  U 5        [        XUS9  SU l        U $ )Nru   T)rn   r)   ry   fitted_rz   s        r   r   ConsumingTransformer.fit  s9    ==$MM  &#	
 r   c                      [        XUS9  US-   $ r   r   r   s       r   	transformConsumingTransformer.transform      #	
 1ur   c                 R    [        XUS9  U R                  XX4S9R                  XUS9$ rt   )ry   r   r   rz   s        r   fit_transform"ConsumingTransformer.fit_transform  s>    
 	$	
 xxMxMWWX X 
 	
r   c                      [        XUS9  US-
  $ r   r   r   s       r   inverse_transform&ConsumingTransformer.inverse_transform  r   r   )r   rn   r   r   r   NN)rd   re   rf   rg   r   rp   r   r   r   r   rh   r   r   r   r   r   p  s     	!

r   r   c                   6    \ rS rSrSrSS jrS	S jrS
S jrSrg)"ConsumingNoFitTransformTransformeri  zA metadata consuming transformer that doesn't inherit from
TransformerMixin, and thus doesn't implement `fit_transform`. Note that
TransformerMixin's `fit_transform` doesn't route metadata to `transform`.Nc                     Xl         g r   rm   ro   s     r   rp   +ConsumingNoFitTransformTransformer.__init__  rr   r   c                 j    U R                   b  U R                   R                  U 5        [        XUS9  U $ rt   )rn   r)   r1   rz   s        r   r   &ConsumingNoFitTransformTransformer.fit  s-    ==$MM  &HMr   c                     [        XUS9  U$ rt   )r1   r   s       r   r   ,ConsumingNoFitTransformTransformer.transform  s    HMr   rm   r   NNNr  )	rd   re   rf   rg   r   rp   r   r   rh   r   r   r   r  r    s    Q!r   r  c                   8   ^  \ rS rSrSU 4S jjrU 4S jrSrU =r$ )ConsumingScoreri  c                 :   > [         TU ]  [        S0 SS9  Xl        g )Nr   r   )
score_funcsignr,   response_method)superrp   r   rn   )r[   rn   	__class__s     r   rp   ConsumingScorer.__init__  s%    )"i 	 	
 !r   c                    > U R                   b  U R                   R                  U 5        [        U 40 UD6  UR                  SS 5      n[        TU ]  XX4US9$ )Nrv   rv   )rn   r)   ry   r5   r  _score)r[   method_callerclfr{   r|   r,   rv   r  s          r   r  ConsumingScorer._score  sQ    ==$MM  &#D3F3

?D9w~m!m~TTr   rm   r   )rd   re   rf   rg   rp   r  rh   __classcell__)r  s   @r   r  r    s    !U Ur   r  c                   <    \ rS rSrSS jrS	S jrS
S jrSS jrSrg)ConsumingSplitteri  Nc                     Xl         g r   rm   ro   s     r   rp   ConsumingSplitter.__init__  rr   r   c              #     #    U R                   b  U R                   R                  U 5        [        XUS9  [        U5      S-  n[	        [        SU5      5      n[	        [        U[        U5      5      5      nXv4v   Xg4v   g 7f)N)groupsrw   r   r   )rn   r)   ry   rR   r   range)r[   r{   r|   r!  rw   split_indextrain_indicestest_indicess           r   splitConsumingSplitter.split  sp     ==$MM  &#D(K!fkU1k23E+s1v67))))s   A?Bc                     g)Nr   r   )r[   r{   r|   r!  rw   s        r   get_n_splitsConsumingSplitter.get_n_splits  s    r   c              #      #    [        U5      S-  n[        [        SU5      5      n[        [        U[        U5      5      5      nUv   Uv   g 7f)Nr   r   )rR   r   r"  )r[   r{   r|   r!  r#  r$  r%  s          r   _iter_test_indices$ConsumingSplitter._iter_test_indices  sD     !fkU1k23E+s1v67s   AArm   r   r   )NNNNr  )	rd   re   rf   rg   rp   r&  r)  r,  rh   r   r   r   r  r    s    !
*r   r  c                   *    \ rS rSrSrS rS rS rSrg)MetaRegressori  z(A meta-regressor which is only a router.c                     Xl         g r   )	estimator)r[   r1  s     r   rp   MetaRegressor.__init__  s    "r   c                     [        U S40 UD6n[        U R                  5      R                  " X40 UR                  R                  D6U l        g Nr   )r   r   r1  r   
estimator_r[   r{   r|   
fit_paramsparamss        r   r   MetaRegressor.fit  s?     u;
;/33AQF<L<L<P<PQr   c                     [        U R                  R                  S9R                  U R                  [        5       R                  SSS9S9nU$ Nownerr   r.   r-   r1  method_mapping)r   r  rd   addr1  r   r[   rG   s     r   get_metadata_routing"MetaRegressor.get_metadata_routing  sJ    dnn&=&=>BBnn(?..eE.J C 
 r   )r1  r5  N	rd   re   rf   rg   r   rp   r   rC  rh   r   r   r   r/  r/    s    2#Rr   r/  c                   8    \ rS rSrSrS	S jrS	S jrS rS rSr	g)
WeightedMetaRegressori  z*A meta-regressor which is also a consumer.Nc                     Xl         X l        g r   r1  rn   r[   r1  rn   s      r   rp   WeightedMetaRegressor.__init__      " r   c                    U R                   b  U R                   R                  U 5        [        XS9  [        U S4SU0UD6n[	        U R
                  5      R                  " X40 UR
                  R                  D6U l        U $ Nr  r   rv   rn   r)   r1   r   r   r1  r   r5  )r[   r{   r|   rv   r7  r8  s         r   r   WeightedMetaRegressor.fit  sm    ==$MM  &: uXMXZX/33AQF<L<L<P<PQr   c                 ~    [        U S40 UD6nU R                  R                  " U40 UR                  R                  D6$ )Nr   )r   r5  r   r1  )r[   r{   predict_paramsr8  s       r   r   WeightedMetaRegressor.predict  s9     yCNC&&qEF,<,<,D,DEEr   c                     [        U R                  R                  S9R                  U 5      R	                  U R
                  [        5       R	                  SSS9R	                  SSS9S9nU$ )Nr<  r   r>  r   r?  r   r  rd   add_self_requestrA  r1  r   rB  s     r   rC  *WeightedMetaRegressor.get_metadata_routing	  sb    !8!89d#S..,E%0Ii8	   	 r   r1  r5  rn   r   )
rd   re   rf   rg   r   rp   r   r   rC  rh   r   r   r   rG  rG    s    4!Fr   rG  c                   2    \ rS rSrSrSS jrSS jrS rSrg)	WeightedMetaClassifieri  zEA meta-estimator which also consumes sample_weight itself in ``fit``.Nc                     Xl         X l        g r   rI  rJ  s      r   rp   WeightedMetaClassifier.__init__  rL  r   c                    U R                   b  U R                   R                  U 5        [        XS9  [        U S4SU0UD6n[	        U R
                  5      R                  " X40 UR
                  R                  D6U l        U $ rN  rO  )r[   r{   r|   rv   r,   r8  s         r   r   WeightedMetaClassifier.fit  sm    ==$MM  &: uTMTVT/33AQF<L<L<P<PQr   c                     [        U R                  R                  S9R                  U 5      R	                  U R
                  [        5       R	                  SSS9S9nU$ r;  rU  rB  s     r   rC  +WeightedMetaClassifier.get_metadata_routing'  sV    !8!89d#S..,22%2N   	 r   rX  r   rE  r   r   r   rZ  rZ    s    O!	r   rZ  c                   8    \ rS rSrSrS rS	S jrS	S jrS rSr	g)
MetaTransformeri3  zA simple meta-transformer.c                     Xl         g r   )transformer)r[   rd  s     r   rp   MetaTransformer.__init__6  s    &r   Nc                     [        U S40 UD6n[        U R                  5      R                  " X40 UR                  R                  D6U l        U $ r4  )r   r   rd  r   transformer_r6  s        r   r   MetaTransformer.fit9  sG     u;
;!$"2"2377W@R@R@V@VWr   c                 ~    [        U S40 UD6nU R                  R                  " U40 UR                  R                  D6$ )Nr   )r   rg  r   rd  )r[   r{   r|   transform_paramsr8  s        r   r   MetaTransformer.transform>  s<     {G6FG  **1M0B0B0L0LMMr   c                     [        U R                  R                  S9R                  U R                  [        5       R                  SSS9R                  SSS9S9$ )Nr<  r   r>  r   )rd  r@  )r   r  rd   rA  rd  r   ra   s    r   rC  $MetaTransformer.get_metadata_routingB  sT    DNN$;$;<@@(((?SeS,SKS8	 A 
 	
r   )rd  rg  r   )
rd   re   rf   rg   r   rp   r   r   rC  rh   r   r   r   rb  rb  3  s    $'
N
r   rb  )Tr   )6r"   collectionsr   	functoolsr   numpyr8   numpy.testingr   sklearn.baser   r   r   r	   r
   r   sklearn.metrics._scorerr   r   sklearn.model_selectionr   sklearn.model_selection._splitr    sklearn.utils._metadata_requestsr   sklearn.utils.metadata_routingr   r   r   sklearn.utils.multiclassr   r1   tuplerC   ry   rF   rV   r   rX   rj   r   r   r   r   r   r   r   r  r  r  r/  rG  rZ  rb  r   r   r   <module>rz     sa    #   ,  @ 6 > 
 C0, ?Dg (V &oeL ::
 
+ +\ %_m  %F
NM 
Q/= Qh	N-@ 	N	R0C 	RR)< R /+] /d *Ug U"+-? 6& $. D/- 8
(*:M 
r   