
    -i"R                     $   S r SSKJr  SSKJrJr  SSKJr  SSKr	SSK
r
SSK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Jr  SS/SS/SS/SS/SS/SS//r/ SQrSS/SS/SS/SS/SS/SS//r/ SQr/ SQrS r\
R>                  RA                  S\!\	RD                  /5      S 5       r#S r$S r%S r&S r'S r(\
R>                  RA                  S\!\	RD                  /5      S 5       r)S r*\
R>                  RA                  S/ SQ5      S 5       r+S  r,g)!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                     [        SSSSS9n U R                  [        [        5        [	        U S S9nSnX:X  d   e[	        U SS/S S	9nS
nX:X  d   e[	        U SS/S S	9nSnX:X  d   e[	        U SS/S S9nSnX:X  d   e[	        U SS/S S9nSnX:X  d   e[	        U SSSSSS SS9nSnX:X  d   e[	        U SSS S9nSnX:X  d   e[	        U SSS SS9nSnX:X  d   e[        SSSSS9n U R                  [        [
        [        S9n [	        U SSS S 9nS!nX:X  d   e[        SSS"SS9n U R                  [        [        5        [	        U SSS SSSS#9nS$nX:X  d   e[        SS%9n U R                  [        [        5        [	        U SS S&9nS'ng )(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      Q/var/www/html/venv/lib/python3.13/site-packages/sklearn/tree/tests/test_export.pytest_graphviz_toyr@       sy   
 qFC GGAqM  d3I	  !!!  J
3dI	  !!!  L,7$I	   !!!  %NI	 " !!!  '61BTRI	 " !!!  	I	 $ !!!  qdTRI		  !!!  qtI
	  !!! !qFC ''!Rq'
)CD54PI	 4 !!!  qORSC GGAqMI	 . !!! !1
-CGGAzD4@I	     constructorc                     [        SSSSS9nUR                  [        [        5        [	        X" SS/5      S S9nSnX#:X  d   e[	        X" S	S
/5      S S9nSnX#:X  d   eg )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 GGAqM  ;
J'?@4I	  !!!  eT]3dI	 " !!!rA   c                  :   [        SSS9n [        5       n[        R                  " [        5         [        X5        S S S 5        U R                  [        [        5        Sn[        R                  " [        US9   [        U S S/S9  S S S 5        Sn[        R                  " [        US9   [        U S / S	QS9  S S S 5        S
n[        R                  " [        US9   [        U R                  [        [        5      R                  5        S S S 5        [        5       n[        R                  " [        5         [        X/ S9  S S S 5        g ! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       Nz= f! , (       d  f       g = f)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
BC *C	~	&! 
' GGAqM PG	z	1T#7 
2 PG	z	1TA 
2 -G	y	01++, 
1 *C	z	"b1 
#	"- 
'	& 
2	1 
2	1
 
1	0
 
#	"s;   E8E(E*.E;3F
E
E'*
E8;
F	
Fc                  h   [        SSS9n U R                  [        [        5        [	        5       n[        XS9  [        SSS9n U R                  [        [        5        U R                   H  n[        US   US9  M     [        SUR                  5       5       H  nSUR                  5       ;   a  M   e   g )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
ICGGAqMzHC+
$!!
DCGGAqM__		!x8 % 0(2C2C2EF000 GrA   c            
      L   [        S5      n [        S5      n[        U R                  S5      UR                  S5      4U R                  S5      UR                  SSS94[	        SS	S
S9[        S
S	S945       GH*  u  p#nUR                  X#5        S GH  n[        US USS9n[        SU5       H=  n[        [        SUR                  5       5      R                  5       5      US
-   ::  a  M=   e   [        U5      (       a  SnOSn[        X5       H=  n[        [        SUR                  5       5      R                  5       5      US
-   :X  a  M=   e   [        SU5       H=  n[        [        SUR                  5       5      R                  5       5      US
-   :X  a  M=   e   GM     GM-     g )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   !nG!nG			v	&(=(=i(HI			t	$gooago&FG!(qA #QQ?		
		c 	I&diDH $$7B6(GMMO<BBDEUVVVV C S!!,4 $G66(GMMO<BBDEUVVVV 7 $NH=6(GMMO<BBDEUVVVV >1  	rA   c                  L   [        SSS9n U R                  [        [        5        Sn[        R
                  " [        US9   [        U S/S9  S S S 5        Sn[        R
                  " [        US9   [        U S/S	9  S S S 5        g ! , (       d  f       N>= f! , (       d  f       g = f)
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     s    
 11
=CGGAqM<G	z	1Cu- 
2	/ 
 
z	1CcU+ 
2	1 
2	1 
2	1s    B/B
B
B#c                  
   [        SSS9n U R                  [        [        5        [	        S5      R                  5       n[        U 5      U:X  d   e[        U SS9U:X  d   e[        U SS9U:X  d   e[	        S5      R                  5       n[        U SS	9U:X  d   e[	        S
5      R                  5       n[        U SS9U:X  d   eSS/SS/SS/SS/SS/SS/SS//n/ SQn[        SSS9n U R                  X#5        [	        S5      R                  5       n[        U SS9U:X  d   eSS/SS/SS/SS/SS/SS//nSS/SS/SS/SS/SS/SS//n[        SSS9nUR                  XE5        [	        S5      R                  5       n[        USS9U:X  d   e[        USSS9U:X  d   eS/S/S/S/S/S//n[        SSS9nUR                  Xu5        [	        S5      R                  5       n[        USS/S9U:X  d   e[        USSS/S9U:X  d   eg )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     s   
 11
=CGGAqM	 fh  s...sa(O;;;sb)_<<<	 fh  s./AAA	 fh  sA&/9998b"XBx!Q!Q!Q"a
IC
"C
 11
=CGGC	 fh  sa(O;;;Hr2hR1a&1a&1a&ADHr2hR1a&1a&1a&AD
!!
<CGGD	 fh  sQ'?:::sQT:oMMMrdRD1#sQC0H
!!
<CGGH	 fh  sQwi@OSSSC!$wiP		rA   c                    [        SSS9nUR                  [        [        5        [	        S5      R                  5       n[        X" SS/5      S9U:X  d   e[	        S5      R                  5       n[        X" S	S
/5      S9U:X  d   eg )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GGAqM	 fh  s+sCj*ABoUUU	 fh  sUEN(CDWWWrA   c                    [        SSSSS9nUR                  [        [        5        SS/n[	        XS9n[        U5      S:X  d   eUS	   R                  5       S
:X  d   eUS   R                  5       S:X  d   eUS   R                  5       S:X  d   eUS   R                  5       S:X  d   eUS   R                  5       S:X  d   eg )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 GGAqM "=1Mc7Eu:??aJ	K	K 8"NNNN8(***8"NNNN8)+++rA   fontsize)Nrt      c                   ^ [        SSSSS9nUR                  [        [        5        SS/n[	        X#TS9n[        U5      S:X  d   eTb  [        U4S	 jU 5       5      (       d   eUS
   R                  5       S:X  d   eUS   R                  5       S:X  d   eUS   R                  5       S:X  d   eUS   R                  5       S:X  d   eUS   R                  5       S:X  d   eg )Nr   r   r   r   r   r   )r"   r   rb   c              3   H   >#    U  H  oR                  5       T:H  v   M     g 7fN)get_fontsize).0noder   s     r?   	<genexpr>&test_plot_tree_gini.<locals>.<genexpr>g  s     Eut$$&(2us   "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  s    !	C GGAqM "=1McJEu:??EuEEEEEaG	H	H 8"KKKK8(***8"KKKK8)+++rA   c                     [        5       n[        R                  " [        5         [	        U5        S S S 5        g ! , (       d  f       g = fr   )r   rM   rN   r
   r   )r   r<   s     r?   test_not_fitted_treer   r  s)    

!C	~	&# 
'	&	&s	   :
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      sI        $ & 7 -  	"XBx"bAq6Aq6Aq6:	1gAwQ!Q!Q!Q8
JZ rxx(892" :2"j2@1'WT,Vr rxx(89X :X6,, ^4, 5,6rA   