U
    9%e`                 &   @   s  U d Z ddlZddlZddlZddlZddlZddlmZmZ 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mZ ddlmZ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l"m#Z# ddl$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl.m5Z6 ddl7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ ddlAmBZB ddlCmDZD dZEdZFe%e'dZGe&e(dZHeI ZJeIeKd< eJLeG eJLeH ddddgZMeNdddddddd dd!ddddgddd"d#dd!dddd$d%dddgd&d&ddd'ddd(dddd'ddgd&d&dd)ddddddd%dddgd&d&dddddd#ddddddgd&d*ddd+d,ddd-ddd#d!dgd.dd/d0dd1ddd-d2d3dd+dgd.dd/d0dd1ddd-d2ddd*dgd.d4d/d0dd1ddd-d2ddd*dgd.d4d/d0dd1ddd-d2d3dd&dgd5d4d"dd3d!d,ddd$d#dd5dgd5ddddd&dddd*d#dddgd5ddd5d#d&d,d5dd&dd5d5dgdddd5d5d&dd5dd$dd5d#dgd#ddd#dd!d,ddd$d#dd#dgd.d4d/d0ddddd-d2d3dd+dgd.d4d/d0ddddd-d2d6dd&d&gd.d4d/d0dd,ddd-d2d3dd&d&gd5dd"dd3d*d,ddd$d#ddd&gd5ddddd*dddd*ddddgd5dddd5d&d,d5dd&dd5ddgdddddd+dd5dd$dd5ddgd#ddddd!dddd*ddddggZOdddddddddddddddddddddddgZPd7d(d8d9d,d:d;d<d=d>d;d?d@d8d5d1dddAdBdCdDdgZQd*d&gd&d&gd&d*gddgdd5gd5dggZRd&d&d&dddgZSd&d&gd5d5gd#d5ggZTd&ddgZUeV ZWejXYdZZeZ[eWj\j]Z^eWj_e^ eW__eWj\e^ eW_\e` ZaeZ[eaj\j]Z^eaj_e^ ea__eaj\e^ ea_\eb ZceZ[ecj\j]Z^ecj_e^ ec__ecj\e^ ec_\eDdZdejeddEd,dF\ZfZgedjhdGdHZid@eieidIk< edjjdddJdHZke#dKd,dLddMl ZmeWj_eWj\dNeaj_eaj\dNecj_ecj\dNeReSdNeOePdNeOeQdNefegdNeiekdNei ekdNemekdNendOekdNdPZoeoD ]Zpeeoep dQ eoep dR< qdSdT ZqdUdV ZrdWdX ZsejtudYeHv ejtudZeFd[d\ Zwd]d^ Zxd_d` ZyejtudaeHz ejtudZeFdbdc Z{e@ejtudaeHz ejtudddedfedgfdhdKedgfdidfedgfdjdfedEfgdkdl Z|dmdn Z}dodp Z~dqdr Zdsdt Zdudv Zdwdx Zdydz Zd{d| Zd}d~ Zdd Zdd ZdPddZejtudeJdd ZejtudeMdd ZdQddZejtudeJdd ZejtudeMdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZejtudeGdd Zdd ZejtudeGdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdRddZejtudeMejtudddd ZejtudeeeMeHejtudddgddń ZddǄ ZddɄ ZejtudeMejtudddddgejtudeegddЄ ZdSdd҄ZejtudeMddԄ Ze?ddք ZejtudeJdd؄ Zddڄ Zdd܄ ZejtudeJddބ Zdd Zdd ZejtudeJdd ZejtudeMdd Zdd Zdd ZejtudeJdd Zdd ZejtudeJdd Zdd Zdd Zdd ZejtudZeEejtudeeeo ddh ejtude%e'gdd ZejtudZeFejtudeo ejtude&e(gdd Zdd Zdd ZÐd d ZejtudeJejtudddgejtuddddgd	d
 ZejtudZdedidjgejtudYeHv dd Zejtuded#dd ZȐdd ZejtudZeFdd ZejtudYe%e'gejtudd5dgd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Ӑd'd( ZԐd)d* Zejtud+ee,v e-v d,d- Z֐d.d/ ZejtudYeJv d0d1 ZejtudZdedigd2d3 ZejtudZd4d5gd6d7 ZejtudZd4d5gd8d9 ZejtudZd4d5gd:d; ZejtudZd4d5gd<d= Zejtud>d?dgejtud@e%ddAe&dhdBgdCdD ZސdEdF ZejtudGeje&feje%fgejtudHddIgdJdK ZdLdM ZejtudGeje&feje%fgdNdO ZdS (T  z-
Testing for the tree module (sklearn.tree).
    N)chainproduct)NumpyPickler)assert_allclose)
coo_matrix
csc_matrix
csr_matrix)datasetstree)DummyRegressor)NotFittedError)accuracy_scoremean_poisson_deviancemean_squared_error)train_test_split)_sparse_random_matrix)DecisionTreeClassifierDecisionTreeRegressorExtraTreeClassifierExtraTreeRegressor)CRITERIA_CLFCRITERIA_REGDENSE_SPLITTERSSPARSE_SPLITTERS)
NODE_DTYPE	TREE_LEAFTREE_UNDEFINED_check_n_classes_check_node_ndarray_check_value_ndarray)Tree)	_IS_32BITcompute_sample_weight)assert_almost_equalassert_array_almost_equalassert_array_equalcreate_memmap_backed_dataignore_warningsskip_if_32bit)check_sample_weights_invariance)check_random_state)ginilog_loss)squared_errorabsolute_errorfriedman_msepoisson)r   r   )r   r   	ALL_TREESr   r   r   r         i      皙?g      g @g333333
   g	gzG @ig                  ?            ?      ?333333?皙?g333333@g@g)\(?{Gz?gףp=
@g?              @g|?5^?g(\??   )random_state	n_samples
n_features)   r5   sizeg?)rN   rN   g      ?)ZdensityrK   Xy)rN   r6   )irisdiabetesdigitstoy	clf_small	reg_small
multilabel
sparse-pos
sparse-neg
sparse-mixzerosrR   X_sparsec                 C   s   |j | j ks"td||j | j t| j|j|d  t| j|j|d  | jtk}t|}t| j	| |j	| |d  t| j
| |j
| |d  t| j |j |d  t| j|j|d  t| j|j|d d	 t| j| |j| |d
 d	 d S )Nz({0}: inequal number of node ({1} != {2})z: inequal children_rightz: inequal children_leftz: inequal featuresz: inequal thresholdz: inequal sum(n_node_samples)z: inequal n_node_samplesz: inequal impurityerr_msgz: inequal value)
node_countAssertionErrorformatr%   children_rightchildren_leftr   npZlogical_notfeature	thresholdn_node_samplessumr#   impurityr$   value)dsmessageZexternalinternal rr   [/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sklearn/tree/tests/test_tree.pyassert_tree_equal   s\    
      

        rt   c                  C   st   t  D ]f\} }|dd}|tt t|ttd	|  |ddd}|tt t|ttd	|  qd S )Nr   rK   Failed with {0}r3   )max_featuresrK   )
	CLF_TREESitemsfitrR   rS   r%   predictTtrue_resultrd   namer    clfrr   rr   rs   test_classification_toy   s    
r   c                  C   s   t  D ]x\} }|dd}|jtttttd t|	t
td|  |jtttttdd t|	t
td|  qd S )Nr   ru   sample_weightrv   r?   )rx   ry   rz   rR   rS   rg   oneslenr%   r{   r|   r}   rd   fullr~   rr   rr   rs    test_weighted_classification_toy   s    
r   r    	criterionc                 C   s   |dkr:t t td }t t| }t t| }nt}t}| |dd}|t| t|	t
| | |ddd}|t| t|	t
| d S )Nr0   r3   r   rK   r   rw   rK   )rg   absminrS   arrayr}   rz   rR   r   r{   r|   )r    r   ay_trainy_testregr   rr   rr   rs   test_regression_toy   s    r   c                  C   s   t d} d| d dd df< d| dd dd f< t | j\}}t | | gj}|  } t D ]r\}}|dd}|	||  |
|| dkstd||ddd}|	||  |
|| dksjtd|qjd S )	N)r<   r<   r3   r5   r   ru   rC   rv   rK   rw   )rg   r^   indicesshapevstackravelr|   rx   ry   rz   scorerc   rd   )rS   ZgridxZgridyrR   r   r    r   rr   rr   rs   test_xor  s    

