o
    iN                     @   s  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 d7ddZe  fddZ!eeddZ"d8ddZ#dd Z$G dd de%Z&G dd dee
Z'G dd dee
Z(G dd dee
Z)G dd  d ee
Z*G d!d" d"e*Z+G d#d$ d$e*Z,G d%d& d&e*Z-G d'd( d(ee
Z.G d)d* d*e
Z/G d+d, d,eZ0G d-d. d.eeZ1G d/d0 d0eee
Z2G d1d2 d2eee
Z3G d3d4 d4eee
Z4G d5d6 d6eee
Z5dS )9    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                 K   sb   t  }|d j}|d j}t| dstdd | _|s%d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                   S   s   t tS N)r   list r   r   t/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/sklearn/tests/metadata_routing_common.py<lambda>*   s    z!record_metadata.<locals>.<lambda>c                 S   s(   i | ]\}}t |tr|d kr||qS )default
isinstancestr).0keyvalr   r   r   
<dictcomp>,   s    z#record_metadata.<locals>.<dictcomp>N)inspectstackfunctionhasattrr   r   itemsappend)objrecord_defaultkwargsr%   calleecallerr   r   r   record_metadata   s   


r/   c           
   	   K   s   t | dt |t |t }|D ]Y}t| t| ks/J d|  d|  | D ]8\}}|| }	||v rN|	durNt|	|	 sMJ q3t
|	tjrZt|	| q3|	|u skJ d|	 d| d| q3q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   Zndarrayr   )
r*   methodparentZsplit_paramsr,   Zall_recordsrecordr!   valueZrecorded_valuer   r   r   check_recorded_metadata4   s"    
r<   F)r+   c                 C   s   t | tr$| D ]\}}|dur||v r|| }nd}t|j|d qdS |du r*g n|}tD ]}||v r5q.t| |}dd |j D }|rHJ q.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                 S   s&   g | ]\}}t |ts|d ur|qS r   r   )r    propaliasr   r   r   
<listcomp>w   s    z+assert_request_is_empty.<locals>.<listcomp>)r   r   assert_request_is_emptyrouterr   r0   requestsr(   )Zmetadata_requestr=   nameZroute_mappingZ_excluder8   mmrpropsr   r   r   rA   b   s"   



rA   c                    s^      D ]\}}t| |}|j|ksJ q fddtD }|D ]}tt| |jr,J q d S )Nc                    s   g | ]}| vr|qS r   r   )r    r8   
dictionaryr   r   r@      s    z(assert_request_equal.<locals>.<listcomp>)r(   r0   rC   r   len)requestrH   r8   rC   rE   Zempty_methodsr   rG   r   assert_request_equal   s   
rK   c                   @   s   e Zd Zdd Zdd ZdS )	_Registryc                 C      | S r   r   )selfmemor   r   r   __deepcopy__      z_Registry.__deepcopy__c                 C   rM   r   r   rN   r   r   r   __copy__   rQ   z_Registry.__copy__N)__name__
__module____qualname__rP   rS   r   r   r   r   rL      s    rL   c                   @   sB   e Zd ZdZdddZdddZddd	Zdd
dZd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                 C   
   || _ d S r   registryrN   rZ   r   r   r   __init__      
zConsumingRegressor.__init__r   c                 C   (   | j d ur| j |  t| ||d | S Nsample_weightmetadatarZ   r)   record_metadata_not_defaultrN   Xyra   rb   r   r   r   partial_fit      
zConsumingRegressor.partial_fitc                 C   r^   r_   rc   re   r   r   r   fit   ri   zConsumingRegressor.fitc                 C   s    t | ||d tjt|fdS )Nr`   shape)rd   r5   ZzerosrI   re   r   r   r   predict   s   zConsumingRegressor.predictc                 C      t | ||d dS Nr`   r   rd   re   r   r   r   score      zConsumingRegressor.scorer   r   r   Nr   r   )	rT   rU   rV   __doc__r\   rh   rj   rm   rq   r   r   r   r   rW      s    


	
	rW   c                   @   sL   e Zd ZdZdddZdd Zddd	Zd
