
    h$,f<                        d dl mZ d dlZd dlmZmZmZmZm	Z	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 d d	lmZ d(d
Z e       fdZ eed      Zd)dZd Z G d de      Z  G d dee      Z! G d dee      Z" G d dee      Z# G d dee      Z$ G d de	e      Z% G d de      Z& G d dee      Z' G d  d!eee      Z( G d" d#eee      Z) G d$ d%eee      Z* G d& d'ee	e      Z+y)*    )partialN)BaseEstimatorClassifierMixinMetaEstimatorMixinRegressorMixinTransformerMixinclone)_Scorermean_squared_error)BaseCrossValidator)GroupsConsumerMixin)SIMPLE_METHODS)MetadataRouterprocess_routing)_check_partial_fit_first_callc                     t        | d      si | _        |s8|j                         D ci c]  \  }}t        |t              r|dk7  r|| }}}|| j                  |<   yc c}}w )zUtility function to store passed metadata to a method.

    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.

    _recordsdefaultN)hasattrr   items
isinstancestr)objmethodrecord_defaultkwargskeyvals         Elib/python3.12/site-packages/sklearn/tests/metadata_routing_common.pyrecord_metadatar       sk     3
# #LLN
Sc3'C9,< H
 

 "CLL
s   "Ac                 h   t        | dt                     j                  |t                     }t        |j	                               t        |j	                               k(  sJ |j                         D ]=  \  }}||   }||v r)|'t        j                  ||      j                         r6J ||u r=J  y)a  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
    split_params : tuple, default=empty
        specifies any parameters which are to be checked as being a subset
        of the original values.
    r   N)	getattrdictgetsetkeysr   npisinall)r   r   split_paramsr   recordsr   valuerecorded_values           r   check_recorded_metadatar.   -   s     c:tv.22646BGv{{}W\\^!4444lln +
U  ,>#=77>5155777!U***+    F)r   c           	      X   t        | t              r0| D ]*  \  }}|
||v r||   }nd}t        |j                  |       , y|g n|}t        D ]U  }||v rt        | |      }|j                  j                         D cg c]  \  }}t        |t              s|| }	}}|	sUJ  yc c}}w )a  Check 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   r"   requestsr   r   )
metadata_requestr1   nameroute_mapping_excluder   mmrpropaliaspropss
             r   r2   r2   I   s     "N3#3 	LD-"tw"4=#M$8$8(K	L 	ObG  	W&/  #||113
e%%): 
 

 y	
