
    0PhI                        d dl Z d dlmZ d dlmZ d dlZd dlm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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          Z- G d# d$ee          Z. G d% d&eee
          Z/ G d' d(eee
          Z0 G d) d*eee
          Z1 G d+ d,eee
          Z2dS )/    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_callTc                 6   t          j                    }|d         j        }|d         j        }t          | d          st	          d           | _        |sd |                                D             }| j        |         |                             |           dS )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                  *    t          t                    S N)r   list     e/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sklearn/tests/metadata_routing_common.py<lambda>z!record_metadata.<locals>.<lambda>*   s    ;t+<+< r   c                 P    i | ]#\  }}t          |t                    r|d k     ||$S )default
isinstancestr).0keyvals      r   
<dictcomp>z#record_metadata.<locals>.<dictcomp>,   sG     
 
 
Sc3''
 -09,<,< ,<,<,<r   N)inspectstackfunctionhasattrr   r   itemsappend)objrecord_defaultkwargsr*   calleecallers         r   record_metadatar4      s     MOOE1XF1XF3
## >"#<#<== 

 
"LLNN
 
 

 L ''/////r   c           	         t          | dt                                                    |t                                                    |t                                }|D ]}t	          |                                          t	          |                                          k    s4J d|                                 d|                                             |                                D ]\  }}||         }	||v r,|	*t          j        |	|          	                                sJ =t          |	t          j                  rt          |	|           h|	|u sJ d|	 d| d|             dS )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, 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_paramsr1   all_recordsrecordr&   valuerecorded_values
             r   check_recorded_metadatarF   4   s   ( 	Z((,,VTVV<<@@PP   Q Q 6;;==!!SKKMM&
 &
 
 
 
9v{{}}99&++--99
 
 
 !,,.. 	Q 	QJC#C[N l""~'Aw~u5599;;;;;;nbj99 Q&~u==== '%///P>PPuPPPP 0///	QQ Qr   F)r0   c                 *   t          | t                    r1| D ],\  }}|||v r	||         }nd}t          |j        |           -dS |g n|}t          D ]>}||v rt          | |          }d |j                                        D             }|rJ ?dS )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)excludec                 F    g | ]\  }}t          |t                    s||S r   r"   )r%   propaliass      r   
<listcomp>z+assert_request_is_empty.<locals>.<listcomp>w   s@     
 
 
e%%%
 */): ):):):r   )r#   r   assert_request_is_emptyrouterr   r6   requestsr-   )metadata_requestrH   nameroute_mapping_excluder?   mmrpropss           r   rM   rM   b   s     "N33 #3 	L 	LD-"tw"4=#M$8(KKKKKObbG  	 	W&//
 
"|1133
 
 

 	 	r   c                                                      D ]"\  }}t          | |          }|j        |k    sJ #fdt          D             }|D ]&}t	          t          | |          j                  rJ 'd S )Nc                     g | ]}|v|	S r   r   )r%   r?   
dictionarys     r   rL   z(assert_request_equal.<locals>.<listcomp>   s#    UUUF*<T<TV<T<T<Tr   )r-   r6   rO   r   len)requestrX   r?   rO   rT   empty_methodss    `    r   assert_request_equalr\      s    &,,.. ( (gv&&|x'''''UUUU.UUUM : :ww//8999999: :r   c                       e Zd Zd Zd ZdS )	_Registryc                     | S r   r   )selfmemos     r   __deepcopy__z_Registry.__deepcopy__       r   c                     | S r   r   r`   s    r   __copy__z_Registry.__copy__   rc   r   N)__name__
__module____qualname__rb   rf   r   r   r   r^   r^      s2              r   r^   c                   :    e Zd ZdZd	dZd
dZd
dZddZd
dZdS )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                     || _         d S r   registryr`   rn   s     r   __init__zConsumingRegressor.__init__        r   r!   c                 l    | j         | j                             |            t          | ||           | S Nsample_weightmetadatarn   r.   record_metadata_not_defaultr`   Xyru   rv   s        r   partial_fitzConsumingRegressor.partial_fit   E    =$M  &&&#	
 	
 	
 	
 r   c                 l    | j         | j                             |            t          | ||           | S rs   rw   ry   s        r   fitzConsumingRegressor.fit   r}   r   c                 l    t          | ||           t          j        t          |          f          S )Nrt   shaperx   r;   zerosrY   ry   s        r   predictzConsumingRegressor.predict   s=    #	
 	
 	
 	
 xs1vvi((((r   c                 *    t          | ||           dS Nrt   r   rx   ry   s        r   scorezConsumingRegressor.score   '    #	
 	
 	
 	
 qr   r   r!   r!   Nr!   r!   )	rg   rh   ri   __doc__rp   r|   r   r   r   r   r   r   rk   rk      s        	 	! ! ! !      ) ) ) )     r   rk   c                   @    e Zd ZdZddZd ZddZd Zd Zd	 Z	d
 Z
