
    0Ph"R                        d Z ddlmZ ddlmZmZ ddlmZ ddlZ	ddl
Z
ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZmZ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e
j                             de!e	j"        g          d             Z#d Z$d Z%d Z&d Z'd Z(e
j                             de!e	j"        g          d             Z)d Z*e
j                             dg d          d             Z+d  Z,dS )!zG
Testing for export functions of decision trees (sklearn.tree.export).
    )StringIO)finditersearch)dedentN)RandomState)is_classifier)GradientBoostingClassifier)NotFittedError)DecisionTreeClassifierDecisionTreeRegressorexport_graphvizexport_text	plot_tree      )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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     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"] ;
}z
feature"0"z
feature"1"a  digraph Tree {
node [shape=box, fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="feature\"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"] ;
}yesnoclass_namesr     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"] ;
}z"yes"z"no"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      ^/var/www/html/test/jupyter/venv/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	  	!!!!  L,7$  I	   	!!!!  %NNNI	 " 	!!!!  '61BTRRRI	 " 	!!!!  	 	 	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    constructorc                    t          dddd          }|                    t          t                     t	          | | ddg          d           }d}||k    sJ t	          | | d	d
g          d           }d}||k    sJ d S )Nr   r   r   r   r   r    r!   r#   r$   r%   r&   r(   )r   r6   r7   r8   r   )rB   r<   r=   r>   s       r?   /test_graphviz_feature_class_names_array_supportrD   -  s     !qF  C GGAqMMM  ;;
J'?@@4  I	  	!!!!  eT]33d  I	 " 	!!!!!!rA   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            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)rH   bczis not an estimator instancer'   )r   r   pytestraisesr
   r   r6   r7   r8   
ValueError	TypeErrortree_
IndexError)r<   outmessages      r?   test_graphviz_errorsrU   c  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 2 2 2sY   AAAB>>CC&DDD/3E..E25E2 G  GG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   r6   r7   r8   r   r   r	   estimators_r   getvaluegroup)r<   dot_data	estimatorfindings       r?   test_friedman_mse_in_graphvizr_     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 1rA   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   )     )rb   )rc   )sizerW   r   r   )r   r   r   r   r   )rd   r   T)r   	precisionr,   zvalue = \d+\.\d+z\.\d+zgini = \d+\.\d+zfriedman_mse = \d+\.\d+z<= \d+\.\d+)r   ziprandom_samplerandintr   r   r6   r   r   lenr   r[   r   )	rng_regrng_clfr7   r8   r<   rg   r\   r^   patterns	            r?   test_precisionro     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rA   c                     t          dd          } |                     t          t                     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g	           d d d            d S # 1 swxY w Y   d S )
Nr   r   rf   z,feature_names must contain 2 elements, got 1rF   rH   rI   zWhen `class_names` is an array, it should contain as many items as `decision_tree.classes_`. Got 1 while the tree was fitted with 2 classes.rL   )r   r6   r7   r8   rM   rN   rO   r   )r<   err_msgs     r?   test_export_text_errorsrr     sC   
 11
=
=
=CGGAqMMM<G	z	1	1	1 . .Cu----. . . . . . . . . . . . . . .	/ 
 
z	1	1	1 , ,CcU++++, , , , , , , , , , , , , , , , , ,s$   A..A25A2B66B:=B:c                  T   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	          |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   rf   zh
    |--- feature_1 <= 0.00
    |   |--- class: -1
    |--- feature_1 >  0.00
    |   |--- class: 1
    r5   
   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   )spacingr   r   )r   r   r   r   r   r   r   rd   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]
    )decimals)rw   ru   zq
    |--- first <= 0.0
    |   |--- value: [-1.0, -1.0]
    |--- first >  0.0
    |   |--- value: [1.0, 1.0]
    first)rw   r"   )rw   ru   r"   )r   r6   r7   r8   r   lstripr   r   )r<   expected_reportX_ly_lX_moy_moregX_singles           r?   test_export_textr     sb   
 11
=
=
=CGGAqMMM	  fhh  s....sa(((O;;;;sb)))_<<<<	  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	 	 	 	 	 	rA   c                 t   t          dd          }|                    t          t                     t	          d                                          }t          | | ddg                    |k    sJ t	          d                                          }t          | | d	d
g                    |k    sJ d S )Nr   r   rf   zX
    |--- b <= 0.00
    |   |--- class: -1
    |--- b >  0.00
    |   |--- class: 1
    rH   rJ   rI   zk
    |--- feature_1 <= 0.00
    |   |--- class: cat
    |--- feature_1 >  0.00
    |   |--- class: dog
    catdogrL   )r   r6   r7   r8   r   ry   r   )rB   r<   rz   s      r?   2test_export_text_feature_class_names_array_supportr   $  s     !11
=
=
=CGGAqMMM	  fhh  s++sCj*A*ABBBoUUUU	  fhh  sUEN(C(CDDDWWWWWWrA   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                                         dk    sJ |d                                         dk    sJ d S )Nr   r   entropyr   
first featsepal_widthrI   rb   r   z:first feat <= 0.0
entropy = 1.0
samples = 6
value = [3, 3]r   z(entropy = 0.0
samples = 3
value = [3, 0]True  z(entropy = 0.0
samples = 3
value = [0, 3]rd     False)r   r6   r7   r8   r   rk   get_text)pyplotr<   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(****8"NNNNN8)++++++rA   fontsize)Nrt      c                 B   t          dddd          }|                    t          t                     ddg}t	          ||          }t          |          dk    sJ t          fd	|D                       sJ |d
                                         dk    sJ |d                                         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   )r"   r   rb   c              3   H   K   | ]}|                                 k    V  d S N)get_fontsize).0noder   s     r?   	<genexpr>z&test_plot_tree_gini.<locals>.<genexpr>g  s4      EEt4$$&&(2EEEEEErA   r   z7first feat <= 0.0
gini = 0.5
samples = 6
value = [3, 3]r   z%gini = 0.0
samples = 3
value = [3, 0]r   z%gini = 0.0
samples = 3
value = [0, 3]rd   r   )r   r6   r7   r8   r   rk   allr   )r   r   r<   r"   r   s    `   r?   test_plot_tree_ginir   V  sV    !	  C GGAqMMM "=1McJJJEu::????EEEEuEEEEEEEEaG	H 	H 	H 	H 8"KKKKK8(****8"KKKKK8)++++++rA   c                     t                      }t          j        t                    5  t	          |           d d d            d S # 1 swxY w Y   d S r   )r   rM   rN   r
   r   )r   r<   s     r?   test_not_fitted_treer   r  s    

!
!C	~	&	&  #                 s   AA	A	)-__doc__ior   rer   r   textwrapr   numpynprM   numpy.randomr   sklearn.baser   sklearn.ensembler	   sklearn.exceptionsr
   sklearn.treer   r   r   r   r   r7   r8   r9   r:   r;   r@   markparametrizelistarrayrD   rU   r_   ro   rr   r   r   r   r   r    rA   r?   <module>r      s                             $ $ $ $ $ $ & & & & & & 7 7 7 7 7 7 - - - - - -              	"XBx"bAq6Aq6Aq6:	1gAwQ!Q!Q!Q8
J J JZ rx(8992" 2" :92"j2 2 2@1 1 1'W 'W 'WT, , ,V V Vr rx(899X X :9X6, , ,, ^^^44, , 54,6    rA   