d Zdd Zdd Z	dd Z
dS )NonConsumingClassifier5A classifier which accepts no metadata on any method.        c                 C   rX   r   )alpha)rN   ry   r   r   r   r\      r]   zNonConsumingClassifier.__init__c                 C   s   t || _t || _| S r   )r5   uniqueclasses_	ones_likecoef_rN   rf   rg   r   r   r   rj      s   zNonConsumingClassifier.fitNc                 C   rM   r   r   )rN   rf   rg   classesr   r   r   rh      rQ   z"NonConsumingClassifier.partial_fitc                 C   
   |  |S r   )rm   rN   rf   r   r   r   decision_function   r]   z(NonConsumingClassifier.decision_functionc                 C   s>   t jt|fd}d|d t|d < d|t|d d < |S )Nrk   r   r   r   )r5   emptyrI   )rN   rf   Zy_predr   r   r   rm      s   zNonConsumingClassifier.predictc                 C   sJ   t jt|t| jft jd}t jjt t| jt|d|d d < |S )Nrl   Zdtypery   size)r5   r   rI   r{   float32random	dirichletones)rN   rf   y_probar   r   r   predict_proba   s   (z$NonConsumingClassifier.predict_probac                 C   r   r   )r   r   r   r   r   predict_log_proba   s   
z(NonConsumingClassifier.predict_log_proba)rx   r   )rT   rU   rV   ru   r\   rj   rh   r   rm   r   r   r   r   r   r   rv      s    

rv   c                   @   (   e Zd ZdZdd Zdd Zdd ZdS )	NonConsumingRegressorrw   c                 C   rM   r   r   r~   r   r   r   rj      rQ   zNonConsumingRegressor.fitc                 C   rM   r   r   r~   r   r   r   rh      rQ   z!NonConsumingRegressor.partial_fitc                 C   s   t t|S r   )r5   r   rI   r   r   r   r   rm      s   zNonConsumingRegressor.predictN)rT   rU   rV   ru   rj   rh   rm   r   r   r   r   r      s
    r   c                   @   sb   e Zd ZdZdddZ	dddZdd	d
ZdddZdddZdddZ	dddZ
d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.
    Nrx   c                 C   s   || _ || _d S r   )ry   rZ   )rN   rZ   ry   r   r   r   r\        
zConsumingClassifier.__init__r   c                 C   s2   | j d ur| j |  t| ||d t| | | S r_   )rZ   r)   rd   r   )rN   rf   rg   r   ra   rb   r   r   r   rh     s   

zConsumingClassifier.partial_fitc                 C   s@   | j d ur| j |  t| ||d t|| _t|| _| S r_   )rZ   r)   rd   r5   rz   r{   r|   r}   re   r   r   r   rj     s   
zConsumingClassifier.fitc                 C   sN   t | ||d tjt|fdd}d|t|d d < d|d t|d < |S )Nr`   Zint8r   r   r   r   rd   r5   r   rI   rN   rf   ra   rb   Zy_scorer   r   r   rm      s   zConsumingClassifier.predictc                 C   sX   t | ||d tjt|t| jftjd}tjjtt| jt|d|d d < |S )Nr`   r   r   )	rd   r5   r   rI   r{   r   r   r   r   )rN   rf   ra   rb   r   r   r   r   r   )  s   (z!ConsumingClassifier.predict_probac                 C   s   t | ||d | |S r_   )rd   r   rN   rf   ra   rb   r   r   r   r   2  s   
z%ConsumingClassifier.predict_log_probac                 C   sL   t | ||d tjt|fd}d|t|d d < d|d t|d < |S )Nr`   rk   r   r   r   r   r   r   r   r   r   8  s   z%ConsumingClassifier.decision_functionc                 C   rn   ro   rp   re   r   r   r   rq   A  rr   zConsumingClassifier.score)Nrx   rt   rs   )rT   rU   rV   ru   r\   rh   rj   rm   r   r   r   rq   r   r   r   r   r      s    




	
	
	r   c                   @      e Zd ZdZedd ZdS )&ConsumingClassifierWithoutPredictProbazConsumingClassifier without a predict_proba method, but with predict_log_proba.

    Used to mimic dynamic method selection such as in the `_parallel_predict_proba()`
    function called by `BaggingClassifier`.
    c                 C      t dNz-This estimator does not support predict_probaAttributeErrorrR   r   r   r   r   O     z4ConsumingClassifierWithoutPredictProba.predict_probaN)rT   rU   rV   ru   propertyr   r   r   r   r   r   H      r   c                   @   r   ))ConsumingClassifierWithoutPredictLogProbazConsumingClassifier without a predict_log_proba method, but with predict_proba.

    Used to mimic dynamic method selection such as in
    `BaggingClassifier.predict_log_proba()`.
    c                 C   r   Nz1This estimator does not support predict_log_probar   rR   r   r   r   r   [  r   z;ConsumingClassifierWithoutPredictLogProba.predict_log_probaN)rT   rU   rV   ru   r   r   r   r   r   r   r   T  r   r   c                   @   s(   e Zd ZdZedd Zedd ZdS )"ConsumingClassifierWithOnlyPredictzConsumingClassifier with only a predict method.

    Used to mimic dynamic method selection such as in
    `BaggingClassifier.predict_log_proba()`.
    c                 C   r   r   r   rR   r   r   r   r   g  r   z0ConsumingClassifierWithOnlyPredict.predict_probac                 C   r   r   r   rR   r   r   r   r   k  r   z4ConsumingClassifierWithOnlyPredict.predict_log_probaN)rT   rU   rV   ru   r   r   r   r   r   r   r   r   `  s    