dS )NonConsumingClassifier5A classifier which accepts no metadata on any method.        c                     || _         d S r   )alpha)r`   r   s     r   rp   zNonConsumingClassifier.__init__   s    


r   c                 j    t          j        |          | _        t          j        |          | _        | S r   )r;   uniqueclasses_	ones_likecoef_r`   rz   r{   s      r   r   zNonConsumingClassifier.fit   s%    	!\!__
r   Nc                     | S r   r   )r`   rz   r{   classess       r   r|   z"NonConsumingClassifier.partial_fit   rc   r   c                 ,    |                      |          S r   )r   r`   rz   s     r   decision_functionz(NonConsumingClassifier.decision_function   s    ||Ar   c                     t          j        t          |          f          }d|d t          |          dz  <   d|t          |          dz  d <   |S )Nr   r   r   r   )r;   emptyrY   )r`   rz   y_preds      r   r   zNonConsumingClassifier.predict   sQ    Q	*** !}Q1} !s1vv{}}r   c                 
   t          j        t          |          df          }t          j        ddg          |d t          |          dz  d d f<   t          j        ddg          |t          |          dz  d d d f<   |S )Nr   r         ?r   )r;   r   rY   asarray)r`   rz   y_probas      r   predict_probaz$NonConsumingClassifier.predict_proba   s    (#a&&!---$&JSz$:$:#a&&A+qqq !$&JSz$:$:A!qqq !r   c                 ,    |                      |          S r   )r   r   s     r   predict_log_probaz(NonConsumingClassifier.predict_log_proba   s    !!!$$$r   )r   r   )rg   rh   ri   r   rp   r   r|   r   r   r   r   r   r   r   r   r      s        ??     
         % % % % %r   r   c                   $    e Zd ZdZd Zd Zd ZdS )NonConsumingRegressorr   c                     | S r   r   r   s      r   r   zNonConsumingRegressor.fit   rc   r   c                     | S r   r   r   s      r   r|   z!NonConsumingRegressor.partial_fit   rc   r   c                 D    t          j        t          |                    S r   )r;   onesrY   r   s     r   r   zNonConsumingRegressor.predict   s    ws1vvr   N)rg   rh   ri   r   r   r|   r   r   r   r   r   r      sG        ??        r   r   c                   T    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
ddZdS )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.
    Nr   c                 "    || _         || _        d S r   )r   rn   )r`   rn   r   s      r   rp   zConsumingClassifier.__init__  s    
 r   r!   c                     | j         | j                             |            t          | ||           t          | |           | S rs   )rn   r.   rx   r   )r`   rz   r{   r   ru   rv   s         r   r|   zConsumingClassifier.partial_fit  sW     =$M  &&&#	
 	
 	
 	
 	&dG444r   c                     | j         | j                             |            t          | ||           t          j        |          | _        t          j        |          | _        | S rs   )rn   r.   rx   r;   r   r   r   r   ry   s        r   r   zConsumingClassifier.fit  sc    =$M  &&&#	
 	
 	
 	
 	!\!__
r   c                     t          | ||           t          j        t          |          fd          }d|t          |          dz  d <   d|d t          |          dz  <   |S )Nrt   int8)r   dtyper   r   r   rx   r;   r   rY   r`   rz   ru   rv   y_scores        r   r   zConsumingClassifier.predict   ss    #	
 	
 	
 	
 (#a&&&999!"A!!"#a&&A+r   c                 .   t          | ||           t          j        t          |          df          }t          j        ddg          |d t          |          dz  d d f<   t          j        ddg          |t          |          dz  d d d f<   |S )Nrt   r   r   r   r   )rx   r;   r   rY   r   )r`   rz   ru   rv   r   s        r   r   z!ConsumingClassifier.predict_proba)  s    #	
 	
 	
 	
 (#a&&!---$&JSz$:$:#a&&A+qqq !$&JSz$:$:A!qqq !r   c                 n    t          | ||           t          j        t          |          df          S )Nrt   r   r   r   r`   rz   ru   rv   s       r   r   z%ConsumingClassifier.predict_log_proba2  s?    #	
 	
 	
 	
 xs1vvqk****r   c                     t          | ||           t          j        t          |          f          }d|t          |          dz  d <   d|d t          |          dz  <   |S )Nrt   r   r   r   r   r   r   s        r   r   z%ConsumingClassifier.decision_function8  sq    #	
 	
 	
 	
 (#a&&+++!"A!!"#a&&A+r   c                 *    t          | ||           dS r   r   ry   s        r   r   zConsumingClassifier.scoreA  r   r   )Nr   r   r   )rg   rh   ri   r   rp   r|   r   r   r   r   r   r   r   r   r   r   r      s         ! ! ! !
 EN
 
 
 

 
 
 
      + + + +        r   r   c                   :    e Zd ZdZd	dZd
dZddZddZddZdS )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                     || _         d S r   rm   ro   s     r   rp   zConsumingTransformer.__init__T  rq   r   r!   c                 z    | j         | j                             |            t          | ||           d| _        | S )Nrt   T)rn   r.   rx   fitted_ry   s        r   r   zConsumingTransformer.fitW  sL    =$M  &&&#	
 	
 	
 	
 r   c                 0    t          | ||           |dz   S r   r   r   s       r   	transformzConsumingTransformer.transforma  +    #	
 	
 	
 	
 1ur   c                     t          | ||           |                     ||||                              |||          S rs   )rx   r   r   ry   s        r   fit_transformz"ConsumingTransformer.fit_transformg  s]    
 	$	
 	
 	
 	
 xx1MHxMMWW]X X 
 
 	
