
    /ii:                        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	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 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/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddl7m?Z@ ddlAmBZB ddlCmDZD ddlEmFZFmGZGmHZHmIZImJZJ ddlKmLZLmMZMmNZNmOZO ddlPmQZQ ddlRmSZS dZTdZUe*e,dZVe+e-dZW eX            ZYeXeZd<   eY[                    eV           eY[                    eW           g dZ\ ej]        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 d3g d4g d5g          Z^g d6Z_g d7Z`d8d9gd9d9gd9d8gd:d:gd:d;gd;d:ggZag d<Zbd9d9gd;d;gd=d;ggZcg d>Zd eje                    Zfejg        h                    d:          Zieij                    efjk        jl                  Zmefjn        em         ef_n        efjk        em         ef_k         ejo                    Zpeij                    epjk        jl                  Zmepjn        em         ep_n        epjk        em         ep_k         ejq                    Zreij                    erjk        jl                  Zmerjn        em         er_n        erjk        em         er_k         eSd          Zs ejt        dd?d@A          \  ZuZvesw                    dBC          ZxdDexexdEk    <   esy                    ddFdGC          Zz e(dHd@dIdJ          {                                Z|efjn        efjk        dKepjn        epjk        dKerjn        erjk        dKeaebdKe^e_dKe^e`dKeuevdKexezdKex ezdKe|ezdK ej}        dL          ezdKdMZ~dN ZdO ZdP Zej                            dQeW                                          ej                            dReU          dS                         ZdT ZdU Zej                            dVeW                                          ej                            dReU          dW                         Zej                            dQeW                                          ej                            dXdYe!fdZefd[e!fd\e fg          d]                         Zd^ Zd_ Zd` Zda Zdb Zdc Zdd Zde Zdf Zdg Zdh ZddiZej                            djeY          dk             Zej                            dje\          ej                            dleN          dm                         Z	 ddnZej                            djeY          do             Zej                            dje\          ej                            dleN          dp                         Zdq Zdr Zej                            dsg  e
eW                                eU           e
eV                                eT                    dt             Zdu Zdv Zdw Zdx Zdy Zej                            djeV          dz             Zej                            djeV          d{             Zd| Zd} Zd~ Zd Zej                            deY                                          d             Zd Zd Zd Zd Zd ZddZej                            de\          ej                            dd          d                         Zej                            d e ee\                              eW                              ej                            dddg          d                         Zej                            de\          ej                            dg d          ej                            dleN          d                                     Zej                            d e e
d e\D             eU                     e e
d e\D             eT                    z             ej                            dg d          ej                            dleN          d                                     Zej                            de\          ej                            d eeNeO                    d                         Zd Zej                            djeY          d             Zej                            djeY          ej                            ddgeNz             d                         Zej                            djeY          d             Zej                            dje\          ej                            deO          d                         Zd Zej                            djeY          d             Zej                            djeY          ej                            deO          d                         Zd Zd Zej                            ddgeNz             d             Zej                            d e ee~                                          ddhz
                      ej                            de*e,g          d                         Zej                            de~                                          ej                            de+e-g          d                         Zd Zd Zd Zej                            djeY          ej                            dddg          ej                            ddgeNz   eOz             d                                     Zej                            dRg d          ej                            dQeW                                          d                         Zej                            d ed=                    d             Zd Zej                            dQe*e,g          ej                            dd;dFg          d                         Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zej                            d e e1j                     e2j                                        d             Zd Zej                            dQeY                                          d             Zej                            dRdYd[g          d             Zej                            d ed=                    ej                            dRdYd[g          dÄ                         Zej                            dRddg          dƄ             Zej                            dRddg          dǄ             Zej                            dRddg          dȄ             Zej                            dRddg          dɄ             Zej                            ddgeOz             ej                            d e+dZ˦           e-dZ˦          g          d̄                         Zej                            dQeW                                          d̈́             Zd΄ Zej                            dej        e+dfej        e-dfee*dfee,dfg          ej                            dddg          dՄ                         Zej                            d eeV                                ddg                    dل             Zej                            dej        e+fej        e*fg          dۄ             Zd܄ Zej                            dQe+e-g          ej                            d ej]        ej        d;ej        dFddg           ej]        ej        ej        d=dFddg           ej]        d:d;d=dFej        ej        g           ej]        d:d;d=ej        dej        g          g          ej                            dRdYd[g          d                                     Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )z-
Testing for the tree module (sklearn.tree).
    N)chainpairwiseproduct)NumpyPickler)assert_allclose)clonedatasetstree)DummyRegressor)NotFittedError)SimpleImputer)accuracy_scoremean_absolute_error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_precompute_absolute_errors)_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)xpx)assert_almost_equalassert_array_almost_equalassert_array_equalcreate_memmap_backed_dataignore_warnings)	_IS_32BITCOO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERS_weighted_percentile)check_random_state)ginilog_loss)squared_errorabsolute_errorfriedman_msepoisson)r   r   )r   r   	ALL_TREES)r   r      r   r   r      ir   r   r   r   r   )r   r         r   r?   r   r   r>   皙?r   r=   r>   )rD   r   r         r   r    @r>   r   r   rE   r   r>   )rD   rD   r   g333333r   r   r   r   r   r   rC   r   r   r>   )rD   rD   r   r   r   r   r   rA   r   r   r   r   r   r>   )rD   r   r=   
   r=   r   皙	r   r=   rA   r?   r>   )zG @r         r      r   r   rJ            ?r   rH   r>   )rK   r   rL   rM   r   rN   r   r   rJ   rO   r   r   rG   r>   )rK      rL   rM   r   rN   r   r   rJ   rO   r   r   rG   r>   )rK   rQ   rL   rM   r   rN   r   r   rJ   rO   rP   r   rD   r   )   rQ   r@   r>   rP   r?   rI   r   r>   rB   rA   r   rR   r   )rR   r   r>   r>   r>   rD   r>   r   r   rG   rA   r   r>   r   )rR   r   r>   rR   rA   rD   rI   rR   r   rD   r>   rR   rR   r   )r>   r>   r   rR   rR   rD   r>   rR   r   rB   r>   rR   rA   r   )rA   r>   r   rA   r   r?   rI   r   r>   rB   rA   r   rA   r>   )rK   rQ   rL   rM   r   r>   r   r   rJ   rO   rP   r   rH   r>   )rK   rQ   rL   rM   r   r>   r   r   rJ   rO         ?r>   rD   rD   )rK   rQ   rL   rM   r   rI   r   r   rJ   rO   rP   r   rD   rD   )rR   r   r@   r>   rP   rG   rI   r   r>   rB   rA   r>   r   rD   )rR   r   r>   r>   r>   rG   r>   r   r   rG   r   r   r   r>   )rR   r>   r>   r>   rR   rD   rI   rR   r   rD   r   rR   r>   r>   )r>   r>   r   r   r>   rH   r>   rR   r   rB   r>   rR   r>   r>   )rA   r>   r   r>   r   r?   r>   r   r>   rG   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   )      ?rF   333333?皙?rI   g333333@@g)\(?{Gz?gףp=
@rW   g?        rU   rR   rN   r   r         @g|?5^?g(\??r   rG   rD   r>   rR   )rD   rD   rD   r>   r>   r>   rA   )rD   r>   r>      rI   )random_state	n_samples
n_features)   r@   sizerY   g?r=   )r`   r`         ?)densityr]   Xy)r`   rA   )irisdiabetesdigitstoy	clf_small	reg_small
multilabel
sparse-pos
sparse-neg
sparse-mixzerosc                 4   |j         | j         k    s)J d                    ||j         | j                               t          | j        |j        |dz              t          | j        |j        |dz              | j        t
          k    }t          j        |          }t          | j        |         |j        |         |dz              t          | j	        |         |j	        |         |dz              t          | j
                                        |j
                                        |dz              t          | j
        |j
        |dz              t          | j        |j        |dz   	           t          | j        |         |j        |         |d
z   	           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!   nplogical_notfeature	thresholdn_node_samplessumr*   impurityr+   value)dsmessageexternalinternals        b/var/www/html/bet.cuttalo.com/ml/venv/lib/python3.11/site-packages/sklearn/tree/tests/test_tree.pyassert_tree_equalr      s   <1<'''299Q\1<	
 	
 ('' 	!*G6P,P   	'4M*M   9,H~h''H		(QYx0'<P2P   	Hq{84g@U6U   		11  
 	!*G6P,P   
AJBV8VWWWW	178,g@Q6Q         c                     t                                           D ]\  } } |d          }|                    t          t                     t          |                    t                    t          d	                    |                       |dd          }|                    t          t                     t          |                    t                    t          d	                    |                      d S )Nr   r]   Failed with {0}r>   )max_featuresr]   )
	CLF_TREESitemsfitrf   rg   r,   predictTtrue_resultrw   namer'   clfs      r   test_classification_toyr      s    oo'' X X
dd"""13;;q>>;8I8P8PQU8V8VWWWd22213;;q>>;8I8P8PQU8V8VWWWWX Xr   c            
      ~   t                                           D ]!\  } } |d          }|                    t          t          t          j        t          t                                         t          |	                    t                    t          d                    |                      |                    t          t          t          j        t          t                    d                     t          |	                    t                    t          d                    |                      #d S )Nr   r   sample_weightr   rP   )r   r   r   rf   rg   rz   oneslenr,   r   r   r   rw   fullr   s      r    test_weighted_classification_toyr     s    oo'' X X
dd"""1BGCFFOO4443;;q>>;8I8P8PQU8V8VWWW1BGCFFC$8$89993;;q>>;8I8P8PQU8V8VWWWWX Xr   r'   	criterionc                 >   |dk    rgt          j        t          j        t                              dz   }t          j        t                    |z   }t          j        t
                    |z   }nt          }t
          } | |d          }|                    t          |           t          |	                    t                    |            | |dd          }|                    t          |           t          |	                    t                    |           d S )Nr;   r>   r   r]   r   r   r]   )rz   absminrg   arrayr   r   rf   r   r   r   )r'   r   ay_trainy_testregr   s          r   test_regression_toyr     s     I F26!99!(1++/+&&*
$
3
3
3CGGAwCKKNNF+++
$
C
C
CCGGAwCKKNNF+++++r   c                     t          j        d          } d| d dd df<   d| dd dd f<   t          j        | j                  \  }}t          j        |                                |                                g          j        }|                                 } t                                          D ]\  }} |d          }|	                    ||            |
                    ||           dk    sJ d                    |                       |dd          }|	                    ||            |
                    ||           dk    sJ d                    |                      d S )	N)rI   rI   r>   r@   r   r   rT   r   r]   r   )rz   rr   indicesshapevstackravelr   r   r   r   scorerw   )rg   gridxgridyrf   r   r'   r   s          r   test_xorr   %  sb   
AAbqb"1"fIAabb!""fI:ag&&LE5
	5;;==%++--0113A			Aoo'' F F
dd"""1yyA#%%%'8'?'?'E'E%%%d2221yyA#%%%'8'?'?'E'E%%%%F Fr   c                     t          t                                          t                    D ]0\  \  } }} ||d          }|                    t
          j        t
          j                   t          |	                    t
          j                  t
          j                  }|dk    sJ d
                    | ||                       ||dd          }|                    t
          j        t
          j                   t          |	                    t
          j                  t
          j                  }|dk    sJ d
                    | ||                      2d S )Nr   r   r[   z0Failed with {0}, criterion = {1} and score = {2}rR   r   rP   )r   r   r   CLF_CRITERIONSr   rh   datatargetr   r   rw   )r   r'   r   r   r   s        r   	test_irisr   :  s*   #*9??+<+<n#M#M 
 
tidYQ777	4;'''s{{4955t{CCs{{{NUU)U
 
{{{ dYQQGGG	4;'''s{{4955t{CCs{{{NUU)U
 
{{{{
 
r   z
name, Treec                 8    ||d          }|                     t          j        t          j                   t	          t          j        |                    t          j                            }|t          j        d          k    sJ d|  d| d|             d S )Nr   r   zFailed with z, criterion = z and score = )r   ri   r   r   r   r   pytestapprox)r   r'   r   r   r   s        r   test_diabetes_overfitr   L  s    
 $
3
3
3CGGHM8?+++xHM0J0JKKEFM!$$$$$JtJJ9JJ5JJ %$$$$r   zcriterion, metricr8   r9   r:   r;   c           	         t          |d|          }t          j        t          j        }} || | di |ddi                    ||                              |                    } || | di |ddi                    ||                              |                    } || | di |ddi                    ||                              |                    }	d|	cxk     r|cxk     r|k     sn J |	||f            d S )	NrO   r   	max_depthr>   r=      r    )dictri   r   r   r   r   )
r'   r   metricglobal_random_seedkwargsrf   rg   loss1loss4loss7s
             r   test_diabetes_underfitr   Y  sN    IADVWWWF=(/qAF1dd11V11q11155a;;CCAFFGGEF1dd11V11q11155a;;CCAFFGGEF1dd11V11q11155a;;CCAFFGGE u$$$$u$$$$u$$$$$ueU&;$$$$$r   c            	      B   t                                           D ]\  } } |ddd          }|                    t          j        t          j                   |                    t          j                  }t          t          j	        |d          t          j
        t          j        j        d                   d                    |                      t          t          j        |d          |                    t          j                  d                    |                      t!          |                    t          j                  t          j        |                    t          j                            dd                    |                      d S )Nr>   *   r   r   r]   r   r   rt   rQ   )r   r   r   rh   r   r   predict_probar+   rz   r   r   r   rw   r,   argmaxr   r*   exppredict_log_proba)r   r'   r   prob_predicts       r   test_probabilityr   p  sg     oo'' 
 

ddQQR@@@	4;'''((33!F<##GDIOA&''%,,T22	
 	
 	
 	

 	IlA&&KK	""%,,T22	
 	
 	
 	

 	di((F3((3344%,,T22		
 	
 	
 	
 	

 
r   c                     t          j        d          d d t           j        f         } t          j        d          }t                                          D ](\  }} |d d          }|                    | |           )d S )Ni'  r   r   r]   )rz   arangenewaxis	REG_TREESr   r   rf   rg   r   r'   r   s        r   test_arrayreprr     s     		%BJ'A
	%Aoo''  
ddT2221 r   c                     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                    |          	           `t                                          D ]_\  }} |d          }|                    | |           t          |                    |           |d                    |          	           `d S )
NrG   rD   r>   rR   )r>   r>   r>   r>   r>   r>   r   r   r   rt   )r   r   r   r,   r   rw   r   r*   )rf   rg   r   TreeClassifierr   TreeRegressorr   s          r   test_pure_setr     s,   
bB8b"X1v1v1v>AA ) 1 1 V Vnn!,,,13;;q>>16G6N6Nt6T6TUUUUU(00 W Wmm+++1CKKNNA7H7O7OPT7U7UVVVVVW Wr   c            
         t          j        g dg dg dg dg dg dg dg          } t          j        g d          }t          j        d	
          5  t                                          D ]m\  }} |d          }|                    | |           |                    | |            |                    |  |           |                    |  |            n	 d d d            d S # 1 swxY w Y   d S )N)gs_c@d	a@籛 `8`@?c@)g_9a@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   )rT   gAw?gtQ?5??rY   g7G?gۺ?gb'?raise)allr   r   )rz   r   errstater   r   r   r   s        r   test_numerical_stabilityr     sh   
