
    UgE                     l   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          Z- G d( d)e	ee          Z. G d* d+e	ee          Z/dS ).    )partialN)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                     t          | d          si | _        |sd |                                D             }|| j        |<   dS )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.

    _recordsc                 P    i | ]#\  }}t          |t                    r|d k     ||$S )default
isinstancestr).0keyvals      d/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/sklearn/tests/metadata_routing_common.py
<dictcomp>z#record_metadata.<locals>.<dictcomp>'   sG     
 
 
Sc3''
 -09,<,< ,<,<,<    N)hasattrr   items)objmethodrecord_defaultkwargss       r   record_metadatar'      s_     3
##  

 
"LLNN
 
 

 "CLr    c                    t          | dt                                                    |t                                }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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
    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 N)getattrdictgetsetkeysr"   npisinallr   ndarrayr   )r#   r$   split_paramsr&   recordsr   valuerecorded_values           r   check_recorded_metadatar6   /   s[    c:tvv..226466BBGv{{}}" "   66;;==66gllnn66   llnn 
X 
X
U  ,>#=7>51155777777."*55 X">59999%...0WN0W0WPU0W0W....
X 
Xr    F)r%   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 Nr   )r   propaliass      r   
<listcomp>z+assert_request_is_empty.<locals>.<listcomp>g   s@     
 
 
e%%%
 */): ):):):r    )r   r   assert_request_is_emptyrouterr   r)   requestsr"   )metadata_requestr8   nameroute_mapping_excluder$   mmrpropss           r   r>   r>   R   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  rI   )r   r$   
dictionarys     r   r=   z(assert_request_equal.<locals>.<listcomp>t   s#    UUUF*<T<TV<T<T<Tr    )r"   r)   r@   r   len)requestrJ   r$   r@   rE   empty_methodss    `    r   assert_request_equalrN   o   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:   rI   )selfmemos     r   __deepcopy__z_Registry.__deepcopy__       r    c                     | S r:   rI   rR   s    r   __copy__z_Registry.__copy__   rU   r    N)__name__
__module____qualname__rT   rX   rI   r    r   rP   rP   y   s2              r    rP   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rR   r`   s     r   __init__zConsumingRegressor.__init__        r    r   c                 n    | j         | j                             |            t          | d||           | S Npartial_fitsample_weightmetadatar`   appendrecord_metadata_not_defaultrR   Xyrh   ri   s        r   rf   zConsumingRegressor.partial_fit   sG    =$M  &&&#-}x	
 	
 	
 	
 r    c                 n    | j         | j                             |            t          | d||           | S Nfitrg   rj   rm   s        r   rr   zConsumingRegressor.fit   G    =$M  &&&#%}x	
 	
 	
 	
 r    c                 n    t          | d||           t          j        t          |          f          S )Npredictrg   shape)rl   r.   zerosrK   rm   s        r   ru   zConsumingRegressor.predict   s?    #)=8	
 	
 	
 	
 xs1vvi((((r    c                 ,    t          | d||           dS )Nscorerg      )rl   rm   s        r   rz   zConsumingRegressor.score   s)    #'	
 	
 	
 	
 qr    r:   r   r   Nr   r   )	rY   rZ   r[   __doc__rb   rf   rr   ru   rz   rI   r    r   r]   r]      s        	 	! ! ! !      ) ) ) )     r    r]   c                   4    e Zd ZdZd	dZd Zd
dZd Zd ZdS )NonConsumingClassifier5A classifier which accepts no metadata on any method.        c                     || _         d S r:   )alpha)rR   r   s     r   rb   zNonConsumingClassifier.__init__   s    


