o
    }Th>u                  	   @   s  d dl Z d dlZd dlZd dl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mZ d dlmZmZmZ d dl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# d dl$m%Z%m&Z& d dl'm(Z(m)Z) d dl*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z:m;Z;m<Z< d dl=m>Z>m?Z?m@Z@mAZAmBZBmCZC dd ZDdd ZEdd ZFejGHdeAe@ e? eC eB e> dd ZIdd ZJd d! ZKd"d# ZLeM ZNeNjOZPeNjQZRe8eRd$d%ZSe8eRd&d%ZTeUeReSeTfZVePjW\ZXZYeVjWd$ ZZe[e\eRZ]e^e_ej\eReSeTfZ`d'd( Zad)d* Zbd+d, Zcd-d. Zdd/d0 Zed1d2 Zfd3d4 Zgd5d6 Zhd7d8 Zid9d: Zjd;d< ZkejGHd=d>d?gd@dA ZldBdC ZmdDdE ZnejGHdFd?dGgdHdI ZoejGHdJeAdKdL ZpdMdN ZqejGHdFg dOejGHd=d>dPgdQdR ZrdSdT ZsejGHdJeAdUdV ZtdWdX ZuejGHdYg dZd[d\ ZvejGHd]ed&d^e.ed&d^e-ed&d^gd_d` ZwG dadb dbeZxG dcdd ddeZyejGHdee.eydfdge fe/ex ejdhd difgdjdk Zzdldm Z{ejGHdne.efe/e!fgdodp Z|ejGHdqe^ej}e~gdrds Zdtdu Zdvdw Zdxdy Zdzd{ ZejGHd|e-d}fe.d~fgdd Zdd ZdS )    N)	cpu_count)datasets)ClassifierMixinclone)load_linnerudmake_classificationmake_multilabel_classificationmake_regression)DummyClassifierDummyRegressor)GradientBoostingRegressorRandomForestClassifierStackingRegressor)NotFittedError)SimpleImputer)LassoLinearRegressionLogisticRegressionOrthogonalMatchingPursuitPassiveAggressiveClassifierRidgeSGDClassifierSGDRegressor)jaccard_scoremean_squared_error)GridSearchCVtrain_test_split)OneVsRestClassifier)ClassifierChainMultiOutputClassifierMultiOutputRegressorRegressorChain)make_pipeline)	LinearSVC)DecisionTreeClassifier)shuffle)assert_almost_equalassert_array_almost_equalassert_array_equal)BSR_CONTAINERSCOO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSDOK_CONTAINERSLIL_CONTAINERSc            
      C   s   t jddd\} }| d d |d d }}| dd  |dd  }}t|}tdD ]}tdd}|||d d |f  |||d d |f< q,ttdd}||| ||}	t	||	 d S N   r   	n_targetsrandom_state2   r3   )
r   r	   np
zeros_likeranger   fitpredictr    r&   )
XyX_trainy_trainX_testy_test
referencesnrgry_pred rE   _/home/air/segue/gemini/back/venv/lib/python3.10/site-packages/sklearn/tests/test_multioutput.pytest_multi_target_regression=   s   


rG   c                  C   s6  t jddd\} }| d d |d d }}| dd  |dd  }}t|}d}tdD ]3}tddd}	|	|d | |d ||f  |	||d  ||d |f  |	||d d |f< q.ttddd}	|	|d | |d |  |	||d  ||d   |	|}
t	||
 t
