a
    �ù»jP� ã                   @   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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 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*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl3m;Z< ddl=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZDmEZE ddlFmGZGmHZHmIZImJZJ ddlKmLZL dZMdZNe(e*dœZOe)e+dœZPeQƒ ZReQeSd< eR TeO¡ eR TeP¡ g d¢ZUe Vg d¢g d¢g d¢g d¢g d ¢g d!¢g d"¢g d#¢g d$¢g d%¢g d&¢g d'¢g d(¢g d)¢g d*¢g d+¢g d,¢g d-¢g d.¢g d/¢g d0¢g d1¢g d2¢g¡ZWg d3¢ZXg d4¢ZYd5d6gd6d6gd6d5gd7d7gd7d8gd8d7ggZZg d9¢Z[d6d6gd8d8gd:d8ggZ\g d;¢Z]e ^¡ Z_ej` ad7¡Zbeb ce_jdje¡Zfe_jgef e__ge_jdef e__de h¡ Zieb ceijdje¡Zfeijgef ei_geijdef ei_de j¡ Zkeb cekjdje¡Zfekjgef ek_gekjdef ek_deLdƒZlejmdd<d=d>�\ZnZoeljpd?d@�ZqdAeqeqdBk< eljrddCdDd@�Zse&dEd=dFddG� t¡ Zue_jge_jddHœeijgeijddHœekjgekjddHœeZe[dHœeWeXdHœeWeYdHœeneodHœeqesdHœeq esdHœeuesdHœe vdI¡esdHœdJœZwdKdL„ ZxdMdN„ ZydOdP„ Zzej{ |dQeP }¡ ¡ej{ |dReN¡dSdT„ ƒƒZ~dUdV„ ZdWdX„ Z€ej{ |dYeP �¡ ¡ej{ |dReN¡dZd[„ ƒƒZ‚eEej{ |dYeP �¡ ¡ej{ |d\d]d^ed_fd`dEed_fdad^ed_fdbd^ed<fg¡dcdd„ ƒƒƒZƒdedf„ Z„dgdh„ Z…didj„ Z†dkdl„ Z‡dmdn„ Zˆdodp„ Z‰dqdr„ ZŠdsdt„ Z‹dudv„ ZŒdwdx„ Z�dydz„ ZŽ�dKd{d|„Z�ej{ |d}eR¡d~d„ ƒZ�ej{ |d}eU¡ej{ |d€eI¡d�d‚„ ƒƒZ‘�dLdƒd„„Z’ej{ |d}eR¡d…d†„ ƒZ“ej{ |d}eU¡ej{ |d€eI¡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œej{ |d}eO¡d™dš„ ƒZ�ej{ |d}eO¡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§�dMd¯d°„Z¨ej{ |d±eU¡ej{ |d²d³¡d´dµ„ ƒƒZ©ej{ |d±eªe«eUƒ ¬eP¡ƒ¡ej{ |d²d¶d·g¡d¸d¹„ ƒƒZ­ej{ |d±eU¡ej{ |d²g dº¢¡ej{ |d€eI¡d»d¼„ ƒƒƒZ®ej{ |d½e¯e	d¾d¿„ eUD ƒeNƒƒe¯e	dÀd¿„ eUD ƒeMƒƒ ¡ej{ |d²g dº¢¡ej{ |d€eI¡dÁdÂ„ ƒƒƒZ°ej{ |d±eU¡ej{ |dÃe±eIeJƒ¡dÄdÅ„ ƒƒZ²dÆdÇ„ Z³ej{ |d}eR¡dÈdÉ„ ƒZ´ej{ |d}eR¡ej{ |dÊdgeI ¡dËdÌ„ ƒƒZµej{ |d}eR¡dÍdÎ„ ƒZ¶ej{ |d}eU¡ej{ |dÏeJ¡dÐdÑ„ ƒƒZ·dÒdÓ„ Z¸ej{ |d}eR¡dÔdÕ„ ƒZ¹ej{ |d}eR¡ej{ |dÏeJ¡dÖd×„ ƒƒZºdØdÙ„ Z»dÚdÛ„ Z¼ej{ |dÊdgeI ¡dÜdÝ„ ƒZ½ej{ |d²eªe«ew ¾¡ ƒd·d¶h ƒ¡ej{ |dÞe(e*g¡dßdà„ ƒƒZ¿ej{ |d²ew ¾¡ ¡ej{ |dÞe)e+g¡dádâ„ ƒƒZÀdãdä„ ZÁdådæ„ ZÂdçdè„ ZÃej{ |d}eR¡ej{ |dédêdëg¡ej{ |dÊdgeI eJ ¡dìdí„ ƒƒƒZÄej{ |dRg dî¢¡ej{ |dQeP }¡ ¡dïdð„ ƒƒZÅej{ |dñeÆd:ƒ¡dòdó„ ƒZÇdôdõ„ ZÈej{ |dQe(e*g¡ej{ |död8dCg¡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„ ZÓej{ |�dee/ }¡ e0 }¡ ƒ¡�d�d„ ƒZÔ�d�d„ ZÕej{ |dQeR }¡ ¡�d�d„ ƒZÖej{ |dRd]dag¡�d�d„ ƒZ×ej{ |dñeÆd:ƒ¡ej{ |dRd]dag¡�d�d„ ƒƒZØej{ |dR�d�dg¡�d�d„ ƒZÙej{ |dR�d�dg¡�d�d„ ƒZÚej{ |dR�d�dg¡�d�d„ ƒZÛej{ |dR�d�dg¡�d �d!„ ƒZÜej{ |dÊdgeJ ¡ej{ |�d"e)d`�d#�e+d`�d#�g¡�d$�d%„ ƒƒZÝej{ |dQeP }¡ ¡�d&�d'„ ƒZÞ�d(�d)„ Zßej{ |�d*ejàe)dfejàe+�d+feße(�d,feße*�d-fg¡ej{ |�d.d�d/g¡�d0�d1„ ƒƒZáej{ |�d2e±eO }¡ �d3�d4gƒ¡�d5�d6„ ƒZâej{ |�d7ejãe)fejäe(fg¡�d8�d9„ ƒZå�d:�d;„ Zæej{ |dQe)e+g¡ej{ |�d<e Vejçd8ejçdC�d=�d>g¡e Vejçejçd:dC�d=�d>g¡e Vd7d8d:dCejçejçg¡e Vd7d8d:ejç�d>ejçg¡g¡ej{ |dRd]dag¡�d?�d@„ ƒƒƒZè�dA�dB„ Zé�dC�dD„ Zê�dE�dF„ Zë�dG�dH„ Zì�dI�dJ„ ZídS (N  z-
Testing for the tree module (sklearn.tree).
é    N)ÚchainÚproduct)ÚNumpyPickler)Úassert_allclose)ÚcloneÚdatasetsÚtree)ÚDummyRegressor)ÚNotFittedError)ÚSimpleImputer)Úaccuracy_scoreÚmean_poisson_devianceÚmean_squared_error)Úcross_val_scoreÚtrain_test_split)Úmake_pipeline)Ú_sparse_random_matrix)ÚDecisionTreeClassifierÚDecisionTreeRegressorÚExtraTreeClassifierÚExtraTreeRegressor)ÚCRITERIA_CLFÚCRITERIA_REGÚDENSE_SPLITTERSÚSPARSE_SPLITTERS)Ú_py_sort)Ú
NODE_DTYPEÚ	TREE_LEAFÚTREE_UNDEFINEDÚ_build_pruned_tree_pyÚ_check_n_classesÚ_check_node_ndarrayÚ_check_value_ndarray)ÚTree)Úcompute_sample_weight)Úassert_almost_equalÚassert_array_almost_equalÚassert_array_equalÚcreate_memmap_backed_dataÚignore_warningsÚskip_if_32bit)Ú	_IS_32BITÚCOO_CONTAINERSÚCSC_CONTAINERSÚCSR_CONTAINERS)Úcheck_random_state)ÚginiÚlog_loss)Úsquared_errorÚabsolute_errorÚfriedman_mseÚpoisson)r   r   )r   r   Ú	ALL_TREES)r   r   é   r   r   r   é   iòÿÿÿr   éüÿÿÿr   r   r   r   )r   r   é   é   r   r9   r   r   r8   éûÿÿÿçš™™™™™É?r   r7   r8   )éÿÿÿÿr>   r   r   ç      Àr   r   çÍÌÌÌÌÌ @r8   r   r   r?   r   r8   )r>   r>   r   g333333ó¿r   r   r   r   r   r   r=   r   r   r8   )r>   r>   r   r   r   r   r   r;   r   r   r   r   r   r8   )r>   éþÿÿÿr   r7   éýÿÿÿé
   r7   r   çš™™™™™	Àr   r7   r;   r9   r8   )çáz®Gá @r   éúÿÿÿç      à¿r   é   r   r   rD   é   ç      à?r   rB   r8   )rE   r   rF   rG   r   rH   r   r   rD   rI   r   r   rA   r8   )rE   é   rF   rG   r   rH   r   r   rD   rI   r   r   rA   r8   )rE   rK   rF   rG   r   rH   r   r   rD   rI   rJ   r   r>   r   )é   rK   r:   r8   rJ   r9   rC   r   r8   r<   r;   r   rL   r   )rL   r   r8   r8   r8   r>   r8   r   r   rA   r;   r   r8   r   )rL   r   r8   rL   r;   r>   rC   rL   r   r>   r8   rL   rL   r   )r8   r8   r   rL   rL   r>   r8   rL   r   r<   r8   rL   r;   r   )r;   r8   r   r;   r   r9   rC   r   r8   r<   r;   r   r;   r8   )rE   rK   rF   rG   r   r8   r   r   rD   rI   rJ   r   rB   r8   )rE   rK   rF   rG   r   r8   r   r   rD   rI   ç      ø?r8   r>   r>   )rE   rK   rF   rG   r   rC   r   r   rD   rI   rJ   r   r>   r>   )rL   r   r:   r8   rJ   rA   rC   r   r8   r<   r;   r8   r   r>   )rL   r   r8   r8   r8   rA   r8   r   r   rA   r   r   r   r8   )rL   r8   r8   r8   rL   r>   rC   rL   r   r>   r   rL   r8   r8   )r8   r8   r   r   r8   rB   r8   rL   r   r<   r8   rL   r8   r8   )r;   r8   r   r8   r   r9   r8   r   r8   rA   r   r   r8   r   )r8   r8   r   r   r   r   r8   r8   r8   r8   r8   r8   r   r   r   r8   r   r   r8   r   r   r   r   )ç      ð?r@   ç333333ó?çš™™™™™©?rC   g333333@çÍÌÌÌÌÌ@g)\�Âõ(ð?ç{®Gáz„?g×£p=
×@rQ   gš™™™™™ñ?ç        rO   rL   rH   r   r   ç      @gî|?5^ºÉ?gö(\�Âõð?çÍÌÌÌÌÌì?r   rA   r>   r8   rL   )r>   r>   r>   r8   r8   r8   r;   )r>   r8   r8   é   rC   )Úrandom_stateÚ	n_samplesÚ
n_features)é   r:   ©ÚsizerS   gš™™™™™é?r7   )rZ   rZ   g      Ð?)ZdensityrW   ©ÚXÚy)rZ   r;   )ÚirisÚdiabetesÚdigitsÚtoyÚ	clf_smallÚ	reg_smallÚ
multilabelú
sparse-posú
sparse-negú
sparse-mixÚzerosc                 C   sþ   |j | j ks"J 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Úformatr'   Úchildren_rightÚchildren_leftr   ÚnpZlogical_notÚfeatureÚ	thresholdÚn_node_samplesÚsumr%   Úimpurityr&   Úvalue)ÚdÚsÚmessageZexternalÚinternal© r|   úBE:\soccer\ml_env\Lib\site-packages\sklearn/tree/tests/test_tree.pyÚassert_tree_equalÈ   s@    
ÿ
ÿþÿÿ