r   c                 0    t          | ||           |dz
  S r   r   r   s       r   inverse_transformz&ConsumingTransformer.inverse_transforms  r   r   r   r   r   NN)	rg   rh   ri   r   rp   r   r   r   r   r   r   r   r   r   H  s        	 	! ! ! !      

 

 

 

     r   r   c                   *    e Zd ZdZddZddZddZdS )	"ConsumingNoFitTransformTransformerzA 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                     || _         d S r   rm   ro   s     r   rp   z+ConsumingNoFitTransformTransformer.__init__  rq   r   c                 l    | j         | j                             |            t          | ||           | S rs   )rn   r.   r4   ry   s        r   r   z&ConsumingNoFitTransformTransformer.fit  s:    =$M  &&&MHMMMMr   c                 *    t          | ||           |S rs   )r4   r   s       r   r   z,ConsumingNoFitTransformTransformer.transform  s    MHMMMMr   r   NNNr   )rg   rh   ri   r   rp   r   r   r   r   r   r   r   z  s\        Q Q! ! ! !        r   r   c                   *     e Zd Zd fd	Z fdZ xZS )ConsumingScorerNc                 j    t                                          t          di d           || _        d S )Nr   r   )
score_funcsignr1   response_method)superrp   r   rn   )r`   rn   	__class__s     r   rp   zConsumingScorer.__init__  s:    )"i 	 	
 	
 	
 !r   c                     | j         | j                             |            t          | fi | |                    dd           }t	                                          |||||          S )Nru   ru   )rn   r.   rx   r8   r   _score)r`   method_callerclfrz   r{   r1   ru   r   s          r   r   zConsumingScorer._score  sj    =$M  &&&#D33F333

?D99ww~~mS!Qm~TTTr   r   )rg   rh   ri   rp   r   __classcell__)r   s   @r   r   r     s_        ! ! ! ! ! !U U U U U U U U Ur   r   c                   .    e Zd ZddZddZd	dZd
dZdS )ConsumingSplitterNc                     || _         d S r   rm   ro   s     r   rp   zConsumingSplitter.__init__  rq   r   r!   c              #   :  K   | j         | j                             |            t          | ||           t          |          dz  }t	          t          d|                    }t	          t          |t          |                              }||fV  ||fV  d S )N)groupsrv   r   r   )rn   r.   rx   rY   r   range)r`   rz   r{   r   rv   split_indextrain_indicestest_indicess           r   splitzConsumingSplitter.split  s      =$M  &&&#D(KKKK!ffkU1k2233E+s1vv6677M))))\))))))r   c                     dS )Nr   r   )r`   rz   r{   r   rv   s        r   get_n_splitszConsumingSplitter.get_n_splits  s    qr   c              #      K   t          |          dz  }t          t          d|                    }t          t          |t          |                              }|V  |V  d S )Nr   r   )rY   r   r   )r`   rz   r{   r   r   r   r   s          r   _iter_test_indicesz$ConsumingSplitter._iter_test_indices  sg      !ffkU1k2233E+s1vv6677r   r   r   )NNNNr   )rg   rh   ri   rp   r   r   r   r   r   r   r   r     sd        ! ! ! !
* 
* 
* 
*        r   r   c                   $    e Zd ZdZd Zd Zd ZdS )MetaRegressorz(A meta-regressor which is only a router.c                     || _         d S r   )	estimator)r`   r   s     r   rp   zMetaRegressor.__init__  s    "r   c                     t          | dfi |} t          | j                  j        ||fi |j        j        | _        d S Nr   )r   r   r   r   
estimator_r`   rz   r{   
fit_paramsparamss        r   r   zMetaRegressor.fit  sK     u;;
;;3%//3AqQQF<L<PQQr   c                     t          | j        j                                      | j        t                                          dd                    }|S Nownerr   r3   r2   r   method_mapping)r   r   rg   addr   r   r`   rN   s     r   get_metadata_routingz"MetaRegressor.get_metadata_routing  sS    dn&=>>>BBn(??..eE.JJ C 
 
 r   Nrg   rh   ri   r   rp   r   r  r   r   r   r   r     sJ        22# # #R R R    r   r   c                   .    e Zd ZdZddZddZd Zd ZdS )WeightedMetaRegressorz*A meta-regressor which is also a consumer.Nc                 "    || _         || _        d S r   r   rn   r`   r   rn   s      r   rp   zWeightedMetaRegressor.__init__      " r   c                     | j         | j                             |            t          | |           t          | dfd|i|} t	          | j                  j        ||fi |j        j        | _        | S Nr   r   ru   rn   r.   r4   r   r   r   r   r   )r`   rz   r{   ru   r   r   s         r   r   zWeightedMetaRegressor.fit  s    =$M  &&&M:::: uXXMXZXX3%//3AqQQF<L<PQQr   c                 X    t          | dfi |} | j        j        |fi |j        j        S )Nr   )r   r   r   r   )r`   rz   predict_paramsr   s       r   r   zWeightedMetaRegressor.predict  s<     yCCNCC&t&qEEF,<,DEEEr   c                     t          | j        j                                      |                               | j        t                                          dd                              dd                    }|S )Nr   r   r   r   r   r   r   rg   add_self_requestr   r   r   r   s     r   r  z*WeightedMetaRegressor.get_metadata_routing  sq    !8999d##S.,E%00Ii88	    	 r   r   )rg   rh   ri   r   rp   r   r   r  r   r   r   r  r    sc        44! ! ! !   F F F    r   r  c                   (    e Zd ZdZddZddZd ZdS )WeightedMetaClassifierzEA meta-estimator which also consumes sample_weight itself in ``fit``.Nc                 "    || _         || _        d S r   r  r  s      r   rp   zWeightedMetaClassifier.__init__  r  r   c                     | j         | j                             |            t          | |           t          | dfd|i|} t	          | j                  j        ||fi |j        j        | _        | S r
  r  )r`   rz   r{   ru   r1   r   s         r   r   zWeightedMetaClassifier.fit  s    =$M  &&&M:::: uTTMTVTT3%//3AqQQF<L<PQQr   c                     t          | j        j                                      |                               | j        t                                          dd                    }|S r   r  r   s     r   r  z+WeightedMetaClassifier.get_metadata_routing  sb    !8999d##S.,22%2NN    	 r   r   r  r   r   r   r  r    sQ        OO! ! ! !   	 	 	 	 	r   r  c                   .    e Zd ZdZd ZddZddZd ZdS )MetaTransformerzA simple meta-transformer.c                     || _         d S r   )transformer)r`   r  s     r   rp   zMetaTransformer.__init__  s    &r   Nc                     t          | dfi |} t          | j                  j        ||fi |j        j        | _        | S r   )r   r   r  r   transformer_r   s        r   r   zMetaTransformer.fit  sN     u;;