DDDDDDDDDDDDDDDDDDDDD	

	 
	A 	WWWXXA		!	!	!  #//++ 	 	JD$$A&&&CGGAqMMMGGArNNNGGQBNNNGGQBOOOO	                 s   BC++C/2C/c            	         t          j        ddddddd          \  } }t                                          D ]\  }} |d          }|                    | |           |j        }t          j        |dk              }|j        d         dk    sJ d		                    |                      |dk    sJ d		                    |                      t          d          }|                    t          j        t          j                   t          dt          t          j                  
          }|                    t          j        t          j                   t          |j        |j                   d S )N  rI   rA   r   Fr^   r_   n_informativen_redundant
n_repeatedshuffler]   r   皙?r   r]   max_leaf_nodes)r	   make_classificationr   r   r   feature_importances_rz   r   r   rw   r   rh   r   r   r   r,   )rf   rg   r   r'   r   importancesn_importantclf2s           r   test_importancesr     se   '  DAq  oo'' @ @
dd"""1.f[3.// #r)))+<+C+CD+I+I)))a!2!9!9$!?!? !a
0
0
0CGGDIt{###!qTYPPPDHHTY$$$s/1JKKKKKr   c                      t                      } t          j        t                    5  t	          | d           d d d            d S # 1 swxY w Y   d S )Nr   )r   r   raises
ValueErrorgetattr)r   s    r   test_importances_raisesr     s    
 
"
"C	z	"	" - -+,,,- - - - - - - - - - - - - - - - - -s   AA
A
c            	      .   t          j        ddddddd          \  } }t          ddd	                              | |          }t	          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  rI   rA   r   Fr   r6   r@   )r   r   r]   r8   )r	   r   r   r   r   r*   r   r,   tree_r|   ry   rx   r~   )rf   rg   r   r   s       r   )test_importances_gini_equal_squared_errorr     s    '  DAq !6QQ
O
O
O
S
S	1 C  !QQ  	c!Qii  0#2JKKKsy(#)*;<<<sy.	0GHHHsy/1IJJJsy/1IJJJJJr   c                     t                                           D ]\  } } |d          }|                    t          j        t          j                   |j        t          t          j	        t          j        j
        d                             k    sJ  |d          }|                    t          j        t          j                   |j        t          t          j        t          j        j
        d                             k    sJ  |d          }|                    t          j        t          j                   |j        dk    sJ  |d          }|                    t          j        t          j                   |j        dk    sJ  |d          }|                    t          j        t          j                   |j        dk    sJ  |d          }|                    t          j        t          j                   |j        t          dt          j        j
        d         z            k    sJ  |d          }|                    t          j        t          j                   |j        t          j        j
        d         k    sJ  |d           }|                    t          j        t          j                   |j        t          j        j
        d         k    sJ d S )	Nsqrt)r   r>   log2rA   rX   rP   rT   )r<   r   r   rh   r   r   max_features_intrz   r  r   r  )r   TreeEstimatorests      r   test_max_featuresr    s{   (00 7 7mm000	4;''' C	0B(C(C$D$DDDDDm000	4;''' C	0B(C(C$D$DDDDDm+++	4;''' A%%%%m+++	4;''' A%%%%m...	4;''' A%%%%m---	4;''' Cdioa.@(@$A$AAAAAm---	4;''' DIOA$66666m...	4;''' DIOA$666666?7 7r   c                  z
   t                                           D ]r\  } } |            }t          j        t                    5  |                    t                     d d d            n# 1 swxY w Y   |                    t          t                     g dg}t          j        t                    5  |                    |           d d d            n# 1 swxY w Y    |            }t          d d         }t          j        t                    5  |                    t          |           d d d            n# 1 swxY w Y   t          j        t                    } |            }|                    |t                     t          |                    t                    t                      |            }t          j        t                    5  |                    t                     d d d            n# 1 swxY w Y   |                    t          t                     t          j        t                    }t          j        t                    5  |                    |d d dd f                    d d d            n# 1 swxY w Y   t          j        t                    j        } |            }|                    t          j        t          |          t                     t          j        t                    5  |                    t                     d d d            n# 1 swxY w Y   t          j        t                    5  |                    t                     d d d            n# 1 swxY w Y    |            }|                    t          t                     t          j        t                    5  |                    |           d d d            n# 1 swxY w Y   t          j        t                    5  |                    |           d d d            n# 1 swxY w Y    |            }t          j        t                    5  |                    t                     d d d            n# 1 swxY w Y   tt)          d          }t          j        t          d          5  |                    g dgg d	           d d d            n# 1 swxY w Y   t          j        t          d
          5  |                    g dgg d           d d d            d S # 1 swxY w Y   d S )N)rG   rD   r>   rD   r>   r;   r   zy is not positive.*Poissonmatchr   r>   rR   )r   r   r   zSome.*y are negative.*Poisson)r@   grR   )r   r   r   r   r   r   rf   r   rg   r   rz   asfortranarrayr*   r   r   r   asarrayr   dotapplyr   )	r   r  r  X2y2XftXtr   s	            r   
test_errorr  &  s   (00 6 6mmoo]>** 	! 	!a   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	1kk]]:&& 	" 	"b!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" moossV]:&& 	 	GGArNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 q!!mooACKKNNK888 moo]>** 	 	KKNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	1JqMM]:&& 	" 	"KK!!!QRR%!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" Xa[[]mooq"q!!!]:&& 	 	KKNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	]:&& 	 	IIaLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 moo1]:&& 	 	KKOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	]:&& 	 	IIbMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 moo]>** 	 	IIaLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  )
4
4
4C	z)E	F	F	F ( (YYY'''( ( ( ( ( ( ( ( ( ( ( ( ( ( (	z)H	I	I	I + +\\\***+ + + + + + + + + + + + + + + + + +s   A**A.	1A.	3CC	C	D::D>	D>	G::G>	G>	"JJ		J		L++L/	2L/	M66M:	=M:	O&&O*	-O*	
P,,P0	3P0	RR	R	9S!!S%(S%T00T47T4c                     t          j        t          j        t          j        j                  } t          j        }t          dt          
                                          D ]\  }}t          |         } |d|d          }|                    | |           |j        j        |j        j        dk             }t          j        |          dk    sJ d                    |                       |d	|d          }|                    | |           |j        j        |j        j        dk             }t          j        |          dk    sJ d                    |                      d
S )z Test min_samples_split parameterdtypeN  rI   r   )min_samples_splitr   r]   rD   	   r   rC   N)rz   r  rh   r   r
   _treeDTYPEr   r   r<   keysr   r   r~   ry   r   rw   )rf   rg   r   r   r  r  node_sampless          r   test_min_samples_splitr#  h  sc   
$)4:+;<<<AA !(inn6F6F G G H H!$ m a
 
 
 	1y/	0G20MNvl##a'''):)A)A$)G)G''' m!.q
 
 
 	1y/	0G20MNvl##a'''):)A)A$)G)G''''+H Hr   c                  @   t          j        t          j        t          j        j                  } t          j        }t          dt          
                                          D ]9\  }}t          |         } |d|d          }|                    | |           |j                            |           }t          j        |          }||dk             }t          j        |          dk    sJ d                    |                       |d|d          }|                    | |           |j                            |           }t          j        |          }||dk             }t          j        |          dk    sJ d                    |                      ;d S )	Nr  r  r@   r   )min_samples_leafr   r]   r=   r   r   )rz   r  rh   r   r
   r  r   r   r   r<   r!  r   r   r  bincountr   rw   )	rf   rg   r   r   r  r  outnode_counts
leaf_counts	            r   test_min_samples_leafr*    s   
$)4:+;<<<AA !(inn6F6F G G F F!$ m~A
 
 
 	1iooa  k#&& !12
vj!!A%%%'8'?'?'E'E%%% m a
 
 
 	1iooa  k#&& !12
vj!!A%%%'8'?'?'E'E%%%%/F Fr   c                 <   t           |         d                             t          j                  }| ||          }t           |         d         }t                              |j        d                   }t          j        |          }t          |          }t          dt          j
        ddd                    D ]\  }}	 ||	|d          }
|
                    |||	           |-|
j                            |                                          }n|
j                            |          }t          j        ||
          }||dk             }t          j        |          ||
j        z  k    s#J d                    | |
j                              |j        d         }t          dt          j
        ddd                    D ]\  }}	 ||	|d          }
|
                    ||           |-|
j                            |                                          }n|
j                            |          }t          j        |          }||dk             }t          j        |          ||
j        z  k    s#J d                    | |
j                              dS )zPTest if leaves contain at least min_weight_fraction_leaf of the
    training setrf   Nrg   r   r  rP   rO   )min_weight_fraction_leafr   r]   r   )weightsz,Failed with {0} min_weight_fraction_leaf={1})DATASETSastyperz   float32rngrandr   r   r<   r   linspacer   r   r  tocsrr&  r   r,  rw   )r   r	   sparse_containerrf   rg   r-  total_weightr  r   fracr  r'  node_weightsleaf_weightss                 r   check_min_weight_fraction_leafr:    s    	3&&rz22A#Q3Ahhqwqz""G6'??LdOM !(bk!S!6L6L M M 
 
m%).WX
 
 
 	1G,,,')//!'')),,CC)//!$$C{3888#LA$56vl##|c6R'RRRR:AAc2  SRRR 71:L 'bk!S!6L6L M M 
 
m%).WX
 
 
 	1')//!'')),,CC)//!$$C{3''#LA$56vl##|c6R'RRRR:AAc2  SRRR
 
r   r   c                 &    t          | d           d S Nrh   r:  r   s    r   ,test_min_weight_fraction_leaf_on_dense_inputr?    s    "400000r   csc_containerc                 *    t          | d|           d S Nrn   )r5  r=  r   r@  s     r   -test_min_weight_fraction_leaf_on_sparse_inputrD    s     #4VVVVVVr   c                 &   t           |         d                             t          j                  }| ||          }t           |         d         }|j        d         }t
          |          }t          dt          j        ddd                    D ]\  }} |||dd	          }	|	                    ||           |-|	j	        
                    |                                          }
n|	j	        
                    |          }
t          j        |
          }||dk             }t          j        |          t          ||	j        z  d          k    s)J d
                    | |	j        |	j                              t          dt          j        ddd                    D ]\  }} |||dd	          }	|	                    ||           |-|	j	        
                    |                                          }
n|	j	        
                    |          }
t          j        |
          }||dk             }t          j        |          t          ||	j        z  ||	j        z            k    s)J d
                    | |	j        |	j                              dS )zzTest the interaction between min_weight_fraction_leaf and
    min_samples_leaf when sample_weights is not provided in fit.rf   Nrg   r   r  rP   rA   r@   )r,  r   r%  r]   zBFailed with {0} min_weight_fraction_leaf={1}, min_samples_leaf={2}r   )r.  r/  rz   r0  r   r<   r   r3  r   r   r  r4  r&  r   maxr,  rw   r%  )r   r	   r5  rf   rg   r6  r  r   r7  r  r'  r8  r9  s                r   4check_min_weight_fraction_leaf_with_min_samples_leafrG    s   
 	3&&rz22A#Q3A71:LdOM 'bk!S!6L6L M M 
 
m%))	
 
 
 	1')//!'')),,CC)//!$$C{3''#LA$56vl##sC881(
 (
 
 
 
OVV#.0D
 

 
 
 

 !(bk!S!6L6L M M 
 
m%)) 	
 
 
 	1')//!'')),,CC)//!$$C{3''#LA$56vl##sC88C00(
 (
 
 
 
 PVV#.0D
 

 
 
 
%
 
r   c                 &    t          | d           d S r<  rG  r>  s    r   Btest_min_weight_fraction_leaf_with_min_samples_leaf_on_dense_inputrJ  +  s    8vFFFFFr   c                 *    t          | d|           d S rB  rI  rC  s     r   Ctest_min_weight_fraction_leaf_with_min_samples_leaf_on_sparse_inputrL  0  s,    
 9l]     r   c                 $   t          j        d|           \  }}t          dt                                                    D ]\  }}t          |         } ||d          } ||dd          } ||dd          } ||d	d          }	|d
f|df|df|	d	ffD ]s\  }
}|
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        |         }||z  }|
j	        j        |         }|
j	        j        |         }|
j	        j        |         }||z  }||z   }||z  }|
j	        j        |         |j        d         z  }|||z
  z  }||k    sJ d                    ||                      ud S )Nd   r^   r]   r  r   r   r]   rV   )r   min_impurity_decreaser]   g-C6?r   Hz>z)Failed, min_impurity_decrease = {0} > {1}z2Failed with {0} expected min_impurity_decrease={1})r	   r   r   r<   r!  rQ  rw   r   ranger   rv   ry   r!   r   weighted_n_node_samplesrx   r   )r   rf   rg   r   r   r  est1est2est3est4r  expected_decreasenode
imp_parent
wtd_n_nodeleft
wtd_n_leftimp_leftwtd_imp_leftrightwtd_n_right	imp_rightwtd_imp_rightwtd_avg_left_right_impfractional_node_weightactual_decreases                             r   test_min_impurity_decreaserh  :  s    '#DVWWWDAq !(inn6F6F G G > >!$ }NKKK})TU
 
 
 })VW
 
 
 })ST
 
 

 4L4L6N3K	'
 ,	 ,	"C" ,0AAAA;BB-/@  BAA
 GGAqMMMci233     9*40I==!$!3D!9J!$!B4!HJ9248D!$!B4!HJ"y1$7H#-#8LI4T:E"%)"CE"JK #	 25 9I$/)$;M-:\-I**j8* 	9$?!'!*L + '="%;;'O +.????LSS+->  @??9 ,	%> >r   c            
         t                                           D ]6\  } }d| v rt          j        t          j        }}nt
          j        t
          j        }} |d                              ||                               ||          }g d}fd|D             }t          j	                  }t          j
        |          }t          |          j        k    sJ |                    ||          }	||	k    sJ d                    |                       |D ]3}
t          t          |j        |
          ||
         d|
 d|  	           48d
S )z8Test pickling preserves Tree properties and performance.
Classifierr   r   )r   rv   capacity	n_classesry   rx   n_leavesr|   r}   r   r~   rT  r   c                 <    i | ]}|t          j        |          S r   )r   r   ).0	attributer  s     r   
<dictcomp>ztest_pickle.<locals>.<dictcomp>  s4     
 
 
9BIwsy)44
 
 
r   z6Failed to generate same score  after pickling with {0}z"Failed to generate same attribute z after pickling with rt   N)r<   r   rh   r   r   ri   r   r   pickledumpsloadstype	__class__rw   r,   r   r   )r   r  rf   rg   r   
attributesfitted_attributeserialized_objectrV  score2rp  r  s              @r   test_pickler{    s   (00 . .m49dkqAA=(/qAm+++1		!Q
 
 


 
 
 
FP
 
 
 #L--|-..DzzS]****Aq!!DKKDQQ  * 	 	I
I.. +   	    	M. .r   zTree, criterionc                     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}t          j        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}t          j        ddgddgddgddgg          }|t          v }|dk    r(||dk    xx         dz  cc<   ||dk    xx         dz  cc<   |r | d|	          }|                    ||                              |          }t          ||           |j        d
k    sJ |                    |          }	t          |	          dk    sJ |	d         j        d
k    sJ |	d         j        dk    sJ |	                    |          }
t          |
          dk    sJ |
d         j        d
k    sJ |
d         j        dk    sJ d S  | d|	          }|                    ||                              |          }t          ||           |j        d
k    sJ d S )NrG   rD   r>   rR   r   rA   r;   r=   )r]   r   r=   rR   )r=   r=   )rz   r   r   r   r   r,   r   r   r   r   r*   )r'   r   rf   rg   r   y_trueis_clfr   y_hatproba	log_probar   s               r   test_multioutputr    s    
R	R	R	
A	
A	
A	Q	Q	Q	
B	
B	
B	A 	GGGFFFGGGFFF	
	 	A" bAq6B7QG,AXAwAQ!Q899F.(FI	!q&			Q			v{q  %dY7771%%a((5&))){f$$$$!!!$$5zzQQx~''''Qx~''''))!,,	9~~""""|!V++++|!V++++++ dY7771%%a((E6***{f$$$$$$r   c                  v   t                                           D ]\  } } |d          }|                    t          t                     |j        dk    sJ t          |j        ddg           t          j	        t          t          j
        t                    dz  f          j        } |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           d S )Nr   r   rR   rD   r>   rG   )r   r   r   rf   rg   
