
    >[gI                     $   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
      Z2y).    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                 d   t        j                         }|d   j                  }|d   j                  }t        | d      st	        d       | _        |s8|j                         D ci c]  \  }}t        |t              r|dk7  r|| }}}| j
                  |   |   j                  |       yc c}}w )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     `/var/www/html/bid-api/venv/lib/python3.12/site-packages/sklearn/tests/metadata_routing_common.py<lambda>z!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_metadatar0      s     MMOE1XF1XF3
#"#<= #LLN
*Sc3'C9,< H* 	 

 LL ''/
s   %"B,c           	      ^   t        | dt                     j                  |t                     j                  |t                     }|D ]  }t	        |j                               t	        |j                               k(  s)J d|j                          d|j                                 |j                         D ]r  \  }}||   }	||v r)|	't        j                  |	|      j                         r6J t        |	t        j                        rt        |	|       _|	|u rdJ d|	 d| d|          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, 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_metadatarB   4   s$   ( 	Z(,,VTV<@@P   6;;=!SKKM&
 
 	:v{{}oT&++-9	: 
 !,,.JC#C[N l"~'Aww~u599;;;nbjj9&~u= '%/Q">"2$ugZxPQ/ ) r   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   r2   requestsr%   r'   )
metadata_requestrD   nameroute_mapping_excluder;   mmrpropaliaspropss
             r   rE   rE   b   s     "N3#3D-"tw"4=#M$8$8(K $4 	ObG W&/  #||113
3e%%): 3 	 

 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 r   )r%   r2   rG   r   len)request
dictionaryr;   rG   rL   empty_methodss         r   assert_request_equalrU      s    &,,.gv&||x''' / +9U.F*<TV.MUww/88999   Vs   	A7A7c                       e Zd Zd Zd Zy)	_Registryc                     | S r   r   )selfmemos     r   __deepcopy__z_Registry.__deepcopy__       r   c                     | S r   r   rY   s    r   __copy__z_Registry.__copy__   r\   r   N)__name__
__module____qualname__r[   r_   r   r   r   rW   rW      s    r   rW   c                   8    e Zd ZdZd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rY   rg   s     r   __init__zConsumingRegressor.__init__   	     r   c                 p    | j                   | j                   j                  |        t        | ||       | S Nsample_weightmetadatarg   r(   record_metadata_not_defaultrY   Xyrn   ro   s        r   partial_fitzConsumingRegressor.partial_fit   4    ==$MM  &#	
 r   c                 p    | j                   | j                   j                  |        t        | ||       | S rl   rp   rr   s        r   fitzConsumingRegressor.fit   rv   r   c                 ^    t        | ||       t        j                  t        |      f      S )Nrm   shaperq   r7   zerosrQ   rr   s        r   predictzConsumingRegressor.predict   s(    #	
 xxs1vi((r   c                      t        | ||       yNrm   r   rq   rr   s        r   scorezConsumingRegressor.score       #	
 r   r   r    r    Nr    r    )	r`   ra   rb   __doc__ri   ru   rx   r~   r   r   r   r   rd   rd      s     	!)r   rd   c                   >    e Zd ZdZd