r   c                  C   s   t t tD ]\\} }}||dd}|tjtj t|	tjtj}|dksdt
d| ||||ddd}|tjtj t|	tjtj}|dkst
d| ||qd S )Nr   r   rI   z0Failed with {0}, criterion = {1} and score = {2}rA   r   r?   )r   rx   ry   CLF_CRITERIONSrz   rT   datatargetr   r{   rc   rd   )r   r    r   r   r   rr   rr   rs   	test_iris,  s"        r   z
name, Treec                 C   s\   ||dd}| tjtj ttj|tj}|tdksXtd|  d| d| d S )Nr   r   zFailed with z, criterion = z and score = )	rz   rU   r   r   r   r{   pytestapproxrc   )r   r    r   r   r   rr   rr   rs   test_diabetes_overfit>  s    r   z&criterion, max_depth, metric, max_lossr-      <   r.   r/   r0   c                 C   sR   |||ddd}| tjtj |tj|tj}d|  k rH|k sNn td S )Nr>   r   )r   	max_depthrw   rK   )rz   rU   r   r   r{   rc   )r   r    r   r   ZmetricZmax_lossr   Zlossrr   rr   rs   test_diabetes_underfitK  s    r   c                  C   s   t  D ]\} }|dddd}|tjtj |tj}tt	|dt
tjjd d| d tt|d|tjd| d t|tjt|tjdd| d qd S )Nr3   *   )r   rw   rK   r   rv   r`   r@   )rx   ry   rz   rT   r   r   predict_probar$   rg   rk   r   r   rd   r%   Zargmaxr{   r#   exppredict_log_proba)r   r    r   Zprob_predictrr   rr   rs   test_probability`  s(    



r   c                  C   sP   t dd d t jf } t d}t D ] \}}|d dd}|| | q*d S )Ni'  r   r   rK   )rg   arangenewaxis	REG_TREESry   rz   rR   rS   r   r    r   rr   rr   rs   test_arrayreprz  s
    
r   c                  C   s   ddgddgddgddgddgddgg} ddddddg}t  D ]8\}}|dd}|| | t|| |d|d q@t D ]8\}}|dd}|| | t|| |d|d qd S )	Nr:   r9   r3   rA   r   ru   rv   r`   )rx   ry   rz   r%   r{   rd   r   r#   )rR   rS   r   TreeClassifierr   TreeRegressorr   rr   rr   rs   test_pure_set  s    (

r   c                  C   s   t ddddgddddgd	dddgd
dddgddddgddddgddddgg} t dddddddg}t jddZ t D ]J\}}|dd}|| | || |  ||  | ||  |  q~W 5 Q R X d S )Ngs_c@gd	a@g `8`@g?c@g_9a@g 8`@g-Vu]@g    @Xd@gSW j_@g ً`@g4Ta@g	lKa@g{c@g|@Y@g~G`a@gwI?lKa@g/"c@g_@g:^@rC   gAw?gtQ?5??rG   g7G?gۺ?gb'?raise)allr   ru   )rg   r   Zerrstater   ry   rz   r   rr   rr   rs   test_numerical_stability  s$    







r   c               	   C   s   t jdddddddd\} }t D ]d\}}|dd}|| | |j}t|dk}|jd dksrt	d	
||dks$t	d	
|q$tdd}|tjtj tdttjd
}|tjtj t|j|j d S )Ni  r<   r6   r   FrL   rM   n_informativen_redundantZ
n_repeatedshufflerK   ru   皙?rv   rK   max_leaf_nodes)r	   make_classificationrx   ry   rz   feature_importances_rg   rk   r   rc   rd   r   rT   r   r   r   r%   )rR   rS   r   r    r   ZimportancesZn_importantclf2rr   rr   rs   test_importances  s*    



r   c               	   C   s*   t  } tt t| d W 5 Q R X d S )Nr   )r   r   raises
ValueErrorgetattrr   rr   rr   rs   test_importances_raises  s    r   c               	   C   s   t jdddddddd\} }tdddd	| |}td
ddd	| |}t|j|j t|jj	|jj	 t|jj
|jj
 t|jj|jj t|jj|jj d S )Ni  r<   r6   r   Fr   r+   r5   )r   r   rK   r-   )r	   r   r   rz   r   r#   r   r%   tree_rh   rf   re   rj   )rR   rS   r   r   rr   rr   rs   )test_importances_gini_equal_squared_error  s4    
    r   c                  C   s  t  D ]\} }|dd}|tjtj |jtt	tjj
d ksLt|dd}|tjtj |jtttjj
d kst|dd}|tjtj |jdkst|dd}|tjtj |jdkst|dd}|tjtj |jdkst|dd}|tjtj |jtdtjj
d  ks8t|dd}|tjtj |jtjj
d ksjt|d d}|tjtj |jtjj
d kstqd S )	Nsqrt)rw   r3   log2r6   rF   r?   rC   )r1   ry   rz   rT   r   r   Zmax_features_intrg   r   r   rc   r   )r   TreeEstimatorestrr   rr   rs   test_max_features  s2    
 
 



 

r   c            	   
   C   s  t  D ]\} }| }tt |t W 5 Q R X |tt dddgg}tt	 || W 5 Q R X | }td d }tt	 |t| W 5 Q R X t
t}| }||t t|tt | }tt |t W 5 Q R X |tt t
t}tt	  ||d d dd f  W 5 Q R X t
tj}| }|t
t|t tt	 |t W 5 Q R X tt	 |t W 5 Q R X | }|tt tt	 || W 5 Q R X tt	 || W 5 Q R X | }tt |t W 5 Q R X qtdd}tjt	dd  |ddd	ggdddg W 5 Q R X tjt	d
d  |ddd	ggddd	g W 5 Q R X d S )Nr:   r9   r3   r0   r   zy is not positive.*Poissonmatchr   rA   zSome.*y are negative.*Poissonr5   g)rx   ry   r   r   r   r   rR   rz   rS   r   rg   asfortranarrayr#   r{   r|   r}   asarrayr   dotapplyr   )	r   r   r   X2y2ZXftZXtr   rr   rr   rs   
test_error  sX    

$
$r   c                  C   s   t jtjtjjd} tj}tdt	
 D ]\}}t	| }|d|dd}|| | |jj|jjdk }t |dkstd||d	|dd}|| | |jj|jjdk }t |dks(td|q(d
S )z Test min_samples_split parameterdtypeN  r<   r   )min_samples_splitr   rK   r9   	   rv   r8   N)rg   r   rT   r   r
   _treeDTYPEr   r   r1   keysrz   r   rj   rf   r   rc   rd   )rR   rS   r   r   r   r   Znode_samplesrr   rr   rs   test_min_samples_splitX  s(        r   c            	      C   s   t jtjtjjd} tj}tdt	
 D ]\}}t	| }|d|dd}|| | |j| }t |}||dk }t |dkstd||d|dd}|| | |j| }t |}||dk }t |dks(td|q(d S )	Nr   r   r5   r   )min_samples_leafr   rK   r2   rv   r   )rg   r   rT   r   r
   r   r   r   r   r1   r   rz   r   r   bincountr   rc   rd   )	rR   rS   r   r   r   r   outZnode_countsZ
leaf_countrr   rr   rs   test_min_samples_leafw  s0      
  