n_classes_r,   classes_rz   r   r   r   r   )r   r   r   _ys       r   test_classes_shaper    s,    ) 1 1 = =nn!,,,1~""""3<"a111 Y28A;;?+,,.n!,,,23>""a''''3<  A%%%%3>Aq62223<2q'B7);<<<<= =r   c                  B   t           j        d d         } t           j        d d         }t          d|          }t                                          D ]L\  }} |d          }|                    | ||           t          |                    |           |           Md S )N}   balancedr   r   r   )	rh   r   r   r(   r   r   r   r*   r   )unbalanced_Xunbalanced_yr   r   r   r   s         r   test_unbalanced_irisr    s    9TcT?L;tt$L)*lCCM ) 1 1 E Enn!,,,l-HHHCKK55|DDDDE Er   c                  D   t          t                                          t          j        t          j        g          D ]\  \  } }} |d          }t          j        t          j        |          }t          j	        }t          |                    ||                              |          |           t          j        t          j        d|          }t          j	        }t          |                    ||                              |          |           t          j        t          j        d|          }t          j	        }t          |                    ||                              |          |           t          j        t          j        |          }t          j	        }t          |                    ||                              |          |           t          D ]\} |t          j        |          }t          j	        }t          |                    ||                              |          |           ]t          D ]\} |t          j        |          }t          j	        }t          |                    ||                              |          |           ]t          j        t          j        d d d         |          }t          j	        d d d         }t          |                    ||                              |          |           d S )Nr   r   r  C)orderr  FrA   )r   r<   r   rz   float64r0  r  rh   r   r   r,   r   r   ascontiguousarrayr2   r1   )r   r  r  r  rf   rg   csr_containerr@  s           r   test_memory_layoutr    s   (/BJ
3) ) (8 (8$}u m+++ Jty...K3771a==0033Q777 Jty5999K3771a==0033Q777 Jty5999K3771a==0033Q777  %888K3771a==0033Q777 , 	< 	<Mdiu555AAswwq!}}44Q77;;;; , 	< 	<Mdiu555AAswwq!}}44Q77;;;; Jty1~U333K!3771a==0033Q7777Q(8 (8r   c                     t          j        d          d d t           j        f         } t          j        d          }d|d d<   t          j        d          }d||dk    <   t	          d          }|                    | ||           t          |                    |           t          j        d                     t          j        d          d d t           j        f         } t          j        d          }d|dd<   d	|dd<   d| dddf<   t          j        d          }d
||d	k    <   t	          dd          }|                    | ||           |j	        j
        d         dk    sJ d||d	k    <   t	          dd          }|                    | ||           |j	        j
        d         dk    sJ t          j        } t          j        }t                              d| j        d         d          }t	          d          }|                    | |         ||                    t          j        || j        d                   }t	          d          }|                    | ||           |j	        j        t&          j        j        k    }t-          |j	        j
        |         |j	        j
        |                    d S )NrN  rY   2   r   r   r      r>   rR   gRQ?r   g     b@rP   g     H@)	minlength)rz   r   r   r   r   r   r,   r   rr   r   r}   rh   r   r   r1  randintr   r&  ry   r
   r  r!   r+   )rf   rg   r   r   
duplicatesr   r   s          r   test_sample_weightr  L  s    		#qqq"*}%A
AAcrcFGCLLMM!q&
 a
0
0
0CGGAqG...s{{1~~rws||444 		#qqq"*}%A
AAbfIAc#gJAc#gqjMGCLLM M!q&
 11
=
=
=CGGAqG...9q!U****M!q&
 11
=
=
=CGGAqG...9q!T)))) 		AAQ
C00J
 a
0
0
0CGGAjM1Z=)))K
agajAAAM!q111DHHQH///y&$**>>H	H%tz';H'E    r   c                  f   t          j        d          d d t           j        f         } t          j        d          }d|d d<   t	          d          }t           j                            dd          }t          j        t                    5  |
                    | ||           d d d            n# 1 swxY w Y   t          j        d          }t          j        d          }t          j        t          |	          5  |
                    | ||           d d d            d S # 1 swxY w Y   d S )
NrN  rY   r  r   r   r>   r   zgInput should have at least 1 dimension i.e. satisfy `len(x.shape) > 0`, got scalar `array(0.)` instead.r  )rz   r   r   r   r   randomr2  r   r   r   r   r   reescape	TypeError)rf   rg   r   r   expected_errs        r   test_sample_weight_invalidr    s   
	#qqq"*}%A
AAcrcF
 a
0
0
0CINN3**M	z	"	" 3 31M2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 HQKKM9B L 
y	5	5	5 3 31M2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3s$   B22B69B6 D&&D*-D*c                    t           |          } |d          }|                    t          j        t          j                    |dd          }|                    t          j        t          j                   t          |j        |j                   t          j        t          j        t          j        t          j        f          j	        } |ddddddddddddgd          }|                    t          j        |           t          |j        |j                    |dd          }|                    t          j        |           t          |j        |j                   t          j
        t          j        j                  }|t          j        dk    xx         d	z  cc<   dd
dd} |d          }|                    t          j        t          j        |            ||d          }|                    t          j        t          j                   t          |j        |j                    |d          }|                    t          j        t          j        |dz              ||d          }|                    t          j        t          j        |           t          |j        |j                   d S )Nr   r   r  class_weightr]   g       @rT   r  r>   rN  g      Y@rR   )r   r   rh   r   r   r*   r   rz   r   r   r   r   )	r   r   clf1r   
iris_multiclf3clf4r   r  s	            r   test_class_weightsr    s    t_N >q)))DHHTY$$$>zBBBDHHTY$$$143LMMM DKdkBCCEJ>$$$$$$

   D 	HHTY
###143LMMM>zBBBDHHTY
###143LMMM GDK-..M$+"###s*###u--L>q)))DHHTY]333>|!DDDDHHTY$$$143LMMM >q)))DHHTY]A%5666>|!DDDDHHTY]333143LMMMMMr   c                 X   t           |          }t          j        t          t          j        t                    dz  f          j        } |dddgd          }d}t          j        t          |          5  |	                    t          |           d d d            d S # 1 swxY w Y   d S )	NrR   rP   rT   rD   r>   r   r  zBnumber of elements in class_weight should match number of outputs.r  )r   rz   r   rg   r   r   r   r   r   r   rf   )r   r   r  r   ru   s        r   test_class_weight_errorsr    s     t_N	Arx{{Q'	(	(	*B .CC'8'8&9
J
J
JCRG	z	1	1	1  2                 s   6BB#&B#c                      t          j        dd          \  } }d}t                                          D ]F\  }} |d |dz                                 | |          }|                                |dz   k    sJ Gd S NrN  r>   rO  r=   )r   r   )r	   make_hastie_10_2r<   r   r   get_n_leavesrf   rg   kr   r  r  s         r   test_max_leaf_nodesr    s    $sCCCDAq	A(00 + +mmd1q5AAAEEaKK!!QU*****+ +r   c                      t          j        dd          \  } }d}t                                          D ]@\  }} |d|                              | |          }|                                dk    sJ Ad S r  )r	   r  r<   r   r   	get_depthr  s         r   test_max_leaf_nodes_max_depthr    s    $sCCCDAq	A(00 $ $mma:::>>q!DD}}!#####$ $r   c                      dD ]a} t          t                                          dgdggddg          j        |           }d|j        d         cxk    rdk     sn J d            bd S )N)rl  r   ry   rx   r}   r   r|   r~   r   r>   rH   rA   z Array points to arbitrary memory)r   r   r   r   flat)attrr   s     r   test_arrays_persistr    s    	 K K .0044qcA3Z!QHHNPTUUUZ]&&&&Q&&&&&(J&&&&K Kr   c                      t          d          } t          j        d          }|                     ddd          }t                                          D ]9\  }} |d          }|                    ||           |j        j        dk    sJ :d S )Nr   )rI   r`   rR   rI   r   )	r5   rz   rr   r  r<   r   r   r   r   )r]   rf   rg   r   r  r  s         r   test_only_constant_featuresr    s    %a((L
AQ5))A(00 ( (mm+++1y"a'''''( (r   tree_clsc                 :   t          d          }|                    dd          }d}|d d dfxx         |z  cc<   |                    ddd          } | d          }|                    ||           |j        d         dk    sJ |j        d         dk    sJ d S )Nr   rI   rR   rR  r  r   r>   )r5   r2  r  r   r   )r  r]   rf   feature_thresholdrg   r  s         r   test_almost_constant_featurer    s    
 &a((L"a  A aaadGGG  GGGQ5))A
(
"
"
"CGGAqMMM#A&!++++#A&******r   c                  \   t          j        t          j        g dgt          j        d          f                    } g d}t                                          D ]P\  }}d|vrG |dd          }|                    | |           |j        j        dk    sJ |j        j	        d	k    sJ Qd S )
N)r   r   r   r   r   r>   rR   r=   r@   rO   r   )r=   rN   )r   r   r   r>   r>   rR   rR   rR   rA   rA   rA   	ExtraTreer   r>   r   rR   r@   )
rz   	transposer   rr   r<   r   r   r   r   rv   rf   rg   r   r  r  s        r   ,test_behaviour_constant_feature_after_splitsr    s    

	55568I8IJKK	 	A 	*))A(00 - -md""-QQ???CGGAqMMM9&!++++9'1,,,,- -r   c                     t          j        t          j        dgdgdgdgg          t          j        d          g          } t          j        g d          }t                                          D ]p\  }} |dd          }|                    | |           |j        j        dk    sJ t          |
                    |           t          j        dd	                     qt                                          D ]p\  }} |dd          }|                    | |           |j        j        dk    sJ t          |                    |           t          j        d
d	                     qd S )NrT   rY   )r=   r  )rY   rT   rY   rT   r   r>   r   r}  rP   )r=   )rz   hstackr   rr   r   r   r   r   r   r,   r   r   r   r   r  s        r   (test_with_only_one_non_constant_featuresr  &  se   
	28cUSEC53%89928I;N;NOPPA
%%%&&A(00 G Gmm;;;1y"a''''3,,Q//1E1EFFFF(00 ? ?mm;;;1y"a''''3;;q>>274+=+=>>>>	? ?r   c                  F   t          j        dd                              t           j                                      dd          } t                      }t          j        t          d          5  |	                    | g d           d d d            d S # 1 swxY w Y   d S )Ng\)c=Hr=   rD   r>   r0  r  )r   r>   r   r>   )
rz   repeatr/  r  reshaper   r   r   r   r   )rf   r   s     r   test_big_inputr  7  s    
	(A%%bj1199"a@@A
 
"
"C	z	3	3	3 ! !<<<   ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !s   0BBBc                      ddl m}  t          j        t                    5   |              d d d            d S # 1 swxY w Y   d S )Nr   _realloc_test)sklearn.tree._utilsr  r   r   MemoryErrorr  s    r   test_reallocr  ?  s    111111	{	#	#                   s   8<<c                  >   dt          j        d          z  } t          j                            dd          }t          j                            ddd          }d| dz   z  }t          d|          }t          j        t                    5  |
                    ||           d d d            n# 1 swxY w Y   d| dz
  z  dz
  }t          d|          }t          j        t                    5  |
                    ||           d d d            d S # 1 swxY w Y   d S )	NrQ   PrI   rR   r   r>   best)splitterr   )structcalcsizerz   r  randnr  r   r   r   	Exceptionr   r  )n_bitsrf   rg   huger   s        r   test_huge_allocationsr  F  s   %%%F
	AA
	!Q##A !D
 &
F
F
FC	y	!	!  1              
 !q D
 &
F
F
FC	{	#	#  1                 s$   B..B25B2.DDDc                    t           |          }t          |         d         }t          |         d         }|dv r$|j        d         dz  }|d |         }|d |         }t          t          z   t
          z   D ]i} ||          } |d|                              ||          }	 |d|                              ||          }
t          |	j        |
j        d	                    |                      |	
                    |          }| t          v r*|	                    |          }|	                    |          }t          t
          z   t          z   D ]} ||t          j                  }t!          |

                    |          |           | t          v rFt!          |
                    |          |           t!          |
                    |          |           kd S )	Nrf   rg   )rj   ri   r   r@   r]   r   5{0} with dense and sparse format gave different treesr  )r<   r.  r   r0   r1   r2   r   r   r   rw   r   r   r   r   rz   r0  r+   )r
   datasetr   r  rf   rg   r^   r5  X_sparser   r   y_predy_probay_log_probasparse_container_testX_sparse_tests                   r   check_sparse_inputr  [  s   dOM#A#A (((GAJ!O	jyjMjyjM*^;nL  ##A&& MqI>>>BB1aHHMqI>>>BB8QOOGGCJJ4PP	
 	
 	
 19ooa((G--a00K%3n%D~%U 		 		!11("*MMMM%aii&>&>GGGy  )!//-*H*H'RRR)''66  		% r   	tree_typer  )rl   rk   rj   rn   ro   rp   rq   rr   c                 <    |dk    rdnd }t          | ||           d S )Nrj   rA   r  )r  r  r   s      r   test_sparse_inputr    s/     ((dIy'955555r   ri   rm   c                 (    t          | |d           d S )NrR   r  )r  r  s     r   test_sparse_input_reg_treesr    s    
 y'1-----r   )ro   rp   rq   rr   c                    t           |          }t          |         d         } ||          }t          |         d         } |ddd                              ||          } |ddd                              ||          }t          |j        |j        d                    |                      t          |                    |          |                    |                      |ddd	                              ||          } |ddd	                              ||          }t          |j        |j        d                    |                      t          |                    |          |                    |                      |d|j        d         dz  
                              ||          } |d|j        d         dz  
                              ||          }t          |j        |j        d                    |                      t          |                    |          |                    |                      |dd                              ||          } |dd                              ||          }t          |j        |j        d                    |                      t          |                    |          |                    |                     d S )Nrf   rg   r   r>   rR   )r]   r   r   r  rI   )r]   r   r  )r]   r%  rA   r   )	r<   r.  r   r   r   rw   r+   r   r   )	r  r  r@  r  rf   r  rg   r   r   s	            r   test_sparse_parametersr    s    i(M#A}QH#A 	11BBBFFq!LLA11BBBFFxQRSSA		?FFyQQ  
 aiillAIIaLL999 	11KKKOOPQSTUUA11KKKOO!	 	A 		?FFyQQ  
 aiillAIIaLL999 	1x~a7HA7MNNNRRSTVWXXA1x~a7HA7MNNNRR!	 	A 		?FFyQQ  
 aiillAIIaLL999 	1Q777;;AqAAA1Q777;;HaHHA		?FFyQQ  
 aiillAIIaLL99999r   ztree_type, criterionc                 $    g | ]}|t           v |S r   )r   ro  r
   s     r   
<listcomp>r    s"    EEE4493D3D$3D3D3Dr   c                 $    g | ]}|t           v |S r   )r   r  s     r   r  r    s"    DDD$$)2C2C2C2C2Cr   c                    t           |          }t          |         d         } ||          }t          |         d         } |dd|                              ||          } |dd|                              ||          }	t          |j        |	j        d                    |                      t          |	                    |          |                    |                     d S )Nrf   rg   r   rA   r]   r   r   r  )r<   r.  r   r   r   rw   r+   r   )
r  r  r@  r   r  rf   r  rg   r   r   s
             r   test_sparse_criteriar    s     i(M#A}QH#A1YGGGKKAqQQA1YGGGKKHVWXXA		?FFyQQ  
 aiillAIIaLL99999r   zcsc_container,csr_containerc                 
   t           |          }d}d}|}t          j        |          }t          d          }g }	g }
d}|g}t	          |          D ]}|                    |d          }|                    |          d |         }|	                    |           |                    dd|f          dz
  }|
                    |           ||z  }|                    |           t          j        |	          	                    t          j
                  }	t          j        |t          j
                  }t          j        t          j        |
          t          j                  }
 ||
|	|f||f          }|                                } ||
|	|f||f          }|                                }|                    dd|f          }|                                }|j        d	k                                    dk    sJ |j        d	k                                    dk    sJ  |d|
                              ||          } |d|
                              ||          }t'          |j        |j        d                    t,                               ||f}t/          ||          D ]N\  }}t1          |j                            |          |j                            |                     t1          |                    |          |                    |                     t1          |                    |          |j                            |                     t1          |j                            |                                          |j                            |                                                     t1          |                    |                                          |                    |                                                     t1          |                    |                                          |j                            |                                                     t1          |                    |          |                    |                     t,          t8          v r6t1          |                    |          |                    |                     Pd S )NrA   rI   r   rP   ra   r>   r  r   rY   r  r  )r<   rz   r   r5   rS  binomialpermutationappendconcatenater/  int32r   r0  toarrayr  copyr   r   r   r   r   rw   r
   r   r+   r  decision_pathr   r   r   )r  r@  r  r  r   r_   r^   samplesr]   r   r   offsetindptrin_nonzero_i	indices_idata_ir  rf   r  X_testrg   r   r   XsX1r  s                              r   test_explicit_sparse_zerosr    s   
 i(MIJ Ii	""G &a((LGDFXF:  "++Is;; ,,W55l{lC	y!!!&&q#[N&CCaGF+fnW%%,,RX66GXfBH---F8BN4((
;;;D}dGV4Y
<STTTHA!M	w	:'>  M ""$$FQ55A "&&((M MS %%''!++++#%**,,q0000 	1	:::>>q!DDA1	:::>>xKKA		?FFtLL   -	 B"b// P PB!!'--"3"3QW]]25F5FGGG!!''"++qwwr{{;;;!!''"++qw}}R/@/@AAA!G!!"%%--//1F1Fr1J1J1R1R1T1T	
 	
 	
 	"OOB''))1??2+>+>+F+F+H+H	
 	
 	
 	"OOB''))17+@+@+D+D+L+L+N+N	
 	
 	
 	"!))B--2???9%aoob&9&91??2;N;NOOO%P Pr   c                 P   t           |          }t          j        d d df                                         }t          j        d d df                             d          }t          j        }t          j        t                    5   |d          	                    ||           d d d            n# 1 swxY w Y    |d          }|	                    ||           t          j        t                    5  |
                    |g           d d d            d S # 1 swxY w Y   d S )Nr   r  r   )r<   rh   r   r   r  r   r   r   r   r   r   )r   r  rf   X_2drg   r  s         r   check_raise_error_on_1d_inputr  >  s   dOM	!!!Q$A9QQQT?""7++DA	z	"	" 0 01%%%))!Q///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -Q
'
'
'CGGD!	z	"	"  QC                 s$   !B11B58B57DD"Dc                 r    t                      5  t          |            d d d            d S # 1 swxY w Y   d S N)r.   r  r>  s    r   test_1d_inputr  N  s    			 , ,%d+++, , , , , , , , , , , , , , , , , ,s   ,00r5  c                 `   t           |          }t          j        dgdgdgdgdgg          }g d}g d}| ||          } |d          }|                    |||           |j        j        dk    sJ  |dd          }|                    |||           |j        j        dk    sJ d S )	Nr   r>   )r   r   r   r   r>   )rC   rC   rC   rC   rC   r   r   g?)r]   r,  )r<   rz   r   r   r   r   )r   r5  r  rf   rg   r   r  s          r    test_min_weight_leaf_split_levelr  T  s     dOM
1#sQC!qc*++AA---M#Q
-Q
'
'
'CGGAqG...9!####
-Q
E
E
ECGGAqG...9!######r   c                 D   t                               t          j        j        d          }t          |                      }|                    t           t                     t          |	                    t                     |j
        	                    |                     d S NFr  X_smallr/  r
   r  r   r<   r   y_smallr,   r  r   )r   	X_small32r  s      r   test_public_apply_all_treesr   h  so    tz/e<<I
D/

CGGGWsyy))39??9+E+EFFFFFr   r  c                 V    |t                               t          j        j        d                    }t          |                      }|                    t           t                     t          |	                    t                     |j
        	                    |                     d S r  r  )r   r  r  r  s       r   test_public_apply_sparse_treesr"  q  s{     gnnTZ-=EnJJKKI
D/

CGGGWsyy))39??9+E+EFFFFFr   c                     t           j        } t           j        }t          dd                              | |          }|                    | d d                                                   }t          |g dg dg           dt          j	        t          j	        ddg} g d}t          j
        |                               d	d          } t          d
                              | |          } |j        |                                                               d          }t          ||j        j                   d S )Nr   r>   r  rR   )r>   r>   r   r>   r   r>   rA   r   r   r   r>   r>   rD   r   axis)rh   r   r   r   r   r  r  r,   rz   nanr   r  r   r   r   r~   )rf   rg   r  node_indicatorr
   r~   s         r   test_decision_path_hardcodedr*  {  s   	AA
 a1
=
=
=
A
A!Q
G
GC&&q!u--5577N~			999'=>>>
 
BFBFAq!AA
B""A a00044Q::D'T'**224488a8@@N~tz'@AAAAAr   c                    t           j        }t           j        }|j        d         }t          |          } |dd          }|                    ||           |                    |          }|                                j        ||j        j	        fk    sJ |
                    |          }fdt          |          D             }t          |t          j        |                     |j        j        t           k    }	t          t          j        |	          t          j        |                                         d                                          }
|j        j        |
k    sJ d S )Nr   rR   r  c                 *    g | ]\  }}||f         S r   r   )ro  r	  jr)  s      r   r  z&test_decision_path.<locals>.<listcomp>  s&    JJJ1~ad+JJJr   r  r>   r&  )rh   r   r   r   r<   r   r  r  r   rv   r  	enumerater+   rz   r   ry   r!   r  r   rF  r   )r   rf   rg   r^   r  r  node_indicator_csrleavesleave_indicator
all_leavesr   r)  s              @r   test_decision_pathr3    s]   	AA
IdOM
-Q!
4
4
4CGGAqMMM**1--'//11NIsy/C#DDDDD YYq\\FJJJJ	&8I8IJJJOorwY/G/G/GHHH (I5J
~z**BG),D,D,D  
 """**..00I9)++++++r   c                     t            |t                    }}t          |          }t          j        t
                    5   |d                              ||           d d d            d S # 1 swxY w Y   d S Nr   r   )X_multilabely_multilabelr<   r   r   r  r   )r   r  rf   rg   r  s        r   test_no_sparse_y_supportr8    s     |44qAdOM	y	!	! 0 01%%%))!Q///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   !A,,A03A0c                     t          ddd          } |                     dgdgdgdgdggg dg d	
           t          | j        j        g d           t          | j        j        j        g d           |                     dgdgdgdgdggg dt          j	        d          
           t          | j        j        g d           t          | j        j        j        g d           |                     dgdgdgdgdggg d           t          | j        j        g d           t          | j        j        j        g d           t          ddd          } dgdgdgdgdgg}|                     |g dg d
           t          | 
                    |          g d           t          | j        j        g d           t          | j        j        j        g d           dS )aP  Check MAE criterion produces correct results on small toy datasets:

    ## First 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
            ------

    ## Second toy dataset:
    ------------------
    | X | y | weight |
    ------------------
    | 1 | 1 |   3    |
    | 2 | 1 |   3    |
    | 3 | 3 |   2    |
    | 4 | 1 |   1    |
    | 5 | 2 |   2    |
    ------------------
    |sum wt:|   11   |
    ------------------

    The weighted median is 1
    Total error = Absolute(1 - 3) * 2 + Absolute(1 - 2) * 2 = 6

    The best split is between X values of 2 and 3, with:
    - left node being the first 2 data points, both with y=1
      => AE and impurity is 0
    - right node being the last 3 data points, weighted median is 2.
      Total error = (Absolute(2 - 3) * 2)
                  + (Absolute(2 - 1) * 1)
                  + (Absolute(2 - 2) * 2)
                  = 3
    r   r9   rR   )r]   r   r   rA   r@   rQ   )rO   r   rA   r=   rA   )333333?333333?r   rT   r;  )rf   rg   r   )g,d?gܶm۶m?g?)      @g      @r<  )ffffff?rS   gUUUUUU?)r=   rZ   r<  re   r>   )r]   r   r   r=   )r>   r>   rA   r>   rR   )rA   rA   rR   r>   rR   )r>   r>   rR   rR   rR   )gtE]t?r   r:  )r>   r>   rR   N)r   r   r   r   r   r,   r   r  rz   r   r   )dt_maerf   s     r   test_maer?    sB   H #"21  F
 JJ3aS1#s