ÿÿýÿÿr~   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   ©rW   úFailed with {0}r8   )Úmax_featuresrW   )
Ú	CLF_TREESÚitemsÚfitr^   r_   r'   ÚpredictÚTÚtrue_resultrn   ©Únamer#   Úclfr|   r|   r}   Ú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   r   ©Úsample_weightr€   rJ   )r‚   rƒ   r„   r^   r_   rq   ÚonesÚlenr'   r…   r†   r‡   rn   Úfullrˆ   r|   r|   r}   Ú 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 )Nr5   r8   ©r’   rW   ©r’   r�   rW   )rq   ÚabsÚminr_   Úarrayr‡   r„   r^   r   r…   r†   )r#   r’   ÚaÚy_trainÚy_testÚregrŠ   r|   r|   r}   Ú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s¦J d |¡ƒ‚|ddd�}| 	|| ¡ | 
|| ¡dksjJ d |¡ƒ‚qjd S )	N)rC   rC   r8   r:   r   r   rN   r€   ©rW   r�   )rq   rj   ÚindicesÚshapeÚvstackÚravelr†   r‚   rƒ   r„   Úscorern   )r_   ZgridxZgridyr^   r‰   r#   rŠ   r|   r|   r}   Útest_xor  s    

r£   c                  C   s¶   t t ¡ tƒD ]¢\\} }}||dd�}| tjtj¡ t| 	tj¡tjƒ}|dksdJ d 
| ||¡ƒ‚||ddd�}| tjtj¡ t| 	tj¡tjƒ}|dksJ d 
| ||¡ƒ‚qd S )Nr   r“   rU   z0Failed with {0}, criterion = {1} and score = {2}rL   r”   rJ   )r   r‚   rƒ   ÚCLF_CRITERIONSr„   r`   ÚdataÚtargetr   r…   rn   )r‰   r#   r’   rŠ   r¢   r|   r|   r}   Ú	test_iris3  s    ÿÿr§   z
name, Treec                 C   s\   ||dd�}|  tjtj¡ ttj| tj¡ƒ}|t d¡ksXJ d| › d|› d|› �ƒ‚d S )Nr   r“   zFailed with z, criterion = z and score = )r„   ra   r¥   r¦   r   r…   ÚpytestÚapprox)r‰   r#   r’   r›   r¢   r|   r|   r}   Útest_diabetes_overfitE  s    ÿþrª   z&criterion, max_depth, metric, max_lossr2   é   é<   r3   r4   r5   c                 C   sR   |||ddd�}|  tjtj¡ |tj| tj¡ƒ}d|  k rH|k sNn J ‚d S )NrI   r   )r’   Ú	max_depthr�   rW   )r„   ra   r¥   r¦   r…   )r‰   r#   r’   r­   ZmetricZmax_lossr›   Zlossr|   r|   r}   Útest_diabetes_underfitR  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 )Nr8   é*   ©r­   r�   rW   r   r€   rk   rK   )r‚   rƒ   r„   r`   r¥   r¦   Úpredict_probar&   rq   ru   rŽ   rŸ   rn   r'   Zargmaxr…   r%   ÚexpÚpredict_log_proba)r‰   r#   rŠ   Zprob_predictr|   r|   r}   Útest_probabilityg  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­   rW   )rq   ÚarangeÚnewaxisÚ	REG_TREESrƒ   r„   ©r^   r_   r‰   r#   r›   r|   r|   r}   Útest_arrayrepr�  s
    
rº   c                  C   s¸   ddgddgddgddgddgddgg} g d¢}t  ¡ D ]8\}}|dd�}| | |¡ t| | ¡|d |¡d	� q8t ¡ D ]8\}}|dd�}| | |¡ t| | ¡|d |¡d	� qzd S )
NrA   r>   r8   rL   )r8   r8   r8   r8   r8   r8   r   r   r€   rk   )r‚   rƒ   r„   r'   r…   rn   r¸   r%   )r^   r_   r‰   ÚTreeClassifierrŠ   ÚTreeRegressorr›   r|   r|   r}   Útest_pure_setŒ  s    (

r½   c               
   C   sÆ   t  g d¢g d¢g d¢g d¢g d¢g d¢g d¢g¡} t  g d¢¡}t jd	d
��d t ¡ D ]J\}}|dd�}| | |¡ | | | ¡ | |  |¡ | |  | ¡ qXW d   ƒ n1 s¸0    Y  d S )N)gsþ_—c@çdÀ	�a@ç±› `8`@çëÆý?õüc@)gŒÁý_9Ða@gþ 8ú`@g-Výßu]@g    @Xd@)gSW jÒ_@r¾   r¿   rÀ   )gÓ Ù‹`@ç4Tÿÿ÷a@ç	£þlKa@çÁ{ýÿ»c@)gç|@�ÆY@g~G`÷a@gwIÿ?lKa@g/"þ»c@)gƒ÷úÿ�í_@rÁ   rÂ   rÃ   )g®û¿‘:^@r¾   r¿   rÀ   )rN   g¿½A‹wæ?gtúQ?5?á?rS   g7G€¶í?g”�ÞÛº¼Þ?g™¥b'Âß?Úraise)Úallr   r   )rq   r—   Zerrstater¸   rƒ   r„   r¹   r|   r|   r}   Ú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srJ d	 	|¡ƒ‚|dks$J d	 	|¡ƒ‚q$t
dd�}| tjtj¡ t
dttjƒd
�}| tjtj¡ t|j|jƒ d S )Néˆ  rC   r;   r   F©rX   rY   Ún_informativeÚn_redundantZ
n_repeatedÚshufflerW   r   çš™™™™™¹?r€   ©rW   Úmax_leaf_nodes)r   Úmake_classificationr‚   rƒ   r„   Úfeature_importances_rq   ru   rŸ   rn   r   r`   r¥   r¦   r�   r'   )r^   r_   r‰   r#   rŠ   ZimportancesZn_importantÚclf2r|   r|   r}   Útest_importancesµ  s*    ù



