
    _ndUB                     ,   d Z ddlmZmZ ddlmZ ddlmZ ddlZddl	m
Z
 ddlmZmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ ddgddgddgddgddgddggZg dZddgddgddgddgddgddggZg dZg dZd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$dS )zG
Testing for export functions of decision trees (sklearn.tree.export).
    )finditersearch)dedent)RandomStateN)is_classifier)DecisionTreeClassifierDecisionTreeRegressor)GradientBoostingClassifier)export_graphviz	plot_treeexport_text)StringIO)NotFittedError      )r   r   r   r   r   r      )r   r   r         ?r   r   )r   r   r   r   r   r   c            
         t          dddd          } |                     t          t                     t	          | d           }d}||k    sJ t	          | ddgd 	          }d
}||k    sJ t	          | ddgd           }d}||k    sJ t	          | dddddd d          }d}||k    sJ t	          | ddd           }d}||k    sJ t	          | ddd d          }d}||k    sJ t          dddd          } |                     t          t
          t                    } t	          | ddd           }d}||k    sJ t          dddd          } |                     t          t                     t	          | ddd ddd          }d}||k    sJ t          d          } |                     t          t                     t	          | dd            }d!}d S )"Nr   r   gini	max_depthmin_samples_split	criterionrandom_stateout_filea  digraph Tree {
node [shape=box, fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="x[0] <= 0.0\ngini = 0.5\nsamples = 6\nvalue = [3, 3]"] ;
1 [label="gini = 0.0\nsamples = 3\nvalue = [3, 0]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="gini = 0.0\nsamples = 3\nvalue = [0, 3]"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}feature0feature1)feature_namesr   a  digraph Tree {
node [shape=box, fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="feature0 <= 0.0\ngini = 0.5\nsamples = 6\nvalue = [3, 3]"] ;
1 [label="gini = 0.0\nsamples = 3\nvalue = [3, 0]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="gini = 0.0\nsamples = 3\nvalue = [0, 3]"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}yesno)class_namesr   a  digraph Tree {
node [shape=box, fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="x[0] <= 0.0\ngini = 0.5\nsamples = 6\nvalue = [3, 3]\nclass = yes"] ;
1 [label="gini = 0.0\nsamples = 3\nvalue = [3, 0]\nclass = yes"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="gini = 0.0\nsamples = 3\nvalue = [0, 3]\nclass = no"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}TFsans)filledimpurity
proportionspecial_charactersroundedr   fontnamea  digraph Tree {
node [shape=box, style="filled, rounded", color="black", fontname="sans"] ;
edge [fontname="sans"] ;
0 [label=<x<SUB>0</SUB> &le; 0.0<br/>samples = 100.0%<br/>value = [0.5, 0.5]>, fillcolor="#ffffff"] ;
1 [label=<samples = 50.0%<br/>value = [1.0, 0.0]>, fillcolor="#e58139"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label=<samples = 50.0%<br/>value = [0.0, 1.0]>, fillcolor="#399de5"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}r   )r   r$   r   zdigraph Tree {
node [shape=box, fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="x[0] <= 0.0\ngini = 0.5\nsamples = 6\nvalue = [3, 3]\nclass = y[0]"] ;
1 [label="(...)"] ;
0 -> 1 ;
2 [label="(...)"] ;
0 -> 2 ;
})r   r&   r   node_idsa;  digraph Tree {
node [shape=box, style="filled", color="black", fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="node #0\nx[0] <= 0.0\ngini = 0.5\nsamples = 6\nvalue = [3, 3]", fillcolor="#ffffff"] ;
1 [label="(...)", fillcolor="#C0C0C0"] ;
0 -> 1 ;
2 [label="(...)", fillcolor="#C0C0C0"] ;
0 -> 2 ;
})sample_weight)r&   r'   r   a  digraph Tree {
node [shape=box, style="filled", color="black", fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="x[0] <= 0.0\nsamples = 6\nvalue = [[3.0, 1.5, 0.0]\n[3.0, 1.0, 0.5]]", fillcolor="#ffffff"] ;
1 [label="samples = 3\nvalue = [[3, 0, 0]\n[3, 0, 0]]", fillcolor="#e58139"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="x[0] <= 1.5\nsamples = 3\nvalue = [[0.0, 1.5, 0.0]\n[0.0, 1.0, 0.5]]", fillcolor="#f1bd97"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
3 [label="samples = 2\nvalue = [[0, 1, 0]\n[0, 1, 0]]", fillcolor="#e58139"] ;
2 -> 3 ;
4 [label="samples = 1\nvalue = [[0.0, 0.5, 0.0]\n[0.0, 0.0, 0.5]]", fillcolor="#e58139"] ;
2 -> 4 ;
}squared_error)r&   leaves_parallelr   rotater*   r+   aT  digraph Tree {
node [shape=box, style="filled, rounded", color="black", fontname="sans"] ;
graph [ranksep=equally, splines=polyline] ;
edge [fontname="sans"] ;
rankdir=LR ;
0 [label="x[0] <= 0.0\nsquared_error = 1.0\nsamples = 6\nvalue = 0.0", fillcolor="#f2c09c"] ;
1 [label="squared_error = 0.0\nsamples = 3\nvalue = -1.0", fillcolor="#ffffff"] ;
0 -> 1 [labeldistance=2.5, labelangle=-45, headlabel="True"] ;
2 [label="squared_error = 0.0\nsamples = 3\nvalue = 1.0", fillcolor="#e58139"] ;
0 -> 2 [labeldistance=2.5, labelangle=45, headlabel="False"] ;
{rank=same ; 0} ;
{rank=same ; 1; 2} ;
}r   )r&   r   zdigraph Tree {
node [shape=box, style="filled", color="black", fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="gini = 0.0\nsamples = 6\nvalue = 6.0", fillcolor="#ffffff"] ;
})	r   fitXyr   y2wr	   
y_degraded)clf	contents1	contents2s      >lib/python3.11/site-packages/sklearn/tree/tests/test_export.pytest_graphviz_toyr<      s   
 qF  C GGAqMMM  d333I	  	!!!!  J