r   Fc                 C   s  |rt | d tj}nt | d tj}t | d }t|jd }t|}t|  }t	dt
dddD ]\}}	||	|dd}
|
j|||d	 |r|
j| }n|
j|}tj||d
}||dk }t|||
j ksptd| |
jqp|jd }t	dt
dddD ]\}}	||	|dd}
|
|| |rR|
j| }n|
j|}t|}||dk }t|||
j kstd| |
jqdS )zPTest if leaves contain at least min_weight_fraction_leaf of the
    training setr_   rR   rS   r   r   r?   r>   )min_weight_fraction_leafr   rK   r   )weightsz,Failed with {0} min_weight_fraction_leaf={1}N)DATASETSastyperg   float32rngrandr   rk   r1   r   linspacerz   r   r   tocsrr   r   r   rc   rd   )r   r	   sparserR   rS   r   total_weightr   r   fracr   r   node_weightsleaf_weightsrr   rr   rs   check_min_weight_fraction_leaf  s\    
   
  
 r   r   c                 C   s   t | d d S NrT   r   r   rr   rr   rs   ,test_min_weight_fraction_leaf_on_dense_input  s    r   c                 C   s   t | dd d S NrZ   Tr   r   rr   rr   rs   -test_min_weight_fraction_leaf_on_sparse_input  s    r   c                 C   s  |rt | d tj}nt | d tj}t | d }|jd }t|  }tdtdddD ]\}}|||ddd	}	|	|| |r|	j	
| }
n|	j	
|}
t|
}||dk }t|t||	j dks`td
| |	j|	jq`tdtdddD ]\}}|||ddd	}	|	|| |r>|	j	
| }
n|	j	
|}
t|
}||dk }t|t||	j ||	j kstd
| |	j|	jqdS )zzTest the interaction between min_weight_fraction_leaf and
    min_samples_leaf when sample_weights is not provided in fit.r_   rR   rS   r   r   r?   r6   r5   )r   r   r   rK   zBFailed with {0} min_weight_fraction_leaf={1}, min_samples_leaf={2}r   N)r   r   rg   r   r   r1   r   r   rz   r   r   r   r   r   maxr   rc   rd   r   )r   r	   r   rR   rS   r   r   r   r   r   r   r   r   rr   rr   rs   4check_min_weight_fraction_leaf_with_min_samples_leaf  sh    


   


  r   c                 C   s   t | d d S r   r   r   rr   rr   rs   Btest_min_weight_fraction_leaf_with_min_samples_leaf_on_dense_input  s    r   c                 C   s   t | dd d S r   r   r   rr   rr   rs   Ctest_min_weight_fraction_leaf_with_min_samples_leaf_on_sparse_input   s    r   c                 C   s  t jd| d\}}tdt D ]r\}}t| }||dd}||ddd}||ddd}||d	dd}	|d
f|df|df|	d	ffD ]\}
}|
j|kstd|
j||
|| t	|
j
jD ]}|
j
j| tkr|
j
j| }|
j
j| }|
j
j| }|
j
j| }|
j
j| }|| }|
j
j| }|
j
j| }|
j
j| }|| }|| }|| }|
j
j| |jd  }|||  }||kstd||qqq d S )Nd   rL   rK   r   r   r   rK   rE   )r   min_impurity_decreaserK   g-C6?r   gHz>z)Failed, min_impurity_decrease = {0} > {1}z2Failed with {0} expected min_impurity_decrease={1})r	   r   r   r1   r   r  rc   rd   rz   ranger   rb   rf   r   rl   weighted_n_node_samplesre   r   )Zglobal_random_seedrR   rS   r   r   r   Zest1est2Zest3Zest4r   Zexpected_decreasenodeZ
imp_parentZ
wtd_n_nodeleftZ
wtd_n_leftZimp_leftZwtd_imp_leftrightZwtd_n_rightZ	imp_rightZwtd_imp_rightZwtd_avg_left_right_impZfractional_node_weightZactual_decreaserr   rr   rs   test_min_impurity_decrease%  st            r  c                     s  t  D ]\} }d| kr(tjtj }}ntjtj }}|dd  ||  ||}dddddd	d
ddddddg} fdd|D }t	 }t
|}t| jkst|||}	||	kstd| |D ]*}
tt|j|
||
 d|
 d|  d qqdS )z8Test pickling preserves Tree properties and performance.
Classifierr   ru   r   rb   capacity	n_classesrf   re   Zn_leavesrh   ri   rl   rj   r  rm   c                    s   i | ]}|t  j|qS rr   )r   r   ).0	attributer   rr   rs   
<dictcomp>  s     ztest_pickle.<locals>.<dictcomp>z6Failed to generate same score  after pickling with {0}z"Failed to generate same attribute z after pickling with r`   N)r1   ry   rT   r   r   rU   rz   r   pickledumpsloadstype	__class__rc   rd   r%   r   r   )r   r   rR   rS   r   
attributesZfitted_attributeZserialized_objectr  Zscore2r  rr   r  rs   test_picklem  sL    




r  c                  C   s  ddgddgddgddgddgddgddgddgddgddgddgddgg} ddgddgddgddgddgddgddgddgddgddgddgddgg}ddgddgddgddgg}ddgddgddgddgg}t  D ]\}}|dd}|| ||}t|| |jdkst||}t|dks2t|d jdksFt|d jd	ksZt|	|}	t|	dksvt|	d jdkst|	d jd	kstqt
 D ]@\}}
|
dd}|| ||}t|| |jdkstqd S )
Nr:   r9   r3   rA   r   r6   ru   r2   rA   )r2   r2   )rx   ry   rz   r{   r%   r   rc   r   r   r   r   r#   )rR   rS   r|   Zy_truer   r   r   Zy_hatZprobaZ	log_probar   r   rr   rr   rs   test_multioutput  s\    





r  c                  C   s   t  D ]\} }|dd}|tt |jdks4tt|jddg t	
tt	td fj}|dd}|t| t|jdkstt|jdkstt|jddg t|jddgddgg qd S )Nr   ru   rA   r9   r3   r:   )rx   ry   rz   rR   rS   
n_classes_rc   r%   Zclasses_rg   r   r   r|   r   )r   r   r   _yrr   rr   rs   test_classes_shape  s    

r  c                  C   sf   t jd d } t jd d }td|}t D ]2\}}|dd}|j| ||d t|| | q.d S )N}   balancedr   ru   r   )	rT   r   r   r"   rx   ry   rz   r#   r{   )Zunbalanced_XZunbalanced_yr   r   r   r   rr   rr   rs   test_unbalanced_iris  s    

r!  c                  C   s  t t tjtjgD ]l\\} }}|dd}tjtj|d}tj	}t
||||| tjtjd|d}tj	}t
||||| tjtjd|d}tj	}t
||||| tjtj|d}tj	}t
||||| ttj|d}tj	}t
||||| ttj|d}tj	}t
||||| tjtjd d d |d}tj	d d d }t
||||| qd S )Nr   ru   r   C)orderr   Fr6   )r   r1   ry   rg   float64r   r   rT   r   r   r%   rz   r{   Zascontiguousarrayr   r   )r   r   r   r   rR   rS   rr   rr   rs   test_memory_layout  s4     

r&  c                  C   s  t dd d t jf } t d}d|d d< t d}d||dk< tdd}|j| ||d t|| t d t dd d t jf } t d}d|dd< d	|dd< d| dddf< t d}d
||d	k< tddd}|j| ||d |j	j
d dkstd||d	k< tddd}|j| ||d |j	j
d dksDttj} tj}td| jd d}tdd}|| | ||  t j|| jd d}tdd}|j| ||d |j	jtjjk}t|j	j
| |j	j
|  d S )Nr  rG   2   r   ru   r      r3   rA   gRQ?r   g     b@r?   g     H@)Z	minlength)rg   r   r   r   r   rz   r%   r{   r^   r   ri   rc   rT   r   r   r   randintr   r   rf   r
   r   r   r$   )rR   rS   r   r   