r   c                   @   sB   e Zd ZdZdddZdddZddd	Zdd
dZd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                 C   rX   r   rY   r[   r   r   r   r\   |  r]   zConsumingTransformer.__init__r   c                 C   s.   | j d ur| j |  t| ||d d| _| S )Nr`   T)rZ   r)   rd   Zfitted_re   r   r   r   rj     s   
zConsumingTransformer.fitc                 C   s   t | ||d |d S ro   rp   r   r   r   r   	transform     zConsumingTransformer.transformc                 C   s,   t | ||d | j||||dj|||dS r_   )rd   rj   r   re   r   r   r   fit_transform  s   z"ConsumingTransformer.fit_transformc                 C   s   t | ||d |d S ro   rp   r   r   r   r   inverse_transform  r   z&ConsumingTransformer.inverse_transformr   rt   rs   NN)	rT   rU   rV   ru   r\   rj   r   r   r   r   r   r   r   r   p  s    




r   c                   @   s.   e Zd ZdZd	ddZd
ddZd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                 C   rX   r   rY   r[   r   r   r   r\     r]   z+ConsumingNoFitTransformTransformer.__init__c                 C   r^   r_   )rZ   r)   r/   re   r   r   r   rj     s   
z&ConsumingNoFitTransformTransformer.fitc                 C   s   t | ||d |S r_   )r/   r   r   r   r   r     s   z,ConsumingNoFitTransformTransformer.transformr   NNNr   )rT   rU   rV   ru   r\   rj   r   r   r   r   r   r     s
    

r   c                       s*   e Zd Zd fdd	Z fddZ  ZS )ConsumingScorerNc                    s   t  jtdi dd || _d S )Nr   rm   )Z
score_funcsignr,   Zresponse_method)superr\   r   rZ   r[   	__class__r   r   r\     s   
zConsumingScorer.__init__c                    sH   | j d ur| j |  t| fi | |dd }t j|||||dS )Nra   ra   )rZ   r)   rd   r2   r   _score)rN   Zmethod_callerZclfrf   rg   r,   ra   r   r   r   r     s
   
zConsumingScorer._scorer   )rT   rU   rV   r\   r   __classcell__r   r   r   r   r     s    r   c                   @   s4   e Zd ZdddZdddZdddZdd	d
ZdS )ConsumingSplitterNc                 C   rX   r   rY   r[   r   r   r   r\     r]   zConsumingSplitter.__init__r   c                 c   sj    | j d ur| j |  t| ||d t|d }ttd|}tt|t|}||fV  ||fV  d S )N)groupsrb   r   r   )rZ   r)   rd   rI   r   range)rN   rf   rg   r   rb   split_indextrain_indicestest_indicesr   r   r   split  s   

zConsumingSplitter.splitc                 C   s   dS )Nr   r   )rN   rf   rg   r   rb   r   r   r   get_n_splits  rQ   zConsumingSplitter.get_n_splitsc                 c   s>    t |d }ttd|}tt|t |}|V  |V  d S )Nr   r   )rI   r   r   )rN   rf   rg   r   r   r   r   r   r   r   _iter_test_indices  s   
z$ConsumingSplitter._iter_test_indicesr   rt   )NNNNr   )rT   rU   rV   r\   r   r   r   r   r   r   r   r     s
    


r   c                   @   r   )	MetaRegressorz(A meta-regressor which is only a router.c                 C   rX   r   )	estimator)rN   r   r   r   r   r\     r]   zMetaRegressor.__init__c                 K   s6   t | dfi |}t| jj||fi |jj| _d S Nrj   )r   r
   r   rj   
estimator_rN   rf   rg   
fit_paramsparamsr   r   r   rj     s   $zMetaRegressor.fitc                 C   s*   t | jjdj| jt jdddd}|S Nownerrj   r.   r-   r   method_mapping)r   r   rT   addr   r   rN   rB   r   r   r   get_metadata_routing  s
   z"MetaRegressor.get_metadata_routingNrT   rU   rV   ru   r\   rj   r   r   r   r   r   r     s
    r   c                   @   s4   e Zd ZdZdddZdddZdd Zd	d
 ZdS )WeightedMetaRegressorz*A meta-regressor which is also a consumer.Nc                 C      || _ || _d S r   r   rZ   rN   r   rZ   r   r   r   r\     r   zWeightedMetaRegressor.__init__c                 K   \   | j d ur| j |  t| |d t| dfd|i|}t| jj||fi |jj| _| S Nr   rj   ra   rZ   r)   r/   r   r
   r   rj   r   )rN   rf   rg   ra   r   r   r   r   r   rj        
 zWeightedMetaRegressor.fitc                 K   s*   t | dfi |}| jj|fi |jjS )Nrm   )r   r   rm   r   )rN   rf   Zpredict_paramsr   r   r   r   rm        zWeightedMetaRegressor.predictc                 C   s:   t | jjd| j| jt jdddjdddd}|S )Nr   rj   r   rm   r   r   r   rT   Zadd_self_requestr   r   r   r   r   r   r   r   	  s   
z*WeightedMetaRegressor.get_metadata_routingr   )rT   rU   rV   ru   r\   rj   rm   r   r   r   r   r   r     s    

	r   c                   @   s,   e Zd ZdZd	ddZd	ddZdd ZdS )
WeightedMetaClassifierzEA meta-estimator which also consumes sample_weight itself in ``fit``.Nc                 C   r   r   r   r   r   r   r   r\     r   zWeightedMetaClassifier.__init__c                 K   r   r   r   )rN   rf   rg   ra   r,   r   r   r   r   rj     r   zWeightedMetaClassifier.fitc                 C   s0   t | jjd| j| jt jdddd}|S r   r   r   r   r   r   r   '  s   z+WeightedMetaClassifier.get_metadata_routingr   r   r   r   r   r   r     s
    

	r   c                   @   s4   e Zd ZdZdd ZdddZdddZd	d
 ZdS )MetaTransformerzA simple meta-transformer.c                 C   rX   r   )transformer)rN   r   r   r   r   r\   6  r]   zMetaTransformer.__init__Nc                 K   s6   t | dfi |}t| jj||fi |jj| _| S r   )r   r
   r   rj   transformer_r   r   r   r   rj   9  s    zMetaTransformer.fitc                 K   s*   t | dfi |}| jj|fi |jjS )Nr   )r   r   r   r   )rN   rf   rg   Ztransform_paramsr   r   r   r   r   >  r   zMetaTransformer.transformc                 C   s0   t | jjdj| jt jdddjddddS )Nr   rj   r   r   )r   r   )r   r   rT   r   r   r   rR   r   r   r   r   B  s   z$MetaTransformer.get_metadata_routingr   )rT   rU   rV   ru   r\   rj   r   r   r   r   r   r   r   3  s    

r   )Tr   )6r$   collectionsr   	functoolsr   numpyr5   Znumpy.testingr   Zsklearn.baser   r   r   r   r	   r
   Zsklearn.metrics._scorerr   r   Zsklearn.model_selectionr   Zsklearn.model_selection._splitr   Z sklearn.utils._metadata_requestsr   Zsklearn.utils.metadata_routingr   r   r   Zsklearn.utils.multiclassr   r/   tupler<   rd   rA   rK   r   rL   rW   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sB     
+

.#T2"