U
    ^»{j�b ã                &   @   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< eJ LeG¡ eJ LeH¡ 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jX Yd¡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< �q dSdT„ ZqdUdV„ ZrdWdX„ Zsejt udYeH v¡ ¡ejt udZeF¡d[d\„ ƒƒZwd]d^„ Zxd_d`„ Zyejt udaeH z¡ ¡ejt udZeF¡dbdc„ ƒƒZ{e@ejt udaeH z¡ ¡ejt udddedfedgfdhdKedgfdidfedgfdjdfedEfg¡dkdl„ ƒƒƒZ|dmdn„ Z}dodp„ Z~dqdr„ Zdsdt„ Z€dudv„ Z�dwdx„ Z‚dydz„ Zƒd{d|„ Z„d}d~„ Z…dd€„ Z†d�d‚„ Z‡�dRd„d…„Zˆejt ud†eJ¡d‡dˆ„ ƒZ‰ejt ud†eM¡d‰dŠ„ ƒZŠ�dSd‹dŒ„Z‹ejt ud†eJ¡d�dŽ„ ƒZŒejt ud†eM¡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jt ud†eG¡d£d¤„ ƒZ—d¥d¦„ Z˜ejt ud†eG¡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¢�dTd»d¼„Z£ejt ud½eM¡ejt ud¾d¿¡dÀdÁ„ ƒƒZ¤ejt ud½e¥e¦eMƒ §eH¡ƒ¡ejt ud¾dÂdÃg¡dÄdÅ„ ƒƒZ¨dÆdÇ„ Z©dÈdÉ„ Zªejt ud½eM¡ejt ud¾dÊdËdÌdÍg¡ejt udÎe©eªg¡dÏdÐ„ ƒƒƒZ«�dUdÑdÒ„Z¬ejt ud½eM¡dÓdÔ„ ƒZ­e?dÕdÖ„ ƒZ®ejt ud†eJ¡d×dØ„ ƒZ¯dÙdÚ„ Z°dÛdÜ„ Z±ejt ud†eJ¡dÝdÞ„ ƒZ²dßdà„ Z³dádâ„ Z´ejt ud†eJ¡dãdä„ ƒZµejt ud†eM¡dådæ„ ƒZ¶dçdè„ Z·dédê„ Z¸ejt ud†eJ¡dëdì„ ƒZ¹dídî„ Zºejt ud†eJ¡dïdð„ ƒZ»dñdò„ Z¼dódô„ Z½dõdö„ Z¾ejt udZeE¡ejt ud¾e¥e¦eo ¿¡ ƒdÃdÂh ƒ¡ejt ud÷e%e'g¡dødù„ ƒƒƒZÀejt udZeF¡ejt ud¾eo ¿¡ ¡ejt ud÷e&e(g¡dúdû„ ƒƒƒZÁdüdý„ ZÂdþdÿ„ ZÃ�d �d„ ZÄejt ud†eJ¡ejt u�d�d�dg¡ejt u�d�d�d�dg¡�d	�d
„ ƒƒƒZÅejt udZdedidjg¡ejt udYeH v¡ ¡�d�d„ ƒƒZÆejt u�deÇd#ƒ¡�d�d„ ƒZÈ�d�d„ ZÉejt udZeF¡�d�d„ ƒZÊejt udYe%e'g¡ejt u�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*„ ZÕejt u�d+ee, v¡ e- v¡ ƒ¡�d,�d-„ ƒZÖ�d.�d/„ Z×ejt udYeJ v¡ ¡�d0�d1„ ƒZØejt udZdedig¡�d2�d3„ ƒZÙejt udZ�d4�d5g¡�d6�d7„ ƒZÚejt udZ�d4�d5g¡�d8�d9„ ƒZÛejt udZ�d4�d5g¡�d:�d;„ ƒZÜejt udZ�d4�d5g¡�d<�d=„ ƒZÝejt u�d>�d?dƒg¡ejt u�d@e%�d�dA�e&dh�dB�g¡�dC�dD„ ƒƒZÞ�dE�dF„ Zßejt u�dGejàe&fejáe%fg¡ejt u�dHd�dIg¡�dJ�dK„ ƒƒZâ�dL�dM„ Zãejt u�dGejàe&fejáe%fg¡�dN�dO„ ƒZä�dP�dQ„ ZådS (V  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š™™™™™	Àgáz®Gá @iúÿÿÿg      à¿é   é   ç      à?é   é   ç      ø?ç      ð?ç333333ó?çš™™™™™©?g333333@gÍÌÌÌÌÌ@g)\�Âõ(ð?ç{®Gáz„?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/bwave/python/venv/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s¦t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� q‚d 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ŒÁý_9Ða@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¿½A‹wæ?gtúQ?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s†t‚|dd�}| tjtj¡ |jdks®t‚|dd�}| tjtj¡ |jdksÖt‚|dd�}| tjtj¡ |jdksþt‚|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s‚t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s�t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sªt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Âtd ||¡ƒ‚qÂq„q d S )Néd   ©rL   rK   rÛ   r   ©r¼   rK   rE   )r¼   Úmin_impurity_decreaserK   g-Cëâ6?rº   gH¯¼šò×z>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s®t‚| ||¡}	||	ksÐtd | ¡ƒ‚|D ]*}
tt|j|
ƒ||
 d|
› d| › �d� qÔq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�sŠt‚|	d jd	ksØt‚qØt
 ¡ D ]@\}}
|
dd�}| | |¡ |¡}t||ƒ |jdk�s¦t‚�q¦d 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s†t‚t|jƒdks˜t‚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sŒt	‚|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sÆt	‚t
| | ¡t  d	d¡ƒ q–d 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rêt|
 |¡|ƒ t|
 |¡|ƒ qêqpd 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�rŽt| |¡| |¡ƒ �qŽd 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sÖt
‚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sÊt‚| |
ksÖt‚||ks’t‚q’q.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sÊt‚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rÊt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¡s¨t‚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 sÐt‚qÐd 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_1Útree1Ú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 qŽt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 )zŠMissing 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 )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.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sît‚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(       ÿ

r1  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sÆt‚| ||
¡dksÚt‚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    
r3  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{   )
r0  r    rì   rL   rM   rR   rS   rƒ   Ztree_with_swZtree_samples_removedrr   rr   rs   Útest_sample_weight_non_uniform*
  s    	 

(r4  c                  C   sP   t dd� tjtj¡} t dd� tjtj¡}t | ¡}t |¡}||ksLt‚d S rŠ  )r   rz   rT   r›   rœ   r  r  rc   )rÌ  rÍ  Zpickle1Zpickle2rr   rr   rs   Útest_deterministic_pickleG
  s
    

r5  )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½   r1  r3  r4  r5  rr   rr   rr   rs   Ú<module>   sŒ    þþ

üéÿ2é(
  ÿ

õ'



üþ	
$B!=

<

H3<+4/

		
+þ3F








d ÿ(!*%!4 ÿ
þþþþ þþ