ttdrJ d S )	Nr0   r   r1   r4         r3   max_iterpartial_fit)r   r	   r6   r7   r8   r   rL   r:   r    r&   hasattrr   )r;   r<   r=   r>   r?   r@   rA   
half_indexrB   sgrrD   rE   rE   rF   (test_multi_target_regression_partial_fitO   s    
  

rP   c                  C   sd   t jddd\} }ttdd}d}tjt|d || | W d    d S 1 s+w   Y  d S )N   r   r1   r5   zat least two dimensionsmatch)r   r	   r    r   pytestraises
ValueErrorr9   )r;   r<   rC   msgrE   rE   rF   'test_multi_target_regression_one_targetf   s   "rX   sparse_containerc                 C   s   t jddd\}}|d d |d d }}|dd  }ttdd}ttdd}||| || || t|||| | d S r/   )r   r	   r    r   r9   r&   r:   )rY   r;   r<   r=   r>   r?   rC   
rgr_sparserE   rE   rF   #test_multi_target_sparse_regressiono   s   
r[   c                  C   s   g dg dg} ddgddgg}ddg}t t }d}tjt|d || || W d    n1 s4w   Y  t td	d
}|| || d S )NrQ      r0      rI      T㥛 	@X9v@g?g333333?zdoes not support sample weightsrR   r   r5   )r    r   rT   rU   rV   r9   r   )r;   r<   wrC   rW   rE   rE   rF   $test_multi_target_sample_weights_api   s   
rd   c                  C   s   g dg dg} ddgddgg}ddg}t tddd	}|| || ddg}t tddd	}|| || || d d || d d ksJJ d S )
Nr\   r^   ra   rb          @      ?r   rI   rJ   )r    r   rL   r:   )r;   r<   rc   rgr_wrC   rE   rE   rF   +test_multi_target_sample_weight_partial_fit   s   ,rh   c                  C   s   g dg dg} ddgddgg}ddg}t tdd}|| || g dg dg dg}ddgddgddgg}t tdd}||| g d	g d
g}t|||| d S )Nr\   r^   ra   rb   re   rf   r   r5   g      ?g      @      @rj   g      @g      @)r    r   r9   r&   r:   )Xwywrc   rg   r;   r<   rC   r?   rE   rE   rF    test_multi_target_sample_weights   s   rn   rQ   r5   r]   c                  C   sf   t dddd} t| dd}|ttt |jd }|tt |jd }t dkr/||us1J d S d S )Nlog_lossrQ   rI   lossr3   rK   r_   )n_jobsr   )r   r   rL   r;   r<   classesestimators_r   )sgd_linear_clfmorest1est2rE   rE   rF   8test_multi_output_classification_partial_fit_parallelism   s   


ry   c                  C   sb   t ddd} t| }|tt t|drJ t dddd} t| }|tt t|ds/J d S )NrQ   rI   rJ   predict_probaro   rp   )r   r   r9   r;   r<   rM   )ru   multi_target_linearrE   rE   rF   'test_hasattr_multi_output_predict_proba   s   r|   c            	      C   s  t ddd} ddi}dd }t| ||dd	d
}t|}|tt |t t ddd} t| }|tt d}d}d}tjt	|d}|t W d    n1 sSw   Y  t
|jjt	saJ |t|jjv skJ t
|jjjt	suJ |t|jjjv sJ d S )NrQ   rI   rJ   rq   )hingero   modified_huberc                 S   s   t | drdS dS )Nrz   rf   g        )rM   )	estimatorr;   r<   rE   rE   rF   custom_scorer   s   
z6test_multi_output_predict_proba.<locals>.custom_scorerr0   raise)
param_gridscoringcverror_scorez8probability estimates are not available for loss='hinge'z0'SGDClassifier' has no attribute 'predict_proba'8'MultiOutputClassifier' has no attribute 'predict_proba'rR   )r   r   r   r9   r;   r<   rz   rT   rU   AttributeError
isinstancevalue	__cause__str)	ru   paramr   grid_clfr{   
inner2_msg
inner1_msg	outer_msg	exec_inforE   rE   rF   test_multi_output_predict_proba   s4   
r   c                  C   s2  t dddd} t| }tjd d }|jtd | td | td |t}tt	f|jks0J |t|d  t|d   |t}tt	f|jksLJ t
dD ]F}t| } | jtd | td ||f t| d t| t|d d |f  | t|d  t|d |f  t| t|d d |f  qPd S )	Nro   rQ   rI   rp   r   r]   )rs   r0   )r   r   r;   shaperL   r<   rs   r:   	n_samples	n_outputsr8   r   r(   )ru   r{   rN   first_predictionssecond_predictionsirE   rE   rF   ,test_multi_output_classification_partial_fit  s$    

 r   c                  C   sZ   t dddd} t| }d}tjt|d |tt W d    d S 1 s&w   Y  d S )Nro   rQ   rI   rp   z8classes must be passed on the first call to partial_fit.rR   )r   r   rT   rU   rV   rL   r;   r<   )ru   r{   rW   rE   rE   rF   Gtest_multi_output_classification_partial_fit_no_first_classes_exception-  s   "r   c                  C   s   t ddd} t| }|tt |t}ttf|jksJ |	t}t
|tks+J |D ]}ttf|jks8J q-ttjt|dd| tdD ]3}t| }|ttd d |f  t|tt|d d |f ksoJ tt|	tt||  qJd S )N
   rQ   n_estimatorsr3   axisr0   )r   r   r9   r;   r<   r:   r   r   r   rz   len	n_classesr(   r6   argmaxdstackr8   r   list)forestmulti_target_forestpredictionsrz   class_probabilitiesr   forest_rE   rE   rF    test_multi_output_classification5  s    