#
/////    
 FL)+L+L+LMMMv|).@@@ JJ1#sQC!qc*oooRWUVZZJXXXv|,.C.C.CDDDv|).>>>
 JJ1#sQC!qc*oooJ>>>v|,.C.C.CDDDv|).>>>""  F
 qcA3aS!A
JJ

//%oo    
 FNN1%%777FL)+=+=+=>>>v|).			:::::r   c                  (   d} t          j        dt           j                  }d}d }t          j        t          j        |fD ]}t          j                    D ]W\  }} || |          } ||                                          }|\  }	\  }
}}||	k    sJ | |
k    sJ t          ||           Xt          j                    D ]O\  }} || |          } ||                                          }|\  }	\  }
}}||	k    sJ | |
k    sJ ||k    sJ Pd S )NrA   r  rN  c                 N    t          j        t          j        |                     S r  )rr  rt  rs  )objs    r   _pickle_copyz)test_criterion_copy.<locals>._pickle_copyJ  s    |FL--...r   )
rz   r   intpr  deepcopyr   r   
__reduce__r,   r   )	n_outputsrl  r^   rC  	copy_func_typenamecriteriaresult	typename_
n_outputs_r  
n_samples_s                r   test_criterion_copyrP  C  s{    I	!27+++II/ / / i= + +	'-// 	6 	6KAxx	955HYx((3355F5;2I/
Jy((((
****y*5555'-// 	+ 	+KAxx	955HYx((3355F5;2I/
Jy((((
****
*****	++ +r   c                    t           j                            d                              dd          dz  }t	          j        |                    d                    }|d d d df         }|  | |          }|d d df         }t          d                              ||          } |j	        |          }t          t          j        |j        j        t          k              d                   }|                    |          }t          j        t          j        |j        j                             d         }t%          |          dk    sJ t%          |          dk    sJ d S )Nr   rN  rN   g*Gr0  rD   r   )rz   r  RandomStater  r)   
nan_to_numr/  r   r   r  setwherer   ry   r!   
differenceisfiniter}   r   )	r5  r   rf   rg   r
   terminal_regions	left_leaf