r    c                 8    t          j        |          | _        | S r:   )r.   uniqueclasses_rR   rn   ro   s      r   rr   zNonConsumingClassifier.fit   s    	!r    Nc                     | S r:   rI   )rR   rn   ro   classess       r   rf   z"NonConsumingClassifier.partial_fit   rU   r    c                 ,    |                      |          S r:   )ru   rR   rn   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 )Nrv   r      r{   )r.   emptyrK   )rR   rn   y_preds      r   ru   zNonConsumingClassifier.predict   sQ    Q	*** !}Q1} !s1vv{}}r    )r   r:   )	rY   rZ   r[   r~   rb   rr   rf   r   ru   rI   r    r   r   r      so        ??              r    r   c                   $    e Zd ZdZd Zd Zd ZdS )NonConsumingRegressorr   c                     | S r:   rI   r   s      r   rr   zNonConsumingRegressor.fit   rU   r    c                     | S r:   rI   r   s      r   rf   z!NonConsumingRegressor.partial_fit   rU   r    c                 D    t          j        t          |                    S r:   )r.   onesrK   r   s     r   ru   zNonConsumingRegressor.predict   s    ws1vvr    N)rY   rZ   r[   r~   rr   rf   ru   rI   r    r   r   r      sG        ??        r    r   c                   L    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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   r`   )rR   r`   r   s      r   rb   zConsumingClassifier.__init__   s    
 r    r   c                     | j         | j                             |            t          | d||           t          | |           | S re   )r`   rk   rl   r   )rR   rn   ro   r   rh   ri   s         r   rf   zConsumingClassifier.partial_fit   sY     =$M  &&&#-}x	
 	
 	
 	
 	&dG444r    c                     | j         | j                             |            t          | d||           t          j        |          | _        | S rq   )r`   rk   rl   r.   r   r   rm   s        r   rr   zConsumingClassifier.fit   sV    =$M  &&&#%}x	
 	
 	
 	
 	!r    c                     t          | d||           t          j        t          |          fd          }d|t          |          dz  d <   d|d t          |          dz  <   |S )Nru   rg   int8)rw   dtyper   r   r{   rl   r.   r   rK   rR   rn   rh   ri   y_scores        r   ru   zConsumingClassifier.predict  su    #)=8	
 	
 	
 	
 (#a&&&999!"A!!"#a&&A+r    c                 0   t          | d||           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 )Npredict_probarg   r   rv   g      ?r   )rl   r.   r   rK   asarray)rR   rn   rh   ri   y_probas        r   r   z!ConsumingClassifier.predict_proba  s    #/	
 	
 	
 	
 (#a&&!---$&JSz$:$:#a&&A+qqq !$&JSz$:$:A!qqq !r    c                     d S r:   rI   rR   rn   rh   ri   s       r   predict_log_probaz%ConsumingClassifier.predict_log_proba  s    r    c                     t          | d||           t          j        t          |          f          }d|t          |          dz  d <   d|d t          |          dz  <   |S )Nr   rg   rv   r   r   r{   r   r   s        r   r   z%ConsumingClassifier.decision_function  ss    #/	
 	
 	
 	
 (#a&&+++!"A!!"#a&&A+r    )Nr   r}   r|   )rY   rZ   r[   r~   rb   rf   rr   ru   r   r   r   rI   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:   r_   ra   s     r   rb   zConsumingTransformer.__init__;  rc   r    c                 n    | j         | j                             |            t          | d||           | S rq   rj   rm   s        r   rr   zConsumingTransformer.fit>  rs   r    c                 ,    t          | d||           |S N	transformrg   r'   r   s       r   r   zConsumingTransformer.transformG  )    +]X	
 	
 	
 	
 r    c                     t          | d||           |                     ||||                              |||          S )Nfit_transformrg   )r'   rr   r   rm   s        r   r   z"ConsumingTransformer.fit_transformM  s_    
 	/	
 	
 	
 	
 xx1MHxMMWW]X X 
 
 	
r    c                 ,    t          | d||           |S )Ninverse_transformrg   r   r   s       r   r   z&ConsumingTransformer.inverse_transformY  s*    %]X	
 	
 	
 	
 r    r:   NNNNN)	rY   rZ   r[   r~   rb   rr   r   r   r   rI   r    r   r   r   /  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:   r_   ra   s     r   rb   z+ConsumingNoFitTransformTransformer.__init__e  rc   r    c                 n    | j         | j                             |            t          | d||           | S rq   )r`   rk   r'   rm   s        r   rr   z&ConsumingNoFitTransformTransformer.fith  s<    =$M  &&&e=8TTTTr    c                 ,    t          | d||           |S r   r   r   s       r   r   z,ConsumingNoFitTransformTransformer.transformp  r   r    r:   r   r   )rY   rZ   r[   r~   rb   rr   r   rI   r    r   r   r   `  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{   ru   )
