o
    i	}                     @   s  U d dl Z d dlZd dlZd dlZd dl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mZ d dlmZ d d	lmZmZ d d
lmZmZmZmZ d dlm Z  d dl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z<m=Z= d dl>m?Z?m@Z@mAZAmBZB d dlCmDZD d dlEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN d dlOmPZP ejQRdZSd\ZTZUeSVeTeUZWeSjXd deTdZYeYdkZe[Z\e]eYZ^eSjXd deTdfdZ_dd e`e_jad D ZbeSjXd deTdZceSVeTZdeSjXd deeeYdZfg eAddeWe_dd gd!e@dd"eWe_dd gd d#ebiid$edd"eWeYdgd%d&e?dd"eWe_dgd!eBddeWe_dgd!e&eWeYd'dd(gd)dgd*e3dd"d+d,d-d.giieWeYdgd%d'dd(gd)dgd/e7dd"d0d,d-d.giieWeYdgd%d'dd(gd)dgd/e5dd"d+d,d-d.giieWeYdgd%d'dd(gd)dgd/e6dd"d0d,d-d.giieWeYdgd%d'dd(gd)dgd/e2dd"eWe\dgd%d&e8dd"eWe\dgd%d&e<dd"eWeYdd gd d#e^iid$e;dd"eWeYdd gd%d d#e^iid1e=dd"d2dieWeYdgd3edd"eWeYdd gd d#e^iid$e)eWeYd)dgd4e"eWeYd)dgd4e$eWeYd)dgd4e'eWe_d)dgd4e(eWe_d)dgd4e#eWeYd)dgd4e%eWeYd)dgd4e*ddd5d6ieWeYd%g d7ddd(gid8	e ddd9d:ieWeYdgd3edd"eWeYd:g d;d<d=gd<d=gg d>d>d?eddeWeYd:dd<gd@e,eWeYd'dgdAe+eWeYd'dgdAe,eWeYd'dgd)dgd*e+eWeYd'dgd)dgd*eeWeYd)dgd4eddeWeYdd<gdBeDdd"eWeYdCg dDddd(gid?edd"eWeYdgd'dgd)dgdE
ed"deWeYg d7dBed"ddgd)dgd'dd(geWeYdF
ZgeheidG< 	 dHd egD Zje e gZkdIdJ ZldCdKdLdMZmejnodekedCdNdOdP ZpejnodekedCdNdQdR ZqedCdNdSdT ZrejnjodUegejdVedCdNdWdX ZsejnjodUegejdVedCdNdYdZ ZtejnjodUegejdVedCdNd[d\ ZuejnjodUegejdVedCdNd]d^ ZvejnjodUegejdVedCdNd_d` ZwejnjodUegejdVedCdNdadb ZxejnjodUegejdVedCdNdcdd ZydS )e    N)config_context)BaseEstimatoris_classifier)CalibratedClassifierCV)TransformedTargetRegressor)GraphicalLassoCV)AdaBoostClassifierAdaBoostRegressorBaggingClassifierBaggingRegressor)UnsetMetadataPassedError)enable_halving_search_cvenable_iterative_imputer)RFERFECVSelectFromModelSequentialFeatureSelector)IterativeImputer)ElasticNetCVLarsCVLassoCVLassoLarsCVLogisticRegressionCVMultiTaskElasticNetCVMultiTaskLassoCVOrthogonalMatchingPursuitCVRANSACRegressorRidgeClassifierCVRidgeCV)mean_squared_error)make_scorer)FixedThresholdClassifierGridSearchCV
GroupKFoldHalvingGridSearchCVHalvingRandomSearchCVRandomizedSearchCVTunedThresholdClassifierCVcross_validate)OneVsOneClassifierOneVsRestClassifierOutputCodeClassifier)ClassifierChainMultiOutputClassifierMultiOutputRegressorRegressorChain)SelfTrainingClassifier)	ConsumingClassifierConsumingRegressorConsumingScorerConsumingSplitterNonConsumingClassifierNonConsumingRegressor	_Registryassert_request_is_emptycheck_recorded_metadata)MetadataRouter*   )d         )size   c                 C   s"   g | ]}t td d |f qS N)npuniquey_multi).0i rG   l/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/tests/test_metaestimators_metadata_routing.py
<listcomp>W   s   " rI   
   	estimator	regressorfitpartial_fit)metaestimatorestimator_namerK   Xyestimator_routing_methods