duplicatesr   rq   rr   rr   rs   test_sample_weight'  sF    







 
r+  c               	   C   s   t dd d t jf } t d}d|d d< tdd}t jdd}tt	 |j
| ||d W 5 Q R X t d}d}tjt|d	 |j
| ||d W 5 Q R X d S )
Nr  rG   r'  r   ru   r3   r   z3Singleton.* cannot be considered a valid collectionr   )rg   r   r   r   r   randomr   r   r   r   rz   r   	TypeError)rR   rS   r   r   Zexpected_errrr   rr   rs   test_sample_weight_invalid[  s    


r.  c           	      C   s  t |  }|dd}|tjtj |ddd}|tjtj t|j|j ttjtjtjfj	}|ddddddddddddgdd}|tj| t|j|j |ddd}|tj| t|j|j t
tjj}|tjdk  d	9  < dd
dd}|dd}|tjtj| ||dd}|tjtj t|j|j |dd}|tjtj|d  ||dd}|tjtj| t|j|j dS )z5Check class_weights resemble sample_weights behavior.r   ru   r   class_weightrK   g       @rC   )r   r3   rA   r3   r  g      Y@rA   N)rx   rz   rT   r   r   r#   r   rg   r   r|   r   r   )	r   r   clf1r   Z
iris_multiZclf3Zclf4r   r0  rr   rr   rs   check_class_weightsm  s@    





r2  c                 C   s   t |  d S N)r2  r   rr   rr   rs   test_class_weights  s    r4  c              	   C   sd   t |  }ttttd fj}|dddgdd}d}tjt|d |	t
| W 5 Q R X d S )	NrA   r?   rC   r9   r3   r   r/  zBnumber of elements in class_weight should match number of outputs.r   )rx   rg   r   rS   r   r|   r   r   r   rz   rR   )r   r   r  r   ra   rr   rr   rs   check_class_weight_errors  s    r6  c                 C   s   t |  d S r3  )r6  r   rr   rr   rs   test_class_weight_errors  s    r7  c                  C   sX   t jddd\} }d}t D ]4\}}|d |d d| |}| |d kstqd S Nr  r3   r  r2   )r   r   )r	   make_hastie_10_2r1   ry   rz   Zget_n_leavesrc   rR   rS   kr   r   r   rr   rr   rs   test_max_leaf_nodes  s
    r<  c                  C   sP   t jddd\} }d}t D ],\}}|d|d| |}| dkstqd S r8  )r	   r9  r1   ry   rz   Z	get_depthrc   r:  rr   rr   rs   test_max_leaf_nodes_max_depth  s
    r=  c                  C   sT   dD ]J} t t dgdggddgj| }d|jd   krDdk sn tdqd S )N)r  rm   rf   re   ri   rl   rh   rj   r   r3   r;   r6   z Array points to arbitrary memory)r   r   rz   r   flatrc   )attrrm   rr   rr   rs   test_arrays_persist  s    
"r@  c                  C   s\   t d} td}| ddd}t D ].\}}|dd}||| |jjdks(t	q(d S )Nr   )r<   rN   rA   )r<   ru   )
r*   rg   r^   r)  r1   ry   rz   r   r   rc   )rK   rR   rS   r   r   r   rr   rr   rs   test_only_constant_features  s    

rA  c                  C   s   t t dddddddddddggt df} ddddddddd	d	d	g}t D ]H\}}d
|krT|ddd}|| | |jjdkst	|jj
dksTt	qTd S )Nr   r3   rA   r2   r5   r>      )r2   r=   r6   Z	ExtraTreer   )rg   Z	transposer   r^   r1   ry   rz   r   r   rc   rb   rR   rS   r   r   r   rr   rr   rs   ,test_behaviour_constant_feature_after_splits  s    *rD  c                  C   s   t t dgdgdgdggt dg} t ddddg}t D ]H\}}|ddd}|| | |jjdkstt	t
|| t dd qDt D ]H\}}|ddd}|| | |jjdkst	t
|| t d	d qd S )
NrC   rG   )r2   r   r   r3   r   r  r?   )r2   )rg   Zhstackr   r^   rx   ry   rz   r   r   rc   r%   r   r   r   r{   rC  rr   rr   rs   (test_with_only_one_non_constant_features  s    *rE  c               	   C   sT   t ddt jdd} t }tjtdd |	| ddddg W 5 Q R X d S )Ng\)c=Hr2   r9   r3   r   r   r   )
rg   repeatr   r%  reshaper   r   r   r   rz   )rR   r   rr   rr   rs   test_big_input  s    rH  c               	   C   s,   ddl m}  tt |   W 5 Q R X d S )Nr   _realloc_test)Zsklearn.tree._utilsrJ  r   r   MemoryErrorrI  rr   rr   rs   test_realloc  s    rL  c               	   C   s   dt d } tjdd}tjddd}d| d  }td|d}tt	 |
|| W 5 Q R X d| d  d }td|d}tt |
|| W 5 Q R X d S )	Nr@   Pr<   rA   r   r3   best)splitterr   )structcalcsizerg   r,  randnr)  r   r   r   	Exceptionrz   rK  )Zn_bitsrR   rS   Zhuger   rr   rr   rs   test_huge_allocations  s    rT  c                 C   s<  t |  }t| d }t| d }t| d }|dkrf|jd d }|d | }|d | }|d | }tttfD ]}||}|d|d||}	|d|d||}
t|	j|
jd	|  |	
|}| tkr|	|}|	|}tttfD ]J}||tjd	}t|

|| | tkrt|
|| t|
|| qqpd S )
NrR   r_   rS   )rV   rU   r   r5   rK   r   5{0} with dense and sparse format gave different treesr   )r1   r   r   r   r   r   rz   rt   r   rd   r{   rx   r   r   rg   r   r$   )r
   datasetr   r   rR   r_   rS   rL   Zsparse_formatrn   ro   y_predZy_probaZy_log_probaZsparse_matrixX_sparse_testrr   rr   rs   check_sparse_input#  s>    


 rZ  	tree_typerW  )rX   rW   rV   rZ   r[   r\   r]   r^   c                 C   s    |dkrdnd }t | || d S )NrV   r6   rZ  )r[  rW  r   rr   rr   rs   test_sparse_inputN  s    r]  rU   rY   c                 C   s   t | |d d S )NrA   r\  )r[  rW  rr   rr   rs   test_sparse_input_reg_treesa  s    r^  c                 C   s  t |  }t| d }t| d }t| d }|dddd||}|dddd||}t|j|jd|  t|||| |ddd	d
||}|ddd	d
||}t|j|jd|  t|||| |d|jd d d||}|d|jd d d||}t|j|jd|  t|||| |ddd||}|ddd||}t|j|jd|  t|||| d S )NrR   r_   rS   r   r3   rA   )rK   rw   r   rV  r<   )rK   rw   r   )rK   r   r6   r   )	r1   r   rz   rt   r   rd   r$   r{   r   )r
   rW  r   rR   r_   rS   rn   ro   rr   rr   rs   check_sparse_parametersi  sT      r_  c           
      C   s   t |  }t| d }t| d }t| d }| tkr8tnt}|D ]\}|dd|d||}|dd|d||}	t|j|	jd|  t	|	
||
| q@d S )NrR   r_   rS   r   r6   rK   r   r   rV  )r1   r   r   REG_CRITERIONSr   rz   rt   r   rd   r$   r{   )
r
   rW  r   rR   r_   rS   Z