rÒ   c                  C   s>   t ƒ } t t¡� t| dƒ W d   ƒ n1 s00    Y  d S )NrÐ   )r   r¨   ÚraisesÚ
ValueErrorÚgetattr©rŠ   r|   r|   r}   Ú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Ð  rC   r;   r   FrÈ   r0   r:   )r’   r­   rW   r2   )r   rÏ   r   r„   r   r%   rÐ   r'   Útree_rr   rp   ro   rt   )r^   r_   rŠ   r›   r|   r|   r}   Ú)test_importances_gini_equal_squared_errorÛ  s,    ù
ÿÿþrÙ   c                  C   s   t  ¡ D �]�\} }|dd�}| tjtj¡ |jtt 	tjj
d ¡ƒksLJ ‚|dd�}| tjtj¡ |jtt tjj
d ¡ƒks†J ‚|dd�}| tjtj¡ |jdks®J ‚|dd�}| tjtj¡ |jdksÖJ ‚|dd�}| tjtj¡ |jdksþJ ‚|dd�}| tjtj¡ |jtdtjj
d  ƒk�s8J ‚|dd�}| tjtj¡ |jtjj
d k�sjJ ‚|d d�}| tjtj¡ |jtjj
d ksJ ‚qd S )	NÚsqrt)r�   r8   Úlog2r;   rR   rJ   rN   )r6   rƒ   r„   r`   r¥   r¦   Zmax_features_Úintrq   rÚ   rŸ   rÛ   )r‰   ÚTreeEstimatorÚestr|   r|   r}   Útest_max_featuresù  s2    
 
 



 

rß   c            	   	   C   sŠ  t  ¡ D �]ä\} }|ƒ }t t¡� | t¡ W d   ƒ n1 sB0    Y  | tt¡ g d¢g}t t	¡� | |¡ W d   ƒ n1 sŒ0    Y  |ƒ }td d… }t t	¡� | t|¡ W d   ƒ n1 sÔ0    Y  t
 t¡}|ƒ }| |t¡ t| t¡tƒ |ƒ }t t¡� | t¡ W d   ƒ n1 �s<0    Y  | tt¡ t
 t¡}t t	¡�* | |d d …dd …f ¡ W d   ƒ n1 �s˜0    Y  t
 t¡j}|ƒ }| t
 t|¡t¡ t t	¡� | t¡ W d   ƒ n1 �sô0    Y  t t	¡� | t¡ W d   ƒ n1 �s*0    Y  |ƒ }| tt¡ t t	¡� | |¡ W d   ƒ n1 �sr0    Y  t t	¡� | |¡ W d   ƒ n1 �s¨0    Y  |ƒ }t t¡� | t¡ W d   ƒ q1 �sä0    Y  qtdd�}tjt	dd��& | g d¢gg d	¢¡ W d   ƒ n1 �s60    Y  tjt	d
d��& | g d¢gg d¢¡ W d   ƒ n1 �s|0    Y  d S )N)rA   r>   r8   r>   r8   r5   ©r’   zy is not positive.*Poisson©Úmatch©r   r8   rL   )r   r   r   zSome.*y are negative.*Poisson)r:   gš™™™™™¹¿rL   )r‚   rƒ   r¨   rÓ   r
   r±   r^   r„   r_   rÔ   rq   Úasfortranarrayr%   r…   r†   r‡   Úasarrayr—   ÚdotÚapplyr   )	r‰   rÝ   rÞ   ÚX2Úy2ZXfÚtZXtrŠ   r|   r|   r}   Ú
test_error  sX    (
(*
*
:****,
6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s‚J d |¡ƒ‚|d	|dd�}| | |¡ |jj|jjdk }t  |¡dks(J d |¡ƒ‚q(d
S )z Test min_samples_split parameter©Údtype©Néè  rC   r   )Úmin_samples_splitrÎ   rW   r>   é	   r€   r=   N)rq   rä   r`   r¥   r   Ú_treeÚDTYPEr¦   r   r6   Úkeysr„   rØ   rt   rp   r–   rn   )r^   r_   rÎ   r‰   rÝ   rÞ   Znode_samplesr|   r|   r}   Útest_min_samples_split_  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s�J d |¡ƒ‚|d|dd�}| | |¡ |j | ¡}t  |¡}||dk }t  |¡dks(J d |¡ƒ‚q(d S )	Nrì   rî   r:   r   )Úmin_samples_leafrÎ   rW   r7   r€   rÌ   )rq   rä   r`   r¥   r   rò   ró   r¦   r   r6   rô   r„   rØ   rç   Úbincountr–   rn   )	r^   r_   rÎ   r‰   rÝ   rÞ   ÚoutZnode_countsZ
leaf_countr|   r|   r}   Útest_min_samples_leaf~  s(    ÿ
ÿ
rù   c                 C   s¢  t | d  tj¡}|dur$||ƒ}t | d }t |jd ¡}t |¡}t|  }t	dt 
ddd¡ƒD ]Œ\}}	||	|dd�}
|
j|||d	� |dur¦|
j | ¡ ¡}n|
j |¡}tj||d
�}||dk }t |¡||
j ksfJ d | |
j¡ƒ‚qf|jd }t	dt 
ddd¡ƒD ]Š\}}	||	|dd�}
|
 ||¡ |du�rP|
j | ¡ ¡}n|
j |¡}t |¡}||dk }t |¡||
j k�sJ d | |
j¡ƒ‚�qdS )zPTest if leaves contain at least min_weight_fraction_leaf of the
    training setr^   Nr_   r   rî   rJ   rI   )Úmin_weight_fraction_leafrÎ   rW   rŒ   )Úweightsz,Failed with {0} min_weight_fraction_leaf={1})ÚDATASETSÚastyperq   Úfloat32ÚrngÚrandrŸ   ru   r6   r   Úlinspacer„   rØ   rç   Útocsrr÷   r–   rú   rn   )r‰   r   Úsparse_containerr^   r_   rû   Útotal_weightrÝ   rÎ   ÚfracrÞ   rø   Únode_weightsÚleaf_weightsr|   r|   r}   Úcheck_min_weight_fraction_leafŸ  sP    
ÿÿÿþ
ÿ

ÿÿþr  r‰   c                 C   s   t | dƒ d S ©Nr`   ©r  ©r‰   r|   r|   r}   Ú,test_min_weight_fraction_leaf_on_dense_inputÚ  s    r  Úcsc_containerc                 C   s   t | d|d� d S ©Nrf   )r  r
  ©r‰   r  r|   r|   r}   Ú-test_min_weight_fraction_leaf_on_sparse_inputß  s    r  c                 C   sš  t | d  tj¡}|dur$||ƒ}t | d }|jd }t|  }tdt ddd¡ƒD ]�\}}|||ddd	�}	|	 ||¡ |dur”|	j	 
| ¡ ¡}
n|	j	 
|¡}
t |
¡}||dk }t |¡t||	j dƒksVJ d
 | |	j|	j¡ƒ‚qVtdt ddd¡ƒD ]˜\}}|||ddd	�}	|	 ||¡ |du�r<|	j	 
| ¡ ¡}
n|	j	 
|¡}
t |
¡}||dk }t |¡t||	j ||	j ƒksüJ 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^   Nr_   r   rî   rJ   r;   r:   )rú   rÎ   rö   rW   zBFailed with {0} min_weight_fraction_leaf={1}, min_samples_leaf={2}rÌ   )rü   rý   rq   rþ   rŸ   r6   r   r  r„   rØ   rç   r  r÷   r–   Úmaxrú   rn   rö   )r‰   r   r  r^   r_   r  rÝ   rÎ   r  rÞ   rø   r  r  r|   r|   r}   Ú4check_min_weight_fraction_leaf_with_min_samples_leafå  s^    
ü


ÿ
ÿþü


þ
ÿýr  c                 C   s   t | dƒ d S r	  ©r  r  r|   r|   r}   Ú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  r|   r|   r}   Ú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sªJ 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sÂJ d ||¡ƒ‚qÂq„q d S )Néd   ©rX   rW   rî   r   ©rÎ   rW   rP   )rÎ   Úmin_impurity_decreaserW   g-Cëâ6?rÌ   gH¯¼šò×z>z)Failed, min_impurity_decrease = {0} > {1}z2Failed with {0} expected min_impurity_decrease={1})r   rÏ   r   r6   rô   r  rn   r„   ÚrangerØ   rm   rp   r   rv   Úweighted_n_node_samplesro   rŸ   )Úglobal_random_seedr^   r_   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_decreaser|   r|   r}   Útest_min_impurity_decrease1  sd    ÿÿÿüÿÿþÿÿÿÿþr!  c               	      sð   t  ¡ D ]â\} }d| v r(tjtj }}ntjtj }}|dd�‰ ˆ  ||¡ ˆ  ||¡}g d¢}‡ fdd„|D ƒ}t 	ˆ ¡}t 
|¡}t|ƒˆ jks˜J ‚| ||¡}	||	ksºJ d | ¡ƒ‚|D ]*}
tt|j|
ƒ||
 d|
› d	| › �d
� q¾qdS )z8Test pickling preserves Tree properties and performance.Ú
Classifierr   r   )r­   rm   ÚcapacityÚ	n_classesrp   ro   Zn_leavesrr   rs   rv   rt   r  rw   c                    s   i | ]}|t ˆ j|ƒ“qS r|   )rÕ   rØ   )Ú.0Ú	attribute©rÞ   r|   r}   Ú
<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 rk   N)r6   rƒ   r`   r¥   r¦   ra   r„   r¢   ÚpickleÚdumpsÚloadsÚtypeÚ	__class__rn   r'   rÕ   rØ   )r‰   rÝ   r^   r_   r¢   Ú
attributesZfitted_attributeZserialized_objectr  Zscore2r&  r|   r'  r}   Útest_pickley  s6    

ÿ

ÿþ
ÿü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J ‚| |¡}t|ƒdk�s2J ‚|d jdk�sFJ ‚|d jd	k�sZJ ‚| |¡}	t|	ƒdk�svJ ‚|	d jdk�sŠJ ‚|	d jd	ksØJ ‚qØt	 ¡ D ]@\}}
|
dd�}| | |¡ |¡}t
||ƒ |jdk�s¦J ‚�q¦d S )
NrA   r>   r8   rL   r   r;   r   ©r7   rL   )r7   r7   )r‚   rƒ   r„   r…   r'   rŸ   r±   r�   r³   r¸   r%   )r^   r_   r†   Zy_truer‰   r»   rŠ   Zy_hatZprobaZ	log_probar¼   r›   r|   r|   r}   Útest_multioutput¬  s\    ôô





r1  c                  C   sÆ   t  ¡ D ]¸\} }|dd�}| tt¡ |jdks4J ‚t|jddgƒ t 	tt 
t¡d f¡j}|dd�}| t|¡ t|jƒdks†J ‚t|jƒdks˜J ‚t|jddgƒ t|jddgddggƒ qd S )Nr   r   rL   r>   r8   rA   )r‚   rƒ   r„   r^   r_   Ú
n_classes_r'   Zclasses_rq   r    r—   r†   r�   )r‰   r»   rŠ   Ú_yr|   r|   r}   Útest_classes_shapeè  s    

r4  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   r   rŒ   )	r`   r¥   r¦   r$   r‚   rƒ   r„   r%   r…   )Zunbalanced_XZunbalanced_yr�   r‰   r»   rŠ   r|   r|   r}   Útest_unbalanced_irisü  s    

