
    Ki:                    x!   % S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJrJ	r	J
r
  SSKrSSKrSSKrSSKJr  SSKJr  SSKJrJrJr  SSKJr  SSKJr  SS	KJr  SS
KJrJrJ r J!r!  SSK"J#r#J$r$  SSK%J&r&  SSK'J(r(  SSK)J*r*J+r+J,r,J-r-  SSK.J/r/J0r0J1r1J2r2  SSK3J4r4  SSK5J6r6  SSK7J8r8J9r9J:r:J;r;J<r<J=r=J>r>  SSK7J?r@  SSKAJBrB  SSKCJDrD  SSKEJFrFJGrGJHrHJIrIJJrJ  SSKKJLrLJMrMJNrNJOrO  SSKPJQrQ  SSKRJSrS  SrTSrU\*\,S.rV\+\-S.rW\X" 5       rY\X\ZS'   \YR                  \V5        \YR                  \W5        / SQr\\R                  " / SQ/ S Q/ S!Q/ S"Q/ S#Q/ S$Q/ S%Q/ S&Q/ S'Q/ S(Q/ S)Q/ S*Q/ S+Q/ S,Q/ S-Q/ S.Q/ S/Q/ S0Q/ S1Q/ S2Q/ S3Q/ S4Q/ S5Q/5      r^/ S6Qr_/ S7Qr`S8S9/S9S9/S9S8/S:S:/S:S;/S;S://ra/ S<QrbS9S9/S;S;/S=S;//rc/ S>Qrd\R                  " 5       rf\R                  R                  S:5      ri\iR                  \fR                  R                  5      rm\fR                  \m   \fln        \fR                  \m   \flk        \R                  " 5       rp\iR                  \pR                  R                  5      rm\pR                  \m   \pln        \pR                  \m   \plk        \R                  " 5       rr\iR                  \rR                  R                  5      rm\rR                  \m   \rln        \rR                  \m   \rlk        \S" S5      rs\R                  " SS?S@SA9u  rurv\sR                  SBSC9rxSD\x\xSE:*  '   \sR                  SSFSGSC9rz\(" SHS@SISSJ9R                  5       r|\fR                  \fR                  SK.\pR                  \pR                  SK.\rR                  \rR                  SK.\a\bSK.\^\_SK.\^\`SK.\u\vSK.\x\zSK.\x* \zSK.\|\zSK.\R                  " SL5      \zSK.SM.r~SN rSO rSP r\GR                  GR                  SQ\WGR	                  5       5      \GR                  GR                  SR\U5      SS 5       5       rST rSU r\GR                  GR                  SV\WGR                  5       5      \GR                  GR                  SR\U5      SW 5       5       r\GR                  GR                  SQ\WGR	                  5       5      \GR                  GR                  SXSY\!4SZ\4S[\!4S\\ 4/5      S] 5       5       rS^ rS_ rS` rSa rSb rSc rSd rSe rSf rSg rSh rSSi jr\GR                  GR                  Sj\Y5      Sk 5       r\GR                  GR                  Sj\\5      \GR                  GR                  Sl\N5      Sm 5       5       r SSn jr\GR                  GR                  Sj\Y5      So 5       r\GR                  GR                  Sj\\5      \GR                  GR                  Sl\N5      Sp 5       5       rSq rSr r\GR                  GR                  Ss/ \
" \WGR	                  5       \U5      Q\
" \VGR	                  5       \T5      Q5      St 5       rSu rSv rSw rSx rSy r\GR                  GR                  Sj\V5      Sz 5       r\GR                  GR                  Sj\V5      S{ 5       rS| rS} rS~ rS r\GR                  GR                  S\YGR	                  5       5      S 5       rS rS rS rS rS rSS jr\GR                  GR                  S\\5      \GR                  GR                  SS5      S 5       5       r\GR                  GR                  S\" \" \\5      GRi                  \W5      5      5      \GR                  GR                  SSS/5      S 5       5       r\GR                  GR                  S\\5      \GR                  GR                  S/ SQ5      \GR                  GR                  Sl\N5      S 5       5       5       r\GR                  GR                  S\" \
" \\ V s/ s H  o \W;   d  M
  U PM     sn \U5      5      \" \
" \\ V s/ s H  o \V;   d  M
  U PM     sn \T5      5      -   5      \GR                  GR                  S/ SQ5      \GR                  GR                  Sl\N5      S 5       5       5       r\GR                  GR                  S\\5      \GR                  GR                  S\" \N\O5      5      S 5       5       rS r\GR                  GR                  Sj\Y5      S 5       r\GR                  GR                  Sj\Y5      \GR                  GR                  SS/\N-   5      S 5       5       r\GR                  GR                  Sj\Y5      S 5       r\GR                  GR                  Sj\\5      \GR                  GR                  S\O5      S 5       5       rS r\GR                  GR                  Sj\Y5      S 5       r\GR                  GR                  Sj\Y5      \GR                  GR                  S\O5      S 5       5       rS rS r\GR                  GR                  SS/\N-   5      S 5       r\GR                  GR                  S\" \" \~GR                  5       5      SS1-
  5      5      \GR                  GR                  S\*\,/5      S 5       5       r\GR                  GR                  S\~GR                  5       5      \GR                  GR                  S\+\-/5      S 5       5       rS rS rS r\GR                  GR                  Sj\Y5      \GR                  GR                  SSS/5      \GR                  GR                  SS/\N-   \O-   5      S 5       5       5       r\GR                  GR                  SR/ SQ5      \GR                  GR                  SQ\WGR	                  5       5      S 5       5       r\GR                  GR                  S\" S=5      5      S 5       rS r\GR                  GR                  SQ\*\,/5      \GR                  GR                  SS;SF/5      S 5       5       rS rS rS rS rS rS rS rS rS rS r\GR                  GR                  S\" \1GR                  " 5       \2GR                  " 5       5      5      S 5       rS r\GR                  GR                  SQ\YGR	                  5       5      S 5       r\GR                  GR                  SRSYS[/5      S 5       r\GR                  GR                  S\" S=5      5      \GR                  GR                  SRSYS[/5      S 5       5       r\GR                  GR                  SRSS/5      S 5       r\GR                  GR                  SRSS/5      S 5       r\GR                  GR                  SRSS/5      S 5       r\GR                  GR                  SRSS/5      S 5       r\GR                  GR                  SS/\O-   5      \GR                  GR                  S\+" SZS9\-" SZS9/5      S 5       5       r\GR                  GR                  SQ\WGR	                  5       5      S 5       rS r\GR                  GR                  S\GR                  \+S4\GR                  \-S4\\*S4\\,S4/5      \GR                  GR                  SSS/5      S 5       5       r\GR                  GR                  S\" \VGR	                  5       SS/5      5      S 5       r\GR                  GR                  S\GR                  \+4\GR                  \*4/5      S 5       rS r\GR                  GR                  SQ\+\-/5      \GR                  GR                  S\R                  " \GR                  S;\GR                  SFSS/5      \R                  " \GR                  \GR                  S=SFSS/5      \R                  " S:S;S=SF\GR                  \GR                  /5      \R                  " S:S;S=\GR                  S\GR                  /5      /5      \GR                  GR                  SRSYS[/5      S 5       5       5       rS rS rS rS rS rS rS rS rS rgs  sn f s  sn f )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=   )rC   r   r         r   r    @r=   r   r   rD   r   r=   )rC   rC   r   g333333r   r   r   r   r   r   rB   r   r   r=   )rC   rC   r   r   r   r   r   r@   r   r   r   r   r   r=   )rC   r   r<   
   r<   r   皙	r   r<   r@   r>   r=   )zG @r         r      r   r   rI            ?r   rG   r=   )rJ   r   rK   rL   r   rM   r   r   rI   rN   r   r   rF   r=   )rJ      rK   rL   r   rM   r   r   rI   rN   r   r   rF   r=   )rJ   rP   rK   rL   r   rM   r   r   rI   rN   rO   r   rC   r   )   rP   r?   r=   rO   r>   rH   r   r=   rA   r@   r   rQ   r   )rQ   r   r=   r=   r=   rC   r=   r   r   rF   r@   r   r=   r   )rQ   r   r=   rQ   r@   rC   rH   rQ   r   rC   r=   rQ   rQ   r   )r=   r=   r   rQ   rQ   rC   r=   rQ   r   rA   r=   rQ   r@   r   )r@   r=   r   r@   r   r>   rH   r   r=   rA   r@   r   r@   r=   )rJ   rP   rK   rL   r   r=   r   r   rI   rN   rO   r   rG   r=   )rJ   rP   rK   rL   r   r=   r   r   rI   rN         ?r=   rC   rC   )rJ   rP   rK   rL   r   rH   r   r   rI   rN   rO   r   rC   rC   )rQ   r   r?   r=   rO   rF   rH   r   r=   rA   r@   r=   r   rC   )rQ   r   r=   r=   r=   rF   r=   r   r   rF   r   r   r   r=   )rQ   r=   r=   r=   rQ   rC   rH   rQ   r   rC   r   rQ   r=   r=   )r=   r=   r   r   r=   rG   r=   rQ   r   rA   r=   rQ   r=   r=   )r@   r=   r   r=   r   r>   r=   r   r=   rF   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   )      ?rE   333333?皙?rH   g333333@@g)\(?{Gz?gףp=
@rV   g?        rT   rQ   rM   r   r         @g|?5^?g(\??r   rF   rC   r=   rQ   )rC   rC   rC   r=   r=   r=   r@   )rC   r=   r=      rH   )random_state	n_samples
n_features)   r?   sizerX   g?r<   )r_   r_         ?)densityr\   Xy)r_   r@   )irisdiabetesdigitstoy	clf_small	reg_small
multilabel
sparse-pos
sparse-neg
sparse-mixzerosc                 t   UR                   U R                   :X  d+   SR                  X!R                   U R                   5      5       e[        U R                  UR                  US-   5        [        U R                  UR                  US-   5        U R                  [
        :H  n[        R                  " U5      n[        U R                  U   UR                  U   US-   5        [        U R                  U   UR                  U   US-   5        [        U R                  R                  5       UR                  R                  5       US-   5        [        U R                  UR                  US-   5        [        U R                  UR                  US-   S	9  [        U R                  U   UR                  U   US
-   S	9  g )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        ^/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/sklearn/tree/tests/test_tree.pyassert_tree_equalr      s   <<1<<' 299\\1<<	
' 	!**G6P,P 	'4M*M 9,H~~h'H			(QYYx0'<P2P 	Hq{{84g@U6U 		11
 	!**G6P,P 

AJJBV8VW	1778,g@Q6Q    c                     [         R                  5        H  u  pU" SS9nUR                  [        [        5        [        UR                  [        5      [        SR                  U 5      5        U" SSS9nUR                  [        [        5        [        UR                  [        5      [        SR                  U 5      5        M     g )Nr   r\   Failed with {0}r=   )max_featuresr\   )
	CLF_TREESitemsfitre   rf   r,   predictTtrue_resultrv   namer'   clfs      r   test_classification_toyr      s    oo'
"13;;q>;8I8P8PQU8VW213;;q>;8I8P8PQU8VW (r   c            
          [         R                  5        H  u  pU" SS9nUR                  [        [        [
        R                  " [        [        5      5      S9  [        UR                  [        5      [        SR                  U 5      5        UR                  [        [        [
        R                  " [        [        5      S5      S9  [        UR                  [        5      [        SR                  U 5      5        M     g )Nr   r   sample_weightr   rO   )r   r   r   re   rf   ry   oneslenr,   r   r   r   rv   fullr   s      r    test_weighted_classification_toyr     s    oo'
"1BGGCFO43;;q>;8I8P8PQU8VW1BGGCFC$893;;q>;8I8P8PQU8VW (r   r'   	criterionc                    US:X  al  [         R                  " [         R                  " [        5      5      S-   n[         R                  " [        5      U-   n[         R                  " [
        5      U-   nO[        n[
        nU " USS9nUR                  [        U5        [        UR                  [        5      U5        U " USSS9nUR                  [        U5        [        UR                  [        5      U5        g )Nr:   r=   r   r\   r   r   r\   )ry   absminrf   arrayr   r   re   r   r   r   )r'   r   ay_trainy_testregr   s          r   test_regression_toyr     s     I FF266!9!((1+/+&*

3CGGAwCKKNF+

CCGGAwCKKNF+r   c                     [         R                  " S5      n SU S S2S S24'   SU SS 2SS 24'   [         R                  " U R                  5      u  p[         R                  " UR                  5       UR                  5       /5      R                  nU R                  5       n [        R                  5        H  u  pEU" SS9nUR                  X05        UR                  X05      S:X  d   SR                  U5      5       eU" SSS9nUR                  X05        UR                  X05      S:X  a  Mv   SR                  U5      5       e   g )	N)rH   rH   r=   r?   r   r   rS   r   r\   r   )ry   rq   indicesshapevstackravelr   r   r   r   scorerv   )rf   gridxgridyre   r   r'   r   s          r   test_xorr   %  s   
AAbqb"1"fIAab!"fI::agg&LE
		5;;=%++-0133A		Aoo'
"yy#%E'8'?'?'EE%2yy#%E'8'?'?'EE% (r   c                     [        [        R                  5       [        5       GH  u  u  pnU" USS9nUR	                  [
        R                  [
        R                  5        [        UR                  [
        R                  5      [
        R                  5      nUS:  d   SR                  XU5      5       eU" USSS9nUR	                  [
        R                  [
        R                  5        [        UR                  [
        R                  5      [
        R                  5      nUS:  a  GM   SR                  XU5      5       e   g )Nr   r   rZ   z0Failed with {0}, criterion = {1} and score = {2}rQ   r   rO   )r   r   r   CLF_CRITERIONSr   rg   datatargetr   r   rv   )r   r'   r   r   r   s        r   	test_irisr   :  s    #*9??+<n#MiYQ7		4;;'s{{4995t{{Cs{ 	
NUUU
 	
{ YQQG		4;;'s{{4995t{{Cs{ 	
NUUU
 	
{ $Nr   z
name, Treec                 0   U" USS9nUR                  [        R                  [        R                  5        [	        [        R                  UR                  [        R                  5      5      nU[        R                  " S5      :X  d   SU  SU SU 35       eg )Nr   r   zFailed with z, criterion = z and score = )r   rh   r   r   r   r   pytestapprox)r   r'   r   r   r   s        r   test_diabetes_overfitr   L  sw    
 
3CGGHMM8??+xHMM0JKEFMM!$$ 
tfN9+]5'J$r   zcriterion, metricr7   r8   r9   r:   c           	         [        USUS9n[        R                  [        R                  peU" X`" S0 UDSS0D6R	                  XV5      R                  U5      5      nU" X`" S0 UDSS0D6R	                  XV5      R                  U5      5      nU" X`" S0 UDSS0D6R	                  XV5      R                  U5      5      n	SU	s=:  a  Us=:  a  U:  d  O   XU45       eg )	NrN   r   	max_depthr=   r<      r    )dictrh   r   r   r   r   )
r'   r   metricglobal_random_seedkwargsre   rf   loss1loss4loss7s
             r   test_diabetes_underfitr   Y  s     IADVWF==(//q1d1V1q155a;CCAFGE1d1V1q155a;CCAFGE1d1V1q155a;CCAFGE u$u$u$;uU&;;$r   c            	         [         R                  5        GHn  u  pU" SSSS9nUR                  [        R                  [        R
                  5        UR                  [        R                  5      n[        [        R                  " US5      [        R                  " [        R                  R                  S   5      SR                  U 5      S9  [        [        R                  " US5      UR                  [        R                  5      SR                  U 5      S9  [!        UR                  [        R                  5      [        R"                  " UR%                  [        R                  5      5      SSR                  U 5      S9  GMq     g )Nr=   *   r   r   r\   r   r   rs   rP   )r   r   r   rg   r   r   predict_probar+   ry   r~   r   r   rv   r,   argmaxr   r*   exppredict_log_proba)r   r'   r   prob_predicts       r   test_probabilityr   p  s
     oo'
QQR@		4;;'((3!FF<#GGDIIOOA&'%,,T2	

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

 	dii(FF3((34%,,T2		
 (r   c                      [         R                  " S5      S S 2[         R                  4   n [         R                  " S5      n[        R	                  5        H  u  p#U" S SS9nUR                  X5        M     g )Ni'  r   r   r\   )ry   arangenewaxis	REG_TREESr   r   re   rf   r   r'   r   s        r   test_arrayreprr     sW     			%BJJ'A
		%Aoo'
T2 (r   c                     SS/SS/SS/SS/SS/SS//n / SQn[         R                  5        HE  u  p#U" SS9nUR                  X5        [        UR	                  U 5      USR                  U5      S	9  MG     [        R                  5        HE  u  p%U" SS9nUR                  X5        [        UR	                  U 5      USR                  U5      S	9  MG     g )
NrF   rC   r=   rQ   )r=   r=   r=   r=   r=   r=   r   r   r   rs   )r   r   r   r,   r   rv   r   r*   )re   rf   r   TreeClassifierr   TreeRegressorr   s          r   test_pure_setr     s    
bB8b"X1v1v1v>AA ) 1!,3;;q>16G6N6Nt6TU !2
  )0+CKKNA7H7O7OPT7UV  1r   c            
         [         R                  " / SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/5      n [         R                  " / SQ5      n[         R                  " S	S
9   [        R	                  5        HU  u  p#U" SS9nUR                  X5        UR                  X* 5        UR                  U * U5        UR                  U * U* 5        MW     S S S 5        g ! , (       d  f       g = f)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   )rS   gAw?gtQ?5??rX   g7G?gۺ?gb'?raise)allr   r   )ry   r   errstater   r   r   r   s        r   test_numerical_stabilityr     s    
DDDDDDD	

	A 	WXA		!#//+JDA&CGGAMGGArNGGQBNGGQBO , 
"	!	!s   A.C
Cc            
         [         R                  " SSSSSSSS9u  p[        R                  5        H  u  p#U" SS9nUR	                  X5        UR
                  n[        R                  " US:  5      nUR                  S   S:X  d   S	R                  U5      5       eUS:X  a  Mr   S	R                  U5      5       e   [        SS9nUR	                  [        R                  [        R                  5        [        S[        [        R                  5      S
9nUR	                  [        R                  [        R                  5        [        UR
                  UR
                  5        g )N  rH   r@   r   Fr]   r^   n_informativen_redundant
n_repeatedshuffler\   r   皙?r   r\   max_leaf_nodes)r	   make_classificationr   r   r   feature_importances_ry   r~   r   rv   r   rg   r   r   r   r,   )re   rf   r   r'   r   importancesn_importantclf2s           r   test_importancesr     s   ''DA  oo'
"..ff[3./  #r)I+<+C+CD+II)a?!2!9!9$!?? ( !a
0CGGDIIt{{#!qTYYPDHHTYY$s//1J1JKr   c                      [        5       n [        R                  " [        5         [	        U S5        S S S 5        g ! , (       d  f       g = f)Nr   )r   r   raises
ValueErrorgetattr)r   s    r   test_importances_raisesr     s-    
 
"C	z	"+, 
#	"	"s	   ;
A	c            
         [         R                  " SSSSSSSS9u  p[        SSSS	9R                  X5      n[	        S
SSS	9R                  X5      n[        UR                  UR                  5        [        UR                  R                  UR                  R                  5        [        UR                  R                  UR                  R                  5        [        UR                  R                  UR                  R                  5        [        UR                  R                  UR                  R                  5        g )Ni  rH   r@   r   Fr   r5   r?   )r   r   r\   r7   )r	   r   r   r   r   r*   r   r,   tree_r{   rx   rw   r}   )re   rf   r   r   s       r   )test_importances_gini_equal_squared_errorr     s     ''DA !6QQ
O
S
S	C  !QQ	c!i  00#2J2JKsyy((#))*;*;<syy..		0G0GHsyy//1I1IJsyy//1I1IJr   c                  <   [         R                  5        GH  u  pU" SS9nUR                  [        R                  [        R
                  5        UR                  [        [        R                  " [        R                  R                  S   5      5      :X  d   eU" SS9nUR                  [        R                  [        R
                  5        UR                  [        [        R                  " [        R                  R                  S   5      5      :X  d   eU" SS9nUR                  [        R                  [        R
                  5        UR                  S:X  d   eU" SS9nUR                  [        R                  [        R
                  5        UR                  S:X  d   eU" SS9nUR                  [        R                  [        R
                  5        UR                  S:X  d   eU" SS9nUR                  [        R                  [        R
                  5        UR                  [        S[        R                  R                  S   -  5      :X  d   eU" SS9nUR                  [        R                  [        R
                  5        UR                  [        R                  R                  S   :X  d   eU" S S9nUR                  [        R                  [        R
                  5        UR                  [        R                  R                  S   :X  a  GM   e   g )	Nsqrt)r   r=   log2r@   rW   rO   rS   )r;   r   r   rg   r   r   max_features_intry   r  r   r  )r   TreeEstimatorests      r   test_max_featuresr    s   (00		4;;'  C		0B(C$DDDD0		4;;'  C		0B(C$DDDD+		4;;'  A%%%+		4;;'  A%%%.		4;;'  A%%%-		4;;'  Cdiiooa.@(@$AAAA-		4;;'  DIIOOA$6666.		4;;'  DIIOOA$6666?  1r   c                  	   [         R                  5        GH}  u  pU" 5       n[        R                  " [        5         UR                  [        5        S S S 5        UR                  [        [        5        / SQ/n[        R                  " [        5         UR                  U5        S S S 5        U" 5       n[        S S n[        R                  " [        5         UR                  [        U5        S S S 5        [        R                  " [        5      nU" 5       nUR                  U[        5        [        UR                  [        5      [        5        U" 5       n[        R                  " [        5         UR                  [        5        S S S 5        UR                  [        [        5        [        R                   " [        5      n[        R                  " [        5         UR                  US S 2SS 24   5        S S S 5        [        R"                  " [        5      R                  nU" 5       nUR                  [        R$                  " [        U5      [        5        [        R                  " [        5         UR                  [        5        S S S 5        [        R                  " [        5         UR'                  [        5        S S S 5        U" 5       nUR                  [        [        5        [        R                  " [        5         UR                  U5        S S S 5        [        R                  " [        5         UR'                  U5        S S S 5        U" 5       n[        R                  " [        5         UR'                  [        5        S S S 5        GM     [)        SS9n[        R                  " [        SS9   UR                  / SQ// S	Q5        S S S 5        [        R                  " [        S
S9   UR                  / SQ// SQ5        S S S 5        g ! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GNP= f! , (       d  f       GN= f! , (       d  f       GNj= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN_= f! , (       d  f       GM  = f! , (       d  f       N= f! , (       d  f       g = f)N)rF   rC   r=   rC   r=   r:   r   zy is not positive.*Poissonmatchr   r=   rQ   )r   r   r   zSome.*y are negative.*Poisson)r?   grQ   )r   r   r   r   r   r   re   r   rf   r   ry   asfortranarrayr*   r   r   r   asarrayr   dotapplyr   )	r   r  r  X2y2XftXtr   s	            r   
test_errorr  &  s   (0o]]>*a  + 	1]]]:&b! ' osV]]:&GGArN ' q!oACKKNK8 o]]>*KKN + 	1JJqM]]:&KK!QR%! ' XXa[]]oq"q!]]:&KKN ']]:&IIaL ' o1]]:&KKO ']]:&IIbM ' o]]>*IIaL +*k  1r  )
4C	z)E	FY' 
G	z)H	I\* 
J	Is +*
 '& '& +* '& '&&&
 '&&&
 +*
 
G	F	I	Is   PP%P71Q	Q4Q-,Q?R9R#4R59S2S
P"	%
P4	7
Q		
Q	
Q*	-
Q<	?
R	
R 	#
R2	5
S	
S
S'c                     [         R                  " [        R                  [        R
                  R                  S9n [        R                  n[        S[        R                  5       5       GH   u  p#[        U   nU" SUSS9nUR                  X5        UR                  R                  UR                  R                  S:g     n[         R                  " U5      S:  d   SR!                  U5      5       eU" S	USS9nUR                  X5        UR                  R                  UR                  R                  S:g     n[         R                  " U5      S:  a  M   SR!                  U5      5       e   g
)z Test min_samples_split parameterdtypeN  rH   r   )min_samples_splitr   r\   rC   	   r   rB   N)ry   r  rg   r   r
   _treeDTYPEr   r   r;   keysr   r   r}   rx   r   rv   )re   rf   r   r   r  r  node_sampless          r   test_min_samples_splitr"  h  s(   
$))4::+;+;<AA !(inn6F G!$  a
 	yy//		0G0G20MNvvl#a'G):)A)A$)GG' !.q
 	yy//		0G0G20MNvvl#a'G):)A)A$)GG'+ !Hr   c                      [         R                  " [        R                  [        R
                  R                  S9n [        R                  n[        S[        R                  5       5       GH  u  p#[        U   nU" SUSS9nUR                  X5        UR                  R                  U 5      n[         R                  " U5      nXwS:g     n[         R                  " U5      S:  d   SR!                  U5      5       eU" SUSS9nUR                  X5        UR                  R                  U 5      n[         R                  " U5      nXwS:g     n[         R                  " U5      S:  a  M   SR!                  U5      5       e   g )	Nr  r  r?   r   )min_samples_leafr   r\   r<   r   r   )ry   r  rg   r   r
   r  r  r   r   r;   r   r   r   r  bincountr   rv   )	re   rf   r   r   r  r  outnode_counts
leaf_counts	            r   test_min_samples_leafr)    s<   
$))4::+;+;<AA !(inn6F G!$ ~A
 	iiooa kk#& !12
vvj!A%E'8'?'?'EE%  a
 	iiooa kk#& !12
vvj!A%E'8'?'?'EE%/ !Hr   c                    [         U   S   R                  [        R                  5      nUb  U" U5      n[         U   S   n[        R                  UR                  S   5      n[        R                  " U5      n[        U    n[        S[        R                  " SSS5      5       H  u  pU" XSS9n
U
R                  X4US	9  Ub*  U
R                  R                  UR                  5       5      nOU
R                  R                  U5      n[        R                  " XS
9nXS:g     n[        R                   " U5      XjR"                  -  :  a  M   SR%                  X
R"                  5      5       e   UR                  S   n[        S[        R                  " SSS5      5       H  u  pU" XSS9n
U
R                  X45        Ub*  U
R                  R                  UR                  5       5      nOU
R                  R                  U5      n[        R                  " U5      nXS:g     n[        R                   " U5      XjR"                  -  :  a  M   SR%                  X
R"                  5      5       e   g)zLTest if leaves contain at least min_weight_fraction_leaf of the
training setre   Nrf   r   r  rO   rN   )min_weight_fraction_leafr   r\   r   )weightsz,Failed with {0} min_weight_fraction_leaf={1})DATASETSastypery   float32rngrandr   r~   r;   r   linspacer   r   r  tocsrr%  r   r+  rv   )r   r	   sparse_containerre   rf   r,  total_weightr  r   fracr  r&  node_weightsleaf_weightss                 r   check_min_weight_fraction_leafr9    s    	3&&rzz2A#Q3Ahhqwwqz"G66'?LdOM !(bkk!S!6L M%)WX
 	G,'))//!''),C))//!$C{{38#A$56vvl#|6R6R'RR 	
:AA22	
R !N* 771:L 'bkk!S!6L M%)WX
 	'))//!''),C))//!$C{{3'#A$56vvl#|6R6R'RR 	
:AA22	
R !Nr   r   c                     [        U S5        g Nrg   r9  r   s    r   ,test_min_weight_fraction_leaf_on_dense_inputr>    s    "40r   csc_containerc                     [        U SUS9  g Nrm   )r4  r<  r   r?  s     r   -test_min_weight_fraction_leaf_on_sparse_inputrC    s     #4Vr   c                    [         U   S   R                  [        R                  5      nUb  U" U5      n[         U   S   nUR                  S   n[
        U    n[        S[        R                  " SSS5      5       H  u  pxU" UUSSS	9n	U	R                  X45        Ub*  U	R                  R                  UR                  5       5      n
OU	R                  R                  U5      n
[        R                  " U
5      nXS:g     n[        R                  " U5      [        XYR                  -  S5      :  a  M   S
R!                  X	R                  U	R"                  5      5       e   [        S[        R                  " SSS5      5       H  u  pxU" UUSSS	9n	U	R                  X45        Ub*  U	R                  R                  UR                  5       5      n
OU	R                  R                  U5      n
[        R                  " U
5      nXS:g     n[        R                  " U5      [        XYR                  -  XYR"                  -  5      :  a  M   S
R!                  X	R                  U	R"                  5      5       e   g)zvTest the interaction between min_weight_fraction_leaf and
min_samples_leaf when sample_weights is not provided in fit.re   Nrf   r   r  rO   r@   r?   )r+  r   r$  r\   zBFailed with {0} min_weight_fraction_leaf={1}, min_samples_leaf={2}r   )r-  r.  ry   r/  r   r;   r   r2  r   r   r  r3  r%  r   maxr+  rv   r$  )r   r	   r4  re   rf   r5  r  r   r6  r  r&  r7  r8  s                r   4check_min_weight_fraction_leaf_with_min_samples_leafrF    s.   
 	3&&rzz2A#Q3A771:LdOM 'bkk!S!6L M%))	
 	'))//!''),C))//!$C{{3'#A$56vvl#s8881(
 
 	
OVV..0D0D
	
 
% !N. !(bkk!S!6L M%)) 	
 	'))//!''),C))//!$C{{3'#A$56vvl#s888000(
 
 	
 PVV..0D0D
	
 
% !Nr   c                     [        U S5        g r;  rF  r=  s    r   Btest_min_weight_fraction_leaf_with_min_samples_leaf_on_dense_inputrI  +  s    8vFr   c                     [        U SUS9  g rA  rH  rB  s     r   Ctest_min_weight_fraction_leaf_with_min_samples_leaf_on_sparse_inputrK  0  s    
 9l]r   c                 t   [         R                  " SU S9u  p[        S[        R	                  5       5       GH  u  p4[        U   nU" USS9nU" USSS9nU" USSS9nU" US	SS9n	US
4US4US4U	S	44 GH  u  pU
R
                  U::  d!   SR                  U
R
                  U5      5       eU
R                  X5        [        U
R                  R                  5       GHQ  nU
R                  R                  U   [        :w  d  M'  U
R                  R                  U   nU
R                  R                  U   nU
R                  R                  U   nU
R                  R                  U   nU
R                  R                  U   nUU-  nU
R                  R                  U   nU
R                  R                  U   nU
R                  R                  U   nUU-  nUU-   nUU-  nU
R                  R                  U   UR                   S   -  nUUU-
  -  nUU:  a  GM=   SR                  UU5      5       e   GM     GM     g )Nd   r]   r\   r  r   r   r\   rU   )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   rP  rv   r   ranger   ru   rx   r!   r   weighted_n_node_samplesrw   r   )r   re   rf   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_decreaserg  :  s]    ''#DVWDA !(inn6F G!$ NK)TU
 )VW
 )ST

 4L4L6N3K	'
"C ,,0AA ;BB--/@A
 GGAMcii223 99**40I=!$!3!3D!9J!$!B!B4!HJ992248D!$!B!B4!HJ"yy11$7H#-#8LII44T:E"%))"C"CE"JK #		 2 25 9I$/)$;M-:\-I**j8* 		99$?!''!*L + '="%;;'O +.?? LSS+->?9 4'
% !Hr   c            
         [         R                  5        GH@  u  pSU ;   a   [        R                  [        R                  p2O[
        R                  [
        R                  p2U" SS9nUR                  X#5        UR                  X#5      n/ SQnU Vs0 s H  ow[        UR                  U5      _M     nn[        R                  " U5      n	[        R                  " U	5      n
[        U
5      UR                  :X  d   eU
R                  X#5      nX[:X  d   SR                  U 5      5       eU H*  n[!        [        U
R                  U5      X   SU SU  3S9  M,     GMC     g	s  snf )
z8Test pickling preserves Tree properties and performance.
Classifierr   r   )r   ru   capacity	n_classesrx   rw   n_leavesr{   r|   r   r}   rS  r   z6Failed to generate same score  after pickling with {0}z"Failed to generate same attribute z after pickling with rs   N)r;   r   rg   r   r   rh   r   r   r   r   pickledumpsloadstype	__class__rv   r,   )r   r  re   rf   r  r   
attributes	attributefitted_attributeserialized_objectrU  score2s               r   test_picklerw    s;   (0499dkkq==(//q+		!

  GQ
FPwsyy)44j 	 
 #LL-||-.DzS]]***A! 	
DKKDQ	
 *I

I. +8 Dv	 *M  14
s    EzTree, criterionc                    SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS//n[         R                  " SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS//5      nSS/SS/SS/SS//n[         R                  " SS/SS/SS/SS//5      nU[        ;   nUS:X  a  X3S:*  ==   S-  ss'   XUS:*  ==   S-  ss'   U(       a  U " SUS	9nUR                  X#5      R	                  U5      n[        X5        UR                  S
:X  d   eUR                  U5      n	[        U	5      S:X  d   eU	S   R                  S
:X  d   eU	S   R                  S:X  d   eUR                  U5      n
[        U
5      S:X  d   eU
S   R                  S
:X  d   eU
S   R                  S:X  d   eg U " SUS	9nUR                  X#5      R	                  U5      n[        X5        UR                  S
:X  d   eg )NrF   rC   r=   rQ   r   r@   r:   r<   )r\   r   r<   rQ   )r<   r<   )ry   r   r   r   r   r,   r   r   r   r   r*   )r'   r   re   rf   r   y_trueis_clfr   y_hatproba	log_probar   s               r   test_multioutputr    sa    
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XXAwAQ!Q89F.(FI	q&	Q	{q Y7%%a(5){{f$$$!!!$5zQQx~~'''Qx~~'''))!,	9~"""|!!V+++|!!V+++ Y7%%a(E*{{f$$$r   c                  d   [         R                  5        GH  u  pU" SS9nUR                  [        [        5        UR
                  S:X  d   e[        UR                  SS/5        [        R                  " [        [        R                  " [        5      S-  45      R                  nU" SS9nUR                  [        U5        [        UR
                  5      S:X  d   e[        UR                  5      S:X  d   e[        UR
                  SS/5        [        UR                  SS/SS//5        GM     g )Nr   r   rQ   rC   r=   rF   )r   r   r   re   rf   
n_classes_r,   classes_ry   r   r   r   r   )r   r   r   _ys       r   test_classes_shaper    s     ) 1!,1~~"""3<<"a1 YY288A;?+,..!,23>>"a'''3<< A%%%3>>Aq623<<2q'B7);< !2r   c                     [         R                  S S n [         R                  S S n[        SU5      n[        R                  5        H6  u  p4U" SS9nUR                  XUS9  [        UR                  U 5      U5        M8     g )N}   balancedr   r   r   )	rg   r   r   r(   r   r   r   r*   r   )unbalanced_Xunbalanced_yr   r   r   r   s         r   test_unbalanced_irisr    sn    99Tc?L;;t$L)*lCM ) 1!,-HCKK5|D !2r   c                     [        [        R                  5       [        R                  [        R
                  /5       GH  u  u  pnU" SS9n[        R                  " [        R                  US9n[        R                  n[        UR                  XE5      R                  U5      U5        [        R                  " [        R                  SUS9n[        R                  n[        UR                  XE5      R                  U5      U5        [        R                  " [        R                  SUS9n[        R                  n[        UR                  XE5      R                  U5      U5        [        R                  " [        R                  US9n[        R                  n[        UR                  XE5      R                  U5      U5        [         HR  nU" [        R                  US9n[        R                  n[        UR                  XE5      R                  U5      U5        MT     [         HR  nU" [        R                  US9n[        R                  n[        UR                  XE5      R                  U5      U5        MT     [        R                  " [        R                  S S S2   US9n[        R                  S S S2   n[        UR                  XE5      R                  U5      U5        GM     g )Nr   r   r  C)orderr  Fr@   )r   r;   r   ry   float64r/  r  rg   r   r   r,   r   r   ascontiguousarrayr2   r1   )r   r  r  r  re   rf   csr_containerr?  s           r   test_memory_layoutr    s   (/BJJ

3)$u + JJtyy.KK3771=003Q7 JJtyy59KK3771=003Q7 JJtyy59KK3771=003Q7   %8KK3771=003Q7 ,Mdiiu5AAswwq}44Q7; , ,Mdiiu5AAswwq}44Q7; , JJtyy1~U3KK!3771=003Q7Q)r   c                  >   [         R                  " S5      S S 2[         R                  4   n [         R                  " S5      nSUS S& [         R                  " S5      nSX!S:H  '   [	        SS9nUR                  XUS9  [        UR                  U 5      [         R                  " S5      5        [         R                  " S5      S S 2[         R                  4   n [         R                  " S5      nSUSS& S	USS& SU SS2S4'   [         R                  " S5      nS
X!S	:H  '   [	        SSS9nUR                  XUS9  UR                  R                  S   S:X  d   eSX!S	:H  '   [	        SSS9nUR                  XUS9  UR                  R                  S   S:X  d   e[        R                  n [        R                  n[        R                  SU R                   S   S5      n[	        SS9nUR                  X   X   5        [         R"                  " X@R                   S   S9n[	        SS9nUR                  XUS9  UR                  R$                  [&        R(                  R*                  :g  n[-        UR                  R                  U   UR                  R                  U   5        g )NrM  rX   2   r   r   r      r=   rQ   gRQ?r   g     b@rO   g     H@)	minlength)ry   r   r   r   r   r   r,   r   rq   r   r|   rg   r   r   r0  randintr   r%  rx   r
   r  r!   r+   )re   rf   r   r   
duplicatesr   r   s          r   test_sample_weightr  L  s-    			#q"**}%A
AAcrFGGCLMMq&
 a
0CGGAG.s{{1~rwws|4 			#q"**}%A
AAbIAc#JAc#gqjMGGCLM Mq&
 11
=CGGAG.99q!U***Mq&
 11
=CGGAG.99q!T))) 			AAQ
C0J
 a
0CGGAM1=)KK
ggajAM!q1DHHQH/yy&&$***>*>>H		H%tzz';';H'Er   c                  H   [         R                  " S5      S S 2[         R                  4   n [         R                  " S5      nSUS S& [	        SS9n[         R
                  R                  SS5      n[        R                  " [        5         UR                  XUS9  S S S 5        [         R                  " S5      n[        R                  " S5      n[        R                  " [        US	9   UR                  XUS9  S S S 5        g ! , (       d  f       Nm= f! , (       d  f       g = f)
NrM  rX   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
  )ry   r   r   r   r   randomr1  r   r   r   r   r   reescape	TypeError)re   rf   r   r   expected_errs        r   test_sample_weight_invalidr    s    
		#q"**}%A
AAcrF
 a
0CIINN3*M	z	"M2 
# HHQKM99BL 
y	5M2 
6	5 
#	" 
6	5s   
D(D
D
D!c                    [         U    nU" SS9nUR                  [        R                  [        R                  5        U" SSS9nUR                  [        R                  [        R                  5        [        UR                  UR                  5        [        R                  " [        R                  [        R                  [        R                  45      R                  nU" SSSS.SSSS.SSSS./SS9nUR                  [        R                  U5        [        UR                  UR                  5        U" SSS9nUR                  [        R                  U5        [        UR                  UR                  5        [        R                  " [        R                  R                  5      nU[        R                  S:H  ==   S	-  ss'   SS
SS.nU" SS9nUR                  [        R                  [        R                  U5        U" USS9nUR                  [        R                  [        R                  5        [        UR                  UR                  5        U" SS9nUR                  [        R                  [        R                  US-  5        U" USS9nUR                  [        R                  [        R                  U5        [        UR                  UR                  5        g )Nr   r   r  class_weightr\   g       @rS   r  r=   rM  g      Y@rQ   )r   r   rg   r   r   r*   r   ry   r   r   r   r   )	r   r   clf1r   
iris_multiclf3clf4r   r  s	            r   test_class_weightsr    s    t_N q)DHHTYY$zBDHHTYY$1143L3LM DKKdkkBCEEJ$$$

 D 	HHTYY
#1143L3LMzBDHHTYY
#1143L3LM GGDKK--.M$++"#s*#u-Lq)DHHTYY]3|!DDHHTYY$1143L3LM q)DHHTYY]A%56|!DDHHTYY]31143L3LMr   c                 D   [         U    n[        R                  " [        [        R                  " [        5      S-  45      R
                  nU" SSS./SS9nSn[        R                  " [        US9   UR                  [        U5        S S S 5        g ! , (       d  f       g = f)	NrQ   rO   rS   rC   r=   r   r  zBnumber of elements in class_weight should match number of outputs.r
  )r   ry   r   rf   r   r   r   r   r   r   re   )r   r   r  r   rt   s        r   test_class_weight_errorsr    st     t_N	Arxx{Q'	(	*	*B CC'8&9
JCRG	z	12 
2	1	1s   1B
Bc                      [         R                  " SSS9u  pSn[        R                  5        H7  u  p4U" S US-   S9R	                  X5      nUR                  5       US-   :X  a  M7   e   g NrM  r=   rN  r<   )r   r   )r	   make_hastie_10_2r;   r   r   get_n_leavesre   rf   kr   r  r  s         r   test_max_leaf_nodesr    se    $$sCDA	A(0d1q5AEEaK!QU***  1r   c                      [         R                  " SSS9u  pSn[        R                  5        H1  u  p4U" SUS9R	                  X5      nUR                  5       S:X  a  M1   e   g r  )r	   r  r;   r   r   	get_depthr  s         r   test_max_leaf_nodes_max_depthr    sZ    $$sCDA	A(0a:>>qD}}!###  1r   c                      S H`  n [        [        5       R                  S/S//SS/5      R                  U 5      nSUR                  S   s=::  a  S:  a  MS   S5       e   S5       e   g )N)rk  r   rx   rw   r|   r   r{   r}   r   r=   rG   r@   z Array points to arbitrary memory)r   r   r   r   flat)attrr   s     r   test_arrays_persistr    sm    	 .044qcA3Z!QHNNPTUUZZ]&Q&J(JJ&J(JJ&	r   c                     [        S5      n [        R                  " S5      nU R                  SSS5      n[        R                  5        H8  u  p4U" SS9nUR                  X5        UR                  R                  S:X  a  M8   e   g )Nr   )rH   r_   rQ   rH   r   )	r4   ry   rq   r  r;   r   r   r   r   )r\   re   rf   r   r  r  s         r   test_only_constant_featuresr    so    %a(L
AQ5)A(0+yy""a'''  1r   tree_clsc                    [        S5      nUR                  SS5      nSnUS S 2S4==   U-  ss'   UR                  SSS5      nU " SS9nUR                  X$5        UR                  S   S:X  d   eUR                  S   S:  d   eg )Nr   rH   rQ   rQ  r  r   r=   )r4   r1  r  r   r   )r  r\   re   feature_thresholdrf   r  s         r   test_almost_constant_featurer    s    
 &a(L"a A adG  GQ5)A

"CGGAM##A&!+++##A&***r   c                  |   [         R                  " [         R                  " / SQ/[         R                  " S5      45      5      n / SQn[        R                  5        H]  u  p#SU;  d  M  U" SSS9nUR                  X5        UR                  R                  S:X  d   eUR                  R                  S	:X  a  M]   e   g )
N)r   r   r   r   r   r=   rQ   r<   r?   rN   r   )r<   rM   )r   r   r   r=   r=   rQ   rQ   rQ   r@   r@   r@   	ExtraTreer   r=   r   rQ   r?   )
ry   	transposer   rq   r;   r   r   r   r   ru   re   rf   r   r  r  s        r   ,test_behaviour_constant_feature_after_splitsr    s    

		568IJK	A 	*A(0d"QQ?CGGAM99&&!+++99''1,,,  1r   c                     [         R                  " [         R                  " S/S/S/S//5      [         R                  " S5      /5      n [         R                  " / SQ5      n[        R                  5        Hi  u  p#U" SSS9nUR                  X5        UR                  R                  S:X  d   e[        UR                  U 5      [         R                  " SS	5      5        Mk     [        R                  5        Hi  u  p#U" SSS9nUR                  X5        UR                  R                  S:X  d   e[        UR                  U 5      [         R                  " S
S	5      5        Mk     g )NrS   rX   )r<   r  )rX   rS   rX   rS   r   r=   r   ry  rO   )r<   )ry   hstackr   rq   r   r   r   r   r   r,   r   r   r   r   r  s        r   (test_with_only_one_non_constant_featuresr  &  s   
		288cUSEC53%89288I;NOPA
%&A(0;yy""a'''3,,Q/1EF	  1  )0;yy""a'''3;;q>2774+=>	  1r   c                  .   [         R                  " SS5      R                  [         R                  5      R	                  SS5      n [        5       n[        R                  " [        SS9   UR                  U / SQ5        S S S 5        g ! , (       d  f       g = f)Ng\)c=Hr<   rC   r=   r/  r
  )r   r=   r   r=   )
ry   repeatr.  r  reshaper   r   r   r   r   )re   r   s     r   test_big_inputr  7  s^    
		(A%%bjj199"a@A
 
"C	z	3<  
4	3	3s   (B
Bc                      SSK Jn   [        R                  " [        5         U " 5         S S S 5        g ! , (       d  f       g = f)Nr   _realloc_test)sklearn.tree._utilsr  r   r   MemoryErrorr  s    r   test_reallocr  ?  s"    1	{	# 
$	#	#s	   2
A c                     S[         R                  " S5      -  n [        R                  R	                  SS5      n[        R                  R                  SSS5      nSU S-   -  n[        SUS9n[        R                  " [        5         UR                  X5        S S S 5        SU S-
  -  S-
  n[        SUS9n[        R                  " [        5         UR                  X5        S S S 5        g ! , (       d  f       NX= f! , (       d  f       g = f)	NrP   PrH   rQ   r   r=   best)splitterr   )structcalcsizery   r  randnr  r   r   r   	Exceptionr   r  )n_bitsre   rf   huger   s        r   test_huge_allocationsr  F  s    %%F
		AA
		!Q#A !D
 &
FC	y	! 
"
 !q D
 &
FC	{	# 
$	# 
"	! 
$	#s   C+C<+
C9<
D
c                     [         U    n[        U   S   n[        U   S   nUS;   a  UR                  S   S-  nUS U nUS U n[        [        -   [
        -    GH2  nU" U5      nU" SUS9R                  XE5      n	U" SUS9R                  X5      n
[        U	R                  U
R                  SR                  U 5      5        U	R                  U5      nU [        ;   a"  U	R                  U5      nU	R                  U5      n[        [
        -   [        -    Hu  nU" U[        R                  S9n[!        U
R                  U5      U5        U [        ;   d  M?  [!        U
R                  U5      W5        [!        U
R                  U5      W5        Mw     GM5     g )	Nre   rf   )ri   rh   r   r?   r\   r   5{0} with dense and sparse format gave different treesr  )r;   r-  r   r0   r1   r2   r   r   r   rv   r   r   r   r   ry   r/  r+   )r
   datasetr   r  re   rf   r]   r4  X_sparser   r   y_predy_probay_log_probasparse_container_testX_sparse_tests                   r   check_sparse_inputr  [  sp   dOM#A#A ((GGAJ!O	jyMjyM*^;nL#A& qI>BB1HqI>BB8OGGGGCJJ4P	
 19ooa(G--a0K%3n%D~%U!1("**MM%aii&>Gy )!//-*H'R)''6 &V% Mr   	tree_typer  )rk   rj   ri   rm   rn   ro   rp   rq   c                 0    US:X  a  SOS n[        XU5        g )Nri   r@   r  )r  r  r   s      r   test_sparse_inputr    s     (dIy95r   rh   rl   c                     [        XS5        g )NrQ   r  )r  r  s     r   test_sparse_input_reg_treesr    s    
 y1-r   )rn   ro   rp   rq   c                    [         U    n[        U   S   nU" U5      n[        U   S   nU" SSSS9R                  XF5      nU" SSSS9R                  XV5      n[        UR                  UR                  SR                  U 5      5        [        UR                  U5      UR                  U5      5        U" SSSS	9R                  XF5      nU" SSSS	9R                  XV5      n[        UR                  UR                  SR                  U 5      5        [        UR                  U5      UR                  U5      5        U" SUR                  S   S-  S
9R                  XF5      nU" SUR                  S   S-  S
9R                  XV5      n[        UR                  UR                  SR                  U 5      5        [        UR                  U5      UR                  U5      5        U" SSS9R                  XF5      nU" SSS9R                  XV5      n[        UR                  UR                  SR                  U 5      5        [        UR                  U5      UR                  U5      5        g )Nre   rf   r   r=   rQ   )r\   r   r   r  rH   )r\   r   r  )r\   r$  r@   r   )	r;   r-  r   r   r   rv   r+   r   r   )	r  r  r?  r  re   r  rf   r   r   s	            r   test_sparse_parametersr    s&    i(M#AQH#A 	11BFFqLA11BFFxSA		?FFyQ
 aiilAIIaL9 	11KOOPQUA11KOO	A 		?FFyQ
 aiilAIIaL9 	1x~~a7HA7MNRRSTXA1x~~a7HA7MNRR	A 		?FFyQ
 aiilAIIaL9 	1Q7;;AAA1Q7;;HHA		?FFyQ
 aiilAIIaL9r   ztree_type, criterionc                 f   [         U    n[        U   S   nU" U5      n[        U   S   nU" SSUS9R                  XW5      nU" SSUS9R                  Xg5      n	[        UR                  U	R                  SR                  U 5      5        [        U	R                  U5      UR                  U5      5        g )Nre   rf   r   r@   r\   r   r   r  )r;   r-  r   r   r   rv   r+   r   )
r  r  r?  r   r  re   r  rf   r   r   s
             r   test_sparse_criteriar    s     i(M#AQH#A1YGKKAQA1YGKKHXA		?FFyQ
 aiilAIIaL9r   zcsc_container,csr_containerc                    [         U    nSnSnUn[        R                  " U5      n[        S5      n/ n	/ n
SnU/n[	        U5       Hu  nUR                  US5      nUR                  U5      S U nU	R                  U5        UR                  SSU4S9S-
  nU
R                  U5        X-  nUR                  U5        Mw     [        R                  " U	5      R                  [        R                  5      n	[        R                  " U[        R                  S9n[        R                  " [        R                  " U
5      [        R                  S9n
U" XU4Xe4S9nUR                  5       nU" XU4Xe4S9nUR                  5       nUR                  SSU4S9nUR                  5       nUR                   S	:H  R#                  5       S:  d   eUR                   S	:H  R#                  5       S:  d   eU" SUS
9R%                  UU5      nU" SUS
9R%                  UU5      n['        UR(                  UR(                  SR+                  [,        5      5        UU4n[/        UU5       GH  u  nn[1        UR(                  R3                  U5      UR(                  R3                  U5      5        [1        UR3                  U5      UR3                  U5      5        [1        UR3                  U5      UR(                  R3                  U5      5        [1        UR(                  R5                  U5      R                  5       UR(                  R5                  U5      R                  5       5        [1        UR5                  U5      R                  5       UR5                  U5      R                  5       5        [1        UR5                  U5      R                  5       UR(                  R5                  U5      R                  5       5        [1        UR7                  U5      UR7                  U5      5        [,        [8        ;   d  GM  [1        UR;                  U5      UR;                  U5      5        GM     g )Nr@   rH   r   rO   r`   r=   r  r   rX   r  r  )r;   ry   r   r4   rR  binomialpermutationappendconcatenater.  int32r   r/  toarrayr  copyr   r~   r   r   r   rv   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  re   r  X_testrf   r   r   XsX1r  s                              r   test_explicit_sparse_zerosr    s   
 i(MIJ Iii	"G &a(LGDFXF:"++Is; ,,W5l{C	y!&&q#[N&CaGFf  nnW%,,RXX6GXXfBHH-F88BNN4(

;DdV4Y<STHA!		'>M ""$FQ5A "&&(M MMS %%'!+++#%**,q000 	1	:>>q!DA1	:>>xKA		?FFtL -	 B"b/B!!''--"3QWW]]25FG!!''"+qwwr{;!!''"+qww}}R/@A!GG!!"%--/1F1Fr1J1R1R1T	
 	"OOB'')1??2+>+F+F+H	
 	"OOB'')177+@+@+D+L+L+N	
 	"!))B-2?9%aoob&91??2;NO% "r   c                    [         U    n[        R                  S S 2S4   R                  5       n[        R                  S S 2S4   R	                  S5      n[        R
                  n[        R                  " [        5         U" SS9R                  X$5        S S S 5        U" SS9nUR                  X45        [        R                  " [        5         UR                  U/5        S S S 5        g ! , (       d  f       N[= f! , (       d  f       g = f)Nr   r  r   )r;   rg   r   r   r  r   r   r   r   r   r   )r   r  re   X_2drf   r  s         r   check_raise_error_on_1d_inputr  >  s    dOM		!Q$A99QT?""7+DA	z	"1%))!/ 
# Q
'CGGD	z	"QC 
#	" 
#	"
 
#	"s   ?C*C;*
C8;
D	c                 b    [        5          [        U 5        S S S 5        g ! , (       d  f       g = fN)r.   r  r=  s    r   test_1d_inputr  N  s    		%d+ 
		s    
.r4  c                 F   [         U    n[        R                  " S/S/S/S/S//5      n/ SQn/ SQnUb  U" U5      nU" SS9nUR                  X4US9  UR                  R
                  S:X  d   eU" SSS9nUR                  X4US9  UR                  R
                  S:X  d   eg )	Nr   r=   )r   r   r   r   r=   )rB   rB   rB   rB   rB   r   r   g?)r\   r+  )r;   ry   r   r   r   r   )r   r4  r  re   rf   r   r  s          r    test_min_weight_leaf_split_levelr  T  s     dOM
1#sQC!qc*+AA-M#Q
Q
'CGGAG.99!###
Q
ECGGAG.99!###r   c                    [         R                  [        R                  R                  SS9n[
        U    " 5       nUR                  [         [        5        [        UR                  [         5      UR                  R                  U5      5        g NFr  X_smallr.  r
   r  r  r;   r   y_smallr,   r  r   )r   	X_small32r  s      r   test_public_apply_all_treesr  h  sX    tzz//e<I
D/
CGGGWsyy)399??9+EFr   r  c                 (   U" [         R                  [        R                  R                  SS95      n[
        U    " 5       nUR                  [         [        5        [        UR                  [         5      UR                  R                  U5      5        g r  r  )r   r  r  r  s       r   test_public_apply_sparse_treesr  q  s_     gnnTZZ-=-=EnJKI
D/
CGGGWsyy)399??9+EFr   c                  @   [         R                  n [         R                  n[        SSS9R	                  X5      nUR                  U S S 5      R                  5       n[        U/ SQ/ SQ/5        S[        R                  [        R                  SS/n / SQn[        R                  " U 5      R                  S	S5      n [        SS
9R	                  X5      nUR
                  " U 5      R                  5       R                  SS9n[        XTR                  R                  5        g )Nr   r=   r  rQ   )r=   r=   r   r=   r   r=   r@   r   r   r   r=   r=   rC   r   axis)rg   r   r   r   r   r  r  r,   ry   nanr   r  r   r~   r   r}   )re   rf   r  node_indicatorr
   r}   s         r   test_decision_path_hardcodedr"  {  s    		AA
 a1
=
A
A!
GC&&q!u-557N~	9'=>
 
BFFBFFAq!AA
B"A a044Q:D''*22488a8@N~zz'@'@Ar   c                    [         R                  n[         R                  nUR                  S   n[        U    nU" SSS9nUR                  X5        UR                  U5      nUR                  5       nUR                  X5R                  R                  4:X  d   eUR                  U5      n[        U5       V	V
s/ s H  u  pXyU
4   PM     nn	n
[        U[        R                  " US95        UR                  R                  [         :H  n[        [        R"                  " X|5      [        R                  " US95        UR%                  SS9R'                  5       nUR                  R(                  U::  d   eg s  sn
n	f )Nr   rQ   r  r  r=   r  )rg   r   r   r   r;   r   r  r  r   ru   r  	enumerater+   ry   r   rx   r!   r  r~   rE  r   )r   re   rf   r]   r  r  node_indicator_csrr!  leavesr  jleave_indicator
all_leavesr   s                 r   test_decision_pathr*    s8   		AA
IdOM
Q!
4CGGAM**1-'//1NIyy/C/C#DDDD YYq\F8A&8IJ8I~d+8IOJorwwY/GH ((I5J
~*BGG),D
 """*..0I99)+++ Ks   8E4c                     [         U" [        5      p2[        U    n[        R                  " [
        5         U" SS9R                  X#5        S S S 5        g ! , (       d  f       g = fNr   r   )X_multilabely_multilabelr;   r   r   r  r   )r   r  re   rf   r  s        r   test_no_sparse_y_supportr/    sD     |4qdOM	y	!1%))!/ 
"	!	!s   A
A"c                     [        SSSS9n U R                  S/S/S/S/S/// SQ/ S	QS
9  [        U R                  R                  / SQ5        [        U R                  R                  R                  / SQ5        U R                  S/S/S/S/S/// SQ[        R                  " S5      S
9  [        U R                  R                  / SQ5        [        U R                  R                  R                  / SQ5        U R                  S/S/S/S/S/// SQS9  [        U R                  R                  / SQ5        [        U R                  R                  R                  / SQ5        [        SSSS9n S/S/S/S/S//nU R                  U/ SQ/ SQS
9  [        U R                  U5      / SQ5        [        U R                  R                  / SQ5        [        U R                  R                  R                  / SQ5        g)a   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   r8   rQ   )r\   r   r   r@   r?   rP   )rN   r   r@   r<   r@   )333333?333333?r   rS   r2  )re   rf   r   )g,d?gܶm۶m?g?)      @g      @r3  )ffffff?rR   gUUUUUU?)r<   rY   r3  rd   r=   )r\   r   r   r<   )r=   r=   r@   r=   rQ   )r@   r@   rQ   r=   rQ   )r=   r=   rQ   rQ   rQ   )gtE]t?r   r1  )r=   r=   rQ   N)r   r   r   r   r   r,   r   r  ry   r   r   )dt_maere   s     r   test_maer6    s   H #"21F
 JJ3aS1#s
#
/  
 FLL))+LMv||))..@ JJ1#sQC!qc*oRWWUVZJXv||,,.CDv||))..>
 JJ1#sQC!qc*oJ>v||,,.CDv||))..>""F
 qcA3aS!A
JJ

%  
 FNN1%7FLL))+=>v||))..	:r   c                     Sn [         R                  " S[         R                  S9nSnS n[        R                  [        R                  U4 H  n[
        R                  " 5        HD  u  pVU" X5      nU" U5      R                  5       nUu  n	u  pnXi:X  d   eX
:X  d   e[        X5        MF     [        R                  " 5        H@  u  pVU" X5      nU" U5      R                  5       nUu  n	u  pnXi:X  d   eX
:X  d   eX,:X  a  M@   e   M     g )Nr@   r  rM  c                 V    [         R                  " [         R                  " U 5      5      $ r  )rm  ro  rn  )objs    r   _pickle_copy)test_criterion_copy.<locals>._pickle_copyJ  s    ||FLL-..r   )
ry   r   intpr  deepcopyr   r   
__reduce__r,   r   )	n_outputsrk  r]   r:  	copy_func_typenamecriteriaresult	typename_
n_outputs_r  
n_samples_s                r   test_criterion_copyrH  C  s
    I		!277+II/ ii=	'--/KA	5Hx(335F5;2I/
(((***y5 0 (--/KA	5Hx(335F5;2I/
(((****** 0 >r   c                    [         R                  R                  S5      R                  SS5      S-  n[        R
                  " UR                  S5      5      nUS S 2S S24   nU b  U " U5      nUS S 2S4   n[        SS9R                  X#5      nUR                  " U5      n[        [         R                  " UR                  R                  [        :H  5      S   5      nUR                  U5      n[         R                  " [         R                   " UR                  R"                  5      ) 5      S   n[%        U5      S:X  d   e[%        U5      S:X  d   eg )Nr   rM  rM   g*Gr/  rC   r   )ry   r  RandomStater  r)   
nan_to_numr.  r   r   r  setwherer   rx   r!   
differenceisfiniter|   r   )	r4  r   re   rf   r
   terminal_regions	left_leaf
empty_leafinfinite_thresholds	            r   "test_empty_leaf_infinite_thresholdrT  _  s    99  #))#r2T9D>>$++i01DQVA#QQUA a044Q:Dzz!}BHHTZZ55BCAFGI%%&67J2;;tzz/C/C#D"DEaH!"a'''z?ar   c                 p   [         U    n U S   U S   p2U" SSS9nUR                  X#5      nUR                  nUR                  n[        R
                  " [        R                  " U5      S:  5      (       d   e[        R
                  " [        R                  " U5      S:  5      (       d   e[        XX65        g Nre   rf   r_   r   rO  r-  cost_complexity_pruning_path
ccp_alphas
impuritiesry   r   diffassert_pruning_creates_subtreer  r  re   rf   r  infopruning_pathrZ  s           r   'test_prune_tree_classifier_are_subtreesr`  r  s    
 wG3<q
"1
5C++A1D??LJ66"'','1,----66"''*%*++++"8@r   c                 p   [         U    n U S   U S   p2U" SSS9nUR                  X#5      nUR                  nUR                  n[        R
                  " [        R                  " U5      S:  5      (       d   e[        R
                  " [        R                  " U5      S:  5      (       d   e[        XX65        g rV  rW  r]  s           r   'test_prune_tree_regression_are_subtreesrb    s     wG3<q
"1
5C++A1D??LJ66"'','1,----66"''*%*++++"8@r   c                      [        SS9n U R                  S/S//SS/5        [        SSS9nUR                  S/S//SS/5        [        U R                  UR                  5        g )Nr   r   r=   rH   )r\   	ccp_alpha)r   r   assert_is_subtreer   )r  r   s     r   test_prune_single_node_treerf    s`    !q1DHHqcA3Z!Q  "qB?DHHqcA3Z!Q djj$**-r   c                     / nU H+  nU " SUSS9R                  X5      nUR                  U5        M-     [        U5       H%  u  px[        UR                  UR                  5        M'     g )Nr_   r   )r   rd  r\   )r   r  r   re  r   )	estimator_clsre   rf   r_  
estimatorsrd  r  prev_estnext_ests	            r   r\  r\    sd    J!	2QRSWW
 	#	 " 'z2(..(..9 3r   c                 L   U R                   UR                   :  d   eU R                  UR                  :  d   eU R                  nU R                  nUR                  nUR                  nS/nU(       Ga1  UR	                  5       u  px[        U R                  U   UR                  U   5        [        U R                  U   UR                  U   5        [        U R                  U   UR                  U   5        [        U R                  U   UR                  U   5        XH   XX   :X  a  [        [        UR                  U   5        OT[        U R                  U   UR                  U   5        UR                  X'   XH   45        UR                  X7   XX   45        U(       a  GM0  g g )N)r   r   )ru   r   rx   rw   popr+   r   r*   r   r}   rS  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   re  re    s   ??g00000>>W.....$$K&&L**N,,OHE
*/))+'!JJ}%w}}5E'F	
 	MM-('*:*:;K*L	
 	.0F0FGW0X	
 	((7++,<=	

 +/PP0A0ABR0ST  }-w/@/@AQ/R LL+4n6VWXLL,o.OP3 %r   r  r  r  c                 &   [         S   nUS   R                  [        R                  R                  SS9nUc  [        U5      nOU" US   5      n[        R                  " UR                  [        R                  R                  S9Ul        [        UR                  UR                  UR                  45      u  Ul        Ul	        Ul
        [        [        R                  " [        [        R                  R                  S95      n[        U    " US9nUR                  XV5        [        UR                  U5      UR                  U5      5        [        UR!                  U5      R#                  5       UR!                  U5      R#                  5       5        g )Nrk   re   Fr  r  )r  )r-  r.  r
   r  r  r-   ry   r   r   r   r   r  r;   r   r,   r   r  todense)r   r  r4  r  r  
X_readonly
y_readonlyr  s           r   "test_apply_path_readonly_all_treesrz    s5    {#Gcl!!$**"2"2!?G.w7
%gcl3
((:??$**:J:JK

 &__j00*2C2CD
		
O
 +288G4::CSCS+TUJ
D/8
,CGGJ#s{{:.G0DE*%--/1B1B71K1S1S1Ur   )r7   r9   r:   c                    [         R                  [         R                  p2U" U S9nUR                  X#5        [        R
                  " UR                  U5      5      [        R                  " [        R
                  " U5      5      :X  d   eg )Nr	  )	rh   r   r   r   ry   r~   r   r   r   )r   r'   re   rf   r   s        r   test_balance_propertyr|    sX     ==(//q

#CGGAM66#++a.!V]]266!9%====r   seedc           	         SS/SS/SS/SS/SS/SS/SS/SS//n/ SQn[        SU S9nUR                  X5        [        R                  " UR	                  U5      5      S:X  d   e[        SU S9nUR                  X5        [        R
                  " UR	                  U5      S:  5      (       d   eS	n[        R                  " US-  S-  S
SUUS-  S-  U S9u  pSUSU:  US:  -  '   [        R                  " U5      n[        SU S9nUR                  X5        [        R
                  " UR	                  U5      S:  5      (       d   eg )Nr   r=   rQ   r@   r   r   r   r   r=   rQ   r@   r<   r7   r   r:   rH   r1  r  )effective_ranktail_strengthr]   r^   r   r\   rC   )	r   r   ry   aminr   r   r	   make_regressionr   )r}  re   rf   r   r^   s        r   test_poisson_zero_nodesr    sL    Q!Q!Q!Q!Q!Q!Q!QHA A  /
MCGGAM773;;q>"a'''
)$
GCGGAM66#++a.1$%%%% J##!A~* 1n)DA ArAv!a%
q	A
)$
GCGGAM66#++a.1$%%%%r   c            	         [         R                  R                  S5      n Su  pn[        R                  " X-   X0S9nU R                  SSUS9[         R                  " USS9-  nU R                  [         R                  " XE-  5      S	9n[        XFX S
9u  pxp[        SSU S9n[        SSU S9nUR                  Xy5        UR                  Xy5        [        SS9R                  Xy5      nXyS4XS44 H  u  pFn[        XkR                  U5      5      n[        U[         R                  " UR                  U5      SS 5      5      n[        XmR                  U5      5      nUS:X  a  USU-  :  d   eUSU-  :  a  M   e   g )Nr   )  r  rH   r]   r^   r\   rF   rQ   )lowhighra   r   r  )lam)	test_sizer\   r:   rH   )r   r  r\   r7   mean)strategytraintestgV瞯<rO   g      ?)ry   r  rJ  r	   make_low_rank_matrixuniformrE  r:   r   r   r   r   r   r   r   clip)r0  n_trainn_testr^   re   coefrf   X_trainr  r   r   tree_poitree_msedummyval
metric_poi
metric_msemetric_dummys                     r   test_poisson_vs_mser  %  s~   
 ))


#C".GZ%%"z	A
 ;;2AJ;7"&&:KKDqx()A'7	($GW %rH %!RcH LL"LL"F+//AE1FF3KL	c*1.>.>q.AB
*1bggh6F6Fq6I5RV.WX
,Qa0@A &=j 0000D<//// Mr   rk  c           	      8   Su  p#[         R                  " UUUUSSS9u  pEU " SSS9R                  XE5      nU " SSS9R                  XE5      n[        UR                  UR                  U < S	35        [        UR                  U5      UR                  U5      5        g
)z3Test that criterion=entropy gives same as log_loss.)r  r?   r   r   )rk  r]   r^   r   r   r\   r6   +   r   entropyz> with criterion 'entropy' and 'log_loss' gave different trees.N)r	   r   r   r   r   r   r   )r'   rk  r]   r^   re   rf   tree_log_losstree_entropys           r   'test_criterion_entropy_same_as_log_lossr  O  s     "I'' DA :B?CCAIM)"=AA!GL(PQ
 M))!,l.B.B1.EFr   c                  2  ^^ [         R                  " SS9u  p[        SSS9mTR                  X5        TR	                  X5      nS mUU4S jn[
        R                  " U" 5       5      nUR	                  X5      n[        R                  " X%5      (       d   eg )Nr   r   r@   r  c                     U R                  5       R                  U R                  R                  5       5      R	                  5       $ r  )byteswapviewr  newbyteorderr>  )arrs    r   reduce_ndarray8test_different_endianness_pickle.<locals>.reduce_ndarrayn  s/    ||~""399#9#9#;<GGIIr   c                  "  > [         R                  " 5       n [        R                  " U 5      n[        R
                  R                  5       Ul        TUR
                  [        R                  '   UR                  T5        U R                  S5        U $ Nr   )ioBytesIOrm  Picklercopyregdispatch_tabler  ry   ndarraydumpseek)fpr   r  s     r    get_pickle_non_native_endiannessJtest_different_endianness_pickle.<locals>.get_pickle_non_native_endiannessq  sb    JJLNN1"11668'5$	s	q	r   )	r	   r   r   r   r   rm  loadry   isclose)re   rf   r   r  new_clf	new_scorer   r  s         @@r    test_different_endianness_pickler  g  s{    ''Q7DA
 a1
=CGGAMIIaOEJ kk:<=Ga#I::e''''r   c                  J  ^^ [         R                  " SS9u  p[        SSS9mTR                  X5        TR	                  X5      n " S S[
        5      mUU4S jn[        R                  " U" 5       5      nUR	                  X5      n[        R                  " X%5      (       d   eg )Nr   r   r@   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )Ptest_different_endianness_joblib_pickle.<locals>.NonNativeEndiannessNumpyPickleri  c                    > [        U[        R                  5      (       a7  UR                  5       R	                  UR
                  R                  5       5      n[        TU ]!  U5        g r  )	
isinstancery   r  r  r  r  r  supersave)selfr9  rq  s     r   r  Utest_different_endianness_joblib_pickle.<locals>.NonNativeEndiannessNumpyPickler.save  sC    #rzz**lln))#))*@*@*BCGLr   r   )__name__
__module____qualname____firstlineno__r  __static_attributes____classcell__)rq  s   @r   NonNativeEndiannessNumpyPicklerr    s    	 	r   r  c                     > [         R                  " 5       n T" U 5      nUR                  T5        U R                  S5        U $ r  )r  r  r  r  )r  r  r  r   s     r   'get_joblib_pickle_non_native_endiannessXtest_different_endianness_joblib_pickle.<locals>.get_joblib_pickle_non_native_endianness  s3    JJL+A.	s	q	r   )
r	   r   r   r   r   r   joblibr  ry   r  )re   rf   r   r  r  r  r  r   s         @@r   'test_different_endianness_joblib_pickler    s    ''Q7DA
 a1
=CGGAMIIaOE,  kkACDGa#I::e''''r   c                    [         (       a  [        R                  O[        R                  n/ SQnU R                  R
                  R                  5        VVVs0 s H
  u  nu  pEX4_M     nnnnU H  nXU'   M	     [        R                  " [        UR                  5       5      [        UR                  5       5      S.5      nU R                  USS9$ s  snnnf )N)
left_childright_childr{   r}   namesformats	same_kindcasting)r/   ry   int64r  r  fieldsr   listr   valuesr.  )node_ndarraynew_dtype_for_indexing_fieldsindexing_field_namesr   r  rA  new_dtype_dict	new_dtypes           r   "get_different_bitness_node_ndarrayr    s    09	BHHrxx! V -9,>,>,E,E,K,K,M,M(ju,M   %<t % ~**,-$~?T?T?V:WXI y+>>s   Cc                    U R                   R                  R                  5        VVVs0 s H
  u  nu  p#X_M     nnnnU R                   R                  R                  5        VVs/ s H  u  p%UPM	     nnnU Vs/ s H  nSU-   PM
     nn[        R                   " [        UR                  5       5      [        UR                  5       5      US.5      nU R                  USS9$ s  snnnf s  snnf s  snf )NrP   )r  r  offsetsr  r  )r  r  r   r  ry   r  r   r.  )	r  r   r  rA  r  r  r  shifted_offsetsr  s	            r   $get_different_alignment_node_ndarrayr    s    ,8,>,>,E,E,K,K,M,M(ju,M   ,8+=+=+D+D+K+K+MN+M-%v+MGN078fq6zO8.--/0N1134&	
I y+>> O8s   C#%C*:C0c                     [         (       a  [        R                  O[        R                  nU R                  " 5       u  nu  p4pVUR                  USS9nUR                  5       n[        US   5      US'   X#Xu4U4$ )Nr  r  nodes)r/   ry   r  r  r>  r.  r  r  )	r
   r  r  r^   rk  r?  statenew_n_classes	new_states	            r   "reduce_tree_with_different_bitnessr    so    %I288I:>//:K7H0zi$$Y$DM

I;Ig<NOIg=<iHHr   c                  &  ^ [         R                  " SS9u  p[        SSS9mTR                  X5        TR	                  X5      nU4S jn[
        R                  " U" 5       5      nUR	                  X5      nU[        R                  " U5      :X  d   eg )Nr   r   r@   r  c                    > [         R                  " 5       n [        R                  " U 5      n[        R
                  R                  5       Ul        [        UR
                  [        '   UR                  T5        U R                  S5        U $ r  )r  r  rm  r  r  r  r  r  
CythonTreer  r  r  r  r   s     r   "pickle_dump_with_different_bitnessItest_different_bitness_pickle.<locals>.pickle_dump_with_different_bitness  s^    JJLNN1"11668'I$	s	q	r   )	r	   r   r   r   r   rm  r  r   r   )re   rf   r   r  r  r  r   s         @r   test_different_bitness_pickler    sw    ''Q7DA
 a1
=CGGAMIIaOE kk<>?Ga#IFMM),,,,r   c                  &  ^ [         R                  " SS9u  p[        SSS9mTR                  X5        TR	                  X5      nU4S jn[
        R                  " U" 5       5      nUR	                  X5      nU[        R                  " U5      :X  d   eg )Nr   r   r@   r  c                     > [         R                  " 5       n [        U 5      n[        R                  R                  5       Ul        [        UR                  [        '   UR                  T5        U R                  S5        U $ r  )
r  r  r   r  r  r  r  r  r  r  r  s     r   "joblib_dump_with_different_bitnessPtest_different_bitness_joblib_pickle.<locals>.joblib_dump_with_different_bitness  sY    JJLO"11668'I$	s	q	r   )	r	   r   r   r   r   r  r  r   r   )re   rf   r   r  r  r  r   s         @r   $test_different_bitness_joblib_pickler    sy     ''Q7DA
 a1
=CGGAMIIaOE kk<>?Ga#IFMM),,,,r   c                  d   [         (       a$  [        R                  " [        R                  5      O#[        R                  " [        R                  5      n [        R                  " [        R                  5      [        R                  " [        R                  5      /nX Vs/ s H  o"R                  5       PM     sn-  n[        R                  " SS/U S9nU H  n[        UR                  U5      U 5        M      [        R                  " [        SS9   [        R                  " SS//U S9n[        X@5        S S S 5        [        R                  " [        SS9   UR                  [        R                  5      n[        XP5        S S S 5        g s  snf ! , (       d  f       N`= f! , (       d  f       g = f)Nr   r=   r  zWrong dimensions.+n_classesr
  zn_classes.+incompatible dtype)r/   ry   r  r  r  r  r   r$   r.  r   r   r   r  )expected_dtypeallowed_dtypesdtrk  wrong_dim_n_classeswrong_dtype_n_classess         r   test_check_n_classesr    s%   +49RXXbhh'"((288:LNhhrxx("((288*<=N>B>R(>BBN!Q~6I))"-~>  
z)F	G hhAx~F,= 
H 
z)H	I ) 0 0 <.? 
J	I C 
H	G 
J	Is    F$F+F!
F!
F/c                     [         R                  " [         R                  5      n Sn[         R                  " XS9nX R	                  5       /nU H  n[        X$US9  M     [        R                  " [        SS9   [        X SS9  S S S 5        US S 2S S 2S S24   [         R                  " U5      4 H:  n[        R                  " [        SS9   [        UU UR                  S9  S S S 5        M<     [        R                  " [        S	S9   [        UR                  [         R                  5      U US9  S S S 5        g ! , (       d  f       N= f! , (       d  f       M  = f! , (       d  f       g = f)
N)r?   r=   rQ   r  )r  expected_shapezWrong shape.+value arrayr
  )r=   rQ   r=   zvalue array.+C-contiguouszvalue array.+incompatible dtype)ry   r  r  rq   r  r&   r   r   r   r  r   r.  r/  )r  r  value_ndarrayr   r  problematic_arrs         r   test_check_value_ndarrayr	  	  s&   XXbjj)NNHH^BM$&A&A&CDN^	
 
 
z)C	D	
 
E
 *!Q(3R5F5F}5UV]]:-HI -.44 JI W 
z)J	K  ,))	
 
L	K 
E	D JI 
L	Ks$   8D8E	)E8
E	
E	
E)c                     [         n [        R                  " SU S9nU[        U5      [	        U5      /nUU Vs/ s H+  o3R                  UR                  R                  5       5      PM-     sn-  nU H  n[        XS9  M     [        R                  " [        SS9   [        R                  " SU S9n[        X@S9  S S S 5        [        R                  " [        SS9   US S S2   n[        X@S9  S S S 5        UR                  R                  R                  5        VVVs0 s H
  u  nu  pgXV_M     nnnnUR                  5       n	[        R                  U	S	'   [        R                  " [!        U	R#                  5       5      [!        U	R%                  5       5      S
.5      n
UR                  U
5      n[        R                  " [        SS9   [        X@S9  S S S 5        UR                  5       n	[        R&                  U	S'   [        R                  " [!        U	R#                  5       5      [!        U	R%                  5       5      S
.5      n
UR                  U
5      n[        R                  " [        SS9   [        X@S9  S S S 5        g s  snf ! , (       d  f       GN= f! , (       d  f       GN= fs  snnnf ! , (       d  f       N= f! , (       d  f       g = f)N)r?   r  )r  zWrong dimensions.+node arrayr
  )r?   rQ   znode array.+C-contiguousrQ   r|   r  znode array.+incompatible dtyper  )r    ry   rq   r  r  r.  r  r  r%   r   r   r   r  r   r  r  r  r   r  r  )r  r  valid_node_ndarraysr  problematic_node_ndarrayr   r  rA  
dtype_dictr  r  s              r   test_check_node_ndarrayr  ,	  sL   N88D7L 	*<8,\:
 8K8K

399))+,8K  #LH # 
z)G	H#%88F.#I 4T 
I 
z)C	D#/!#4 4T 
E 7C6H6H6O6O6U6U6WX6W"2$
$+6WJX  __&N"$((N;~**,-$~?T?T?V:WXI  ,229=	z)I	J4T 
K  __&N#%::N< ~**,-$~?T?T?V:WXI  ,229=	z)I	J4T 
K	JM 
I	H 
E	D Y 
K	J 
K	Js;   2I>JJJ'
J.+
J?
J
J$.
J<?
KSplitterc           	      d   [         R                  R                  S5      nSnS[         R                  " SS/[         R                  S9pC[
        S   " X45      nU " XRSSUS	S
9n[        R                  " U5      n[        R                  " U5      nUR                  U:X  d   e[        X5      (       d   eg	)z&Check that splitters are serializable.r   rH   rQ   r@   r  r5   r?   rO   N)monotonic_cst)ry   r  rJ  r   r<  r   rm  rn  ro  r   r  )	r  r0  r   r?  rk  r   r  splitter_serializesplitter_backs	            r   test_splitter_serializabler  `	  s    
 ))


#CLbhh1vRWW=yV$Y:I	CDQHh/LL!34M%%555m....r   c                    [        U R                  S5      5      n[        SS9nUR                  [        [
        5        [        R                  " X!5        [        R                  " USS9n[        UR                  UR                  S5        g)z`Check 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	  sf    
 fkk,/0K
 a
0CGGGW
KK![C8J		Ir   c                 0   [         R                  " SS/SS//5      n[         R                  " SS/5      nU " SS9R                  X5        U " SS9nSn[        R                  " [
        US9   UR                  " X5        SSS5        g! , (       d  f       g= f)z`Check that an error is raised when min_sample_split=1.

non-regression test for issue gh-25481.
r   r=   rS   )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)ry   r   r   r   r   r   )r'   re   rf   r
   msgs        r   test_min_sample_split_1_errorr   	  s     	1a&1a&!"A
!QA 	3##A) !$D	0  
z	- 
.	-	-s   +B
Bc                    [         R                  " / SQ/5      R                  n[         R                  " / SQ5      n[        SSU S9nUR	                  X5        UR                  [         R                  //5      n[        U[         R                  " USS 5      /5        USS nUSS n[        SSU S9nUR	                  XV5        UR                  [         R                  //5      n[        U[         R                  " US	S 5      /5        g)
z=Check missing values goes to correct node during predictions.	r   r=   rQ   r@   rP   r  rM         	r   rB   r2  rB   r4  r4  rR   g?g@r   r=   r  rA   NrC   r>   )	ry   r   r   r   r   r   r   r   r  )r   re   rf   dtcr  X_equaly_equals          r   ;test_missing_values_best_splitter_on_equal_nodes_no_missingr)  	  s     	01244A
>?A
R1	
RCGGAM [[266($FFRWWQrsV_-. fGfG
R1	
RCGGG [[266($FFRWWWRS\234r   c                 p   [         R                  " / SQ/5      R                  n[         R                  " / SQ5      n[        USU S9nUR	                  X#5        UR
                  R                  S   nUR
                  R                  S   nUR
                  R                  U   nUR
                  R                  U   nXx:  n	UR
                  R                  U   S   n
UR
                  R                  U   S   nUR                  [         R                  //5      nU	(       a  [        X5        g[        X5        g)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)ry   r   r   r   r   r   rx   rw   rS  r   r   r   r   )r   r}  re   rf   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_missingr1  	  s     	01244A
>?A
$!y
QCGGAM ((+J))**1-K 9944Z@LII55kBM,I ))//*-a0K99??;/2L [[266($F,-r   r  r5   c                    Sn[         R                  " [         R                  /S-  / SQ-   /5      R                  n[         R                  " U/S-  S/S-  -   S/S-  -   5      n[	        SSU S9nUR                  X#5        [         R                  " [         R                  SS	//5      R                  nUR                  U5      n[        XaSS/5        g
)zITest when missing values are uniquely present in a class among 3 classes.r   r<   )r   r=   rQ   r@   rP   r  rM   r#  r=   rQ   r   r  r@   r#  Nry   r   r   r   r   r   r   r,   )r   missing_values_classre   rf   r&  r  
y_nan_preds          r   /test_missing_values_best_splitter_three_classesr6  	  s     
266(Q,!;;<=??A
&'!+qcAg5a?@A
 bA
SCGGAMXX2'(**FV$Jz!Q#?@r   c                    [         R                  " [         R                  /S-  / SQ-   /5      R                  n[         R                  " S/S-  S/S-  -   5      n[	        SSU S9nUR                  X5        [         R                  " [         R                  S	[         R                  //5      R                  nUR                  U5      n[        U/ S
Q5        g)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=   rQ   r@   r<   r?   r   r=   rN   r   rQ   r  r?   )r   r=   r   Nr3  r   re   rf   r&  r  r  s         r   )test_missing_values_best_splitter_to_leftr:  	  s     	266(Q,!334577A
!qA37"#A
 bA
SCGGAMXX266*+,..F[[ Fvy)r   c                    [         R                  " [         R                  /S-  / SQ-   /5      R                  n[         R                  " S/S-  S/S-  -   S/S-  -   5      n[	        SSU S9nUR                  X5        [         R                  " [         R                  SS	//5      R                  nUR                  U5      n[        U/ S
Q5        g)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<   r8  r=   r   rQ   r   r  rT   g333333@r  Nr3  r9  s         r   *test_missing_values_best_splitter_to_rightr<  	  s    
 	266(Q,!334577A
!qA37"aS1W,-A
 bA
SCGGAMXXS)*+--F[[ Fvy)r   c                    [         R                  " SSSS[         R                  SSSS[         R                  /
/5      R                  n[         R                  " S	/S-  S/S-  -   5      n[	        S
SU S9nUR                  X5        [         R                  " [         R                  SS//5      R                  nUR                  U5      n[        U/ SQ5        g)zNCheck behavior of missing value when there is one missing value in each class.r=   rQ   r@   r?   rH   r_   r[   <   r   r   r  gffffff@gA@r  Nr3  r9  s         r   >test_missing_values_best_splitter_missing_both_classes_has_nanr?  
  s     	1aArvvr2r2rvv>?@BBA
!qA37"#A
 bA
SCGGAMXXT*+,..F[[ F vy)r   r
   r	  c                 t   [         R                  " SSSS[         R                  SSSS[         R                  /
/5      R                  n[         R                  " S	/S-  S/S-  -   5      nU b  U " U5      n[        R
                  " [        SS9   UR                  " X#5        S
S
S
5        g
! , (       d  f       g
= f)z4Check unsupported configurations for missing values.r=   rQ   r@   r?   rH   r_   r[   r>  r   NzInput X contains NaNr
  )ry   r   r   r   r   r   r   r   )r4  r
   re   rf   s       r   test_missing_value_errorsrA  
  s     	1aArvvr2r2rvv>?@BBA
!qA37"#A#Q	z)?	@ 
A	@	@s   B))
B7c                 D   [         R                  R                  5       [         R                  p![        R
                  USSS2S4'   [        R
                  USSS2S4'   U " SSS9nUR                  X5        UR                  U5      nUS	:  R                  5       (       d   eg)
z5Smoke test for poisson regression and missing values.Nr?   r   rN   rC   r:   r   r   rX   )	rh   r   r  r   ry   r   r   r   r   )r'   re   rf   r   r  s        r   test_missing_values_poissonrC  -
  s     ==q Acc1fIAcc2gJ

4CGGAM[[^FcM    r   c                  B    [         R                  " U 0 UD6u  p#US:  nX#4$ )N   )r	   make_friedman1)argsr   re   rf   s       r   make_friedman1_classificationrH  =
  s)    ""D3F3DA	BA4Kr   zmake_data, Tree, tolerancegQ?gQ?gQ?sample_weight_trainr   c                 N   Su  pVU " UUSUS9u  pxUR                  5       n	[        R                  R                  U5      n
[        R                  XR                  SS/UR                  SS/S9'   [        XUS	9u  ppUS
:X  a$  [        R                  " UR                  S   5      nOSnSnU" UUS9nUR                  XUS9  UR                  X5      n[        [        5       U" UUS95      nUR                  X5        UR                  X5      nUU-   U:  d   SU< SU SU 35       eg)zFCheck that trees can deal with missing values have decent performance.)r   rH   rS   )r]   r^   noiser\   FTrZ   r   ra   r  r   r   r   NrH   r   r   zscore_native_tree=z + z! should be strictly greater than )r  ry   r  rJ  r   choicer   r   r   r   r   r   r   )	make_datar'   rI  r   	tolerancer]   r^   re   rf   	X_missingr0  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_resiliencerW  C
  sT   ( &I'	DA I
))

 2
3CGIvvIjj%QWWc
jCD7G#584OW f$ 5 5a 89 I9KLKOOOMOJ#)).A%	@RS /3/55nMy(+BB 
c) -#$	&Br   zTree, expected_scoreg333333?g(\?c                 &   [         R                  R                  S5      nSnUR                  US4S9n[         R                  " [         R
                  " US-  5      [         R                  " US-  5      /5      nUR                  SS/USS	/S
9nUR                  5       R                  [        5      nX   ) X'   UR                  US9n	[         R                  X'   XSS2S4'   U " US9n
[        XUSS9R                  5       nX:  d   SU SU 35       eg)z@Check the tree learns when only the missing value is predictive.r   r  r_   r`   rQ   FTgffffff?rU   rL  Nr?   r   )cvzExpected CV score: z	 but got )ry   r  rJ  standard_normalr  rq   r   rM  r  r.  boolr   r   r  )r'   expected_scorer   r0  r]   re   rf   X_random_masky_maskX_predictiver
   tree_cv_scores               r    test_missing_value_is_predictivera  
  s    ))


"CI)R1A
a0"'')q.2IJKA JJt}9tJMMVVX__T"F#22F&&I&6L66LadG/0D $DQ15::<M* 
n-Y}oF*r   zmake_data, Treec                    [         R                  R                  S5      nSu  p4U " X4US9u  pV[         R                  XRR	                  SS/UR
                  SS/S9'   [         R                  " UR
                  S   5      nS	US
S
S2'   U" SS9nUR                  XVUS9  U" SS9n	U	R                  USS
S2S
S
24   USS
S2   5        [        U	R                  U5      UR                  U5      5        g
)z=Check sample weight is correctly handled with missing values.r   )r  rH   r  FTrZ   r   rL  rX   NrQ   r   r   r=   )
ry   r  rJ  r   rM  r   r   r   r   r   )
rN  r'   r0  r]   r^   re   rf   r   tree_with_swtree_samples_removeds
             r   test_sample_weight_non_uniformre  
  s     ))


"C$IycRDA @BvvAjj%QWWc
j;< GGAGGAJ'MM#A#Q'LQ7Q/Qqt!tQwZ14a41(003\5I5I!5LMr   c                  >   [        SS9R                  [        R                  [        R                  5      n [        SS9R                  [        R                  [        R                  5      n[
        R                  " U 5      n[
        R                  " U5      nX#:X  d   eg r,  )r   r   rg   r   r   rm  rn  )tree1tree2pickle1pickle2s       r   test_deterministic_picklerk  
  sj     #266tyy$++NE"266tyy$++NEll5!Gll5!Gr   re   r?   rN   c                    UR                  SS5      n[        R                  " S5      nU " X#S9R                  X5      n[	        U5      R                  UR                  SS5      U5      nUR
                  R                  n[        US:  5      (       d   UR                  5       5       eU [        L a:  [        UR
                  R                  SS UR
                  R                  SS 5        [        R                  " UR
                  R                  S:H  UR
                  R                  S:H  -  5      n[        UR
                  R                  U   S5        g)	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
rC   r=   rN   r   r   NrQ   rX   )r  ry   r   r   r   r   r   r   r   r   r   flatnonzerorx   r}   )	r'   re   r   r   rf   r
   tree_refr   
leaves_idxs	            r   'test_regression_tree_missing_values_toyrp  
  s   6 	
		"aA
		!A)EII!ODT{qyyQ/3Hzz""Hx1}-x||~- $$

++BQ/1H1H!1LM 		!	!R	'DJJ,E,E,JKJ DJJ''
3S9r   c                    [         R                  R                  U 5      nSn[         R                  " U[         R                  S9R                  SS5      n[         R                  USS 2S S 24'   UR                  U5        [         R                  " U5      n[        U SS9R                  X45      nUR                  R                  n[        US:  5      (       d   U5       eg )	NrM  r  rC   r=   ir?   r  r   )ry   r  rJ  r   r  r  r   r   r   r   r   r   r   )r   r0  r]   re   rf   r
   r   s          r   -test_regression_extra_tree_missing_values_toyrr  
  s    
))

 2
3CI
		)2::.66r1=AAcdAgJKKN
		)A+=KOOPQUDzz""Hx1}'x'r   c                     [         R                  " SS9u  p[        R                  R	                  S5      nU R                  5       nUR                  [        R                  " S[        R                  S9U SS2S/4   S-  S	9R                  [        5      n[        R                  X4'   [        X1S
S9u  pVpv[        R                  " / SQ[        R                  S9n[        SSSS9n	U	R                  " XX   Xx   5        [!        U	R"                  R$                  S:  5      (       d   e[        R&                  " U	R"                  R(                  S:H  U	R"                  R*                  S:H  -  5      n
[-        U	R"                  R$                  U
   S5        g)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  NrQ   rP   )nr     r   )prQ   Q   '   a   [   &   .      e   rv  Y   R   rM  r   E      rw     I   J   3   /   k      K   n   r_   r$  h   9      r$  r  O   #   M   Z   r  r|  rv  ^   rz     rP   ]   r  r  r  r#  rv  r  m   r     rH   r  r  r  \   4   r_   r  rP   rP      r  r  r#  r#  r   r  r   r[   r}  N   r#  r  i   r  r   r  r#  f   r  rv  r}  r=   r  rM       r  r  j   r  r>  8   r  r  >   U   rw  rx  P   r  ?   rN   r  T   r@   r@   L   r  r  r@   r  iHnr   r   rC   r=   rX   )r	   	load_irisry   r  rJ  r  r  r   r  r.  r[  r   r   r   r   r   r   r   r   rm  rx   r}   r   )re   rf   r0  rP  maskr  rA  r   r   r
   ro  s              r   +test_classification_tree_missing_values_toyr    sJ    .DA
))


#CI<<
''bhh
/1QV9q=  fTl 	 ffIO-iLG hh  XXG "&zD 	HHWw/0tzz""a'((((		!	!R	'DJJ,E,E,JKJ DJJ''
3S9r   c                     [        SSS9n U R                  " [        R                  [        R                  5        [
        R                  " U R                  5      n[        U R                  XR                  5      n[
        R                  " U R                  R                  [
        R                  S9nSUS'   [        X R                  U5        U R                  R                  S:X  d   eUR                  S:X  d   e[         R"                  " [$        5         ['        U R                  R(                  UR(                  5        SSS5        ['        U R                  R(                  S   UR(                  S   5        [        U R                  XR                  5      n[
        R                  " U R                  R                  [
        R                  S9nSUSS& [        X R                  U5        U R                  R                  S:X  d   eUR                  S:X  d   UR                  5       e['        U R                  R(                  UR(                  5        g! , (       d  f       GN= f)zHTest pruning a tree with the Python caller of the Cythonized prune tree.r   r=   r  r  r@   N)r   r   rg   r   r   ry   
atleast_1dr  r  n_features_in_rF  rq   r   ru   uint8r#   r   r   AssertionErrorr,   r   r
   rk  pruned_treeleave_in_subtrees       r   test_build_pruned_tree_pyr  6  s   !qA>DHHTYY$doo.IT00)__MK xx

 5 5RXXFQ+zz3CD::  A%%%!!Q&&&	~	&4::++[->->? 
'tzz''*K,=,=a,@A T00)__MKxx

 5 5RXXFQR +zz3CD::  A%%%!!Q&>(>(>>&tzz''):):; 
'	&s   +I
I c                      [        SSS9n U R                  " [        R                  [        R                  5        [
        R                  " U R                  5      n[        U R                  XR                  5      n[
        R                  " U R                  R                  [
        R                  S9nSUS'   [        R                   " ["        SS9   [%        X R                  U5        SSS5        g! , (       d  f       g= f)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   rg   r   r   ry   r  r  r  r  rF  rq   r   ru   r  r   r   r   r#   r  s       r   $test_build_pruned_tree_infinite_loopr  U  s     "qA>DHHTYY$doo.IT00)__MK xx

 5 5RXXFQ	H
 	k::7GH
 
 
s   C//
C=c                  N   [         R                  R                  S5      n U R                  SSSS9R	                  [         R
                  5      n[         R                  " U/S-  5      n[         R                  " S[         R                  S9n[        X#S5        / S	Qn[        X45        g
)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  rX         $@rH   )locscalera   r?   r  r  )2r   (   r[   r_   rH      rx     1   r  -   r$  r  r?      rM   r}  )   r=         r#  rQ   r   r  r  rv  r  r@   !   rN   $   r|  r  r  r<   rE  r  "   ,   r  r  r   %   r  rP   r{  0   r     N)ry   r  default_rngnormalr.  r/  r  r   r<  r   r,   )r0  somefeature_valuesr  expected_sampless        r   test_sort_log2_buildr  g  s     ))


#C::#T:3::2::FD^^TFQJ/Nii"''*G^b) w1r   c                   ^ S mSU4S jjn[         R                  R                  U 5      nS H  nUR                  US4S9nUR                  U5      nUSUR                  SS5      -  -  n[         R                  " U5      nU" XEU5        U" U[         R
                  " U5      U5        U" XER                  5       S-   U5        U" XEUS	S
9  UR                  U5      nU" XEU5        U" XEUS	S
9  M     g)aw  
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           
         U R                  5       R                  5       n [        SU R                  S-   5       Vs/ s H  n[	        U S U US U SSS9PM     nn[        [        SU R                  S-   5      U5       VVs/ s H5  u  p$[        R                  " U S U U-
  5      US U -  R                  5       PM7     nnn[        R                  " U5      [        R                  " U5      4$ s  snf s  snnf )Nr=   r  Taverage)
r   r  rR  ra   r3   zipry   r   r~   r   )rf   wr  mediansmerrorss         r   compute_prefix_abs_errors_naiveUtest_absolute_errors_precomputation_function.<locals>.compute_prefix_abs_errors_naive  s    GGINN 1affqj)
) !2A"1r4@) 	 
 E!QVVaZ0':
: VVAbqEAI2A&++-: 	 
 xx'!222

s   C)><C.c                   > U R                   S   nU(       a  US-
  S4OSU4n[        XU/UQUP76 u  pgX   nX   n	U(       a  US S S2   nU	S S S2   n	T" X5      u  pU(       a  U
S S S2   n
US S S2   n[        XjSS9  [        X{SS9  g )Nr   r=   rC   gdy=)atol)r   r   r   )rf   r  r   reverseru  rG  
abs_errorsr  y_sortedw_sortedabs_errors_medians_r  s               r   assert_same_resultsItest_absolute_errors_precomputation_function.<locals>.assert_same_results  s    GGAJ%Ar{Aq6<Q7UTUSTU
::"~H"~H ? S%dd+K"~H
e<6r   )r@   r?   rH   r_   r  rM  r=   r`   r  rA   r?   T)r  N)F)ry   r  r  r  r   r   roundr  )r   r  r0  ru  rf   r  r   r  s          @r   ,test_absolute_errors_precomputation_functionr  }  s    
37  ))

 2
3C$KKaVK$JJqM	TS[[Q'''))A,A'*Arwwqz73Awwy1}g6A'48//!$A'*A'48 %r   c                    [         R                  R                  U 5      n[        S5      nUR	                  US9nUR                  SSUS9UR                  SSUS9-  n[        SSS9R                  [         R                  " UR                  S   S4S9X4S	9R                  R                  R                  5       S   n[        X4S
SS9n[        XV5        g)zx
Test that the weighted-median computed under-the-hood when
building a tree with criterion="absolute_error" is correct.
g     j@r`   r   r@   r=   r8   )r   r   r  r   r  Tr  N)ry   r  r  r  	lognormalintegersr  r   r   r   r   r   r   r   r3   r   )r   r0  ru  r   r,  tree_leaf_weighted_medianweighted_medians          r   7test_absolute_error_accurately_predicts_weighted_medianr    s    
 ))

 2
3CCA==a= Dll1aal(3;;q!!;+DDG 	(8AF	RWWDJJqM1-.	L	uuUUWQ	  
 +4"dKO-?r   c                  v   [         R                  " / SQ/ SQ/5      R                  SS5      R                  [        5      n / SQn[         R
                  X S:H  '   [        S5       HR  n[        SUS9R                  X5      n[        UR                  R                  [         R                  " / SQ5      5        MT     g )	Nr  )r=   rQ   r=   rQ   r=   rQ   r=   rQ   r   r=   )r   r   r   r   r=   r=   r=   r=   r_   r   )rb   rX   rX   )ry   r   swapaxesr.  floatr   rR  r   r   r,   r   r   r   )re   rf   r  r
   s       r   "test_splitting_with_missing_valuesr    s     			+-EFG	!Q	 
 	!AA1fI 2Y$qqAEEaK4::..9I0JK r   c                  @   SSS[         R                  [         R                  /n / SQn[         R                  " U 5      R                  SS5      n [	        5       R                  X5      n[        UR                  " U 5      U5        UR                  R                  S:X  d   eg )Nr   r  rC   r=   r@   )
ry   r   r   r  r   r   r,   r   r   ru   )re   rf   r
   s      r   $test_missing_values_and_constant_toyr    sz     
Aq"&&"&&!AA
B"A!#''-D t||A*::  A%%%r   r  )__doc__r  r  r  rm  r  r  	itertoolsr   r   r   r  numpyry   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.statsr3   sklearn.utils.validationr4   r   REG_CRITERIONSr   r   r   r;   __annotations__updateSPARSE_TREESr   r  r  y_small_regre   rf   r   r   r  rg   r  rJ  r0  r  r   ra   permr   load_diabetesrh   load_digitsri   r\   make_multilabel_classificationr-  r.  r  X_sparse_posr  y_randomr  X_sparse_mixrq   r-  r   r   r   markparametrizer  r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r)  r9  r>  rC  rF  rI  rK  rg  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  sortedrL  intersectionr  r  r  r  r  r  r  r  r  r  r  r"  r*  r/  r6  rH  rT  r   r`  rb  rf  r\  re  rz  r|  rR  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r   r)  r1  r6  r:  r<  r?  rA  rC  rH  rF  rW  ra  r  r   re  rk  r   rp  rr  r  r  r  r  r  r  r  r  )r
   s   0r   <module>r     s     	  	  . .    , ) ) ) ( - (  F * ;   C .   2 / (   5 7%O 5.	 3,	
 &	4  	    	    ((56<94:@>>@74545?@A84544/8 P6 	"XBx"bAq6Aq6Aq6:"X1v1v iiA
t{{''(IIdO	kk$ !!#
x++,d#//$'				
v}}))*kk$d#!!$%DDbR l
 ###1$'\S  !151$RTJRRT ))$++.mm(//:KKfmm4W-[1$<8$84%H5$8488G$84$N	X	X !1!1!34n5, 6 5,*F*
$ y'89n5 6 : !1!1!34	,-	./	+,	)*	
< 5
<
4W 2L>-K<!7H?+DH>FB8
v +1 ,1 ..9W : /W
 &*:
z +G ,G ..9 : /EP0f 	!!#^	4	!!#^	4@%@%F=(	E*8Z1h30 +,N ,,N^ +	 ,	+$K$( Y%5%5%78+ 9+(-?"!*&R l3	6 46
 fS->-K-KI-V&WXZ$=>. ? Y. l3$WX.90: : Y 40:f <E<493D$<E~	VW
,D,$)2C,DnU $WX.9: : Y:" l3!3~~#FHP 4HPV  +, ,,
 ++dVn-DE$ F ,$$ +G ,G ..9G : /GB& +, ,,: +.90 : ,0J;Z+8 +dVn-DE  F $ vc(--/*k:-FFG &<>Q%RSA TA HMMO4&;=O%PQA R 5A	.:%P +fh%78+dVn-D~-UV W 9 ,4 &RS!1!1!34	> 5 T	> q*& +&B'0T "8:M!NOq!f-G . PG,(2(4?$?"I-,-6@$
B1Uh o,,.0@0G0G0IJ//& !1!1!34 5* &GH5 I52 q*&GH. I +.B y&&9:A ;A y&&9:* ;* y&&9:* ;*  y&&9:* ;* +dVn-DE
(89%56
 F
 !1!1!34! 5!   
	 	 "7;		 	 "4d;	&(>E	&(;TB .v?' @ 'Z /Y5E5E5G$PT1VW X: 		!	!#89		%	%'=>NN,
 "79K!LM 	"&&!RVVQ1-.
"&&"&&!Q1-.
!Q1bffbff-.
!Q2661bff-.
 &GH!: I
 N!:H(,:^<>I$2,49n@*L(&M0 FDs   	AB2AB2*	AB77AB7