CRITERIONSr   rn   ro   rr   rr   rs   check_sparse_criterion  s"     rb  r[   r\   r]   r^   checkc                 C   s   || | d S r3  rr   )r[  rW  rc  rr   rr   rs   test_sparse  s    rd  c                 C   s|  t |  }|}t|}td}g }g }d}	|	g}
t|D ]^}||d}||d | }|| |jdd|fdd }|| |	|7 }	|
|	 q8t|}tj	t|tj
d}t|||
f||fd}| }t|||
f||fd}| }|jdd|fd}| }|jdk dks&t|jdk dks>t|d|d	||}|d|d	||}t|j|jd
|  ||f}t||D ]\}}t|j||j| t|||| t|||j| t|j| |j|  t|| ||  t|| |j|  t|||| | tkrt|||| qd S )Nr   r?   r6   rO   r3   r   r   rG   rU  rV  )r1   rg   r   r*   r  Zbinomialpermutationappendconcatenater   r   r   toarrayr   r)  copyr   rk   rc   rz   rt   r   rd   r   r$   r   decision_pathr{   rx   r   )r
   r   rM   r   rL   ZsamplesrK   r   r   offsetindptriZn_nonzero_iZ	indices_iZdata_ir_   rR   rY  X_testrS   rn   ro   ZXsZX1r   rr   rr   rs   check_explicit_sparse_zeros  sj    



   
rp  c                 C   s   t |  d S r3  )rp  )r[  rr   rr   rs   test_explicit_sparse_zeros  s    rq  c              	   C   s   t |  }tjd d df  }tjd d df d}tj}tt |dd	|| W 5 Q R X |dd}|	|| tt |
|g W 5 Q R X d S )Nr   r5  ru   )r1   rT   r   r   rG  r   r   r   r   rz   r{   )r   r   rR   ZX_2drS   r   rr   rr   rs   check_raise_error_on_1d_input  s    
rr  c              	   C   s   t   t|  W 5 Q R X d S r3  )r'   rr  r   rr   rr   rs   test_1d_input  s    rs  c                 C   sZ   | dd}|j |||d |jjdks*t| ddd}|j |||d |jjdksVtd S )Nr   ru   r   r3   g?)rK   r   )rz   r   r   rc   )r   rR   rS   r   r   rr   rr   rs   "_check_min_weight_leaf_split_level  s    
rt  c                 C   sf   t |  }tdgdgdgdgdgg}dddddg}dddddg}t|||| t|t||| d S )Nr   r3   r8   )r1   rg   r   rt  r   )r   r   rR   rS   r   rr   rr   rs   !check_min_weight_leaf_split_level%  s    ru  c                 C   s   t |  d S r3  )ru  r   rr   rr   rs    test_min_weight_leaf_split_level0  s    rv  c                 C   sD   t jtjjdd}t|   }|t t t|	t |j
	| d S NFrj  )X_smallr   r
   r   r   r1   rz   y_smallr%   r   r   r   Z	X_small32r   rr   rr   rs   check_public_apply5  s    
r|  c                 C   sH   t tjtjjdd}t|   }|tt t	|
t|j
| d S rw  )r   ry  r   r
   r   r   r1   rz   rz  r%   r   r   r{  rr   rr   rs   check_public_apply_sparse=  s    
r}  c                 C   s   t |  d S r3  )r|  r   rr   rr   rs   test_public_apply_all_treesE  s    r~  c                 C   s   t |  d S r3  )r}  r   rr   rr   rs   test_public_apply_sparse_treesJ  s    r  c                  C   sT   t j} t j}tddd| |}|| d d  }t|dddgdddgg d S )Nr   r3   rU  rA   )rT   r   r   r   rz   rk  ri  r%   )rR   rS   r   node_indicatorrr   rr   rs   test_decision_path_hardcodedO  s
    r  c                    s   t j}t j}|jd }t|  }|ddd}||| ||}|   j||jj	fks^t
||} fddt|D }t|tj|d |jjtk}	tt |	tj|d  jdd }
|jj|
kst
d S )	Nr   rA   rU  c                    s   g | ]\}} ||f qS rr   rr   )r  rn  jr  rr   rs   
<listcomp>f  s     z'check_decision_path.<locals>.<listcomp>re  r3   Zaxis)rT   r   r   r   r1   rz   rk  ri  r   rb   rc   r   	enumerater$   rg   r   rf   r   r   rk   r   r   )r   rR   rS   rL   r   r   Znode_indicator_csrleavesZleave_indicatorZ
all_leavesr   rr   r  rs   check_decision_pathW  s&    



 
r  c                 C   s   t |  d S r3  )r  r   rr   rr   rs   test_decision_patht  s    r  c              	   C   sB   t tt }}t|  }tt |dd|| W 5 Q R X d S )Nr   ru   )X_multilabelr   y_multilabelr1   r   r   r-  rz   )r   rR   rS   r   rr   rr   rs   check_no_sparse_y_supporty  s    r  c                 C   s   t |  d S r3  )r  r   rr   rr   rs   test_no_sparse_y_support  s    r  c                  C   s(  t dddd} | jdgdgdgdgdggdd	dd
dgdddddgd t| jjdddg t| jjjdddg | jdgdgdgdgdggdd	dd
dgt	dd t| jjdddg t| jjjd
ddg | jdgdgdgdgdggdd	dd
dgd t| jjdddg t| jjjd
ddg dS )aQ	  Check MAE criterion produces correct results on small toy dataset:

    ------------------
    | X | y | weight |
    ------------------
    | 3 | 3 |  0.1   |
    | 5 | 3 |  0.3   |
    | 8 | 4 |  1.0   |
    | 3 | 6 |  0.6   |
    | 5 | 7 |  0.3   |
    ------------------
    |sum wt:|  2.3   |
    ------------------

    Because we are dealing with sample weights, we cannot find the median by
    simply choosing/averaging the centre value(s), instead we consider the
    median where 50% of the cumulative weight is found (in a y sorted data set)
    . Therefore with regards to this test data, the cumulative weight is >= 50%
    when y = 4.  Therefore:
    Median = 4

    For all the samples, we can get the total error by summing:
    Absolute(Median - y) * weight

    I.e., total error = (Absolute(4 - 3) * 0.1)
                      + (Absolute(4 - 3) * 0.3)
                      + (Absolute(4 - 4) * 1.0)
                      + (Absolute(4 - 6) * 0.6)
                      + (Absolute(4 - 7) * 0.3)
                      = 2.5

    Impurity = Total error / total weight
             = 2.5 / 2.3
             = 1.08695652173913
             ------------------

    From this root node, the next best split is between X values of 3 and 5.
    Thus, we have left and right child nodes:

    LEFT                    RIGHT
    ------------------      ------------------
    | X | y | weight |      | X | y | weight |
    ------------------      ------------------
    | 3 | 3 |  0.1   |      | 5 | 3 |  0.3   |
    | 3 | 6 |  0.6   |      | 8 | 4 |  1.0   |
    ------------------      | 5 | 7 |  0.3   |
    |sum wt:|  0.7   |      ------------------
    ------------------      |sum wt:|  1.6   |
                            ------------------

    Impurity is found in the same way:
    Left node Median = 6
    Total error = (Absolute(6 - 3) * 0.1)
                + (Absolute(6 - 6) * 0.6)
                = 0.3

    Left Impurity = Total error / total weight
            = 0.3 / 0.7
            = 0.428571428571429
            -------------------

    Likewise for Right node:
    Right node Median = 4
    Total error = (Absolute(4 - 3) * 0.3)
                + (Absolute(4 - 4) * 1.0)
                + (Absolute(4 - 7) * 0.3)
                = 1.2

    Right Impurity = Total error / total weight
            = 1.2 / 1.6
            = 0.75
            ------
    r   r.   rA   )rK   r   r   r6   r5   r@   r>   rB  r2   333333?333333?r   rC   )rR   rS   r   g,d?gܶm۶m?g?g      @g      @ffffff?rB   gUUUUUU?rH   rQ   N)
