
    Ug,F                        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            
      6   t          dddd          } |                     t          t                     t	          | 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"] ;
}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   class_namesr   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/surfInsights/venv3-11/lib/python3.11/site-packages/sklearn/tree/tests/test_export.pytest_graphviz_toyr7       sM   
 qF  C GGAqMMM  d333I	  	!!!!  	 	 	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   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)r&   r   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"] ;
})r   r-   r.   r/   r   )r9   r3   r4   r5   s       r6   /test_graphviz_feature_class_names_array_supportr@      s     !qF  C GGAqMMM  ;;
J'?@@4  I	  	!!!!  eT]33d  I	 " 	!!!!!!r8   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)rD   bczis not an estimator instancer&   )r   r   pytestraisesr
   r   r-   r.   r/   
ValueError	TypeErrortree_
IndexError)r3   outmessages      r6   test_graphviz_errorsrQ     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   r-   r.   r/   r   r   r	   estimators_r   getvaluegroup)r3   dot_data	estimatorfindings       r6   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 1r8   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_   )sizerS   r   r   )r   r   r   r   r   )r`   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   r-   r   r   lenr   rW   r   )	rng_regrng_clfr.   r/   r3   rc   rX   rZ   patterns	            r6   test_precisionrk   >  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r8   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   rb   z,feature_names must contain 2 elements, got 1rB   rD   rE   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.rH   )r   r-   r.   r/   rI   rJ   rK   r   )r3   err_msgs     r6   test_export_text_errorsrn   h  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   rb   zh
    |--- feature_1 <= 0.00
    |   |--- class: -1
    |--- feature_1 >  0.00
    |   |--- class: 1
    r,   
   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   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]
    )decimals)rs   rq   zq
    |--- first <= 0.0
    |   |--- value: [-1.0, -1.0]
    |--- first >  0.0
    |   |--- value: [1.0, 1.0]
    first)rs   r=   )rs   rq   r=   )r   r-   r.   r/   r   lstripr   r   )r3   expected_reportX_ly_lX_moy_moregX_singles           r6   test_export_textr}   w  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	 	 	 	 	 	r8   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   rb   zX
    |--- b <= 0.00
    |   |--- class: -1
    |--- b >  0.00
    |   |--- class: 1
    rD   rF   rE   zk
    |--- feature_1 <= 0.00
    |   |--- class: cat
    |--- feature_1 >  0.00
    |   |--- class: dog
    catdogrH   )r   r-   r.   r/   r   ru   r   )r9   r3   rv   s      r6   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Wr8   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_widthrE   r^   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]r`     False)r   r-   r.   r/   r   rg   get_text)pyplotr3   r=   nodess       r6   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)++++++r8   fontsize)Nrp      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   r^   c              3   H   K   | ]}|                                 k    V  d S N)get_fontsize).0noder   s     r6   	<genexpr>z&test_plot_tree_gini.<locals>.<genexpr>  s4      EEt4$$&&(2EEEEEEr8   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]r`   r   )r   r-   r.   r/   r   rg   allr   )r   r   r3   r=   r   s    `   r6   test_plot_tree_ginir     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)++++++r8   c                     t                      }t          j        t                    5  t	          |           d d d            d S # 1 swxY w Y   d S r   )r   rI   rJ   r
   r   )r   r3   s     r6   test_not_fitted_treer     s    

!
!C	~	&	&  #                 s   AA	A	)-__doc__ior   rer   r   textwrapr   numpynprI   numpy.randomr   sklearn.baser   sklearn.ensembler	   sklearn.exceptionsr
   sklearn.treer   r   r   r   r   r.   r/   r0   r1   r2   r7   markparametrizelistarrayr@   rQ   r[   rk   rn   r}   r   r   r   r    r8   r6   <module>r      s                             $ $ $ $ $ $ & & & & & & 7 7 7 7 7 7 - - - - - -              	"XBx"bAq6Aq6Aq6:	1gAwQ!Q!Q!Q8
v v vr 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    r8   