r7  c                  C   s   t t ¡ tjtjgƒD �]‚\\} }}|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D ]0}|tj|d�}tj	}t
| ||¡ |¡|ƒ qîtD ]2}|tj|d�}tj	}t
| ||¡ |¡|ƒ �q$tjtjd d d… |d�}tj	d d d… }t
| ||¡ |¡|ƒ qd S )Nr   r   rì   ÚC)Úorderrí   ÚFr;   )r   r6   rƒ   rq   Úfloat64rþ   rå   r`   r¥   r¦   r'   r„   r…   Zascontiguousarrayr.   r-   )r‰   rÝ   rí   rÞ   r^   r_   Úcsr_containerr  r|   r|   r}   Útest_memory_layout  s6    ÿ
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J ‚d||d	k< tddd�}|j| ||d� |j	j
d dk�sDJ ‚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  rS   é2   r   r   rŒ   éÈ   r8   rL   gR¸…ëQà?rµ   g     °b@rJ   g     ÀH@)Z	minlength)rq   r¶   r·   rŽ   r   r„   r'   r…   rj   rØ   rs   r`   r¥   r¦   rÿ   ÚrandintrŸ   r÷   rp   r   rò   r   r&   )r^   r_   r�   rŠ   Ú
duplicatesrÑ   r{   r|   r|   r}   Útest_sample_weight5  sD    






ÿrB  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 d   ƒ n1 sv0    Y  t  d¡}t d¡}tjt|d	��  |j
| ||d� W d   ƒ n1 sÈ0    Y  d S )
Nr  rS   r>  r   r   r8   rŒ   zgInput should have at least 1 dimension i.e. satisfy `len(x.shape) > 0`, got scalar `array(0.)` instead.rá   )rq   r¶   r·   rŽ   r   Úrandomr   r¨   rÓ   rÔ   r„   r—   ÚreÚescapeÚ	TypeError)r^   r_   rŠ   r�   Zexpected_errr|   r|   r}   Útest_sample_weight_invalidi  s    

.
þrG  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 )Nr   r   r6  ©Úclass_weightrW   g       @rN   rã   r8   r  g      Y@rL   )r‚   r„   r`   r¥   r¦   r%   rÐ   rq   r    r†   rŽ   rŸ   )	r‰   r»   Úclf1rÑ   Z
iris_multiZclf3Zclf4r�   rI  r|   r|   r}   Útest_class_weights�  s@    



ýú

rK  c                 C   sx   t |  }t tt t¡d f¡j}|dddœgdd�}d}tjt|d�� | 	t
|¡ W d   ƒ n1 sj0    Y  d S )	NrL   rJ   rN   ©r>   r8   r   rH  zBnumber of elements in class_weight should match number of outputs.rá   )r‚   rq   r    r_   r—   r†   r¨   rÓ   rÔ   r„   r^   )r‰   r»   r3  rŠ   rl   r|   r|   r}   Útest_class_weight_errors±  s    rM  c                  C   sX   t jddd�\} }d}t ¡ D ]4\}}|d |d d� | |¡}| ¡ |d ksJ ‚qd S ©Nr  r8   r  r7   )r­   rÎ   )r   Úmake_hastie_10_2r6   rƒ   r„   Zget_n_leaves©r^   r_   Úkr‰   rÝ   rÞ   r|   r|   r}   Útest_max_leaf_nodes¾  s
    rR  c                  C   sP   t jddd�\} }d}t ¡ D ],\}}|d|d� | |¡}| ¡ dksJ ‚qd S rN  )r   rO  r6   rƒ   r„   Z	get_depthrP  r|   r|   r}   Útest_max_leaf_nodes_max_depthÇ  s
    rS  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 J dƒ‚qd S )N)r$  rw   rp   ro   rs   rv   rr   rt   r   r8   rB   r;   z Array points to arbitrary memory)rÕ   r   r„   rØ   Úflat)Úattrrw   r|   r|   r}   Útest_arrays_persistÐ  s    
"rV  c                  C   s\   t dƒ} t d¡}|  ddd¡}t ¡ D ].\}}|dd�}| ||¡ |jjdks(J ‚q(d S )Nr   )rC   rZ   rL   )rC   r   )	r/   rq   rj   r@  r6   rƒ   r„   rØ   r­   )rW   r^   r_   r‰   rÝ   rÞ   r|   r|   r}   Útest_only_constant_featuresâ  s    

rW  c                  C   s~   t  t  g d¢gt  d¡f¡¡} g d¢}t ¡ D ]H\}}d|vr0|ddd�}| | |¡ |jjdkshJ ‚|jj	d	ks0J ‚q0d S )
N)r   r   r   r   r   r8   rL   r7   r:   rI   é   )r7   rH   )r   r   r   r8   r8   rL   rL   rL   r;   r;   r;   Z	ExtraTreer   r8   r�   rL   r:   )
rq   Z	transposer    rj   r6   rƒ   r„   rØ   r­   rm   ©r^   r_   r‰   rÝ   rÞ   r|   r|   r}   Ú,test_behaviour_constant_feature_after_splitsì  s    ÿrZ  c                  C   sà   t  t  dgdgdgdgg¡t  d¡g¡} t  g d¢¡}t ¡ D ]H\}}|ddd�}| | |¡ |jjdkspJ ‚t	| 
| ¡t  dd	¡ƒ q@t ¡ D ]H\}}|ddd�}| | |¡ |jjdksÂJ ‚t	| | ¡t  d
d	¡ƒ q’d S )NrN   rS   )r7   rï   )rS   rN   rS   rN   r   r8   r�   r0  rJ   )r7   )rq   Zhstackr—   rj   r‚   rƒ   r„   rØ   r­   r'   r±   r�   r¸   r…   rY  r|   r|   r}   Ú(test_with_only_one_non_constant_featuresú  s    *r[  c                  C   sd   t  dd¡ t j¡ dd¡} tƒ }tjtdd��  | 	| g d¢¡ W d   ƒ n1 sV0    Y  d S )Ng¥\Ãñ)c=Hr7   r>   r8   rþ   rá   )r   r8   r   r8   )
rq   Úrepeatrý   r;  Úreshaper   r¨   rÓ   rÔ   r„   )r^   rŠ   r|   r|   r}   Útest_big_input  s    r^  c                  C   s@   ddl m}  t t¡� | ƒ  W d   ƒ n1 s20    Y  d S )Nr   ©Ú_realloc_test)Zsklearn.tree._utilsr`  r¨   rÓ   ÚMemoryErrorr_  r|   r|   r}   Útest_realloc  s    rb  c                  C   sÐ   dt  d¡ } tj dd¡}tj ddd¡}d| d  }td|d�}t t	¡� | 
||¡ W d   ƒ n1 sp0    Y  d| d  d }td|d�}t t¡� | 
||¡ W d   ƒ n1 sÂ0    Y  d S )	NrK   ÚPrC   rL   r   r8   Úbest)ÚsplitterrÎ   )ÚstructÚcalcsizerq   rC  Úrandnr@  r   r¨   rÓ   Ú	Exceptionr„   ra  )Zn_bitsr^   r_   ZhugerŠ   r|   r|   r}   Útest_huge_allocations  s    *rj  c                 C   s(  t |  }t| d }t| d }|dv rN|jd d }|d |… }|d |… }tt t D ]È}||ƒ}|d|d� ||¡}	|d|d� ||¡}
t|	j|
jd 	| ¡ƒ |	 
|¡}| tv rÊ|	 |¡}|	 |¡}tt t D ]J}||tjd�}t|
 
|¡|ƒ | tv rÖt|
 |¡|ƒ t|
 |¡|ƒ qÖqZd S )	Nr^   r_   )rb   ra   r   r:   ©rW   r­   ú5{0} with dense and sparse format gave different treesrì   )r6   rü   rŸ   r,   r-   r.   r„   r~   rØ   rn   r…   r‚   r±   r³   rq   rþ   r&   )r   Údatasetr­   rÝ   r^   r_   rX   r  ÚX_sparserx   ry   Úy_predZy_probaZy_log_probaZsparse_container_testÚX_sparse_testr|   r|   r}   Úcheck_sparse_input/  s8    ý



ÿrq  Ú	tree_typerm  )rd   rc   rb   rf   rg   rh   ri   rj   c                 C   s    |dkrdnd }t | ||ƒ d S )Nrb   r;   ©rq  )rr  rm  r­   r|   r|   r}   Útest_sparse_inputX  s    rt  ra   re   c                 C   s   t | |dƒ d S )NrL   rs  )rr  rm  r|   r|   r}   Útest_sparse_input_reg_treesk  s    ru  )rg   rh   ri   rj   c           	      C   s˜  t |  }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 )Nr^   r_   r   r8   rL   )rW   r�   r­   rl  rC   )rW   r�   rð   )rW   rö   r;   rÍ   )	r6   rü   r„   r~   rØ   rn   r&   r…   rŸ   )	rr  rm  r  rÝ   r^   rn  r_   rx   ry   r|   r|   r}   Útest_sparse_parameterss  sP    ýÿýÿýýrv  ztree_type, criterionc                 C   s   g | ]}|t v r|‘qS r|   )r¸   ©r%  r   r|   r|   r}   Ú
<listcomp>«  ó    rx  c                 C   s   g | ]}|t v r|‘qS r|   )r‚   rw  r|   r|   r}   rx  ­  ry  c           
      C   s„   t |  }t| d }||ƒ}t| d }|dd|d� ||¡}|dd|d� ||¡}	t|j|	jd | ¡ƒ t|	 |¡| |¡ƒ d S )Nr^   r_   r   r;   ©rW   r­   r’   rl  )r6   rü   r„   r~   rØ   rn   r&   r…   )
rr  rm  r  r’   rÝ   r^   rn  r_   rx   ry   r|   r|   r}   Útest_sparse_criteria©  s    
ýr{  zcsc_container,csr_containerc                 C   sœ  t |  }d}d}|}t |¡}tdƒ}g }	g }
d}|g}t|ƒD ]^}| |d¡}| |¡d |… }|	 |¡ |jdd|fd�d }|
 |¡ ||7 }| |¡ q@t |	¡ 	tj