&r   c                  C   s   t dd} t| }t|}|tt |t}ttf|j	ks!J t
dD ]%}t|}|ttd d |f  t|tt|d d |f ksJJ q%d S )Nr   r5   r0   )r#   r   r   r9   r;   r<   r:   r   r   r   r8   r   r   )svcmulti_class_svcmulti_target_svcr   r   multi_class_svc_rE   rE   rF   %test_multiclass_multioutput_estimatorR  s   

(r   c            
   	   C   s   d} t j| }|jdd}t g ddd}t g ddd}t j||gdd}ttd	| d
}|	|| |
|}t ddgddgddgddgddggt g dg dg dg dg dgg}tt|D ]}	t||	 ||	  qnd S )Ni  )rI   rI   )size)bar   r   r   rI   rQ   )defr   r   r   	liblinear)solverr3   gu)"?gu_|?gtĳ?gv?g/?g ?gK[aS?g[rO?ga]q?g?kDQ?)g 8칌?g?go|̋<?)gOW?gڔ#K?gz~?)gP1s&q?gf^?g]=!?)g{Y;?ghJ?gL$$S?)gXA	?g 7%?g?)r6   randomRandomStatenormalarrayreshapeconcatenater   r   r9   rz   r8   r   r&   )
seedrngr;   y1y2Yclfy_resulty_actualr   rE   rE   rF   3test_multiclass_multioutput_estimator_predict_probad  s>   

	r   c            	      C   s   g dg dg} ddgddgg}t ddg}tddd	}t|}|| || g dg dg dg}ddgddgddgg}tddd	}t|}||| g d
g dg}t|||| d S )Nr\   r^   r0   r]   re   rf   r   rQ   r   ri   rk   )r6   asarrayr   r   r9   r&   r:   )	rl   rm   rc   r   clf_wr;   r<   r   r?   rE   rE   rF   /test_multi_output_classification_sample_weights  s   r   c            	      C   s   g dg dg dg} ddgddgddgg}t g d}tddd	}t|}|| || g dg dg dg dg}ddgddgddgddgg}tddd	}t|}||| g dg}t|||| d S )
Nr\   r^   ri   r0   r]   )re   rf   rf   rQ      rJ   )r6   r   r   r   r9   r'   r:   )	rl   rm   rc   ru   r   r;   r<   r   r?   rE   rE   rF   ;test_multi_output_classification_partial_fit_sample_weights  s   
r   c                  C   s   t tdd} tt | tt W d    n1 sw   Y  t	t
tf}| tt tt | t| W d    n1 sEw   Y  d}tjt|d | ttd d df  W d    d S 1 skw   Y  d S )Nr   r5   zUnknown label typerR   rQ   )r   r#   rT   rU   r   scorer;   r<   r6   column_stackr   r   r9   rV   )mocy_newrW   rE   rE   rF   test_multi_output_exceptions  s   "r   response_methodrz   r:   c                 C   sH   t t }tt t|| t W d   dS 1 sw   Y  dS )zECheck that we raise the proper error when the estimator is not fittedN)r   r   rT   rU   r   getattrr;   )r   r   rE   rE   rF   "test_multi_output_not_fitted_error  s   
"r   c                  C   s,  t t } t| dsJ | tt t| dsJ t t } t| dr%J d}d}tjt	|d}| 
t W d   n1 s@w   Y  t|jjt	sNJ |t|jjksXJ | tt t| dreJ tjt	|d}| 
t W d   n1 s|w   Y  t|jjt	sJ |t|jjksJ dS )zVCheck the behavior for the delegation of predict_proba to the underlying
    estimatorrz   r   z3'LinearSVC' object has no attribute 'predict_proba'rR   N)r   r   rM   r9   r;   r<   r#   rT   rU   r   rz   r   r   r   r   )r   r   	inner_msgr   rE   rE   rF   (test_multi_output_delegate_predict_proba  s(   