empty_leafinfinite_thresholds	            r   "test_empty_leaf_infinite_thresholdr\  _  sM    9  ##))#r22T9D>$++i0011DQQQVA#QQQQUA a00044Q::D!tz!}}BHTZ5BCCAFGGI%%&677J2;tz/C#D#D"DEEaH!""a''''z??ar   c                 v   t           |          } | d         | d         }} |dd          }|                    ||          }|j        }|j        }t	          j        t	          j        |          dk              sJ t	          j        t	          j        |          dk              sJ t          ||||           d S Nrf   rg   r`   r   rP  r.  cost_complexity_pruning_path
ccp_alphas
impuritiesrz   r   diffassert_pruning_creates_subtreer  r  rf   rg   r  infopruning_pathrb  s           r   'test_prune_tree_classifier_are_subtreesrh  r  s    
 wG3<qA
("1
5
5
5C++Aq11D?LJ6"',''1,-----6"'*%%*+++++"8Q<@@@@@r   c                 v   t           |          } | d         | d         }} |dd          }|                    ||          }|j        }|j        }t	          j        t	          j        |          dk              sJ t	          j        t	          j        |          dk              sJ t          ||||           d S r^  r_  re  s           r   'test_prune_tree_regression_are_subtreesrj    s     wG3<qA
("1
5
5
5C++Aq11D?LJ6"',''1,-----6"'*%%*+++++"8Q<@@@@@r   c                      t          d          } |                     dgdggddg           t          dd          }|                    dgdggddg           t          | j        |j                   d S )Nr   r   r>   rI   )r]   	ccp_alpha)r   r   assert_is_subtreer   )r  r   s     r   test_prune_single_node_treern    s    !q111DHHqcA3Z!Q    "qB???DHHqcA3Z!Q   dj$*-----r   c                     g }|D ]9} | d|d                               ||          }|                    |           :t          |          D ]\  }}t          |j        |j                    d S )Nr`   r   )r   rl  r]   )r   r   r   rm  r   )	estimator_clsrf   rg   rg  
estimatorsrl  r  prev_estnext_ests	            r   rd  rd    s    J!  	m2QRSSSWWq
 
 	# 'z22 : :((.(.9999: :r   c                 8   | j         |j         k    sJ | j        |j        k    sJ | j        }| j        }|j        }|j        }dg}|rS|                                \  }}t          | j        |         |j        |                    t          | j        |         |j        |                    t          | j	        |         |j	        |                    t          | j
        |         |j
        |                    ||         ||         k    r!t          t          |j        |                    nlt          | j        |         |j        |                    |                    ||         ||         f           |                    ||         ||         f           |Qd S d S )N)r   r   )rv   r   ry   rx   popr+   r   r*   r   r~   rT  r"   r}   r   )	r
   subtreetree_c_lefttree_c_rightsubtree_c_leftsubtree_c_rightstacktree_node_idxsubtree_node_idxs	            r   rm  rm    s   ?g00000>W.....$K&L*N,OHE
 */))++''!J}%w}5E'F	
 	
 	
 	M-('*:;K*L	
 	
 	
 	.0FGW0X	
 	
 	
 	(7+,<=	
 	
 	

 *+?O/PPP0ABR0STTTT  }-w/@AQ/R   LL+m4nEU6VWXXXLLm,o>N.OP  3      r   r  r  r  c                 j   t           d         }|d                             t          j        j        d          }|t          |          }nt ||d                   }t          j        |j        t          j        j                  |_        t          |j        |j	        |j
        f          \  |_        |_	        |_
        t          t          j        t          t          j        j                            }t          |          |          }|                    ||           t          |                    |          |                    |                     t          |                    |                                          |                    |                                                     d S )Nrl   rf   Fr  r  )r  )r.  r/  r
   r  r   r-   rz   r   r   r   r  r  r<   r   r,   r   r  todense)r   r  r5  r  r  
X_readonly
y_readonlyr  s           r   "test_apply_path_readonly_all_treesr    st    {#Gcl!!$*"2!??G.w77

%%gcl33
(:?$*:JKKK

 &_j0*2CD
 
		
O
 +28G4:CS+T+T+TUUJ
D/8
,
,
,CGGJ
###s{{:..G0D0DEEE*%%--//1B1B71K1K1S1S1U1U    r   )r8   r:   r;   c                    t           j        t           j        }} ||           }|                    ||           t	          j        |                    |                    t          j        t	          j        |                    k    sJ d S )Nr
  )	ri   r   r   r   rz   r   r   r   r   )r   r'   rf   rg   r   s        r   test_balance_propertyr    sq     =(/qA
$
#
#
#CGGAqMMM6#++a..!!V]26!99%=%=======r   seedc           	         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|           }|                    ||           t          j        |                    |                    dk    sJ t          d|           }|                    ||           t          j        |                    |          dk              sJ d	}t          j        |dz  dz  d
d||dz  dz  |           \  }}d|d|k     |dk     z  <   t          j        |          }t          d|           }|                    ||           t          j        |                    |          dk              sJ d S )Nr   r>   rR   rA   r   r   r   r   r>   rR   rA   r=   r8   r   r;   rI   r:  r  )effective_ranktail_strengthr^   r_   r   r]   rD   )	r   r   rz   aminr   r   r	   make_regressionr   )r  rf   rg   r   r_   s        r   test_poisson_zero_nodesr    s    Q!Q!Q!Q!Q!Q!Q!QHA   A  /
M
M
MCGGAqMMM73;;q>>""a''''
)$
G
G
GCGGAqMMM6#++a..1$%%%%% J#!A~* 1n)  DAq ArAv!a%
q		A
)$
G
G
GCGGAqMMM6#++a..1$%%%%%%%r   c            	         t           j                            d          } d\  }}}t          j        ||z   ||           }|                     dd|          t          j        |d          z  }|                     t          j        ||z            	          }t          |||| 
          \  }}}	}
t          dd|           }t          dd|           }|                    ||	           |                    ||	           t          d                              ||	          }||	df||
dffD ]\  }}}t          ||                    |                    }t          |t          j        |                    |          dd                     }t          ||                    |                    }|dk    r|d|z  k     sJ |d|z  k     sJ d S )Nr   )  r  rI   r^   r_   r]   rG   rR   )lowhighrb   r   r&  )lam)	test_sizer]   r;   rI   )r   r  r]   r8   mean)strategytraintestgV瞯<rP   g      ?)rz   r  rR  r	   make_low_rank_matrixuniformrF  r;   r   r   r   r   r   r   r   clip)r1  n_trainn_testr_   rf   coefrg   X_trainr  r   r   tree_poitree_msedummyval
metric_poi
metric_msemetric_dummys                     r   test_poisson_vs_mser  %  s   
 )


#
#C".GVZ%F"z	 	 	A
 ;;2AJ;77"&:K:K:KKDq4x(())A'7	1S( ( ($GVWf %r  H %!Rc  H LL'"""LL'"""F+++//AAE1FFF3KL 