r   rz   r   r   rl   r%   rm   r>  rg   r   )Zdt_maerr   rr   rs   test_mae  s$    J  4,r  c                  C   s   d} t jdt jd}d}dd }tjtj|fD ]}t D ]N\}}|| |}|| }|\}	\}
}}||	ksrt| |
ks~tt	|| q:t
 D ]P\}}|| |}|| }|\}	\}
}}||	kst| |
kst||kstqq.d S )Nr6   r   r  c                 S   s   t t | S r3  )r  r  r  )objrr   rr   rs   _pickle_copy  s    z)test_criterion_copy.<locals>._pickle_copy)rg   r   intprj  deepcopyr   ry   
__reduce__rc   r%   r   )	n_outputsr  rL   r  Z	copy_func_typenamecriteriaresultZ	typename_Z
n_outputs_r  Z
n_samples_rr   rr   rs   test_criterion_copy  s&    

r  c            
      C   s   t jdddd } t | d} | d d d df }t|}| d d df }||fD ]~}tdd||}|	|}t
t |jjtkd }||}t t |jj d }	t|	dkstt|dks\tq\d S )Nr   r  r=   g*Gr   r9   ru   )rg   r,  RandomStaterR  Z
nan_to_numr   r   r   rz   r   setwherer   rf   r   
differenceisfiniteri   r   rc   )
r   ZX_fullr_   rS   rR   r
   Zterminal_regionsZ	left_leafZ
empty_leafZinfinite_thresholdrr   rr   rs   "test_empty_leaf_infinite_threshold  s    

r  tree_clsc           	      C   s   t | }|d |d  }}|ddd}|||}|j}|j}tt|dksVttt|dksntt|||| d S NrR   rS   rN   r   r  	r   Zcost_complexity_pruning_pathZ
ccp_alphas
impuritiesrg   r   diffrc   assert_pruning_creates_subtree	r   rW  r  rR   rS   r   infopruning_pathr  rr   rr   rs   'test_prune_tree_classifier_are_subtrees  s    r  c           	      C   s   t | }|d |d  }}|ddd}|||}|j}|j}tt|dksVttt|dksntt|||| d S r  r  r  rr   rr   rs   'test_prune_tree_regression_are_subtrees*  s    r  c                  C   sX   t dd} | dgdggddg t ddd}|dgdggddg t| j|j d S )Nr   ru   r3   r<   )rK   	ccp_alpha)r   rz   assert_is_subtreer   )r1  r   rr   rr   rs   test_prune_single_node_tree<  s
    
r  c           	      C   s\   g }|D ]$}| d|dd ||}|| qt||dd  D ]\}}t|j|j q@d S )NrN   r   )r   r  rK   r3   )rz   rg  zipr  r   )	Zestimator_clsrR   rS   r  Z
estimatorsr  r   Zprev_estZnext_estrr   rr   rs   r  H  s     r  c           	      C   s  | j |j kst| j|jks t| j}| j}|j}|j}dg}|r| \}}t| j| |j|  t| j	| |j	|  t| j
| |j
|  t| j| |j|  || || krtt|j|  q>t| j| |j|  ||| || f ||| || f q>d S )N)r   r   )rb   rc   r   rf   re   popr$   rm   r#   rl   rj   r  r   ri   rg  )	r
   ZsubtreeZtree_c_leftZtree_c_rightZsubtree_c_leftZsubtree_c_rightstackZtree_node_idxZsubtree_node_idxrr   rr   rs   r  W  sF        r  rO  rN  r,  X_formatdenseZcsrcscc                 C   s   t d }|d jtjjdd}|dkr0t|}nN|d }|dkrH| }tj|j	tjjd|_	t|j	|j
|jf\|_	|_
|_ttjttjjd}t|  |d	}||| t|||| t|| ||  d S )
NrX   rR   Frx  r  r_   r  r   rO  )r   r   r
   r   r   r&   Ztocscrg   r   r   r   rm  rz  r1   rz   r%   r{   rk  Ztodense)r   rO  r  rW  ry  Z
X_readonlyZ
y_readonlyr   rr   rr   rs   "test_apply_path_readonly_all_trees  s.    
 r  c                 C   sL   t jt j }}|| d}||| t||tt|ksHt	d S )Nr   )
rU   r   r   rz   rg   rk   r{   r   r   rc   )r   r    rR   rS   r   rr   rr   rs   test_balance_property  s    
r  seedc              	   C   s*  ddgddgddgddgddgddgddgddgg}ddddddddg}t d| d}||| t||dksxtt d| d}||| t||dkstd	}tj|d d d
d||d d | d\}}d|d|k |dk @ < t	|}t d| d}||| t||dks&td S )Nr   r3   rA   r6   r2   r-   r   r0   r<   r  r   )Zeffective_rankZtail_strengthrL   rM   r   rK   r9   )
r   rz   rg   Zaminr{   rc   r   r	   make_regressionr   )r  rR   rS   r   rM   rr   rr   rs   test_poisson_zero_nodes  s,    4


	
r  c                  C   sF  t jd} d\}}}tj|| || d}| jdd|dt j|dd }| jt || d	}t	|||| d
\}}}	}
t
dd| d}t
dd| d}|||	 |||	 tdd||	}||	df||
dffD ]p\}}}t|||}t|t ||dd }t|||}|dkr0|d| k s0t|d| k stqd S )Nr   )  r  r<   rL   rM   rK   r:   rA   )lowhighrP   r   r  )Zlam)Z	test_sizerK   r0   r<   )r   r   rK   r-   mean)ZstrategytraintestgV瞯<r?   g      ?)rg   r,  r  r	   Zmake_low_rank_matrixuniformr   r0   r   r   r   rz   r   r   r{   Zcliprc   )r   Zn_trainZn_testrM   rR   ZcoefrS   X_trainro  r   r   Ztree_poiZtree_msedummyvalZ
metric_poiZ
metric_mseZmetric_dummyrr   rr   rs   test_poisson_vs_mse  sF    
         
r  c                 C   s4  t | d}tf |ddi}dD ]}td|  |dd q tjd}d	\}}|||}tj|d
d|| }|t|d 7 }tj	||d|d  gdd}	t	||d|d  g}
t
t|}d|d|d < tf |j|||d}tf |j|	|
dd}|jj|jjkstt|||| dS )z4Test that the impact of sample_weight is consistent.r   rK   r   )r^   r   ZDecisionTreeRegressor_r^   )kindr   )r<   r5   r3   r  r   NrA   r   )dictr   r)   rg   r,  r  r   r  r   rh  r   r   rz   r   rb   rc   r   r{   )r   Ztree_paramsr
   r  r   rL   rM   rR   rS   r   r   Zsample_weight_1Ztree1Ztree2rr   rr   rs   6test_decision_tree_regressor_sample_weight_consistency  s2    
  
  r  r  c                 C   sz   d\}}t j||||ddd\}}| ddd||}| ddd||}t|j|j| d	 t|||| d
S )z3Test that criterion=entropy gives same as log_loss.)r'  r5   r   r   )r  rL   rM   r   r   rK   r,   +   r   entropyz> with criterion 'entropy' and 'log_loss' gave different trees.N)r	   r   rz   rt   r   r   r{   )r    r  rL   rM   rR   rS   Ztree_log_lossZtree_entropyrr   rr   rs   'test_criterion_entropy_same_as_log_loss  s"    
r  c                     sv   t jdd\} }tddd  | |  | |}dd  fdd}t| }|| |}t||srt	d S )	Nr   ru   r6   rU  c                 S   s   |     S r3  )byteswapnewbyteorderr  )arrrr   rr   rs   reduce_ndarray>  s    z8test_different_endianness_pickle.<locals>.reduce_ndarrayc                     sB   t  } t| }tj |_|jtj< |	  | 
d | S Nr   )ioBytesIOr  Picklercopyregdispatch_tablerj  rg   ndarraydumpseekfpr   r  rr   rs    get_pickle_non_native_endiannessA  s    