r   c                  C   s2   t dddddd\} }tdd |D }| |fS )	Ni  d      r   r   )r   
n_featuresr   n_informativer3   c                 S   s(   g | ]}d d t |ddd D qS )c                 S   s   g | ]}t |qS rE   )int).0yyyrE   rE   rF   
<listcomp>      zLgenerate_multilabel_dataset_with_correlations.<locals>.<listcomp>.<listcomp>z#06br]   N)format)r   yyrE   rE   rF   r     s   ( zAgenerate_multilabel_dataset_with_correlations.<locals>.<listcomp>)r   r6   r   )r;   r<   Y_multirE   rE   rF   -generate_multilabel_dataset_with_correlations  s
   

r   chain_methoddecision_functionc                 C   sh   t  \}}tt | d||}||}|j|jksJ ||}|dk}t|| t|dr2J d S )Nr   r   rz   )	r   r   r#   r9   r:   r   r   r(   rM   )r   r;   r   classifier_chainY_pred
Y_decisionY_binaryrE   rE   rF   5test_classifier_chain_fit_and_predict_with_linear_svc  s   



r   csr_containerc                 C   sX   t  \}}| |}tt ||}||}tt ||}||}t|| d S N)r   r   r   r9   r:   r(   )r   r;   r   X_sparser   Y_pred_sparseY_pred_denserE   rE   rF   6test_classifier_chain_fit_and_predict_with_sparse_data  s   


r   c            
      C   s   t  \} }| d dd d f }| dd d d f }|d dd d f }|dd d d f }tt }||| ||}tt }||| ||}	t||	ddt||ddks]J d S )NiX  samplesaverage)r   r   r   r9   r:   r   r   )
r;   r   r=   r?   Y_trainY_testovr
Y_pred_ovrchainY_pred_chainrE   rE   rF   +test_classifier_chain_vs_independent_models!  s   




r   )r:   rz   predict_log_probar   r   c                 C   s   t  \}}tt | d}||| ||}|j|jksJ dd |jD tt|jd |jd |jd  ks;J t	|||}|dkrKt
|}|dk}t|| t|ts[J d S )Nr   c                 S      g | ]}|j jqS rE   coef_r   r   crE   rE   rF   r   D  r   z9test_classifier_chain_fit_and_predict.<locals>.<listcomp>rQ   r         ?)r   r   r   r9   r:   r   rt   r   r8   r   r6   expr(   r   r   )r   r   r;   r   r   r   Y_probr   rE   rE   rF   %test_classifier_chain_fit_and_predict8  s   




r  c                  C   sv   t  \} }tt }|| | || }|j|jksJ dd |jD tt| jd | jd |jd  ks9J d S )Nc                 S   r   rE   r   r   rE   rE   rF   r   X  r   z8test_regressor_chain_fit_and_predict.<locals>.<listcomp>rQ   )	r   r!   r   r9   r:   r   rt   r   r8   )r;   r   r   r   rE   rE   rF   $test_regressor_chain_fit_and_predictQ  s   


r  c                 C   sb   t  \}}| |}tt ddtt ddg}|D ]}||| ||}|j|jks.J qd S )Nr0   r   )r   r   r   r!   r   r9   r:   r   )r   r;   r   r   base_chainsr   r   rE   rE   rF   7test_base_chain_fit_and_predict_with_sparse_data_and_cv]  s   