0 
0	1c*1h.>.>q.A.ABB
*1bgh6F6Fq6I6I5RV.W.WXX
,Qa0@0@AA &==j 00000D<//////
0 
0r   rl  c                 v   d\  }}t          j        ||||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   )rl  r^   r_   r   r   r]   r7   +   r   entropyz> with criterion 'entropy' and 'log_loss' gave different trees.N)r	   r   r   r   r   r   r   )r'   rl  r^   r_   rf   rg   tree_log_losstree_entropys           r   'test_criterion_entropy_same_as_log_lossr  O  s     "Iz'   DAq D:B???CCAqIIM4)"===AA!QGGLQQQ  
 M))!,,l.B.B1.E.EFFFFFr   c                  X   t          j        d          \  } }t          dd                              | |                               | |          }d fd}t          j         |                      }|                    | |          }t          j        ||          sJ d S )Nr   r   rA   r  c                     |                                                      | j                                                                                  S r  )byteswapviewr  newbyteorderrF  )arrs    r   reduce_ndarrayz8test_different_endianness_pickle.<locals>.reduce_ndarrayn  s8    ||~~""39#9#9#;#;<<GGIIIr   c                     t          j                    } t          j        |           }t          j                                        |_        |j        t          j        <   |	                               | 
                    d           | S Nr   )ioBytesIOrr  Picklercopyregdispatch_tabler  rz   ndarraydumpseek)fpr   r  s     r    get_pickle_non_native_endiannesszJtest_different_endianness_pickle.<locals>.get_pickle_non_native_endiannessq  sf    JLLN1"16688'5$	s	q			r   )	r	   r   r   r   r   rr  loadrz   isclose)rf   rg   r   r  new_clf	new_scorer   r  s         @@r    test_different_endianness_pickler  g  s    'Q777DAq
 a1
=
=
=CGGAqMMMIIaOOEJ J J      k::<<==Ga##I:eY'''''''r   c                  x   t          j        d          \  } }t          dd                              | |                               | |          } G d dt
                    fd}t          j         |                      }|                    | |          }t          j	        ||          sJ d S )Nr   r   rA   r  c                        e Zd Z fdZ xZS )Ptest_different_endianness_joblib_pickle.<locals>.NonNativeEndiannessNumpyPicklerc                     t          |t          j                  r>|                                                    |j                                                  }t                                          |           d S r  )	
isinstancerz   r  r  r  r  r  supersave)selfrB  rv  s     r   r  zUtest_different_endianness_joblib_pickle.<locals>.NonNativeEndiannessNumpyPickler.save  s]    #rz** Dllnn))#)*@*@*B*BCCGGLLr   )__name__
__module____qualname__r  __classcell__)rv  s   @r   NonNativeEndiannessNumpyPicklerr    s8        	 	 	 	 	 	 	 	 	r   r  c                      t          j                    }  |           }|                               |                     d           | S r  )r  r  r  r  )r  r  r  r   s     r   'get_joblib_pickle_non_native_endiannesszXtest_different_endianness_joblib_pickle.<locals>.get_joblib_pickle_non_native_endianness  sA    JLL++A..	s	q			r   )
r	   r   r   r   r   r   joblibr  rz   r  )rf   rg   r   r  r  r  r  r   s         @@r   'test_different_endianness_joblib_pickler    s    'Q777DAq
 a1
=
=
=CGGAqMMMIIaOOE    ,         kAACCDDGa##I:eY'''''''r   c                    t           rt          j        nt          j        }g d}d | j        j                                        D             }|D ]}|||<   t          j        t          |                                          t          |	                                          d          }| 
                    |d          S )N)
left_childright_childr|   r~   c                      i | ]\  }\  }}||S r   r   ro  r   r  rI  s       r   rq  z6get_different_bitness_node_ndarray.<locals>.<dictcomp>  /       (juae  r   namesformats	same_kindcasting)r/   rz   int64r  r  fieldsr   listr!  valuesr/  )node_ndarraynew_dtype_for_indexing_fieldsindexing_field_namesnew_dtype_dictr   	new_dtypes         r   "get_different_bitness_node_ndarrayr    s    09$GBHHrx! VUU ,8,>,E,K,K,M,M  N % = =<t~**,,--$~?T?T?V?V:W:WXX I y+>>>r   c                    d | j         j                                        D             }d | j         j                                        D             }d |D             }t	          j         t          |                                          t          |                                          |d          }|                     |d          S )Nc                      i | ]\  }\  }}||S r   r   r  s       r   rq  z8get_different_alignment_node_ndarray.<locals>.<dictcomp>  r  r   c                     g | ]\  }}|S r   r   )ro  r  r  s      r   r  z8get_different_alignment_node_ndarray.<locals>.<listcomp>  s    NNN-%vNNNr   c                     g | ]}d |z   S )rQ   r   )ro  r  s     r   r  z8get_different_alignment_node_ndarray.<locals>.<listcomp>  s    888fq6z888r   )r  r  offsetsr  r  )r  r  r   r  rz   r  r!  r/  )r  r  r  shifted_offsetsr  s        r   $get_different_alignment_node_ndarrayr    s     ,8,>,E,K,K,M,M  N ON<+=+D+K+K+M+MNNNG88888O.--//00N113344&	
 	
 I y+>>>r   c                    t           rt          j        nt          j        } | j                    \  }\  }}}}|                    |d          }|                                }t          |d                   |d<   ||||f|fS )Nr  r  nodes)r/   rz   r  r  rF  r/  r  r  )	r
   r  r  r_   rl  rG  statenew_n_classes	new_states	            r   "reduce_tree_with_different_bitnessr    s    %328I:I$/:K:K7H0z9i%$$Y$DDM

I;Ig<NOOIgz=)<iHHr   c                  T   t          j        d          \  } }t          dd                              | |                               | |          }fd}t          j         |                      }|                    | |          }|t          j        |          k    sJ d S )Nr   r   rA   r  c                     t          j                    } t          j        |           }t          j                                        |_        t          |j        t          <   |	                               | 
                    d           | S r  )r  r  rr  r  r  r  r  r  
CythonTreer  r  r  r  r   s     r   "pickle_dump_with_different_bitnesszItest_different_bitness_pickle.<locals>.pickle_dump_with_different_bitness  sd    JLLN1"16688'I$	s	q			r   )	r	   r   r   r   r   rr  r  r   r   )rf   rg   r   r  r  r  r   s         @r   test_different_bitness_pickler    s    'Q777DAq
 a1
=
=
=CGGAqMMMIIaOOE     k<<>>??Ga##IFM),,,,,,,,r   c                  T   t          j        d          \  } }t          dd                              | |                               | |          }fd}t          j         |                      }|                    | |          }|t          j        |          k    sJ d S )Nr   r   rA   r  c                     t          j                    } t          |           }t          j                                        |_        t          |j        t          <   |                               | 	                    d           | S r  )
r  r  r   r  r  r  r  r  r  r  r  s     r   "joblib_dump_with_different_bitnesszPtest_different_bitness_joblib_pickle.<locals>.joblib_dump_with_different_bitness  s`    JLLOO"16688'I$	s	q			r   )	r	   r   r   r   r   r  r  r   r   )rf   rg   r   r  r  r  r   s         @r   $test_different_bitness_joblib_pickler    s     'Q777DAq
 a1
=
=
=CGGAqMMMIIaOOE     k<<>>??Ga##IFM),,,,,,,,r   c                      t           rt          j        t          j                  nt          j        t          j                  } t          j        t          j                  t          j        t          j                  g}|d |D             z  }t          j        ddg|           }|D ]%}t          |                    |          |            &t          j	        t          d          5  t          j        ddgg|           }t          ||            d d d            n# 1 swxY w Y   t          j	        t          d          5  |                    t          j                  }t          ||            d d d            d S # 1 swxY w Y   d S )Nc                 6    g | ]}|                                 S r   )r  )ro  dts     r   r  z(test_check_n_classes.<locals>.<listcomp>  s"    BBBRr((BBBr   r   r>   r  zWrong dimensions.+n_classesr  zn_classes.+incompatible dtype)r/   rz   r  r  r  r   r$   r/  r   r   r   r  )expected_dtypeallowed_dtypesrl  r  wrong_dim_n_classeswrong_dtype_n_classess         r   test_check_n_classesr    s   +4LRXbh'''"(28:L:LNhrx(("(28*<*<=NBB>BBBBN!Q~666I ? ?))"--~>>>>	z)F	G	G	G > > hAx~FFF,n===> > > > > > > > > > > > > > > 
z)H	I	I	I @ @ ) 0 0 < <.???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @s$   **D  D$'D$0FF
Fc                      t          j        t           j                  } d}t          j        ||           }| |                                 g}|D ]}t          |||           t          j        t          d          5  t          || d           d d d            n# 1 swxY w Y   |d d d d d df         t          j	        |          fD ]L}t          j        t          d          5  t          || |j
                   d d d            n# 1 swxY w Y   Mt          j        t          d	          5  t          |                    t           j                  | |           d d d            d S # 1 swxY w Y   d S )
N)r@   r>   rR   r  )r  expected_shapezWrong shape.+value arrayr  )r>   rR   r>   zvalue array.+C-contiguouszvalue array.+incompatible dtype)rz   r  r  rr   r  r&   r   r   r   r  r   r/  r0  )r  r  value_ndarrayr  r  problematic_arrs         r   test_check_value_ndarrayr  	  sr   Xbj))NNH^>BBBM$n&A&A&C&CDN 
 
"^	
 	
 	
 	
 	
 
z)C	D	D	D 
 
.	
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 *!!!QQQ(3R5F}5U5UV  ]:-HIII 	 	 -.4   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 
z)J	K	K	K 
 
  ,,))	
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s6   ?BB"%B"+DD	D	60E33E7:E7c                     t           } t          j        d|           }|t          |          t	          |          g}|d |D             z  }|D ]}t          ||            t          j        t          d          5  t          j        d|           }t          ||            d d d            n# 1 swxY w Y   t          j        t          d          5  |d d d	         }t          ||            d d d            n# 1 swxY w Y   d
 |j	        j
                                        D             }|                                }t          j        |d<   t          j	        t          |                                          t          |                                          d          }|                    |          }t          j        t          d          5  t          ||            d d d            n# 1 swxY w Y   |                                }t          j        |d<   t          j	        t          |                                          t          |                                          d          }|                    |          }t          j        t          d          5  t          ||            d d d            d S # 1 swxY w Y   d S )N)r@   r  c                 f    g | ].}|                     |j                                                  /S r   )r/  r  r  )ro  r  s     r   r  z+test_check_node_ndarray.<locals>.<listcomp>6	  s?       14

39))++,,  r   )r  zWrong dimensions.+node arrayr  )r@   rR   znode array.+C-contiguousrR   c                      i | ]\  }\  }}||S r   r   r  s       r   rq  z+test_check_node_ndarray.<locals>.<dictcomp>E	  s#    XXX"2$
$XXXr   r}   r  znode array.+incompatible dtyper  )r    rz   rr   r  r  r%   r   r   r   r  r  r   r  r  r  r!  r  r/  r  )r  r  valid_node_ndarraysr  problematic_node_ndarray
dtype_dictr  r  s           r   test_check_node_ndarrayr  ,	  s    N8D777L 	*<88,\::
   8K    # I ILHHHHH	z)G	H	H	H U U#%8F.#I#I#I 4^TTTTU U U U U U U U U U U U U U U 