s   >B&c                     |j                         D ]"  \  }}t        | |      }|j                  |k(  r"J  t        D cg c]	  }||vs| }}|D ]#  }t	        t        | |      j                        s#J  y c c}w N)r   r"   r4   r   len)request
dictionaryr   r4   r9   empty_methodss         r   assert_request_equalrC   f   s    &,,. (gv&||x'''( +9UF*<TVUMU :ww/88999: Vs   	A7A7c                       e Zd Zd Zd Zy)	_Registryc                     | S r>    )selfmemos     r   __deepcopy__z_Registry.__deepcopy__v       r/   c                     | S r>   rG   rH   s    r   __copy__z_Registry.__copy__y   rK   r/   N)__name__
__module____qualname__rJ   rN   rG   r/   r   rE   rE   p   s    r/   rE   c                   0    e Zd ZdZddZddZddZddZy)	ConsumingRegressorac  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                     || _         y r>   registryrH   rV   s     r   __init__zConsumingRegressor.__init__   	     r/   c                 r    | j                   | j                   j                  |        t        | d||       | S Npartial_fitsample_weightmetadatarV   appendrecord_metadata_not_defaultrH   Xyr^   r_   s        r   r\   zConsumingRegressor.partial_fit   s6    ==$MM  &#-}x	
 r/   c                 r    | j                   | j                   j                  |        t        | d||       | S Nfitr]   r`   rc   s        r   rh   zConsumingRegressor.fit   6    ==$MM  &#%}x	
 r/   c                      y r>   rG   rH   rd   r^   r_   s       r   predictzConsumingRegressor.predict       r/   r>   r   r   )rO   rP   rQ   __doc__rX   r\   rh   rl   rG   r/   r   rS   rS   }   s    	!r/   rS   c                   2    e Zd ZdZddZd Zd	dZd Zd Zy)
NonConsumingClassifier5A classifier which accepts no metadata on any method.c                     || _         y r>   )alpha)rH   rt   s     r   rX   zNonConsumingClassifier.__init__   s	    
r/   c                 :    t        j                  |      | _        | S r>   )r'   uniqueclasses_rH   rd   re   s      r   rh   zNonConsumingClassifier.fit   s    		!r/   Nc                     | S r>   rG   )rH   rd   re   classess       r   r\   z"NonConsumingClassifier.partial_fit   rK   r/   c                 $    | j                  |      S r>   )rl   rH   rd   s     r   decision_functionz(NonConsumingClassifier.decision_function   s    ||Ar/   c                 >    t        j                  t        |            S r>   r'   onesr?   r|   s     r   rl   zNonConsumingClassifier.predict       wws1vr/   )        r>   )	rO   rP   rQ   ro   rX   rh   r\   r}   rl   rG   r/   r   rq   rq      s    ?r/   rq   c                   "    e Zd ZdZd Zd Zd Zy)NonConsumingRegressorrr   c                     | S r>   rG   rx   s      r   rh   zNonConsumingRegressor.fit   rK   r/   c                     | S r>   rG   rx   s      r   r\   z!NonConsumingRegressor.partial_fit   rK   r/   c                 >    t        j                  t        |            S r>   r   r|   s     r   rl   zNonConsumingRegressor.predict   r   r/   N)rO   rP   rQ   ro   rh   r\   rl   rG   r/   r   r   r      s    ?r/   r   c                   J    e Zd ZdZd
dZ	 ddZddZddZddZddZ	dd	Z
y)ConsumingClassifiera  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                      || _         || _        y r>   )rt   rV   )rH   rV   rt   s      r   rX   zConsumingClassifier.__init__   s    
 r/   c                     | j                   | j                   j                  |        t        | d||       t        | |       | S r[   )rV   ra   rb   r   )rH   rd   re   rz   r^   r_   s         r   r\   zConsumingClassifier.partial_fit   sB     ==$MM  &#-}x	
 	&dG4r/   c                     | j                   | j                   j                  |        t        | d||       t        j                  |      | _        | S rg   )rV   ra   rb   r'   rv   rw   rc   s        r   rh   zConsumingClassifier.fit   sE    ==$MM  &#%}x	
 		!r/   c                 `    t        | d||       t        j                  t        |      f      S )Nrl   r]   shaperb   r'   zerosr?   rk   s       r   rl   zConsumingClassifier.predict   s*    #)=8	
 xxs1vi((r/   c                      y r>   rG   rk   s       r   predict_probaz!ConsumingClassifier.predict_proba   rm   r/   c                      y r>   rG   rk   s       r   predict_log_probaz%ConsumingClassifier.predict_log_proba  rm   r/   c                 `    t        | d||       t        j                  t        |      f      S )Nr   r]   r   r   rk   s       r   r}   z%ConsumingClassifier.decision_function  s*    #/	
 xxs1vi((r/   )Nr   Nr   r   rn   )rO   rP   rQ   ro   rX   r\   rh   rl   r   r   r}   rG   r/   r   r   r      s1    !
 EN
))r/   r   c                   8    e Zd ZdZddZd	dZd
dZd
dZd
dZy)ConsumingTransformera~  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                     || _         y r>   rU   rW   s     r   rX   zConsumingTransformer.__init__  rY   r/   c                 r    | j                   | j                   j                  |        t        | d||       | S rg   r`   rc   s        r   rh   zConsumingTransformer.fit!  ri   r/   c                 $    t        | d||       |S )N	transformr]   r    rk   s       r   r   zConsumingTransformer.transform*  s    +]X	
 r/   c                 n    t        | d||       | j                  ||||      j                  |||      S )Nfit_transformr]   )r    rh   r   rc   s        r   r   z"ConsumingTransformer.fit_transform0  sH    
 	/	
 xx1MHxMWW]X X 
 	
r/   c                 $    t        | d||       |S )Ninverse_transformr]   r   rk   s       r   r   z&ConsumingTransformer.inverse_transform<  s    %]X	
 r/   r>   NNN)NN)	rO   rP   rQ   ro   rX   rh   r   r   r   rG   r/   r   r   r     s     	!

r/   r   c                   *     e Zd Zd fd	Z fdZ xZS )ConsumingScorerc                 B    t         |   t        di d       || _        y )N   rl   )
score_funcsignr   response_method)superrX   r   rV   )rH   rV   	__class__s     r   rX   zConsumingScorer.__init__D  s'    )"i 	 	
 !r/   c                     | j                   | j                   j                  |        t        | dfi | |j                  dd       }t        |   |||||      S )Nscorer^   r^   )rV   ra   rb   r$   r   _score)rH   method_callerclfrd   re   r   r^   r   s          r   r   zConsumingScorer._scoreJ  sW    ==$MM  &#D'<V<

?D9w~mS!Qm~TTr/   r>   )rO   rP   rQ   rX   r   __classcell__)r   s   @r   r   r   C  s    !U Ur/   r   c                   ,    e Zd ZddZddZddZd	dZy)
ConsumingSplitterNc                     || _         y r>   rU   rW   s     r   rX   zConsumingSplitter.__init__U  rY   r/   c              #     K   | j                   | j                   j                  |        t        | d||       t        |      dz  }t	        t        d|            }t	        t        |t        |                  }||f ||f y w)Nsplit)groupsr_      r   )rV   ra   rb   r?   listrange)rH   rd   re   r   r_   split_indextrain_indicestest_indicess           r   r   zConsumingSplitter.splitX  sy     ==$MM  &#D'&8T!fkU1k23E+s1v67M))\))s   BBc                      y)Nr   rG   )rH   rd   re   r   r_   s        r   get_n_splitszConsumingSplitter.get_n_splitsd  s    r/   c              #      K   t        |      dz  }t        t        d|            }t        t        |t        |                  }| | y w)Nr   r   )r?   r   r   )rH   rd   re   r   r   r   r   s          r   _iter_test_indicesz$ConsumingSplitter._iter_test_indicesg  sE     !fkU1k23E+s1v67s   AAr>   r   )NNNNr   )rO   rP   rQ   rX   r   r   r   rG   r/   r   r   r   T  s    !
*r/   r   c                   "    e Zd ZdZd Zd Zd Zy)MetaRegressorz(A meta-regressor which is only a router.c                     || _         y r>   )	estimator)rH   r   s     r   rX   zMetaRegressor.__init__r  s	    "r/   c                     t        | dfi |} t        | j                        j                  ||fi |j                  j                  | _        y Nrh   )r   r	   r   rh   
estimator_rH   rd   re   
fit_paramsparamss        r   rh   zMetaRegressor.fitu  sC     u;
;3%/33AqQF<L<L<P<PQr/   c                 |    t        | j                  j                        j                  | j                  d      }|S Nowner
one-to-oner   method_mapping)r   r   rO   addr   rH   r3   s     r   get_metadata_routingz"MetaRegressor.get_metadata_routingy  s7    dnn&=&=>BBnn\ C 
 r/   NrO   rP   rQ   ro   rX   rh   r   rG   r/   r   r   r   o  s    2#Rr/   r   c                   ,    e Zd ZdZddZddZd Zd Zy)WeightedMetaRegressorz*A meta-regressor which is also a consumer.Nc                      || _         || _        y r>   r   rV   rH   r   rV   s      r   rX   zWeightedMetaRegressor.__init__      " r/   c                    | j                   | j                   j                  |        t        | d|       t        | dfd|i|} t	        | j
                        j                  ||fi |j
                  j                  | _        | S Nrh   r   r^   rV   ra   r    r   r	   r   rh   r   )rH   rd   re   r^   r   r   s         r   rh   zWeightedMetaRegressor.fit  su    ==$MM  &e=A uXMXZX3%/33AqQF<L<L<P<PQr/   c                 ~    t        | dfi |} | j                  j                  |fi |j                  j                  S )Nrl   )r   r   rl   r   )rH   rd   predict_paramsr   s       r   rl   zWeightedMetaRegressor.predict  s;     yCNC&t&&qEF,<,<,D,DEEr/   c                     t        | j                  j                        j                  |       j	                  | j
                  d      }|S r   r   r   rO   add_self_requestr   r   r   s     r   r   z*WeightedMetaRegressor.get_metadata_routing  s=    !8!89d#S4>>,SG 	
 r/   r>   )rO   rP   rQ   ro   rX   rh   rl   r   rG   r/   r   r   r     s    4!Fr/   r   c                   &    e Zd ZdZddZddZd Zy)WeightedMetaClassifierzEA meta-estimator which also consumes sample_weight itself in ``fit``.Nc                      || _         || _        y r>   r   r   s      r   rX   zWeightedMetaClassifier.__init__  r   r/   c                    | j                   | j                   j                  |        t        | d|       t        | dfd|i|} t	        | j
                        j                  ||fi |j
                  j                  | _        | S r   r   )rH   rd   re   r^   r   r   s         r   rh   zWeightedMetaClassifier.fit  su    ==$MM  &e=A uTMTVT3%/33AqQF<L<L<P<PQr/   c                     t        | j                  j                        j                  |       j	                  | j
                  d      }|S )Nr   rh   r   r   r   s     r   r   z+WeightedMetaClassifier.get_metadata_routing  s=    !8!89d#S4>>%S@ 	
 r/   r>   r   rG   r/   r   r   r     s    O!r/   r   c                   ,    e Zd ZdZd ZddZddZd Zy)MetaTransformerzA simple meta-transformer.c                     || _         y r>   )transformer)rH   r   s     r   rX   zMetaTransformer.__init__  s
    &r/   Nc                     t        | dfi |} t        | j                        j                  ||fi |j                  j                  | _        | S r   )r   r	   r   rh   transformer_r   s        r   rh   zMetaTransformer.fit  sK     u;
;7E$"2"23771W@R@R@V@VWr/   c                 ~    t        | dfi |} | j                  j                  |fi |j                  j                  S )Nr   )r   r   r   r   )rH   rd   re   transform_paramsr   s        r   r   zMetaTransformer.transform  s>     {G6FG*t  **1M0B0B0L0LMMr/   c                 x    t        | j                  j                        j                  | j                  d      S )Nr   r   )r   r   )r   r   rO   r   r   rM   s    r   r   z$MetaTransformer.get_metadata_routing  s5    DNN$;$;<@@(( A 
 	
r/   r>   )rO   rP   rQ   ro   rX   rh   r   r   rG   r/   r   r   r     s    $'
N
r/   r   )Tr>   ),	functoolsr   numpyr'   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   sklearn.utils.multiclassr   r    tupler.   rb   r2   rC   r   rE   rS   rq   r   r   r   r   r   r   r   r   r   rG   r/   r   <module>r      s      @ 6 > C"& 7<g +2 &oeL ::
 
" "V_m (
NM 
F)/= F)R.+] .bUg U"*,? 6& ". :/- 2
(*:M 
r/   