score_funcsignr&   response_method)superrb   r   r`   )rR   r`   	__class__s     r   rb   zConsumingScorer.__init__x  s:    )"i 	 	
 	
 	
 !r    c                     | j         | j                             |            t          | dfi | |                    dd           }t	                                          |||||          S )Nrz   rh   rh   )r`   rk   rl   r+   r   _score)rR   method_callerclfrn   ro   r&   rh   r   s          r   r   zConsumingScorer._score~  sl    =$M  &&&#D'<<V<<<

?D99ww~~mS!Qm~TTTr    r:   )rY   rZ   r[   rb   r   __classcell__)r   s   @r   r   r   w  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:   r_   ra   s     r   rb   zConsumingSplitter.__init__  rc   r    r   c              #   <  K   | j         | j                             |            t          | d||           t          |          dz  }t	          t          d|                    }t	          t          |t          |                              }||fV  ||fV  d S )Nsplit)groupsri   r   r   )r`   rk   rl   rK   listrange)rR   rn   ro   r   ri   split_indextrain_indicestest_indicess           r   r   zConsumingSplitter.split  s      =$M  &&&#D'&8TTTT!ffkU1k2233E+s1vv6677M))))\))))))r    c                     dS )Nr   rI   )rR   rn   ro   r   ri   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   )rK   r   r   )rR   rn   ro   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   )rY   rZ   r[   rb   r   r   r   rI   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)rR   r   s     r   rb   zMetaRegressor.__init__  s    "r    c                     t          | dfi |} t          | j                  j        ||fi |j        j        | _        d S Nrr   )r   r
   r   rr   
estimator_rR   rn   ro   
fit_paramsparamss        r   rr   zMetaRegressor.fit  sK     u;;
;;3%//3AqQQF<L<PQQr    c                     t          | j        j                                      | j        t                                          dd                    }|S Nownerrr   callercalleer   method_mapping)r   r   rY   addr   r   rR   r?   s     r   get_metadata_routingz"MetaRegressor.get_metadata_routing  sS    dn&=>>>BBn(??..eE.JJ C 
 
 r    NrY   rZ   r[   r~   rb   rr   r   rI   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   r`   rR   r   r`   s      r   rb   zWeightedMetaRegressor.__init__      " r    c                     | j         | j                             |            t          | d|           t          | dfd|i|} t	          | j                  j        ||fi |j        j        | _        | S Nrr   r   rh   r`   rk   r'   r   r
   r   rr   r   )rR   rn   ro   rh   r   r   s         r   rr   zWeightedMetaRegressor.fit  s    =$M  &&&e=AAAA 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 )Nru   )r   r   ru   r   )rR   rn   predict_paramsr   s       r   ru   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   rr   r   ru   r   r   r   rY   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:   )rY   rZ   r[   r~   rb   rr   ru   r   rI   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   rb   zWeightedMetaClassifier.__init__  r   r    c                     | j         | j                             |            t          | d|           t          | dfd|i|} t	          | j                  j        ||fi |j        j        | _        | S r   r   )rR   rn   ro   rh   r&   r   s         r   rr   zWeightedMetaClassifier.fit  s    =$M  &&&e=AAAA 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   rI   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)rR   r	  s     r   rb   zMetaTransformer.__init__  s    &r    Nc                     t          | dfi |} t          | j                  j        ||fi |j        j        | _        | S r   )r   r
   r	  rr   transformer_r   s        r   rr   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	  )rR   rn   ro   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   rr   r   r   )r	  r   )r   r   rY   r   r	  r   rW   s    r   r   z$MetaTransformer.get_metadata_routing  s_    DN$;<<<@@((??SeS,,SKS88	 A 
 
 	
r    r:   )rY   rZ   r[   r~   rb   rr   r   r   rI   r    r   r  r    sd        $$' ' '   
N N N N
 
 
 
 
r    r  )Tr:   )0	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   r'   tupler6   rl   r>   rN   r   rP   r]   r   r   r   r   r   r   r   r   r   r  r  rI   r    r   <module>r     s             , , , , , ,                @ ? ? ? ? ? ? ? 6 6 6 6 6 6 > > > > > >              
 C B B B B B" " " "& 7<egg X X X X@ &goeLLL    :: : :
 
 
 
 
 
 
 
+ + + + + + + +\    _m   .
 
 
 
 
NM 
 
 
M M M M M/= M M Mn. . . . .+] . . .b       .U U U U Ug U U U"    +-?   6    &   $    .   D    /-   8
 
 
 
 
(*:M 
 
 
 
 
r    