r  c                  C   s   t  \} }tt tt fD ][}t|jddd}|| | t|j|jd}|| | t	|j|j t
|jt
tdksCJ t|jdksLJ tt|jdksWJ t|j|jD ]\}}t|j|j q^qd S )Nr   *   )orderr3   r
  r_   )r   r   r   r!   r   r   
set_paramsr9   order_r(   r   r
  r8   r   setziprt   r'   r   )r;   r   r   chain_randomchain_fixedrw   rx   rE   rE   rF   test_base_chain_random_orderl  s   
r  zchain_type, chain_method))
classifierr:   )r  rz   )r  r   )r  r   )	regressor c                 C   s   t  \}}| dkrtt |d}ntt }||| t|jdd}||| ||}||}|j	|j	ks<J t
||krEJ t|trWt||dddksUJ d S t||dk s`J d S )	Nr  r   r0   r  r   r   g?g      ?)r   r   r   r!   r   r9   r   r  r:   r   r6   allr   r   r   )
chain_typer   r;   r   r   chain_cv	Y_pred_cvr   rE   rE   rF   (test_base_chain_crossval_fit_and_predict~  s   




r  r   )r   c                 C   sR   |  tt t| jtsJ t| jtksJ tt	| jD ]	\}}t
|| qd S r   )r9   r;   r<   r   classes_r   r   r   r  rs   r(   )r   estimator_classesexpected_classesrE   rE   rF   test_multi_output_classes_  s   r  c                          e Zd Zd fdd	Z  ZS )DummyRegressorWithFitParamsNc                       || _ t |||S r   _fit_paramssuperr9   selfr;   r<   sample_weight
fit_params	__class__rE   rF   r9        zDummyRegressorWithFitParams.fitr   __name__
__module____qualname__r9   __classcell__rE   rE   r)  rF   r         r   c                       r  )DummyClassifierWithFitParamsNc                    r!  r   r"  r%  r)  rE   rF   r9     r+  z DummyClassifierWithFitParams.fitr   r,  rE   rE   r)  rF   r2    r1  r2  zestimator, datasetprior)strategyr0   r1   c                 C   s@   |\}}t |}| j|||d | jD ]	}d|jv sJ qd S )N)
some_paramr5  )r6   r7   r9   rt   r#  )r   datasetr;   r<   r5  dummy_estimatorrE   rE   rF   *test_multioutput_estimator_with_fit_params  s   

r8  c                  C   s   t jd} tjddd\}}| |jd }G dd dt}t| }d|i}|j	||fi | |j
D ]	}|j|u s>J q5d S )Nr   r0   r1   c                       s   e Zd Z fddZ  ZS )z0test_regressor_chain_w_fit_params.<locals>.MySGDc                    s$   |d | _ t j||fi | d S )Nr'  )sample_weight_r$  r9   )r&  r;   r<   r(  r)  rE   rF   r9     s   
z4test_regressor_chain_w_fit_params.<locals>.MySGD.fitr,  rE   rE   r)  rF   MySGD  s    r:  r'  )r6   r   r   r   r	   randr   r   r!   r9   rt   r9  )r   r;   r<   weightr:  model	fit_paramestrE   rE   rF   !test_regressor_chain_w_fit_params  s   

r@  zMultiOutputEstimator, Estimatorc                 C   s|   t jd}|dd|ddd}}|jddg|jdd	gd
t}t j	||< t
t | }| ||||| d S )Nr	  r4   r]   rQ   r  )r4   r0   r   g{Gz?gGz?)p)r6   r   r   randnbinomialchoicer   astypeboolnanr"   r   r9   r   )MultiOutputEstimator	Estimatorr   r;   r<   maskpiperE   rE   rF   test_support_missing_values  s   
 
rL  
order_typec                 C   s   g dg dg dg}ddgddgddgg}| ddg}t tddd|d	}||| g dg}ddgg}t||| d S )
Nr\   r^   ri   r0   r]   rQ   r   r   r  )r   r   r9   r'   r:   )rM  r;   r<   r
  r   r?   r@   rE   rE   rF   !test_classifier_chain_tuple_order  s   

rN  c                  C   s   g dg dg dg} ddgddgddgg}t ddg}tt |d}tjtdd	 || | W d    d S 1 s<w   Y  d S )
Nr\   r^   ri   r0   r]   rQ   r  zinvalid orderrR   )tupler   r   rT   rU   rV   r9   )r;   r<   r
  r   rE   rE   rF   )test_classifier_chain_tuple_invalid_order
  s   "rP  c           	      C   sn   t dddddd\}}t||dd\}}}}d}tt g ddd	d
}||| t||  d s5J d S )Nr   rI   r0   r   )r   r   r   n_labelsr3   r5   z\[Chain\].*\(1 of 3\) Processing order 0, total=.*\n\[Chain\].*\(2 of 3\) Processing order 1, total=.*\n\[Chain\].*\(3 of 3\) Processing order 2, total=.*\n$)r   rQ   r]   Tr
  r3   verbose)r   r   r   r$   r9   rerS   
readouterr)	capsysr;   r<   r=   r?   r>   r@   patternr  rE   rE   rF   test_classifier_chain_verbose  s   

rX  c           	      C   sj   t dddd\}}t||dd\}}}}d}tt g dddd	}||| t||  d s3J d S )
N}   r0   r   )r   r2   r3   r5   z\[Chain\].*\(1 of 3\) Processing order 1, total=.*\n\[Chain\].*\(2 of 3\) Processing order 0, total=.*\n\[Chain\].*\(3 of 3\) Processing order 2, total=.*\n$)rQ   r   r]   TrR  )r	   r   r!   r   r9   rT  rS   rU  )	rV  r;   r<   r=   r?   r>   r@   rW  r  rE   rE   rF   test_regressor_chain_verbose+  s   rZ  c                  C   sJ   t dd\} }tdtddfgt dd}t|d| |}||  d	S )
zkTest that MultiOutputRegressor checks the fitted estimator for
    predict. Non-regression test for #16549.T)
return_X_ysgdrQ   r5   r]   )
estimatorsfinal_estimatorr   )r   N)r   r   r   r   r    r9   r:   )r;   r<   stackerregrE   rE   rF   4test_multioutputregressor_ducktypes_fitted_estimator>  s   ra  zCls, methodr9   rL   c                 C   s`   t dd\}}| t }tjtdd t||||dd W d   dS 1 s)w   Y  dS )zgCheck that we raise an error when passing metadata not requested by the
    underlying classifier.
    r4   )r   zis only supported ifrR   rQ   )testN)r   r   rT   rU   rV   r   )Clsmethodr;   r<   r   rE   rE   rF   test_fit_params_no_routingN  s
   