zJtest_different_endianness_pickle.<locals>.get_pickle_non_native_endianness)
r	   r   r   rz   r   r  loadrg   iscloserc   )rR   rS   r   r  new_clf	new_scorerr   r  rs    test_different_endianness_pickle7  s    
r  c                     s~   t jdd\} }tddd| | | |}G dd dt  fdd}t| }|| |}t	||szt
d S )	Nr   ru   r6   rU  c                       s   e Zd Z fddZ  ZS )zPtest_different_endianness_joblib_pickle.<locals>.NonNativeEndiannessNumpyPicklerc                    s(   t |tjr|  }t | d S r3  )
isinstancerg   r  r  r  supersave)selfr  r  rr   rs   r  X  s    zUtest_different_endianness_joblib_pickle.<locals>.NonNativeEndiannessNumpyPickler.save)__name__
__module____qualname__r  __classcell__rr   rr   r  rs   NonNativeEndiannessNumpyPicklerW  s   r  c                     s(   t  }  | }| | d | S r  )r  r  r  r  r  r  r   rr   rs   'get_joblib_pickle_non_native_endianness]  s
    

zXtest_different_endianness_joblib_pickle.<locals>.get_joblib_pickle_non_native_endianness)r	   r   r   rz   r   r   joblibr  rg   r  rc   )rR   rS   r   r  r  r  rr   r  rs   'test_different_endianness_joblib_pickleP  s    r  c                 C   sr   t r
tjntj}ddddg}dd | jj D }|D ]}|||< q6tt| t|	 d}| j
|dd	S )
N
left_childZright_childrh   rj   c                 S   s   i | ]\}\}}||qS rr   rr   r  r   r   r  rr   rr   rs   r  p  s   
  z6get_different_bitness_node_ndarray.<locals>.<dictcomp>namesformats	same_kindZcasting)r!   rg   int64int32r   fieldsry   listr   valuesr   )node_ndarrayZnew_dtype_for_indexing_fieldsZindexing_field_namesnew_dtype_dictr   	new_dtyperr   rr   rs   "get_different_bitness_node_ndarrayj  s    

r  c                 C   sj   dd | j j D }dd | j j D }dd |D }t t| t| |d}| j|ddS )	Nc                 S   s   i | ]\}\}}||qS rr   rr   r  rr   rr   rs   r  }  s   
  z8get_different_alignment_node_ndarray.<locals>.<dictcomp>c                 S   s   g | ]\}}|qS rr   rr   )r  r   rl  rr   rr   rs   r    s     z8get_different_alignment_node_ndarray.<locals>.<listcomp>c                 S   s   g | ]}d | qS )r@   rr   )r  rl  rr   rr   rs   r    s     )r  r  offsetsr  r  )r   r  ry   r  rg   r  r   r   )r   r  r  Zshifted_offsetsr  rr   rr   rs   $get_different_alignment_node_ndarray|  s    


r  c           	      C   sZ   t r
tjntj}|  \}\}}}}|j|dd}| }t|d |d< ||||f|fS )Nr  r  Znodes)r!   rg   r  r  r  r   rj  r  )	r
   r  r  rM   r  r  stateZnew_n_classes	new_staterr   rr   rs   "reduce_tree_with_different_bitness  s    r  c                     sn   t jdd\} }tddd  | |  | |} fdd}t| }|| |}|t|ksjt	d S )Nr   ru   r6   rU  c                     s@   t  } t| }tj |_t|jt< |	  | 
d | S r  )r  r  r  r  r  r  rj  r  
CythonTreer  r  r  r   rr   rs   "pickle_dump_with_different_bitness  s    



zItest_different_bitness_pickle.<locals>.pickle_dump_with_different_bitness)
r	   r   r   rz   r   r  r  r   r   rc   )rR   rS   r   r
  r  r  rr   r   rs   test_different_bitness_pickle  s    
r  c                     sn   t jdd\} }tddd  | |  | |} fdd}t| }|| |}|t|ksjt	d S )Nr   ru   r6   rU  c                     s>   t  } t| }tj |_t|jt< |  | 	d | S r  )
r  r  r   r  r  rj  r  r	  r  r  r  r   rr   rs   "joblib_dump_with_different_bitness  s    


zPtest_different_bitness_joblib_pickle.<locals>.joblib_dump_with_different_bitness)
r	   r   r   rz   r   r  r  r   r   rc   )rR   rS   r   r  r  r  rr   r   rs   $test_different_bitness_joblib_pickle  s    
r  c               	   C   s   t rttjn
ttj} ttjttjg}|dd |D 7 }tjddg| d}|D ]}t|||  q\tj	t
dd$ tjddgg| d}t||  W 5 Q R X tj	t
dd |tj}t||  W 5 Q R X d S )	Nc                 S   s   g | ]}|  qS rr   )r  )r  dtrr   rr   rs   r    s     z(test_check_n_classes.<locals>.<listcomp>r   r3   r   zWrong dimensions.+n_classesr   zn_classes.+incompatible dtype)r!   rg   r   r  r  r   r   r   r   r   r   r%  )expected_dtypeallowed_dtypesr  r  Zwrong_dim_n_classesZwrong_dtype_n_classesrr   rr   rs   test_check_n_classes  s    r  c               
   C   s   t t j} d}t j|| d}| |  g}|D ]}t|||d q.tjtdd t|| dd W 5 Q R X |d d d d d df t 	|fD ].}tjtdd t|| |j
d W 5 Q R X qtjtd	d t|t j| |d W 5 Q R X d S )
N)r5   r3   rA   r   )r  expected_shapezWrong shape.+value arrayr   )r3   rA   r3   zvalue array.+C-contiguouszvalue array.+incompatible dtype)rg   r   r%  r^   r  r   r   r   r   r   r   r   r   )r  r  Zvalue_ndarrayr  r  Zproblematic_arrrr   rr   rs   test_check_value_ndarray  s:        (
r  c               	   C   s  t } tjd| d}|t|t|g}|dd |D 7 }|D ]}t|| d q:tjtdd  tjd| d}t|| d W 5 Q R X tjtd	d  |d d d
 }t|| d W 5 Q R X dd |j	j
 D }| }tj|d< t	t| t| d}||}tjtdd t|| d W 5 Q R X | }tj|d< t	t| t| d}||}tjtdd t|| d W 5 Q R X d S )N)r5   r   c                 S   s   g | ]}| |j qS rr   )r   r   r  )r  r  rr   rr   rs   r  	  s    z+test_check_node_ndarray.<locals>.<listcomp>)r  zWrong dimensions.+node arrayr   )r5   rA   znode array.+C-contiguousrA   c                 S   s   i | ]\}\}}||qS rr   rr   r  rr   rr   rs   r  	  s    
  z+test_check_node_ndarray.<locals>.<dictcomp>ri   r  znode array.+incompatible dtyper  )r   rg   r^   r  r  r   r   r   r   r   r  ry   rj  r  r  r   r  r   r%  )r  r   Zvalid_node_ndarraysr  Zproblematic_node_ndarrayZ
dtype_dictr  r  rr   rr   rs   test_check_node_ndarray  sD    



r  Splitterc           	      C   s|   t jd}d}dt jddgt jd }}td ||}| ||dd|}t|}t|}|j	|ksjt
t|| sxt
d	S )
z&Check that splitters are serializable.r   r<   rA   r6   r   r+   r5   r?   N)rg   r,  r  r   r  r   r  r  r  rw   rc   r  )	r  r   rw   r  r  r   rO  Zsplitter_serializeZsplitter_backrr   rr   rs   test_splitter_serializable0	  s    

r  c                 C   sR   t | d}tdd}|tt t|| tj|dd}t	|j
|j
d dS )zhCheck that Trees can be deserialized with read only buffers.

    Non-regression test for gh-25584.
    z