¡}	tj|tj
d�}tjt |
¡tjd�}
||
|	|f||fd�}| ¡ }||
|	|f||fd�}| ¡ }|jdd|fd�}| ¡ }|jd	k ¡ dk�sFJ ‚|jd	k ¡ dk�s^J ‚|d|d
� ||¡}|d|d
� ||¡}t|j|jd t¡ƒ ||f}t||ƒD ]è\}}t|j |¡|j |¡ƒ t| |¡| |¡ƒ t| |¡|j |¡ƒ t|j |¡ ¡ |j |¡ ¡ ƒ t| |¡ ¡ | |¡ ¡ ƒ t| |¡ ¡ |j |¡ ¡ ƒ t| |¡| |¡ƒ ttv �r®t| |¡| |¡ƒ �q®d S )Nr;   rC   r   rJ   r[   r8   rì   ©rŸ   rS   rk  rl  )r6   rq   r¶   r/   r  ÚbinomialÚpermutationÚappendÚconcatenaterý   Úint32r—   rþ   Útoarrayr@  Úcopyr¥   ru   r„   r~   rØ   rn   r   r   r&   rç   Údecision_pathr…   r‚   r±   )rr  r  r<  rÝ   r­   rY   rX   ÚsamplesrW   rž   r¥   ÚoffsetÚindptrÚiZn_nonzero_iZ	indices_iZdata_irn  r^   rp  ÚX_testr_   rx   ry   ZXsZX1rè   r|   r|   r}   Útest_explicit_sparse_zerosÃ  sn    


ÿýÿÿÿ
rŠ  c                 C   sÈ   t |  }tjd d …df  ¡ }tjd d …df  d¡}tj}t t¡�" |dd� 	||¡ W d   ƒ n1 sn0    Y  |dd�}| 	||¡ t t¡� | 
|g¡ W d   ƒ n1 sº0    Y  d S )Nr   rL  r   )r6   r`   r¥   r¡   r]  r¦   r¨   rÓ   rÔ   r„   r…   )r‰   rÝ   r^   ZX_2dr_   rÞ   r|   r|   r}   Úcheck_raise_error_on_1d_input  s    0
r‹  c                 C   s2   t ƒ � t| ƒ W d   ƒ n1 s$0    Y  d S ©N)r)   r‹  r  r|   r|   r}   Útest_1d_input"  s    r�  r  c                 C   s    t |  }t dgdgdgdgdgg¡}g d¢}g d¢}|d urF||ƒ}|dd�}|j|||d� |jjdkspJ ‚|ddd�}|j|||d� |jjdksœJ ‚d S )	Nr   r8   )r   r   r   r   r8   )r=   r=   r=   r=   r=   r   rŒ   gš™™™™™Ù?)rW   rú   )r6   rq   r—   r„   rØ   r­   )r‰   r  rÝ   r^   r_   r�   rÞ   r|   r|   r}   Ú test_min_weight_leaf_split_level(  s    
rŽ  c                 C   sD   t jtjjdd�}t|  ƒ }| t t¡ t| 	t ¡|j
 	|¡ƒ d S ©NF©rƒ  ©ÚX_smallrý   r   rò   ró   r6   r„   Úy_smallr'   rç   rØ   )r‰   Ú	X_small32rÞ   r|   r|   r}   Útest_public_apply_all_trees<  s    
r•  r<  c                 C   sH   |t jtjjdd�ƒ}t|  ƒ }| t t¡ t| 	t ¡|j
 	|¡ƒ d S r�  r‘  )r‰   r<  r”  rÞ   r|   r|   r}   Útest_public_apply_sparse_treesE  s    
r–  c                  C   sP   t j} t j}tddd� | |¡}| | d d… ¡ ¡ }t|g d¢g d¢gƒ d S )Nr   r8   rk  rL   )r8   r8   r   ©r8   r   r8   )r`   r¥   r¦   r   r„   r„  r‚  r'   )r^   r_   rÞ   Únode_indicatorr|   r|   r}   Útest_decision_path_hardcodedO  s
    r™  c                    sÚ   t j}t j}|jd }t|  }|ddd�}| ||¡ | |¡}| ¡ ‰ ˆ j||jj	fks^J ‚| 