"re  c                  C   sL   t t } d}tjt|d t| d W d    d S 1 sw   Y  d S )Nz:This 'MultiOutputRegressor' has no attribute 'partial_fit'rR   rL   )r    r   rT   rU   r   r   )r?  rW   rE   rE   rF   *test_multioutput_regressor_has_partial_fit\  s
   
"rf  )rT  numpyr6   rT   joblibr   sklearnr   sklearn.baser   r   sklearn.datasetsr   r   r   r	   sklearn.dummyr
   r   sklearn.ensembler   r   r   sklearn.exceptionsr   sklearn.imputer   sklearn.linear_modelr   r   r   r   r   r   r   r   sklearn.metricsr   r   sklearn.model_selectionr   r   sklearn.multiclassr   sklearn.multioutputr   r   r    r!   sklearn.pipeliner"   sklearn.svmr#   sklearn.treer$   sklearn.utilsr%   sklearn.utils._testingr&   r'   r(   sklearn.utils.fixesr)   r*   r+   r,   r-   r.   rG   rP   rX   markparametrizer[   rd   rh   rn   	load_irisirisdatar;   targetr   r   y3r   r<   r   r   r   r   r   uniquer   r   maprs   ry   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r   r2  r8  r@  rL  r   rO  rN  rP  rX  rZ  ra  re  rf  rE   rE   rE   rF   <module>   s    (
 
	
	

*/