classifierclasses)rO   rP   rK   rQ   rR   rS   method_argssubset)rO   rP   rK   rQ   rR   rS   preserves_metadatascoringscorecv)rO   rQ   rR   scorer_namescorer_routing_methodscv_namecv_routing_methodsZ
param_gridalphag?g?)rO   rP   rK   	init_argsrQ   rR   rS   rX   r\   r]   r^   r_   Zparam_distributions)rO   rP   rK   rQ   rR   rS   rX   rV   Zrandom_state)rO   rP   rK   ra   rQ   rR   rS   )rO   rQ   rR   r^   r_   Zmin_samplesg      ?)rM   predictrZ   )	rO   rP   rK   ra   rQ   rR   rX   rS   method_mappingZskip_completeF)rM   rb   predict_probapredict_log_probadecision_functionrb   rd   )rb   rd   re   )rO   rP   rK   rQ   rR   rX   rS   rc   )rO   rP   rK   rQ   rR   rX   rS   )rO   rQ   rR   r\   r]   )rO   rK   rP   rQ   rR   rS   T)rM   rb   rd   re   rf   rZ   )
rO   rP   rK   rQ   rR   rS   r\   r]   r^   r_   )
rO   rK   rP   rS   r^   r_   r\   r]   rQ   rR   METAESTIMATORSc                 C   s   g | ]	}t |d  jqS )rO   )str__name__)rE   rowrG   rG   rH   rI     s    c                 C   s
  |  di }d\}}d\}}d\}}d| v rQ| d }	t }| d }
|r9|
dkr,t|}n!|
dkr5t|}ntd|
dkrAt }n|
dkrIt }ntd|||	< d| v re| d }t }t|d	}|||< d
| v ry| d
 }t }t|d	}|||< |||f||f||ffS )a=  Get the init args for a metaestimator

    This is a helper function to get the init args for a metaestimator from
    the METAESTIMATORS list. It returns an empty dict if no init args are
    required.

    Parameters
    ----------
    metaestimator_info : dict
        The metaestimator info from METAESTIMATORS

    sub_estimator_consumes : bool
        Whether the sub-estimator consumes metadata or not.

    Returns
    -------
    kwargs : dict
        The init args for the metaestimator.

    (estimator, estimator_registry) : (estimator, registry)
        The sub-estimator and the corresponding registry.

    (scorer, scorer_registry) : (scorer, registry)
        The scorer and the corresponding registry.

    (cv, cv_registry) : (CV splitter, registry)
        The CV splitter and the corresponding registry.
    ra   )NNrK   rP   rL   rT   z!Unpermitted `sub_estimator_type`.r\   )registryr^   )	getr7   r2   r1   
ValueErrorr6   r5   r3   r4   )Zmetaestimator_infosub_estimator_consumeskwargsrK   Zestimator_registryscorerZscorer_registryr[   Zcv_registryrP   Zsub_estimator_typer\   r^   rG   rG   rH   get_init_args  sF   



rq   )valuec                C   sj   |D ]0}| ||gD ]&}t| d| d}|di ||i t| tr1t| r1|dkr1|dd qqdS )a  Call `set_{method}_request` on a list of methods from the sub-estimator.

    Parameters
    ----------
    obj : BaseEstimator
        The object for which `set_{method}_request` methods are called.

    method_mapping : dict
        The method mapping in the form of `{caller: [callee, ...]}`.
        If a "caller" is not present in the method mapping, a one-to-one mapping is
        assumed.

    methods : list of str
        The list of methods as "caller"s for which the request for the child should
        be set.

    metadata_name : str
        The name of the metadata to be routed, usually either `"metadata"` or
        `"sample_weight"` in our tests.

    value : None, bool, or str
        The request value to be set, by default it's `True`
    Zset__requestrN   TrU   NrG   )rl   getattr