dZd ZddZd Zd Zd Z	d	 Z
y)NonConsumingClassifier5A classifier which accepts no metadata on any method.c                     || _         y r   )alpha)rY   r   s     r   ri   zNonConsumingClassifier.__init__   s	    
r   c                 n    t        j                  |      | _        t        j                  |      | _        | S r   )r7   uniqueclasses_	ones_likecoef_rY   rs   rt   s      r   rx   zNonConsumingClassifier.fit   s%    		!\\!_
r   Nc                     | S r   r   )rY   rs   rt   classess       r   ru   z"NonConsumingClassifier.partial_fit   r\   r   c                 $    | j                  |      S r   )r~   rY   rs   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 )Nrz   r   r   r   )r7   emptyrQ   )rY   rs   y_preds      r   r~   zNonConsumingClassifier.predict   sC    Q	* !}Q1 !s1v{}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   rz         ?        )r7   r   rQ   asarray)rY   rs   y_probas      r   predict_probaz$NonConsumingClassifier.predict_proba   sk    ((#a&!-$&JJSz$:#a&A+q !$&JJSz$:A!q !r   c                 $    | j                  |      S r   )r   r   s     r   predict_log_probaz(NonConsumingClassifier.predict_log_proba   s    !!!$$r   )r   r   )r`   ra   rb   r   ri   rx   ru   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y)NonConsumingRegressorr   c                     | S r   r   r   s      r   rx   zNonConsumingRegressor.fit   r\   r   c                     | S r   r   r   s      r   ru   z!NonConsumingRegressor.partial_fit   r\   r   c                 >    t        j                  t        |            S r   )r7   onesrQ   r   s     r   r~   zNonConsumingRegressor.predict   s    wws1vr   N)r`   ra   rb   r   rx   ru   r~   r   r   r   r   r      s    ?r   r   c                   R    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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   )r   rg   )rY   rg   r   s      r   ri   zConsumingClassifier.__init__  s    
 r   c                     | j                   | j                   j                  |        t        | ||       t        | |       | S rl   )rg   r(   rq   r   )rY   rs   rt   r   rn   ro   s         r   ru   zConsumingClassifier.partial_fit  s@     ==$MM  &#	
 	&dG4r   c                     | j                   | j                   j                  |        t        | ||       t        j                  |      | _        t        j                  |      | _        | S rl   )rg   r(   rq   r7   r   r   r   r   rr   s        r   rx   zConsumingClassifier.fit  sR    ==$MM  &#	
 		!\\!_
r   c                     t        | ||       t        j                  t        |      fd      }d|t        |      dz  d  d|d t        |      dz   |S )Nrm   int8)r{   dtyper   r   r   rq   r7   r   rQ   rY   rs   rn   ro   y_scores        r   r~   zConsumingClassifier.predict   sV    #	
 ((#a&&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 )Nrm   r   rz   r   r   )rq   r7   r   rQ   r   )rY   rs   rn   ro   r   s        r   r   z!ConsumingClassifier.predict_proba)  s|    #	
 ((#a&!-$&JJSz$:#a&A+q !$&JJSz$:A!q !r   c                 `    t        | ||       t        j                  t        |      df      S )Nrm   r   rz   r|   rY   rs   rn   ro   s       r   r   z%ConsumingClassifier.predict_log_proba2  s*    #	
 xxs1vqk**r   c                     t        | ||       t        j                  t        |      f      }d|t        |      dz  d  d|d t        |      dz   |S )Nrm   rz   r   r   r   r   r   s        r   r   z%ConsumingClassifier.decision_function8  sT    #	
 ((#a&+!"A!!"#a&A+r   c                      t        | ||       yr   r   rr   s        r   r   zConsumingClassifier.scoreA  r   r   )Nr   r   r   )r`   ra   rb   r   ri   ru   rx   r~   r   r   r   r   r   r   r   r   r      s6    !
 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   rf   rh   s     r   ri   zConsumingTransformer.__init__T  rj   r   c                 ~    | j                   | j                   j                  |        t        | ||       d| _        | S )Nrm   T)rg   r(   rq   fitted_rr   s        r   rx   zConsumingTransformer.fitW  s;    ==$MM  &#	
 r   c                 (    t        | ||       |dz   S r   r   r   s       r   	transformzConsumingTransformer.transforma      #	
 1ur   c                 l    t        | ||       | j                  ||||      j                  |||      S rl   )rq   rx   r   rr   s        r   fit_transformz"ConsumingTransformer.fit_transformg  sF    
 	$	
 xx1MHxMWW]X X 
 	
r   c                 (    t        | ||       |dz
  S r   r   r   s       r   inverse_transformz&ConsumingTransformer.inverse_transforms  r   r   r   r   r   NN)	r`   ra   rb   r   ri   rx   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y)	"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                     || _         y r   rf   rh   s     r   ri   z+ConsumingNoFitTransformTransformer.__init__  rj   r   c                 p    | j                   | j                   j                  |        t        | ||       | S rl   )rg   r(   r0   rr   s        r   rx   z&ConsumingNoFitTransformTransformer.fit  s/    ==$MM  &MHMr   c                 "    t        | ||       |S rl   )r0   r   s       r   r   z,ConsumingNoFitTransformTransformer.transform  s    MHMr   r   NNNr   )r`   ra   rb   r   ri   rx   r   r   r   r   r   r   z  s    Q!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 )Nr   r~   )
score_funcsignr+   response_method)superri   r   rg   )rY   rg   	__class__s     r   ri   zConsumingScorer.__init__  s'    )"i 	 	
 !r   c                     | j                   | j                   j                  |        t        | fi | |j                  dd       }t        |   |||||      S )Nrn   rn   )rg   r(   rq   r4   r   _score)rY   method_callerclfrs   rt   r+   rn   r   s          r   r   zConsumingScorer._score  sU    ==$MM  &#D3F3