clf.joblibr   ru   r)Z	mmap_modez?The trees of the original and loaded classifiers are not equal.N)strjoinr   rz   ry  rz  r  r  r  rt   r   )ZtmpdirZpickle_pathr   Z
loaded_clfrr   rr   rs   /test_tree_deserialization_from_read_only_bufferB	  s    
r  c              	   C   sn   t ddgddgg}t ddg}| dd|| | dd}d}tjt|d ||| W 5 Q R X dS )zhCheck that an error is raised when min_sample_split=1.

    non-regression test for issue gh-25481.
    r   r3   rC   )r   zb'min_samples_split' .* must be an int in the range \[2, inf\) or a float in the range \(0.0, 1.0\]r   N)rg   r   rz   r   r   r   )r    rR   rS   r
   msgrr   rr   rs   test_min_sample_split_1_errorU	  s    
r  c                 C   s   t ddddddddd	g	gj}t d
ddddddddg	}tdd| d}||| |t jgg}t|t |dd g |dd }|dd }tdd| d}||| |t jgg}t|t |dd g dS )z<Check missing values goes to correct node during predictionsr   r3   rA   r6   r@   r   r=      r   r   r8   r  r  rB   g?g@r   r`  r7   Nr9   r4   )	rg   r   r|   r   rz   r{   nanr   r  )r   rR   rS   dtcrX  ZX_equalZy_equalrr   rr   rs   -test_missing_values_on_equal_nodes_no_missingk	  s     r   r  r+   c                 C   s   d}t t jgd dddddddd	g gj}t |gd dgd  dgd  }td
d| d}||| t t jdd	ggj}||}t||ddg dS )zITest when missing values are uniquely present in a class among 3 classes.r   r2   r3   rA   r6   r@   r   r=   r  r   r`  Nrg   r   r  r|   r   rz   r{   r%   )r   Zmissing_values_classrR   rS   r  ro  Z
y_nan_predrr   rr   rs   /test_missing_values_best_splitter_three_classes	  s    *$
r"  c              	   C   s   t t jgd ddddddg gj}t dgd dgd  }tdd| d	}||| t t jdt jggj}||}t|dddg d
S )zMissing values spanning only one class at fit-time must make missing
    values at predict-time be classified has belonging to this class.r2   r   r3   rA   r6   r5   r>   r   r`  Nr!  r   rR   rS   r  ro  rX  rr   rr   rs   )test_missing_values_best_splitter_to_left	  s    &
r$  c              	   C   s   t t jgd ddddddg gj}t dgd dgd  dgd  }tdd| d}||| t t jd	d
ggj}||}t|dddg dS )zMissing values and non-missing values sharing one class at fit-time
    must make missing values at predict-time be classified has belonging
    to this class.r2   r   r3   rA   r6   r5   r   r`  rD   g333333@Nr!  r#  rr   rr   rs   *test_missing_values_best_splitter_to_right	  s    &$
r%  c                 C   s   t ddddt jddddt jg
gj}t d	gd dgd  }td
d| d}||| t t jddggj}||}t|dd	dg dS )zNCheck behavior of missing value when there is one missing value in each class.r3   rA   r6   r5   r<   rN   rJ   r   r   r   r`  gffffff@gA@Nr!  r#  rr   rr   rs   0test_missing_values_missing_both_classes_has_nan	  s    &
r&  	is_sparseTr
   r  r   c                 C   sv   t ddddt jddddt jg
gj}t d	gd dgd  }| rLt|}tjtd
d ||| W 5 Q R X dS )z4Check unsupported configurations for missing values.r3   rA   r6   r5   r<   rN   rJ   r   r   zInput X contains NaNr   N)	rg   r   r  r|   r   r   r   r   rz   )r'  r
   rR   rS   rr   rr   rs   test_missing_value_errors	  s    &r(  c                  C   sp   t j t j } }tj| ddddf< tj| ddddf< tddd}|| | || }|d	k	 slt
dS )
z5Smoke test for poisson regression and missing values.Nr5   r   r>   r9   r0   r   r   rG   )rU   r   rj  r   rg   r  r   rz   r{   r   rc   )rR   rS   r   rX  rr   rr   rs   test_missing_values_poisson	  s    
r)  zmake_data, Treesample_weight_trainr   c                 C   s   t jd}d\}}| |||d\}}| }t j||jddg|jddgd< t||dd	\}	}
}}|d
kr|t |	jd }||d	}|j	|	||d |
|
|}t||dd	\}}}}||d	}|j	|||d |
||}|d| kstdS )zJCheck that trees can deal with missing values and have decent performance.r   )r   r'  r  FTrI   r   rP   r  ru   r   r   N)rg   r,  r  rj  r  choicer   r   r   rz   r   rc   )	make_datar    r*  r   rL   rM   rR   rS   Z	X_missingZX_missing_trainZX_missing_testr   r   Ztree_with_missingZscore_with_missingr  ro  r
   Zscore_without_missingrr   rr   rs   !test_missing_values_is_resilience	  s(       

r.  c                  C   s   t jd} d}| j|dfd}| jdd|d}| jddg|d	d
gd}| t}||  ||< | j|d}t j	||< ||dddf< t
||| d\}}}	}
t| d||	}|||	dkst|||
dkstdS )z@Check the tree learns when only the missing value is predictive.r   r   r<   rO   rA   )r  rP   FTgffffff?rE   r+  Nr5   ru   g333333?)rg   r,  r  Zstandard_normalr)  r,  rj  r   boolr  r   r   rz   r   rc   )r   rL   rR   rS   ZX_random_maskZy_maskZX_predictiver  ro  r   r   r
   rr   rr   rs    test_missing_value_is_predictive
  s    
r0  c           
      C   s   t jd}d\}}| |||d\}}t j||jddg|jddgd< t |jd }d	|d
d
d< |dd}|j|||d |dd}	|	|dd
dd
d
f |dd
d  t|		||	| d
S )z=Check sample weight is correctly handled with missing values.r   )r   r<   r  FTrI   r   r+  rG   NrA   ru   r   r3   )
rg   r,  r  r  r,  r   r   rz   r   r{   )
r-  r    r   rL   rM   rR   rS   r   Ztree_with_swZtree_samples_removedrr   rr   rs   test_sample_weight_non_uniform*
  s    	 

(r1  )F)F)N)r6   r<   )__doc__rj  r  r  r  rP  	itertoolsr   r   r  numpyrg   r   Zjoblib.numpy_pickler   Znumpy.testingr   Zscipy.sparser   r   r   Zsklearnr	   r
   Zsklearn.dummyr   Zsklearn.exceptionsr   Zsklearn.metricsr   r   r   Zsklearn.model_selectionr   Zsklearn.random_projectionr   Zsklearn.treer   r   r   r   Zsklearn.tree._classesr   r   r   r   Zsklearn.tree._treer   r   r   r   r   r   r    r	  Zsklearn.utilsr!   r"   Zsklearn.utils._testingr#   r$   r%   r&   r'   r(   Zsklearn.utils.estimator_checksr)   Zsklearn.utils.validationr*   r   ra  rx   r   r  r1   __annotations__updateZSPARSE_TREESr   ry  rz  Zy_small_regrR   rS   r|   r}   Z	load_irisrT   r,  r  r   rf  r   rP   permr   Zload_diabetesrU   Zload_digitsrV   rK   Zmake_multilabel_classificationr  r  r  ZX_sparse_posr)  Zy_randomri  ZX_sparse_mixr^   r   r   rt   r   r   markZparametrizer  r   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r!  r&  r+  r.  r2  r4  r6  r7  r<  r=  r@  rA  rD  rE  rH  rL  rT  rZ  r]  sortedr  intersectionr^  r_  rb  rd  rp  rq  rr  rs  rt  ru  rv  r|  r}  r~  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r$  r%  r&  r(  r)  r  r   r.  r0  r1  rr   rr   rr   rs   <module>   s    

2(
  

'



	
$B!=

<

H3<+4/

		
+3F








d (!*%!4 
 