isinstancer   r   )objrc   methodsmetadata_namerr   ZcallerZcalleeZset_request_for_methodrG   rG   rH   set_requests5  s   
rz   )Zenable_metadata_routingc                 C   s8   t t |   W d   dS 1 sw   Y  dS )zvTest that get_metadata_routing is not implemented on meta-estimators for
    which we haven't implemented routing yet.N)pytestraisesNotImplementedErrorget_metadata_routingrK   rG   rG   rH   0test_unsupported_estimators_get_metadata_routingY  s   
"r   c              	   C   s`   t t! z| jdggdgdgd W n	 ty   tw W d   dS 1 s)w   Y  dS )zTest that fit raises NotImplementedError when metadata routing is
    enabled and a metadata is passed on meta-estimators for which we haven't
    implemented routing yet.r@   sample_weightN)r{   r|   r}   rM   	TypeErrorr   rG   rG   rH   -test_unsupported_estimators_fit_with_metadatab  s   "r   c                  C   s@   t  } t  }| |usJ | t| u sJ | t| u sJ d S rA   )r7   copydeepcopy)abrG   rG   rH   test_registry_copyq  s
   r   rO   )Zidsc                 C   sd   | d }t | dd^}}|di |}d| v rddgi}nd }t| |d t| ts0J d S )	NrO   Trn   r^   splittersplit)excluderG   )rq   r8   r~   rv   r:   )rO   metaestimator_classro   _instancer   rG   rG   rH   test_default_request{  s   r   c                 C   s  d| vrd S | d }| d }| d }| d }|D ]}dD ]}t | dd^}\}}	\}
}	}	|
r8|
jdi |di ttd| }||i}|di |}d	| d
|jj d| }tjtt	
|dS t||}d|vrt|| di dg|d |j||fi | t|| di dg|d d z|||fi | W n ty   ||fi | Y nw W d    n1 sw   Y  qqd S )NrK   rO   rQ   rR   rS   r   metadataTr   [zJ] are passed but are not explicitly set as requested or not requested for .)matchrM   rc   rc   rx   ry   )rc   rx   ry   rr   rG   )rq   set_score_requestr   r   	__class__ri   r{   r|   r   reescaperu   rz   rl   rM   r   )rO   r   rQ   rR   routing_methodsmethod_namekeyro   rK   r   rp   valmethod_kwargsr   msgmethodrG   rG   rH   0test_error_on_missing_requests_for_sub_estimator  sb   


r   c              
   C   s  d| vrd S | d }| d }| d }| d }|  di }|  dd}|D ]}d	D ]}ttd	| }	||	i}
t| dd
\}\}}\}}\}}|rPt|i dg|d |rY|jddd t|||g|d |di |}t||}|  di  |i }d|vr||| z|||fi |
| W n ty   ||fi |
| Y nw |sJ |dkr|
	 nd}|D ]}t
|f|||d|
 qq(q$d S )NrK   rO   rQ   rR   rS   rc   rX   Tr   r   rZ   r   groupsr   rV   rM   rW   rG   )r   parentsplit_params)rl   r   r   rq   rz   set_split_requestru   rM   r   keysr9   )rO   r   rQ   rR   r   rc   rX   r   r   r   r   ro   rK   rk   rp   r   r[   r   r   extra_method_argsr   rG   rG   rH   3test_setting_request_on_sub_estimator_removes_error  sn   

r   c              	   C   s   d| vrd S dd }| d }| d }| d }| d }|D ]W}t | dd	\}\}}	\}	}	\}	}	|di |}
||| t|
|}| d
i |i }d|vrW|
j||fi | z|||fi | W q tys   ||fi | Y qw d S )NrK   c                 S   s(   t | r|dkr| jdd d S d S d S )NrN   Trt   )r   Zset_partial_fit_request)rK   r   rG   rG   rH   set_request  s   z7test_non_consuming_estimator_works.<locals>.set_requestrO   rQ   rR   rS   Fr   rV   rM   rG   )rq   ru   rl   rM   r   )rO   r   r   rQ   rR   r   r   ro   rK   r   r   r   r   rG   rG   rH   "test_non_consuming_estimator_works  s.   