|¡}‡ fdd„t|ƒD ƒ}t|tj|d�ƒ |jjtk}	tt ˆ |	¡tj|d�ƒ ˆ jdd� ¡ }
|jj|
ksÖJ ‚d S )	Nr   rL   rk  c                    s   g | ]\}}ˆ ||f ‘qS r|   r|   )r%  rˆ  Új©r˜  r|   r}   rx  g  ry  z&test_decision_path.<locals>.<listcomp>r|  r8   ©Zaxis)r`   r¥   r¦   rŸ   r6   r„   r„  r‚  rØ   rm   rç   Ú	enumerater&   rq   rŽ   rp   r   ræ   ru   r  r­   )r‰   r^   r_   rX   rÝ   rÞ   Znode_indicator_csrÚleavesZleave_indicatorZ
all_leavesr­   r|   r›  r}   Útest_decision_pathW  s$    


ÿrŸ  c                 C   sV   t |tƒ }}t|  }t t¡�" |dd� ||¡ W d   ƒ n1 sH0    Y  d S ©Nr   r   )ÚX_multilabelÚy_multilabelr6   r¨   rÓ   rF  r„   )r‰   r<  r^   r_   rÝ   r|   r|   r}   Útest_no_sparse_y_supportu  s    r£  c                  C   s  t dddd�} | jdgdgdgdgdggg d¢g d	¢d
� t| jjg d¢ƒ t| jjjg d¢ƒ | jdgdgdgdgdggg d¢t 	d¡d
� t| jjg d¢ƒ t| jjjg d¢ƒ | jdgdgdgdgdggg d¢d� t| jjg d¢ƒ t| jjjg d¢ƒ 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   r3   rL   )rW   r’   rÎ   r;   r:   rK   )rI   rX  r;   r7   r;   )ç333333ã?ç333333Ó?rÌ   rN   r¥  )r^   r_   r�   )g²�…,dñ?gÜ¶mÛ¶mÛ?gÿÿÿÿÿÿç?)ç      @g      @r¦  )çffffffö?rM   gUUUUUUõ?)r7   rT   r¦  r]   N)
r   r„   r   rØ   rv   r'   rw   rT  rq   rŽ   )Zdt_maer|   r|   r}   Útest_mae  s     Jÿý.&r¨  c                  C   sê   d} t jdt jd�}d}dd„ }tjtj|fD ]¶}t ¡ D ]N\}}|| |ƒ}||ƒ ¡ }|\}	\}
}}||	ksrJ ‚| |
ks~J ‚t||ƒ q:t	 ¡ D ]P\}}|| |ƒ}||ƒ ¡ }|\}	\}
}}||	ksÊJ ‚| |
ksÖJ ‚||ks’J ‚q’q.d S )Nr;   rì   r  c                 S   s   t  t  | ¡¡S rŒ  )r)  r+  r*  )Úobjr|   r|   r}   Ú_pickle_copyê  s    z)test_criterion_copy.<locals>._pickle_copy)
rq   r¶   Úintprƒ  Údeepcopyr   rƒ   Ú
__reduce__r'   r   )Ú	n_outputsr$  rX   rª  Z	copy_funcÚ_ÚtypenameÚcriteriaÚresultZ	typename_Ú
n_outputs_r2  Z
n_samples_r|   r|   r}   Útest_criterion_copyã  s&    

r´  c           	      C   sÚ   t j d¡ dd¡d }t  | d¡¡}|d d …d d…f }| d urL| |ƒ}|d d …df }tdd� ||¡}| |¡}t	t  
|jjtk¡d ƒ}| |¡}t  
t  |jj¡ ¡d }t|ƒdksÆJ ‚t|ƒdksÖJ ‚d S )Nr   r  rH   g±¡*ÓÎâGrþ   r>   r   )rq   rC  ÚRandomStaterh  Z
nan_to_numrý   r   r„   rç   ÚsetÚwhererØ   rp   r   Ú
differenceÚisfiniters   r�   )	r  r¥   r^   r_   r   Zterminal_regionsZ	left_leafZ
empty_leafZinfinite_thresholdr|   r|   r}   Ú"test_empty_leaf_infinite_thresholdÿ  s    

rº  Útree_clsc                 C   s€   t |  } | d | d  }}|ddd�}| ||¡}|j}|j}t t |¡dk¡sVJ ‚t t |¡dk¡snJ ‚t||||ƒ d S ©Nr^   r_   rZ   r   r  ©rü   Zcost_complexity_pruning_pathZ
ccp_alphasÚ
impuritiesrq   rÅ   ÚdiffÚassert_pruning_creates_subtree©rm  r»  r^   r_   rÞ   ÚinfoÚpruning_pathr¾  r|   r|   r}   Ú'test_prune_tree_classifier_are_subtrees  s    rÄ  c                 C   s€   t |  } | d | d  }}|ddd�}| ||¡}|j}|j}t t |¡dk¡sVJ ‚t t |¡dk¡snJ ‚t||||ƒ d S r¼  r½  rÁ  r|   r|   r}   Ú'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   r   r8   rC   )rW   Ú	ccp_alpha)r   r„   Úassert_is_subtreerØ   )rJ  rÑ   r|   r|   r}   Útest_prune_single_node_tree5  s
    
rÈ  c           	      C   s\   g }|D ]$}| d|dd�  ||¡}| |¡ qt||dd … ƒD ]\}}t|j|jƒ q@d S )NrZ   r   )rÎ   rÆ  rW   r8   )r„   r  ÚziprÇ  rØ   )	Zestimator_clsr^   r_   rÃ  Z
estimatorsrÆ  rÞ   Zprev_estZnext_estr|   r|   r}   rÀ  A  s    ÿrÀ  c           	      C   s  | j |j ksJ ‚| j|jks J ‚| j}| j}|j}|j}dg}|�r| ¡ \}}t| j| |j| ƒ t| j| |j| ƒ t| j	| |j	| ƒ t| j
| |j
| ƒ || || krÊtt|j| ƒ q>t| j| |j| ƒ | || || f¡ | || || f¡ q>d S )N)r   r   )rm   r­   rp   ro   Úpopr&   rw   r%   rv   rt   r  r   rs   r  )	r   ZsubtreeZtree_c_leftZtree_c_rightZsubtree_c_leftZsubtree_c_rightÚstackZtree_node_idxZsubtree_node_idxr|   r|   r}   rÇ  P  s>    ÿÿÿþÿÿrÇ  re  rd  rC  c                 C   sÚ   t d }|d jtjjdd�}|d u r0t|ƒ}nB||d ƒ}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 )Nrd   r^   Fr�  rì   )re  )rü   rý   r   rò   ró   r(   rq   r—   r¥   rž   r‡  r“  r6   r„   r'   r…   r„  Ztodense)r‰   re  r  rm  r’  Z
X_readonlyZ
y_readonlyrÞ   r|   r|   r}   Ú"test_apply_path_readonly_all_treesx  s(    
ÿüÿrÌ  )r2   r4   r5   c                 C   sL   t jt j }}|| d�}| ||¡ t | |¡¡t t |¡¡ksHJ ‚d S )Nrà   )	ra   r¥   r¦   r„   rq   ru   r…   r¨   r©   )r’   r#   r^   r_   r›   r|   r|   r}   Ú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}g d¢}t d| d�}| ||¡ t | |¡¡dkslJ ‚t d| d�}| ||¡ t | |¡dk¡sœJ ‚d	}tj|d d d
d||d d | d�\}}d|d|k |dk @ < t |¡}t d| d�}| ||¡ t | |¡dk¡�sJ ‚d S )Nr   r8   rL   r;   )r   r   r   r   r8   rL   r;   r7   r2   r“   r5   rC   r¤  rï   )Zeffective_rankZtail_strengthrX   rY   rÉ   rW   r>   )	r   r„   rq   Zaminr…   rÅ   r   Úmake_regressionr•   )rÎ  r^   r_   r›   rY   r|   r|   r}   Ú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 �s0J ‚|d| k sÐJ ‚qÐd S )Nr¯   )éô  rÑ  rC   ©rX   rY   rW   rA   rL   )ÚlowÚhighr\   r   rœ  )Zlam)Z	test_sizerW   r5   rC   )r’   rð   rW   r2   Úmean)ZstrategyÚtrainÚtestgVçž¯Ò<rJ   g      è?)rq   rC  rµ  r   Zmake_low_rank_matrixÚuniformr  r5   r²   r   r   r„   r	   r   r…   Zclip)rÿ   Zn_trainZn_testrY   r^   Zcoefr_   ÚX_trainr‰  r™   rš   Ztree_poiZtree_mseÚdummyÚvalZ
metric_poiZ
metric_mseZmetric_dummyr|   r|   r}   Útest_poisson_vs_mseÅ  s4    

ÿÿÿÿ
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>  r:   r   r¯   )r$  rX   rY   rÉ   rÊ   rW   r1   é+   r“   Úentropyz> with criterion 'entropy' and 'log_loss' gave different trees.N)r   rÏ   r„   r~   rØ   r   r…   )r#   r$  rX   rY   r^   r_   Ztree_log_lossZtree_entropyr|   r|   r}   Ú'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 ||¡srJ ‚d S )	Nr   r   r;   rk  c                 S   s   |   ¡  | j ¡ ¡ ¡ S rŒ  )ÚbyteswapÚviewrí   Únewbyteorderr­  )Úarrr|   r|   r}   Ú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_tablerƒ  rq   ÚndarrayÚdumpÚseek©ÚfÚp©rŠ   rä  r|   r}   Ú get_pickle_non_native_endianness  s    


zJtest_different_endianness_pickle.<locals>.get_pickle_non_native_endianness)	r   rÏ   r   r„   r¢   r)  Úloadrq   Úisclose)r^   r_   r¢   rò  Únew_clfÚ	new_scorer|   rñ  r}   Ú test_different_endianness_pickle  s    
r÷  c                     s~   t jdd�\} }tddd�‰ˆ | |¡ ˆ | |¡}G dd„ dtƒ‰ ‡ ‡fdd„}t |ƒ ¡}| | |¡}t 	||¡szJ ‚d S )	Nr   r   r;   rk  c                       s   e Zd Z‡ fdd„Z‡  ZS )zPtest_different_endianness_joblib_pickle.<locals>.NonNativeEndiannessNumpyPicklerc                    s0   t |tjƒr | ¡  |j ¡ ¡}tƒ  |¡ d S rŒ  )	Ú
isinstancerq   rë  rà  rá  rí   râ  ÚsuperÚsave)Úselfr©  ©r-  r|   r}   rú  (  s    zUtest_different_endianness_joblib_pickle.<locals>.NonNativeEndiannessNumpyPickler.save)Ú__name__Ú
__module__Ú__qualname__rú  Ú__classcell__r|   r|   rü  r}   ÚNonNativeEndiannessNumpyPickler'  s   r  c                     s(   t  ¡ } ˆ | ƒ}| ˆ¡ |  d¡ | S rå  )ræ  rç  rì  rí  rî  ©r  rŠ   r|   r}   Ú'get_joblib_pickle_non_native_endianness-  s
    

zXtest_different_endianness_joblib_pickle.<locals>.get_joblib_pickle_non_native_endianness)
r   rÏ   r   r„   r¢   r   Újoblibró  rq   rô  )r^   r_   r¢   r  rõ  rö  r|   r  r}   Ú'test_different_endianness_joblib_pickle   s    r  c                 C   sn   t r
tjntj}g d¢}dd„ | jj ¡ D ƒ}|D ]}|||< q2t t| ¡ ƒt| 	¡ ƒdœ¡}| j
|dd�S )N)Ú
left_childÚright_childrr   rt   c                 S   s   i | ]\}\}}||“qS r|   r|   ©r%  r‰   rí   r¯  r|   r|   r}   r(  @  s   z6get_different_bitness_node_ndarray.<locals>.<dictcomp>©ÚnamesÚformatsÚ	same_kind©Zcasting)r+   rq   Úint64r�  rí   Úfieldsrƒ   Úlistrô   Úvaluesrý   )Únode_ndarrayZnew_dtype_for_indexing_fieldsZindexing_field_namesÚnew_dtype_dictr‰   Ú	new_dtyper|   r|   r}   Ú"get_different_bitness_node_ndarray:  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 r|   r|   r  r|   r|   r}   r(  M  s   z8get_different_alignment_node_ndarray.<locals>.<dictcomp>c                 S   s   g | ]\}}|‘qS r|   r|   )r%  rí   r†  r|   r|   r}   rx  P  ry  z8get_different_alignment_node_ndarray.<locals>.<listcomp>c                 S   s   g | ]}d | ‘qS )rK   r|   )r%  r†  r|   r|   r}   rx  Q  ry  )r
  r  Úoffsetsr  r  )rí   r  rƒ   r  rq   r  rô   rý   )r  r  r  Zshifted_offsetsr  r|   r|   r}   Ú$get_different_alignment_node_ndarrayL  s    
ÿ

ýÿr  c           	      C   sZ   t r
tjntj}|  ¡ \}\}}}}|j|dd�}| ¡ }t|d ƒ|d< ||||f|fS )Nr  r  Únodes)r+   rq   r  r�  r­  rý   rƒ  r  )	r   r  r»  rY   r$  r®  ÚstateZnew_n_classesÚ	new_stater|   r|   r}   Ú"reduce_tree_with_different_bitness]  s    r  c                     sn   t jdd�\} }tddd�‰ ˆ  | |¡ ˆ  | |¡}‡ fdd„}t |ƒ ¡}| | |¡}|t |¡ksjJ ‚d S )Nr   r   r;   rk  c                     s@   t  ¡ } t | ¡}tj ¡ |_t|jt< | 	ˆ ¡ |  
d¡ | S rå  )ræ  rç  r)  rè  ré  rê  rƒ  r  Ú
CythonTreerì  rí  rî  rÖ   r|   r}   Ú"pickle_dump_with_different_bitnesso  s    



zItest_different_bitness_pickle.<locals>.pickle_dump_with_different_bitness)	r   rÏ   r   r„   r¢   r)  ró  r¨   r©   )r^   r_   r¢   r  rõ  rö  r|   rÖ   r}   Útest_different_bitness_pickleh  s    
r  c                     sn   t jdd�\} }tddd�‰ ˆ  | |¡ ˆ  | |¡}‡ fdd„}t |ƒ ¡}| | |¡}|t |¡ksjJ ‚d S )Nr   r   r;   rk  c                     s>   t  ¡ } t| ƒ}tj ¡ |_t|jt< | ˆ ¡ |  	d¡ | S rå  )
ræ  rç  r   ré  rê  rƒ  r  r  rì  rí  rî  rÖ   r|   r}   Ú"joblib_dump_with_different_bitnessŠ  s    


zPtest_different_bitness_joblib_pickle.<locals>.joblib_dump_with_different_bitness)	r   rÏ   r   r„   r¢   r  ró  r¨   r©   )r^   r_   r¢   r  rõ  rö  r|   rÖ   r}   Ú$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 d   ƒ n1 s´0    Y  tj	t
dd��& | tj¡}t|| ƒ W d   ƒ n1 sø0    Y  d S )	Nc                 S   s   g | ]}|  ¡ ‘qS r|   )râ  )r%  Údtr|   r|   r}   rx  œ  ry  z(test_check_n_classes.<locals>.<listcomp>r   r8   rì   zWrong dimensions.+n_classesrá   zn_classes.+incompatible dtype)r+   rq   rí   r�  r  r—   r    rý   r¨   rÓ   rÔ   r;  )Úexpected_dtypeÚallowed_dtypesr$  r!  Zwrong_dim_n_classesZwrong_dtype_n_classesr|   r|   r}   Útest_check_n_classes™  s    (r$  c               	   C   s0  t  t j¡} d}t j|| d�}| |  ¡ g}|D ]}t|||d� q.tjtdd�� t|| dd� W d   ƒ n1 st0    Y  |d d …d d …d d…f t  	|¡fD ]B}tjtdd��  t|| |j
d� W d   ƒ q¢1 sÚ0    Y  q¢tjtd	d��& t| t j¡| |d� W d   ƒ n1 �s"0    Y  d S )
N)r:   r8   rL   rì   )r"  Úexpected_shapezWrong shape.+value arrayrá   )r8   rL   r8   zvalue array.+C-contiguouszvalue array.+incompatible dtype)rq   rí   r;  rj   râ  r"   r¨   rÓ   rÔ   rä   rŸ   rý   rþ   )r"  r%  Zvalue_ndarrayr#  r!  Zproblematic_arrr|   r|   r}   Útest_check_value_ndarray«  s2    ÿÿ$(ý&
ý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 d   ƒ n1 sŠ0    Y  tjtd	d��* |d d d
… }t|| d� W d   ƒ n1 sÒ0    Y  dd„ |j	j
 ¡ D ƒ}| ¡ }tj|d< t 	t| ¡ ƒt| ¡ ƒdœ¡}| |¡}tjtdd�� t|| d� W d   ƒ n1 �s`0    Y  | ¡ }tj|d< t 	t| ¡ ƒt| ¡ ƒdœ¡}| |¡}tjtdd�� t|| d� W d   ƒ n1 �sØ0    Y  d S )N)r:   rì   c                 S   s   g | ]}|  |j ¡ ¡‘qS r|   )rý   rí   râ  )r%  rã  r|   r|   r}   rx  Ö  s   z+test_check_node_ndarray.<locals>.<listcomp>)r"  zWrong dimensions.+node arrayrá   )r:   rL   znode array.+C-contiguousrL   c                 S   s   i | ]\}\}}||“qS r|   r|   r  r|   r|   r}   r(  å  ry  z+test_check_node_ndarray.<locals>.<dictcomp>rs   r	  znode array.+incompatible dtyper  )r   rq   rj   r  r  r!   r¨   rÓ   rÔ   rí   r  rƒ   rƒ  r  r  rô   r  rý   r;  )r"  r  Zvalid_node_ndarraysrã  Zproblematic_node_ndarrayZ