z)C	D	D	D U U#/!#4 4^TTTTU U U U U U U U U U U U U U U YXl6H6O6U6U6W6WXXXJ  __&&N"$(N;~**,,--$~?T?T?V?V:W:WXX I  ,229==	z)I	J	J	J U U4^TTTTU U U U U U U U U U U U U U U  __&&N#%:N< ~**,,--$~?T?T?V?V:W:WXX I  ,229==	z)I	J	J	J U U4^TTTTU U U U U U U U U U U U U U U U U UsH   =(B11B58B5D  DDG99G= G=,KKKSplitterc                 l   t           j                            d          }d}dt          j        ddgt           j                  }}t          d         ||          } | ||dd|d	
          }t          j        |          }t          j        |          }|j	        |k    sJ t          ||           sJ d	S )z&Check that splitters are serializable.r   rI   rR   rA   r  r6   r@   rP   N)monotonic_cst)rz   r  rR  r   rD  r   rr  rs  rt  r   r  )	r  r1  r   rG  rl  r   r  splitter_serializesplitter_backs	            r   test_splitter_serializabler  `	  s    
 )


#
#CLbh1vRW===yIV$Y	::Ix	<CDQQQHh//L!344M%5555mX.......r   c                 6   t          |                     d                    }t          d          }|                    t          t
                     t          j        ||           t          j        |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)	mmap_modez?The trees of the original and loaded classifiers are not equal.N)strjoinr   r   r  r  r  r  r  r   r   )tmpdirpickle_pathr   
loaded_clfs       r   /test_tree_deserialization_from_read_only_bufferr&  r	  s    
 fkk,//00K
 a
0
0
0CGGGW
K[!!![C888J	I    r   c                 L   t          j        ddgddgg          }t          j        ddg          } | d                              ||            | d          }d}t          j        t
          |          5   |j        ||           ddd           dS # 1 swxY w Y   dS )zhCheck that an error is raised when min_sample_split=1.

    non-regression test for issue gh-25481.
    r   r>   rT   )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)rz   r   r   r   r   r   )r'   rf   rg   r
   msgs        r   test_min_sample_split_1_errorr)  	  s    	1a&1a&!""A
!QA 	D3##Aq))) 4!$$$D	0  
z	-	-	-  A                 s   :BB Bc                 b   t          j        g dg          j        }t          j        g d          }t          dd|           }|                    ||           |                    t           j        gg          }t          |t          j        |dd                   g           |dd         }|dd         }t          dd|           }|                    ||           |                    t           j        gg          }t          |t          j        |d	d                   g           dS )
z=Check missing values goes to correct node during predictions.	r   r>   rR   rA   rQ   r  rN         	r   rC   r;  rC   r=  r=  rS   g?g@r   r>   r  rB   NrD   r?   )	rz   r   r   r   r   r   r(  r   r  )r   rf   rg   dtcr  X_equaly_equals          r   ;test_missing_values_best_splitter_on_equal_nodes_no_missingr2  	  s    	0001224A
>>>??A
R1	
R
R
RCGGAqMMM [[26($$FFRWQrssV__-... fGfG
R1	
R
R
RCGGGW [[26($$FFRWWRSS\22344444r   c                 @   t          j        g dg          j        }t          j        g d          }t          |d|           }|                    ||           |j        j        d         }|j        j        d         }|j        j        |         }|j        j        |         }||k    }	|j        j	        |         d         }
|j        j	        |         d         }|
                    t           j        gg          }|	rt          |
|           dS t          ||           dS )zCheck 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.
    r+  r.  r>   r  r   N)rz   r   r   r   r   r   ry   rx   rT  r   r   r(  r   )r   r  rf   rg   etrr  r  left_samplesright_samples	went_lefty_pred_lefty_pred_rightr  s                r   =test_missing_values_random_splitter_on_equal_nodes_no_missingr:  	  s    	0001224A
>>>??A
$!y
Q
Q
QCGGAqMMM (+J)*1-K 94Z@LI5kBM},I )/*-a0K9?;/2L [[26($$F .V,,,,,f-----r   r  r6   c                    d}t          j        t           j        gdz  g dz   g          j        }t          j        |gdz  dgdz  z   dgdz  z             }t	          dd|           }|                    ||           t          j        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   r=   )r   r>   rR   rA   rQ   r  rN   r,  r>   rR   r   r  rA   r,  Nrz   r   r(  r   r   r   r   r,   )r   missing_values_classrf   rg   r/  r  
y_nan_preds          r   /test_missing_values_best_splitter_three_classesr?  	  s     
26(Q,!;!;!;;<==?A
&'!+qcAg5a?@@A
 bA
S
S
SCGGAqMMMX2'((*FV$$Jz$8!Q#?@@@@@r   c                    t          j        t           j        gdz  g dz   g          j        }t          j        dgdz  dgdz  z             }t	          dd|           }|                    ||           t          j        t           j        d	t           j        gg          j        }|                    |          }t          |g d
           dS )zMissing values spanning only one class at fit-time must make missing
    values at predict-time be classified has belonging to this class.r=   r   r>   rR   rA   r=   r@   r   r>   rO   r   rR   r  r@   )r   r>   r   Nr<  r   rf   rg   r/  r  r  s         r   )test_missing_values_best_splitter_to_leftrC  	  s     	26(Q,!3!3!334557A
!qA37"##A
 bA
S
S
SCGGAqMMMX26*+,,.F[[  Fvyyy)))))r   c                    t          j        t           j        gdz  g dz   g          j        }t          j        dgdz  dgdz  z   dgdz  z             }t	          dd|           }|                    ||           t          j        t           j        dd	gg          j        }|                    |          }t          |g d
           dS )zMissing values and non-missing values sharing one class at fit-time
    must make missing values at predict-time be classified has belonging
    to this class.r=   rA  r>   r   rR   r   r  rU   g333333@r$  Nr<  rB  s         r   *test_missing_values_best_splitter_to_rightrE  	  s    
 	26(Q,!3!3!334557A
!qA37"aS1W,--A
 bA
S
S
SCGGAqMMMXS)*++-F[[  Fvyyy)))))r   c                    t          j        ddddt           j        ddddt           j        g
g          j        }t          j        d	gdz  dgdz  z             }t	          d
d|           }|                    ||           t          j        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.r>   rR   rA   r@   rI   r`   r\   <   r   r   r  gffffff@gA@r$  Nr<  rB  s         r   >test_missing_values_best_splitter_missing_both_classes_has_nanrH  
  s     	1aArvr2r2rv>?@@BA
!qA37"##A
 bA
S
S
SCGGAqMMMXT*+,,.F[[  F vyyy)))))r   r
   r
  c                 X   t          j        ddddt           j        ddddt           j        g
g          j        }t          j        d	gdz  dgdz  z             }|  | |          }t	          j        t          d          5   |j        ||           d
d
d
           d
S # 1 swxY w Y   d
S )z4Check unsupported configurations for missing values.r>   rR   rA   r@   rI   r`   r\   rG  r   NzInput X contains NaNr  )rz   r   r(  r   r   r   r   r   )r5  r
   rf   rg   s       r   test_missing_value_errorsrJ  
  s     	1aArvr2r2rv>?@@BA
!qA37"##A#Q	z)?	@	@	@  A                 s    BB#&B#c                 N   t           j                                        t           j        }}t          j        |ddddf<   t          j        |ddddf<    | dd          }|                    ||           |                    |          }|d	k                                    sJ dS )
z5Smoke test for poisson regression and missing values.Nr@   r   rO   rD   r;   r   r   rY   )	ri   r   r  r   rz   r(  r   r   r   )r'   rf   rg   r   r  s        r   test_missing_values_poissonrL  -
  s     =qA Accc1fIAccc2gJ
$
4
4
4CGGAqMMM[[^^FcM       r   c                  >    t          j        | i |\  }}|dk    }||fS )N   )r	   make_friedman1)argsr   rf   rg   s       r   make_friedman1_classificationrQ  =
  s-    "D3F33DAq	BAa4Kr   zmake_data, Tree, tolerancegQ?gQ?gQ?sample_weight_trainr   c                    d\  }} | ||d|          \  }}|                                 }	t          j                            |          }
t          j        |	|
                    ddg|j        ddg          <   t          |	||	          \  }}}}|d
k    r t          j        |j        d                   }nd}d} |||          }|	                    |||           |
                    ||          }t          t                       |||                    }|	                    ||           |
                    ||          }||z   |k    sJ d|d| d|             dS )zFCheck that trees can deal with missing values have decent performance.)r   rI   rT   )r^   r_   noiser]   FTr[   r   rb   r  r   r   r   NrI   r   r   zscore_native_tree=z + z! should be strictly greater than )r  rz   r  rR  r(  choicer   r   r   r   r   r   r   )	make_datar'   rR  r   	tolerancer^   r_   rf   rg   	X_missingr1  X_missing_trainX_missing_testr   r   r   r   native_treescore_native_treetree_with_imputerscore_tree_with_imputers                        r   !test_missing_values_is_resiliencer`  C
  s   ( &Iz9'	  DAq I
)

 2
3
3CGIvIcjj%QWc
jCCD7G1#58 8 84O^Wf f$$ 5a 899 I$9KLLLKOOOWMOJJJ#)).&AA%	@RSSS  /7333/55nfMMy(+BBBB	& 	& 	&) 	& 	&#	& 	& CBBBBr   zTree, expected_scoreg333333?g(\?c                    t           j                            d          }d}|                    |df          }t          j        t          j        |dz            t          j        |dz            g          }|                    ddg|dd	g
          }|                                	                    t                    }||          ||<   |                    |          }	t           j        |	|<   |	|dddf<    | |          }
t          |
||d                                          }||k    sJ d| d|             dS )z@Check the tree learns when only the missing value is predictive.r   r  r`   ra   rR   FTgffffff?rV   rU  Nr@   r   )cvzExpected CV score: z	 but got )rz   r  rR  standard_normalr  rr   r   rV  r  r/  boolr(  r   r  )r'   expected_scorer   r1  r^   rf   rg   X_random_masky_maskX_predictiver
   tree_cv_scores               r    test_missing_value_is_predictiverj  
  sP    )


"
"CI)R11A
a00"')q.2I2IJKKA JJt}9tJMMMVVXX__T""F#M22F=&&I&66L6LAaaadG4/000D $D!Q1555::<<MN***FnFF}FF +****r   zmake_data, Treec                 >   t           j                            d          }d\  }} | |||          \  }}t           j        ||                    ddg|j        ddg          <   t          j        |j        d                   }d	|d
d
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  rI   r  FTr[   r   rU  rY   NrR   r   r   r>   )
rz   r  rR  r(  rV  r   r   r   r   r   )
rW  r'   r1  r^   r_   rf   rg   r   tree_with_swtree_samples_removeds
             r   test_sample_weight_non_uniformrn  
  s5    )


"
"C$Iz9yZcRRRDAq @BvAcjj%QWc
j;;< GAGAJ''MM##A#4Q'''LQ7774Q///Qqt!tQQQwZ14a4111(0033\5I5I!5L5LMMMMMr   c                  F   t          d                              t          j        t          j                  } t          d                              t          j        t          j                  }t          j        |           }t          j        |          }||k    sJ d S r5  )r   r   rh   r   r   rr  rs  )tree1tree2pickle1pickle2s       r   test_deterministic_picklert  
  s     #22266ty$+NNE"22266ty$+NNEl5!!Gl5!!Ggr   rf   r@   rO   c                    |                     dd          }t          j        d          } | ||                              ||          }t	          |                              |                     dd          |          }|j        j        }t          |dk              sJ |                                            | t          u r4t          |j        j        dd         |j        j        dd                    t          j        |j        j        dk    |j        j        dk    z            }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
    rD   r>   rO   r   r   NrR   rY   )r  rz   r   r   r   r   r   r   r   r   r   flatnonzerory   r~   )	r'   rf   r   r   rg   r
   tree_refr   
leaves_idxs	            r   'test_regression_tree_missing_values_toyry  
  s-   6 	
		"aA
	!A4)2DEEEII!QOODT{{qyyQ//33Hz"Hx1}--x||~~--- $$$
+BQB/1H!1LMMM 		!R	'DJ,E,JK J DJ'
3S99999r   c                    t           j                            |           }d}t          j        |t           j                                      dd          }t           j        |dd d d f<   |                    |           t          j        |          }t          | d          	                    ||          }|j
        j        }t          |dk              s
J |            d S )	NrN  r  rD   r>   ir@   r  r   )rz   r  rR  r   r  r  r(  r   r   r   r   r   r   )r   r1  r^   rf   rg   r
   r   s          r   -test_regression_extra_tree_missing_values_toyr{  
  s    
)

 2
3
3CI
	)2:...66r1==AAcddAAAgJKKNNN
	)A+=KKKOOPQSTUUDz"Hx1}''x'''''r   c                  $   t          j        d          \  } }t          j                            d          }|                                 }|                    t          j        dt          j                  | dddgf         dz  	          	                    t                    }t          j        ||<   t          ||d
          \  }}}}t          j        g dt          j                  }t          ddd          }	 |	j        ||         ||                    t!          |	j        j        dk              sJ t          j        |	j        j        dk    |	j        j        dk    z            }
t-          |	j        j        |
         d           dS )a  Check that we properly handle missing values in classification 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)
return_X_yr   )r>   r=   )r   r  NrR   rQ   )nr     r   )prR   Q   '   a   [   &   .      e   r  Y   R   rN  r   E      r     I   J   3   /   k      K   n   r`   r-  h   9      r-  r  O   #   M   Z   r  r  r  ^   r     rQ   ]   r  r  r  r,  r  r  m   r     rI   r  r  r  \   4   r`   r  rQ   rQ      r  r  r,  r,  r   r  r   r\   r  N   r,  r  i   r  r   r  r,  f   r  r  r  r>   r  rN       r  r  j   r  rG  8   r  r  >   U   r  r  P   r  ?   rO   r  T   rA   rA   L   r  r  rA   r  iHnr   r   rD   r>   rY   )r	   	load_irisrz   r  rR  r  r  r   r  r/  rd  r(  r   r   r   r   r   r   r   rv  ry   r~   r   )rf   rg   r1  rY  maskr  rI  r   r   r
   rx  s              r   +test_classification_tree_missing_values_toyr    s    ...DAq
)


#
#CI<<
'bh
/
/
/1QQQV9q=   fTll 	 fIdO-iLLLGQ h    X  G "&z  D DHWWww/000tz"a'(((((		!R	'DJ,E,JK J DJ'
3S99999r   c                     t          dd          }  | j        t          j        t          j                   t          j        | j                  }t          | j	        || j
                  }t          j        | j        j        t
          j                  }d|d<   t          || j        |           | j        j        dk    sJ |j        dk    sJ t!          j        t$                    5  t'          | j        j        |j                   ddd           n# 1 swxY w Y   t'          | j        j        d         |j        d                    t          | j	        || j
                  }t          j        | j        j        t
          j                  }d|dd<   t          || j        |           | j        j        dk    sJ |j        dk    sJ |j                    t'          | j        j        |j                   dS )zHTest pruning a tree with the Python caller of the Cythonized prune tree.r   r>   r  r  rA   N)r   r   rh   r   r   rz   