r   c              	   C   s   d| vrdS | d }| d }|  di }|D ]f}t| dd\}\}}\}}	\}
}|jdd |
r7|
jddd	 |durDt|||gd
d |di |}t||}d
ti}d|vr^|tt	 |tt	fi | |	skJ |	D ]}t
d|d|dd| qmqdS )ziTest that any requested metadata is correctly routed to the underlying
    scorers in CV estimators.
    r\   NrO   r]   rc   Tr   r   r   r   r   rM   rZ   )rw   r   r   r   rG   )rl   rq   r   r   rz   ru   r   rM   rQ   rR   r9   )rO   r   r   rc   r   ro   rK   r   rp   rk   r[   r   r   r   Z_scorerrG   rG   rH   +test_metadata_is_routed_correctly_to_scorer4  sJ   
r   c                 C   s   d| vrdS | d }| d }| d }| d }|D ]Y}t | dd\}\}}\}	}\}
}|r3|jddd	 |	r<|	jddd	 |
jddd
 |di |}ttd
}t||}|||fi | |saJ |D ]}td|d|d| qcqdS )zkTest that any requested metadata is correctly routed to the underlying
    splitters in CV estimators.
    r_   NrO   rQ   rR   Tr   Fr   r   r   )rw   r   r   rG   )rq   Zset_fit_requestr   r   r   r   ru   r9   )rO   r   r   X_y_r   ro   rK   r   rp   r[   rk   r   r   r   Z	_splitterrG   rG   rH   -test_metadata_is_routed_correctly_to_splitterb  s8   

r   c              
   C   s   d| vrdS | d }| d }| d }t | dd^}}|dd |ddtd	d
i|}t|||dtitd	d
ttddd dS )zTest that groups are routed correctly if group splitter of CV estimator is used
    within cross_validate. Regression test for issue described in PR #29634 to test that
    `ValueError: The 'groups' parameter should not be None.` is not raised.r_   NrO   rQ   rR   Tr   r[      )Zn_splitsr   rb   )Zresponse_method)paramsr[   rY   rG   )rq   popr#   r(   r   r    r   )rO   r   r   r   ro   r   r   rG   rG   rH   &test_metadata_routed_to_group_splitter  s    

r   )zr   r   numpyrB   r{   Zsklearnr   Zsklearn.baser   r   Zsklearn.calibrationr   Zsklearn.composer   Zsklearn.covariancer   Zsklearn.ensembler   r	   r
   r   Zsklearn.exceptionsr   Zsklearn.experimentalr   r   Zsklearn.feature_selectionr   r   r   r   Zsklearn.imputer   Zsklearn.linear_modelr   r   r   r   r   r   r   r   r   r   r   Zsklearn.metrics._regressionr   Zsklearn.metrics._scorerr    Zsklearn.model_selectionr!   r"   r#   r$   r%   r&   r'   r(   Zsklearn.multiclassr)   r*   r+   Zsklearn.multioutputr,   r-   r.   r/   Zsklearn.semi_supervisedr0   Z%sklearn.tests.metadata_routing_commonr1   r2   r3   r4   r5   r6   r7   r8   r9   Zsklearn.utils.metadata_routingr:   randomZRandomStaterngNMZrandrQ   randintrR   ZastypeintZy_binaryrC   rU   rD   rangeshapeZclasses_multir   r   lenr   rg   list__annotations__ZMETAESTIMATOR_IDSZUNSUPPORTED_ESTIMATORSrq   rz   markZparametrizer   r   r   r   r   r   r   r   r   r   rG   rG   rG   rH   <module>   s  
 4(
,



$,5CQ_mv
 	
    
  %  ,  3  :  A  H  O  V
  a  j  ~                   (    /    7
    H    T    \    h#G$
	9D%,!