;;7E$"23371WW@R@VWWr   c                 X    t          | dfi |} | j        j        |fi |j        j        S )Nr   )r   r  r   r  )r`   rz   r{   transform_paramsr   s        r   r   zMetaTransformer.transform  s>     {GG6FGG*t *1MM0B0LMMMr   c                     t          | j        j                                      | j        t                                          dd                              dd                    S )Nr   r   r   r   )r  r   )r   r   rg   r   r  r   re   s    r   r  z$MetaTransformer.get_metadata_routing  s_    DN$;<<<@@((??SeS,,SKS88	 A 
 
 	
r   r   )rg   rh   ri   r   rp   r   r   r  r   r   r   r  r    sd        $$' ' '   
N N N N
 
 
 
 
r   r  )Tr   )3r)   collectionsr   	functoolsr   numpyr;   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   r4   tuplerF   rx   rM   r\   r   r^   rk   r   r   r   r   r   r   r   r   r  r  r  r   r   r   <module>r+     s    # # # # # #           , , , , , ,                @ ? ? ? ? ? ? ? 6 6 6 6 6 6 > > > > > >              
 C B B B B B0 0 0 0, ?Degg (Q (Q (Q (QV &goeLLL    :: : :
 
 
 
 
 
 
 
+ + + + + + + +\ %  %  %  %  %_m  %  %  %F
 
 
 
 
NM 
 
 
Q Q Q Q Q/= Q Q Qh/ / / / /+] / / /d       *U U U U Ug U U U"    +-?   6    &   $    .   D    /-   8
 
 
 
 
(*:M 
 
 
 
 
r   