atleast_1dr  r  n_features_in_rN  rr   r   rv   uint8r#   r   r   AssertionErrorr,   r   r
   rl  pruned_treeleave_in_subtrees       r   test_build_pruned_tree_pyr  6  s   !qA>>>DDHTY$$$do..IT0)T_MMK x
 5RXFFFQ+tz3CDDD: A%%%%!Q&&&&	~	&	& @ @4:+[->???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @tz'*K,=a,@AAA T0)T_MMKx
 5RXFFFQRR +tz3CDDD: A%%%%!Q&&&(>&&&tz'):;;;;;s   ( DDDc                     t          dd          }  | j        t          j        t          j                   t          j        | j                  }t          | j	        || j
                  }t          j        | j        j        t
          j                  }d|d<   t          j        t"          d          5  t%          || j        |           ddd           dS # 1 swxY w Y   dS )z8Test pruning a tree does not result in an infinite loop.r   r>   r  r  z,Node has reached a leaf in the original treer  N)r   r   rh   r   r   rz   r  r  r  r  rN  rr   r   rv   r  r   r   r   r#   r  s       r   $test_build_pruned_tree_infinite_loopr  U  s*    "qA>>>DDHTY$$$do..IT0)T_MMK x
 5RXFFFQ	H
 
 
 I I 	k4:7GHHHI I I I I I I I I I I I I I I I I Is   5CC Cc                  h   t           j                            d          } |                     ddd                              t           j                  }t          j        |gdz            }t          j        dt           j                  }t          ||d           g d	}t          ||           d
S )zNon-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.
    r  rY         $@rI   )locscalerb   r@   r  r  )2r   (   r\   r`   rI      r     1   r  -   r-  r  r@      rN   r  )   r>         r,  rR   r   r  r  r  r  rA   !   rO   $   r  r  r  r=   rN  r  "   ,   r  r  r   %   r  rQ   r  0   r     N)rz   r  default_rngnormalr/  r0  r  r   rD  r   r,   )r1  somefeature_valuesr  expected_sampless        r   test_sort_log2_buildr  g  s     )


#
#C::#T:33::2:FFD^TFQJ//Ni"'***G^Wb)))   w 011111r   c                 8   d dfd	}t           j                            |           }dD ]}|                    |df          }|                    |          }|d|                    dd	          z  z  }t          j        |          } ||||            ||t          j        |          |            |||                                dz   |            ||||d
           |                    |          } ||||            ||||d
           dS )a  
    Test the main bit of logic of the MAE(RegressionCriterion) class
    (used by DecisionTreeRegressor(criterion="absolute_error")).

    The implementation of the criterion relies on an efficient precomputation
    of left/right children absolute error for each split. This test verifies this
    part of the computation, in case of major refactor of the MAE class,
    it can be safely removed.
    c                 R                                                                        fdt          d j        dz             D             } fdt	          t          d j        dz             |          D             }t          j        |          t          j        |          fS )Nc                 V    g | ]%}t          d |         d |         dd          &S )Nr  Taverager3   )ro  r	  wrg   s     r   r  zitest_absolute_errors_precomputation_function.<locals>.compute_prefix_abs_errors_naive.<locals>.<listcomp>  sJ     
 
 
 !2A2"1"r4@@@
 
 
r   r>   c                     g | ]A\  }}t          j        d |         |z
            d |         z                                  BS r  )rz   r   r   )ro  r	  mr  rg   s      r   r  zitest_absolute_errors_precomputation_function.<locals>.compute_prefix_abs_errors_naive.<locals>.<listcomp>  s\     
 
 
1 VAbqbEAI2A2&++--
 
 
r   )r   r  rS  rb   ziprz   r   )rg   r  medianserrorss   ``  r   compute_prefix_abs_errors_naivezUtest_absolute_errors_precomputation_function.<locals>.compute_prefix_abs_errors_naive  s    GGIINN
 
 
 
 
1afqj))
 
 

 
 
 
 
E!QVaZ00'::
 
 
 x'!2!222r   Fc                 J   | j         d         }|r|dz
  dfnd|f}t          | ||g||R  \  }}| |         }||         }	|r|d d d         }|	d d d         }	 ||	          \  }
}|r|
d d d         }
|d d d         }t          ||
d           t          ||d           d S )Nr   r>   rD   gdy=)atol)r   r   r   )rg   r  r   reverser~  rP  
abs_errorsr  y_sortedw_sortedabs_errors_medians_r  s               r   assert_same_resultszItest_absolute_errors_precomputation_function.<locals>.assert_same_results  s    GAJ%1Ar{{Aq6<Q7UTUSTUUU
GW:W: 	&"~H"~H ? ?( S SX 	&%ddd+K"~H
Ke<<<<666666r   )rA   r@   rI   r`   r  rN  r>   ra   r  rB   r@   T)r  N)F)rz   r  r  r  r   r   roundr  )r   r  r1  r~  rg   r  r   r  s          @r   ,test_absolute_errors_precomputation_functionr  }  sa   
3 
3 
37 7 7 7 7 7  )

 2
3
3C$ 9 9KKaVK$$JJqMM	TS[[Q'''')A,,Aq'***Arwqzz7333Aqwwyy1}g666Aq'48888//!$$Aq'***Aq'4888889 9r   c                    t           j                            |           }t          d          }|                    |          }|                    dd|          |                    dd|          z  }t          dd                              t          j	        |j
        d         df          ||	          j        j                                        d         }t          ||d
d          }t          ||           dS )z
    Test that the weighted-median computed under-the-hood when
    building a tree with criterion="absolute_error" is correct.
    g     j@ra   r   rA   r>   r9   )r   r   r  r   r  Tr  N)rz   r  r  r  	lognormalintegersr  r   r   r   r   r   r   r   r4   r   )r   r1  r~  r   r-  tree_leaf_weighted_medianweighted_medians          r   7test_absolute_error_accurately_predicts_weighted_medianr    s    
 )

 2
3
3CCA==a=  Dll1aal((3;;q!!;+D+DDG 	(8AFFF	RWDJqM1-...G	L	L	uUUWWQ	  
 +4"dKKKO-?????r   c                     t          j        g dg dg                              dd                              t                    } g d}t           j        | | dk    <   t          d          D ]U}t          d|                              | |          }t          |j
        j        t          j        g d                     Vd S )	Nr  )r>   rR   r>   rR   r>   rR   r>   rR   r   r>   )r   r   r   r   r>   r>   r>   r>   r`   r   )rc   rY   rY   )rz   r   swapaxesr/  floatr(  rS  r   r   r,   r   r   r   )rf   rg   r	  r
   s       r   "test_splitting_with_missing_valuesr    s     		+++-E-E-EFGG	!Q	 
 	!  AAa1fI 2YY L L$qqAAAEEaKK4:.9I9I9I0J0JKKKKL Lr   c                  8   dddt           j        t           j        g} g d}t          j        |                               dd          } t	                                          | |          }t           |j        |           |           |j        j	        dk    sJ d S )Nr   r%  rD   r>   rA   )
rz   r(  r   r  r   r   r,   r   r   rv   )rf   rg   r
   s      r   $test_missing_values_and_constant_toyr    s     
Aq"&"&!AA
B""A!##''1--D |t|A***: A%%%%%%r   r  )__doc__r  r  r  rr  r  r  	itertoolsr   r   r   r  numpyrz   r   joblib.numpy_pickler   numpy.testingr   sklearnr   r	   r
   sklearn.dummyr   sklearn.exceptionsr   sklearn.imputer   sklearn.metricsr   r   r   r   sklearn.model_selectionr   r   sklearn.pipeliner   sklearn.random_projectionr   sklearn.treer   r   r   r   sklearn.tree._classesr   r   r   r   sklearn.tree._criterionr   sklearn.tree._partitionerr   sklearn.tree._treer    r!   r"   r#   r$   r%   r&   r'   r  sklearn.utilsr(   sklearn.utils._array_apir)   sklearn.utils._testingr*   r+   r,   r-   r.   sklearn.utils.fixesr/   r0   r1   r2   sklearn.utils.statsr4   sklearn.utils.validationr5   r   REG_CRITERIONSr   r   r   r<   __annotations__updateSPARSE_TREESr   r  r  y_small_regrf   rg   r   r   r  rh   r  rR  r1  r  r   rb   permr   load_diabetesri   load_digitsrj   r]   make_multilabel_classificationr6  r7  r  X_sparse_posr  y_randomr  X_sparse_mixrr   r.  r   r   r   markparametrizer  r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r#  r*  r:  r?  rD  rG  rJ  rL  rh  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  sortedrT  intersectionr  r  r  r  r  r  r  r  r  r   r"  r*  r3  r8  r?  rP  r\  r!  rh  rj  rn  rd  rm  r  r  rS  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r&  r)  r2  r:  r?  rC  rE  rH  rJ  rL  rQ  rO  r`  rj  r  r   rn  rt  r(  ry  r{  r  r  r  r  r  r  r  r  r   r   r   <module>r#     s       				  				  . . . . . . . . . .       , , , , , , ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ( ( ( ( ( ( - - - - - - ( ( ( ( ( (            F E E E E E E E * * * * * * ; ; ; ; ; ;                       C B B B B B . . . . . .                  2 1 1 1 1 1 / / / / / / ( ( ( ( ( (                         5 4 4 4 4 4 7 7 7 7 7 7%O 5. 	 3, 	
 $&&	4    	      	        "(555666<<<999444:::@@@>>>>>>@@@777444555444555???@@@AAA888444555444444/ 8 P
O
O  6 	"XBx"bAq6Aq6Aq6:"X1v1vjj xiA
t{'((IdO	k$ "8!##
x+,,d#/$'				
v})**k$d#!!!$$DXDbR   l
 ###11$'\S  !1511$$RTJJJRRTT )$+..m(/::Kfm44W--[11$<88$844%H55$84428G$$844 $ $ $N	X 	X 	X	X 	X 	X !1!1!3!344n55, , 65 54,*F F F*
 
 
$ y'8'899n55  65 :9 !1!1!3!344	,-	./	+,	)*	 
< 
<  54
<
 
 
4  W W W   2L L L>- - -K K K<!7 !7 !7H?+ ?+ ?+DH H H>F F FB8
 8
 8
 8
v ++1 1 ,+1 ...99W W :9 /.W
 &*:
 :
 :
 :
z ++G G ,+G ...99  :9 /.E E EP0 0 0f 	!!##^	4	4	!!##^	4	4 @% @% @%F= = =(	E 	E 	E*8 *8 *8Z1 1 1h3 3 30 ++,N ,N ,+,N^ ++	 	 ,+	+ + +$ $ $K K K$( ( ( Y%5%5%7%788+ + 98+(- - -? ? ?"! ! !    *& & & &R l33	 6 6  436
 ffSS->->-K-KI-V-V&W&WXXZ$=>>. . ?> YX. l33$W$W$WXX.990: 0: :9 YX 430:f DEE<EEE~	V	VWW
dDD,DDDnUU   $W$W$WXX.99: : :9 YX :" l33!33~~#F#F HP HP  43HPV    ++, , ,+,
 +++dVn-DEE$ $ FE ,+$$ ++G G ,+G ...99G G :9 /.GB B B& ++, , ,+,: ++.990 0 :9 ,+0J; J; J;Z+ + +8 +dVn-DEE    FE $ vvcc(--//**k:-FFGG  &<>Q%RSSA A TS A HMMOO44&;=O%PQQA A RQ 54A	. 	. 	.: : :% % %P ++fh%788+dVn-D~-UVV  WV 98 ,+4 &R&R&RSS!1!1!3!344	> 	> 54 TS	> q**& & +*&B'0 '0 '0T "8:M!NOOq!f--G G .- POG,( ( (2( ( (4? ? ?$? ? ?"I I I- - -,- - -6@ @ @$
 
 
B1U 1U 1Uh ,o,..0G0@0G0I0IJJ / / /  & !1!1!3!344  54* &GHH5 5 IH52 q**&GHH. . IH +*.B y&&9::A A ;:A y&&9::* * ;:* y&&9::* * ;:*  y&&9::* * ;:* +dVn-DEE
(8999%5666 
 
  FE
 !1!1!3!344! ! 54!     
	 "7;		 "4d;	&(>E	&(;TB  .v??' ' @?  'Z /Y5E5E5G5G$PT1V1VWW  XW: 		!#89		%'=> N N N,
 
 
 "79K!LMM 	"&!RVQ1-.."&"&!Q1-..!Q1bfbf-..!Q261bf-..
 
 &GHH!: !: IH
 
 NM!:H( ( (,: ,: ,:^< < <>I I I$2 2 2,49 49 49n@ @ @*L L L(& & & & &r   