3d  I	  	!!!!  %NNNI	 " 	!!!!  	 	 	I	 $ 	!!!!  qdTRRRI		  	!!!!  qt  I
	  	!!!! !qF  C ''!Rq'
)
)CD54PPPI	 4 	!!!!  qORS  C GGAqMMM  I	 . 	!!!! !1
-
-
-CGGAzD4@@@I	 II    c                     t          dd          } t                      }t          j        t                    5  t          | |           d d d            n# 1 swxY w Y   |                     t          t                     d}t          j        t          |          5  t          | d dg           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          | d g d	           d d d            n# 1 swxY w Y   d
}t          j        t          |          5  t          |                     t          t                    j                   d d d            n# 1 swxY w Y   t                      }t          j        t                    5  t          | |g            d d d            n# 1 swxY w Y   t                      }t          j        t          d          5  t          | |d           d d d            n# 1 swxY w Y   t          j        t          d          5  t          | |d           d d d            d S # 1 swxY w Y   d S )Nr   r   )r   r   z?Length of feature_names, 1 does not match number of features, 2matchar!   z?Length of feature_names, 3 does not match number of features, 2)rA   bczis not an estimator instance)r$   zshould be greater or equalr   )	precisionzshould be an integer1)r   r   pytestraisesr   r   r2   r3   r4   
ValueError	TypeErrortree_
IndexError)r8   outmessages      r;   test_graphviz_errorsrO      s   
 1
B
B
BC **C	~	&	& " "S!!!" " " " " " " " " " " " " " " GGAqMMM PG	z	1	1	1 8 8T#77778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 PG	z	1	1	1 B BTAAAAB B B B B B B B B B B B B B B -G	y	0	0	0 - -1+,,,- - - - - - - - - - - - - - - **C	z	"	" 2 2Sb11112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 **C	z)E	F	F	F 0 0SB////0 0 0 0 0 0 0 0 0 0 0 0 0 0 0	z)?	@	@	@ 1 1SC00001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1s}   AAAB>>CC&DDD/3E..E25E2 F??GG3HHH8IIIc                     t          dd          } |                     t          t                     t	                      }t          | |           t          dd          } |                     t          t                     | j        D ]}t          |d         |           t          d|	                                          D ]}d|
                                v sJ d S )Nfriedman_mser   )r   r   r   r   )n_estimatorsr   z\[.*?samples.*?\])r	   r2   r3   r4   r   r   r
   estimators_r   getvaluegroup)r8   dot_data	estimatorfindings       r;   test_friedman_mse_in_graphvizrY   #  s    