dtype_dictr  r  r|   r|   r}   Ú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|d	d
�}t |¡}t |¡}|j	|ksnJ ‚t
|| ƒs|J ‚d	S )z&Check that splitters are serializable.r¯   rC   rL   r;   rì   r0   r:   rJ   N)Zmonotonic_cst)rq   rC  rµ  r—   r«  r   r)  r*  r+  r�   rø  )	r(  rÿ   r�   r®  r$  r’   re  Zsplitter_serializeZsplitter_backr|   r|   r}   Útest_splitter_serializable 	  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   r   Úr)Z	mmap_modez?The trees of the original and loaded classifiers are not equal.N)ÚstrÚjoinr   r„   r’  r“  r  rì  ró  r~   rØ   )ZtmpdirZpickle_pathrŠ   Z
loaded_clfr|   r|   r}   Ú/test_tree_deserialization_from_read_only_buffer	  s    
ýr-  c                 C   s‚   t  ddgddgg¡}t  ddg¡}| dd� ||¡ | dd�}d}tjt|d�� | ||¡ W d  ƒ n1 st0    Y  dS )zhCheck that an error is raised when min_sample_split=1.

    non-regression test for issue gh-25481.
    r   r8   rN   )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)rq   r—   r„   r¨   rÓ   rÔ   )r#   r^   r_   r   Úmsgr|   r|   r}   Útest_min_sample_split_1_error%	  s    
ÿr/  c                 C   sÄ   t  g d¢g¡j}t  g d¢¡}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 predictions.©	r   r8   rL   r;   rK   rñ   rH   é   r«   ©	rÌ   r=   r¥  r=   r§  r§  rM   gš™™™™™ù?gÍÌÌÌÌÌ@r¯   r8   rz  r<   Nr>   r9   )	rq   r—   r†   r   r„   r…   Únanr   rÕ  )r’   r^   r_   Údtcro  ZX_equalZy_equalr|   r|   r}   Ú;test_missing_values_best_splitter_on_equal_nodes_no_missing;	  s    r5  c                 C   sÀ   t  g d¢g¡j}t  g d¢¡}t|d| d�}| ||¡ |jjd }|jjd }|jj| }|jj| }||k}	|jj	| d }
|jj	| d }| 
t jgg¡}|	r²t|
|ƒ n
t||ƒ dS )zÝCheck missing values go to the correct node during predictions for ExtraTree.

    Since ETC use random splits, we use different seeds to verify that the
    left/right node is chosen correctly when the splits occur.
    r0  r2  r8   rz  r   N)rq   r—   r†   r   r„   rØ   rp   ro   r  rw   r…   r3  r   )r’   rÎ  r^   r_   Zetrr  r  Zleft_samplesZright_samplesZ	went_leftZy_pred_leftZy_pred_rightro  r|   r|   r}   Ú=test_missing_values_random_splitter_on_equal_nodes_no_missingU	  s    r6  rÞ  r0   c                 C   s”   d}t  t jgd g d¢ 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   r7   )r   r8   rL   r;   rK   rñ   rH   r1  r8   rL   r¯   rz  r;   r1  N©rq   r—   r3  r†   r   r„   r…   r'   )r’   Zmissing_values_classr^   r_   r4  r‰  Z
y_nan_predr|   r|   r}   Ú/test_missing_values_best_splitter_three_classesx	  s    $
r8  c                 C   s†   t  t jgd g d¢ g¡j}t  dgd dgd  ¡}tdd| d�}| ||¡ t  t jd	t jgg¡j}| |¡}t|g d
¢ƒ dS )zŠMissing values spanning only one class at fit-time must make missing
    values at predict-time be classified has belonging to this class.r7   ©r   r8   rL   r;   r7   r:   r   r8   rI   r¯   rL   rz  r:   )r   r8   r   Nr7  ©r’   r^   r_   r4  r‰  ro  r|   r|   r}   Ú)test_missing_values_best_splitter_to_left‡	  s    
r;  c                 C   sŽ   t  t jgd g d¢ 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|g d
¢ƒ dS )zŸMissing 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.r7   r9  r8   r   rL   r¯   rz  rO   g333333@r—  Nr7  r:  r|   r|   r}   Ú*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|g d¢ƒ dS )zNCheck behavior of missing value when there is one missing value in each class.r8   rL   r;   r:   rC   rZ   rV   r¬   r   r¯   rz  gffffff@gš™™™™A@r—  Nr7  r:  r|   r|   r}   Ú>test_missing_values_best_splitter_missing_both_classes_has_nan¨	  s    &
r=  r   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  ¡}| d
urP| |ƒ}tjtdd�� | ||¡ W d
  ƒ n1 s€0    Y  d
S )z4Check unsupported configurations for missing values.r8   rL   r;   r:   rC   rZ   rV   r¬   r   NzInput X contains NaNrá   )rq   r—   r3  r†   r¨   rÓ   rÔ   r„   )r  r   r^   r_   r|   r|   r}   Ú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< | ddd�}| ||¡ | |¡}|d	k ¡ slJ ‚dS )
z5Smoke test for poisson regression and missing values.Nr:   r   rI   r>   r5   r¯   r“   rS   )	ra   r¥   rƒ  r¦   rq   r3  r„   r…   rÅ   )r#   r^   r_   r›   ro  r|   r|   r}   Útest_missing_values_poissonÍ	  s    
r?  c                  O   s$   t j| i |¤Ž\}}|dk}||fS )Né   )r   Úmake_friedman1)ÚargsÚkwargsr^   r_   r|   r|   r}   Úmake_friedman1_classificationÝ	  s    rD  zmake_data, Tree, tolerancegìQ¸…ë±?g¸…ëQ¸ž?g¸…ëQ¸¾?Úsample_weight_trainrŽ   c                 C   s  d\}}| ||d|d�\}}|  ¡ }	tj |¡}
tj|	|
jddg|jddgd�< t|	||d	�\}}}}|d
kr€t |jd ¡}nd}d}|||d�}|j	|||d� | 
||¡}ttƒ |||d�ƒ}| 	||¡ | 
||¡}|| |k�sJ d|›d|› d|› �ƒ‚dS )zFCheck that trees can deal with missing values have decent performance.)rÇ   rC   rN   )rX   rY   ÚnoiserW   FTrU   rÌ   ©r\   rð  r   rŽ   r   NrC   rµ   rŒ   zscore_native_tree=z + z! should be strictly greater than )rƒ  rq   rC  rµ  r3  ÚchoicerŸ   r   rŽ   r„   r¢   r   r   )Ú	make_datar#   rE  r  Z	tolerancerX   rY   r^   r_   Ú	X_missingrÿ   ZX_missing_trainZX_missing_testr™   rš   r�   r­   Znative_treeZscore_native_treeZtree_with_imputerZscore_tree_with_imputerr|   r|   r}   Ú!test_missing_values_is_resilienceã	  s<    ü
 ÿÿÿÿrK  zTree, expected_scoreg333333ë?gö(\�Âõà?c                 C   sÚ   t j d¡}d}|j|dfd�}t  t  |d ¡t  |d ¡g¡}|jddg|dd	gd