?D9w~mS!Qm~TTr   r   )r`   ra   rb   ri   r   __classcell__)r   s   @r   r   r     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   rf   rh   s     r   ri   zConsumingSplitter.__init__  rj   r   c              #     K   | j                   | j                   j                  |        t        | ||       t        |      dz  }t	        t        d|            }t	        t        |t        |                  }||f ||f y w)N)groupsro   r   r   )rg   r(   rq   rQ   r   range)rY   rs   rt   r   ro   split_indextrain_indicestest_indicess           r   splitzConsumingSplitter.split  sw     ==$MM  &#D(K!fkU1k23E+s1v67M))\))s   BBc                      y)Nr   r   )rY   rs   rt   r   ro   s        r   get_n_splitszConsumingSplitter.get_n_splits  s    r   c              #      K   t        |      dz  }t        t        d|            }t        t        |t        |                  }| | y w)Nr   r   )rQ   r   r   )rY   rs   rt   r   r   r   r   s          r   _iter_test_indicesz$ConsumingSplitter._iter_test_indices  sE     !fkU1k23E+s1v67s   AAr   r   )NNNNr   )r`   ra   rb   ri   r   r   r   r   r   r   r   r     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)rY   r   s     r   ri   zMetaRegressor.__init__  s	    "r   c                     t        | dfi |} t        | j                        j                  ||fi |j                  j                  | _        y Nrx   )r   r   r   rx   
estimator_rY   rs   rt   
fit_paramsparamss        r   rx   zMetaRegressor.fit  sC     u;
;3%/33AqQF<L<L<P<PQr   c                     t        | j                  j                        j                  | j                  t               j                  dd            }|S Nownerrx   r-   r,   r   method_mapping)r   r   r`   addr   r   rY   rF   s     r   get_metadata_routingz"MetaRegressor.get_metadata_routing  sJ    dnn&=&=>BBnn(?..eE.J C 
 r   Nr`   ra   rb   r   ri   rx   r   r   r   r   r   r     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   rg   rY   r   rg   s      r   ri   zWeightedMetaRegressor.__init__      " r   c                    | j                   | j                   j                  |        t        | |       t        | dfd|i|} t	        | j
                        j                  ||fi |j
                  j                  | _        | S Nr   rx   rn   rg   r(   r0   r   r   r   rx   r   )rY   rs   rt   rn   r   r   s         r   rx   zWeightedMetaRegressor.fit  ss    ==$MM  &M: 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 )Nr~   )r   r   r~   r   )rY   rs   predict_paramsr   s       r   r~   zWeightedMetaRegressor.predict  s;     yCNC&t&&qEF,<,<,D,DEEr   c                     t        | j                  j                        j                  |       j	                  | j
                  t               j	                  dd      j	                  dd            }|S )Nr   rx   r   r~   r   r   r   r`   add_self_requestr   r   r   r   s     r   r   z*WeightedMetaRegressor.get_metadata_routing  sb    !8!89d#S..,E%0Ii8	   	 r   r   )r`   ra   rb   r   ri   rx   r~   r   r   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   ri   zWeightedMetaClassifier.__init__  r  r   c                    | j                   | j                   j                  |        t        | |       t        | dfd|i|} t	        | j
                        j                  ||fi |j
                  j                  | _        | S r  r  )rY   rs   rt   rn   r+   r   s         r   rx   zWeightedMetaClassifier.fit  ss    ==$MM  &M: uTMTVT3%/33AqQF<L<L<P<PQr   c                     t        | j                  j                        j                  |       j	                  | j
                  t               j	                  dd            }|S r   r  r   s     r   r   z+WeightedMetaClassifier.get_metadata_routing  sV    !8!89d#S..,22%2N   	 r   r   r   r   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)rY   r  s     r   ri   zMetaTransformer.__init__  s
    &r   Nc                     t        | dfi |} t        | j                        j                  ||fi |j                  j                  | _        | S r   )r   r   r  rx   transformer_r   s        r   rx   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  )rY   rs   rt   transform_paramsr   s        r   r   zMetaTransformer.transform  s>     {G6FG*t  **1M0B0B0L0LMMr   c                     t        | j                  j                        j                  | j                  t               j                  dd      j                  dd            S )Nr   rx   r   r   )r  r   )r   r   r`   r   r  r   r^   s    r   r   z$MetaTransformer.get_metadata_routing  sT    DNN$;$;<@@(((?SeS,SKS8	 A 
 	
r   r   )r`   ra   rb   r   ri   rx   r   r   r   r   r   r  r    s    $'
N
r   r  )Tr   )3r!   collectionsr   	functoolsr   numpyr7   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   r0   tuplerB   rq   rE   rU   r   rW   rd   r   r   r   r   r   r   r   r   r   r  r  r   r   r   <module>r$     s5    #   ,  @ 6 > 
 C0, ?Dg (QV &oeL ::
 
+ +\ %_m  %F
NM 
Q/= Qh/+] /d *Ug U"+-? 6& $. D/- 8
(*:M 
r   