.q
I
I
ICGGAqMMMzzHC(++++
$!!
D
D
DCGGAqMMM_ 9 9		!x888880(2C2C2E2EFF 1 1000001 1r=   c            
         t          d          } t          d          }t          |                     d          |                    d          f|                     d          |                    dd          ft	          dd	d
          t          d
d	          f          D ]b\  }}}|                    ||           dD ]A}t          |d |d          }t          d|          D ]L}t          t          d|                                                                                    |d
z   k    sJ Mt          |          rd}nd}t          ||          D ]L}t          t          d|                                                                                    |d
z   k    sJ Mt          d|          D ]L}t          t          d|                                                                                    |d
z   k    sJ MCdd S )Nr      )   r   )     )r\   )r]   )sizerQ   r   r   )r   r   r   r   r   )r^   r   T)r   rE   r(   zvalue = \d+\.\d+z\.\d+zgini = \d+\.\d+zfriedman_mse = \d+\.\d+z<= \d+\.\d+)r   ziprandom_samplerandintr	   r   r2   r   r   lenr   rU   r   )	rng_regrng_clfr3   r4   r8   rE   rV   rX   patterns	            r;   test_precisionrh   2  s;   !nnG!nnG			v	&	&(=(=i(H(HI			t	$	$gooago&F&FG!(qA   #QQ???		
	 	 %W %W	1c 	1 	W 	WI&diD  H $$7BB W W6(GMMOO<<BBDDEEUVVVVVVS!! 5,4 $GX66 W W6(GMMOO<<BBDDEEUVVVVVV#NH== W W6(GMMOO<<BBDDEEUVVVVVVW1	W%W %Wr=   c                     t          dd          } |                     t          t                     d}t	          j        t          |          5  t          | d           d d d            n# 1 swxY w Y   d}t	          j        t          |          5  t          | d	g
           d d d            n# 1 swxY w Y   d}t	          j        t          |          5  t          | d           d d d            n# 1 swxY w Y   d}t	          j        t          |          5  t          | d           d d d            d S # 1 swxY w Y   d S )Nr   r   r`   z max_depth bust be >= 0, given -1r?   r   r1   z,feature_names must contain 2 elements, got 1rA   rB   zdecimals must be >= 0, given -1decimalszspacing must be > 0, given 0spacing)r   r2   r3   r4   rG   rH   rI   r   )r8   err_msgs     r;   test_export_text_errorsro   ^  s>   
 11
=
=
=CGGAqMMM0G	z	1	1	1 ' 'C2&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '<G	z	1	1	1 . .Cu----. . . . . . . . . . . . . . ./G	z	1	1	1 & &C"%%%%& & & & & & & & & & & & & & &,G	z	1	1	1 $ $C####$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $sH   A--A14A1B44B8;B8C::C>C>"EEEc                     t          dd          } |                     t          t                     t	          d                                          }t          |           |k    sJ t          | d          |k    sJ t          | d          |k    sJ t	          d                                          }t          | dd	g
          |k    sJ t	          d                                          }t          | d          |k    sJ t	          d                                          }t          | d          |k    sJ ddgddgddgddgddgddgddgg}g d}t          dd          } |                     ||           t	          d                                          }t          | d          |k    sJ ddgddgddgddgddgddgg}ddgddgddgddgddgddgg}t          dd          }|                    ||           t	          d                                          }t          |d          |k    sJ t          |dd          |k    sJ dgdgdgdgdgdgg}t          dd          }|                    ||           t	          d                                          }t          |ddg          |k    sJ t          |dddg          |k    sJ d S )Nr   r   r`   zh
    |--- feature_1 <= 0.00
    |   |--- class: -1
    |--- feature_1 >  0.00
    |   |--- class: 1
    r1   
   zX
    |--- b <= 0.00
    |   |--- class: -1
    |--- b >  0.00
    |   |--- class: 1
    rA   rC   rB   z
    |--- feature_1 <= 0.00
    |   |--- weights: [3.00, 0.00] class: -1
    |--- feature_1 >  0.00
    |   |--- weights: [0.00, 3.00] class: 1
    T)show_weightsz\
    |- feature_1 <= 0.00
    | |- class: -1
    |- feature_1 >  0.00
    | |- class: 1
    r   rl   r   r   )r   r   r   r   r   r   r   r^   z{
    |--- feature_1 <= 0.00
    |   |--- class: -1
    |--- feature_1 >  0.00
    |   |--- truncated branch of depth 2
    zy
    |--- feature_1 <= 0.0
    |   |--- value: [-1.0, -1.0]
    |--- feature_1 >  0.0
    |   |--- value: [1.0, 1.0]
    rj   )rk   rr   zq
    |--- first <= 0.0
    |   |--- value: [-1.0, -1.0]
    |--- first >  0.0
    |   |--- value: [1.0, 1.0]
    first)rk   r!   )rk   rr   r!   )r   r2   r3   r4   r   lstripr   r	   )r8   expected_reportX_ly_lX_moy_moregX_singles           r;   test_export_textr|   p  s   
 11
=
=
=CGGAqMMM	  fhh  s....sa(((O;;;;sb)))_<<<<	  fhh  s3*555HHHH	  fhh  s.../AAAA	  fhh  sA&&&/99998b"XBx!Q!Q!Q"a
IC
"
"
"C
 11
=
=
=CGGC	  fhh  sa(((O;;;;Hr2hR1a&1a&1a&ADHr2hR1a&1a&1a&AD
!!
<
<
<CGGD$	  fhh  sQ'''?::::sQT:::oMMMMrdRD1#sQC0H
!!
<
<
<CGGHd	  fhh  sQwi@@@OSSSSC!$wiPPP	 	 	 	 	 	r=   c                    t          dddd          }|                    t          t                     ddg}t	          ||          }t          |          dk    sJ |d                                         d	k    sJ |d
                                         dk    sJ |d                                         dk    sJ d S )Nr   r   entropyr   
first featsepal_widthrB   r   z:first feat <= 0.0
entropy = 1.0
samples = 6
value = [3, 3]r   z(entropy = 0.0
samples = 3
value = [3, 0]z(entropy = 0.0
samples = 3
value = [0, 3]r   r2   r3   r4   r   rd   get_textpyplotr8   r!   nodess       r;   test_plot_tree_entropyr     s     !qIA  C GGAqMMM "=1Mc777Eu::????aJ	K 	K 	K 	K 8"NNNNN8"NNNNNNNr=   c                    t          dddd          }|                    t          t                     ddg}t	          ||          }t          |          dk    sJ |d                                         d	k    sJ |d
                                         dk    sJ |d                                         dk    sJ d S )Nr   r   r   r   r   r   rB   r   z7first feat <= 0.0
gini = 0.5
samples = 6
value = [3, 3]r   z%gini = 0.0
samples = 3
value = [3, 0]z%gini = 0.0
samples = 3
value = [0, 3]r   r   s       r;   test_plot_tree_ginir     s     !qF  C GGAqMMM "=1Mc777Eu::????aG	H 	H 	H 	H 8"KKKKK8"KKKKKKKr=   c                     t                      }t          j        t                    5  t	          |           d d d            d S # 1 swxY w Y   d S )N)r	   rG   rH   r   r   )r   r8   s     r;   test_not_fitted_treer     s      
!
!C	~	&	&  #                 s   AA	A	)%__doc__rer   r   textwrapr   numpy.randomr   rG   sklearn.baser   sklearn.treer   r	   sklearn.ensembler
   r   r   r   ior   sklearn.exceptionsr   r3   r4   r5   r6   r7   r<   rO   rY   rh   ro   r|   r   r   r    r=   r;   <module>r      s                   $ $ $ $ $ $  & & & & & & F F F F F F F F 7 7 7 7 7 7 @ @ @ @ @ @ @ @ @ @       - - - - - - 	"XBx"bAq6Aq6Aq6:	1gAwQ!Q!Q!Q8
` ` `F$1 $1 $1N1 1 1)W )W )WX$ $ $$` ` `FO O O(L L L(    r=   