�}| ¡  	t
¡}||  ||< |j|d�}	t j|	|< |	|dd…df< | |d�}
t|
||dd� ¡ }||ksÖJ d|› d|› �ƒ‚dS )z@Check the tree learns when only the missing value is predictive.r   rÑ  rZ   r[   rL   FTgffffffî?rP   rG  Nr:   r   )ZcvzExpected CV score: z	 but got )rq   rC  rµ  Zstandard_normalr€  rj   rŽ   rH  rƒ  rý   Úboolr3  r   rÕ  )r#   Zexpected_scorer  rÿ   rX   r^   r_   ZX_random_maskZy_maskZX_predictiver   Ztree_cv_scorer|   r|   r}   Ú test_missing_value_is_predictive 
  s     "

ÿþrM  zmake_data, Treec           
      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ï   rC   rÒ  FTrU   rÌ   rG  rS   NrL   r   rŒ   r8   )
rq   rC  rµ  r3  rH  rŸ   rŽ   r„   r   r…   )
rI  r#   rÿ   rX   rY   r^   r_   r�   Ztree_with_swZtree_samples_removedr|   r|   r}   Útest_sample_weight_non_uniform>
  s    	 

(rN  c                  C   sP   t dd� tjtj¡} t dd� tjtj¡}t | ¡}t |¡}||ksLJ ‚d S r   )r   r„   r`   r¥   r¦   r)  r*  )Ztree1Ztree2Zpickle1Zpickle2r|   r|   r}   Útest_deterministic_pickle[
  s
    

rO  r^   r:   rI   c                 C   s¸   |  dd¡}t d¡}| |dd� ||¡}t|ƒ |  dd¡|¡}|jj}t|dkƒsbJ | ¡ ƒ‚t	|jjdd… |jjdd… ƒ t 
|jjdk|jjdk@ ¡}t	|jj| dƒ dS )	a'  Check that we properly handle missing values in regression trees using a toy
    dataset.

    The regression targeted by this test was that we were not reinitializing the
    criterion when it comes to the number of missing values. Therefore, the value
    of the critetion (i.e. MSE) was completely wrong.

    This test check that the MSE is null when there is a single sample in the leaf.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/28254
    https://github.com/scikit-learn/scikit-learn/issues/28316
    r>   r8   rI   r   r“   NrL   rS   )r]  rq   r¶   r„   r   rØ   rv   rÅ   r–   r   Úflatnonzerorp   rt   )r#   r^   r’   r_   r   Ztree_refrv   Ú
leaves_idxr|   r|   r}   Ú'test_regression_tree_missing_values_toyh
  s    
"ÿrR  c                 C   s†   t j | ¡}d}t j|t jd� dd¡}t j|dd …d d …f< | |¡ t  |¡}t| dd� 	||¡}|j
j}t|dkƒs‚J |ƒ‚d S )	Nr  rì   r>   r8   iìÿÿÿr:   rk  r   )rq   rC  rµ  r¶   r;  r]  r3  rË   r   r„   rØ   rv   rÅ   )r  rÿ   rX   r^   r_   r   rv   r|   r|   r}   Ú-test_regression_extra_tree_missing_values_toy–
  s    

rS  c                  C   sô   t jdd�\} }tj d¡}|  ¡ }|jtjdtjd�| dd…dgf d d	� 	t
¡}tj||< t||d
d�\}}}}tjg d¢tjd�}tdddd�}	|	 || || ¡ t|	jjdkƒsÀJ ‚t |	jjdk|	jjdk@ ¡}
t|	jj|
 dƒ dS )a×  Check that we properly handle missing values in clasification trees using a toy
    dataset.

    The test is more involved because we use a case where we detected a regression
    in a random forest. We therefore define the seed and bootstrap indices to detect
    one of the non-frequent regression.

    Here, we check that the impurity is null or positive in the leaves.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/28254
    T)Z
return_X_yr¯   )r8   r7   )rŸ   rí   NrL   rK   )Únrð  é   r   )prL   éQ   é'   éa   é[   é&   é.   é   ée   rU  éY   éR   r  r¯   éE   é   rV  é   éI   éJ   é3   é/   ék   é   éK   én   rZ   r«   éh   é9   é   r«   ri  éO   é#   éM   éZ   re  r[  rU  é^   rY  é   rK   é]   rt  rc  rp  r1  rU  rd  ém   rj  é   rC   rs  rk  ra  é\   é4   rZ   ru  rK   rK   é   ra  ro  r1  r1  rX  rÝ  r   rV   r\  éN   r1  rv  éi   r>  r   rc  r1  éf   r{  rU  r\  r8   r`  rH   é    ri  rq  éj   rr  r¬   é8   ro  rh  é>   éU   rV  rW  éP   rb  é?   rI   r‚  éT   r;   r;   éL   rz  rì   r;   rÚ   iH¼nr°   r   r>   r8   rS   )r   Ú	load_irisrq   rC  rµ  rƒ  r}  rŽ   r�  rý   rL  r3  r   r—   r   r„   rÅ   rØ   rv   rP  rp   rt   r   )r^   r_   rÿ   rJ  ÚmaskrÙ  r¯  r™   rž   r   rQ  r|   r|   r}   Ú+test_classification_tree_missing_values_toy¤
  s,    "ÿþ

ù
ÿÿrˆ  c                  C   sL  t ddd�} |  tjtj¡ t | j¡}t| j	|| j
ƒ}tj| jjtjd�}d|d< t|| j|ƒ | jjdksrJ ‚|jdks€J ‚t t¡�  t| jj|jƒ W d  ƒ n1 s°0    Y  t| jjd |jd ƒ t| j	|| j
ƒ}tj| jjtjd�}d|dd…< t|| j|ƒ | jjdk�s"J ‚|jdk�s8J |jƒ‚t| jj|jƒ dS )zHTest pruning a tree with the Python caller of the Cythonized prune tree.r   r8   rk  rì   r;   N)r   r„   r`   r¥   r¦   rq   Ú
atleast_1dr2  r  Ún_features_in_r³  rj   rØ   rm   Úuint8r   r¨   rÓ   ÚAssertionErrorr'   rw   ©r   r$  Zpruned_treeZleave_in_subtreer|   r|   r}   Útest_build_pruned_tree_pyÓ
  s&    .rŽ  c                  C   s”   t ddd�} |  tjtj¡ t | j¡}t| j	|| j
ƒ}tj| jjtjd�}d|d< tjtdd�� t|| j|ƒ W d  ƒ n1 s†0    Y  dS )z8Test pruning a tree does not result in an infinite loop.r   r8   rk  rì   z,Node has reached a leaf in the original treerá   N)r   r„   r`   r¥   r¦   rq   r‰  r2  r  rŠ  r³  rj   rØ   rm   r‹  r¨   rÓ   rÔ   r   r�  r|   r|   r}   Ú$test_build_pruned_tree_infinite_loopò
  s    ÿr�  c                  C   s`   t j d¡} | jdddd� t j¡}t  |gd ¡}t  d¡}t||dƒ g d¢}t	||ƒ d	S )
zÇNon-regression test for gh-30554.

    Using log2 and log in sort correctly sorts feature_values, but the tie breaking is
    different which can results in placing samples in a different order.
    ri  rS   g      $@rC   )ÚlocÚscaler\   r:   r>  )2r   é(   rV   rZ   rC   é   rW  é   é1   rñ   é-   r«   ro  r:   é   rH   r\  é)   r8   é   é   r1  rL   r¯   r}  rs  rU  rÝ  r;   é!   rI   é$   r[  rb  rm  r7   r@  rv  é"   é,   ra  rf  rX  é%   rh  rK   rZ  é0   ry  é   N)
rq   rC  Zdefault_rngÚnormalrý   rþ   r€  r¶   r   r'   )rÿ   ZsomeZfeature_valuesr…  Zexpected_samplesr|   r|   r}   Útest_sort_log2_build  s    
r£  )N)N)N)îÚ__doc__rƒ  ré  ræ  r)  rD  rf  Ú	itertoolsr   r   r  Únumpyrq   r¨   Zjoblib.numpy_pickler   Znumpy.testingr   Zsklearnr   r   r   Zsklearn.dummyr	   Zsklearn.exceptionsr
   Zsklearn.imputer   Zsklearn.metricsr   r   r   Zsklearn.model_selectionr   r   Zsklearn.pipeliner   Zsklearn.random_projectionr   Zsklearn.treer   r   r   r   Zsklearn.tree._classesr   r   r   r   Zsklearn.tree._partitionerr   Zsklearn.tree._treer   r   r   r   r    r!   r"   r#   r  Zsklearn.utilsr$   Zsklearn.utils._testingr%   r&   r'   r(   r)   r*   Zsklearn.utils.fixesr+   r,   r-   r.   Zsklearn.utils.validationr/   r¤   ZREG_CRITERIONSr‚   r¸   Údictr6   Ú__annotations__ÚupdateZSPARSE_TREESr—   r’  r“  Zy_small_regr^   r_   r†   r‡   r†  r`   rC  rµ  rÿ   r~  r¦   r\   Úpermr¥   Zload_diabetesra   Zload_digitsrb   rW   Zmake_multilabel_classificationr¡  r¢  rØ  ZX_sparse_posr@  Zy_randomr‚  ZX_sparse_mixrj   rü   r~   r‹   r‘   ÚmarkZparametrizer  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/  r1  r4  r7  r=  rB  rG  rK  rM  rR  rS  rV  rW  rZ  r[  r^  rb  rj  rq  rt  Úsortedr¶  Úintersectionru  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/  r5  r6  r8  r;  r<  r=  r>  r?  rD  rA  rK  rM  rÏ  rÏ   rN  rO  r3  rR  rS  rˆ  rŽ  r�  r£  r|   r|   r|   r}   Ú<module>   sŠ  $	 þþ

éÿ(ÿ

õ'



üþ	
$B!;
ÿ
=
H3<-4
/
		
)þ3ÿÿþ
ÿK


d
ÿ(
!*
!4ÿ!

þþ


öþ- þþúþ!/