
    {Kg,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>                  jA                  de!e	jD                  g      d        Z#d Z$d Z%d Z&d Z'd Z(e
j>                  jA                  de!e	jD                  g      d        Z)d Z*e
j>                  jA                  dg d      d        Z+d  Z,y)!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      } | j                  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      } | j                  t        t
        t              } t	        | ddd       }d}||k(  sJ t        dddd      } | j                  t        t               t	        | ddd ddd	      }d}||k(  sJ t        d      } | j                  t        t               t	        | dd       }d}y )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      b/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/tree/tests/test_export.pytest_graphviz_toyr7       s   
 qFC GGAqM  d3I	  	!!!  	I	 $ 	!!!  qdTRI		  	!!!  qtI
	  	!!! !qFC ''!Rq'
)CD54PI	 4 	!!!  qORSC GGAqMI	 . 	!!! !1
-CGGAzD4@I	     constructorc                     t        dddd      }|j                  t        t               t	        | | ddg      d       }d}||k(  sJ t	        | | d	d
g      d       }d}||k(  sJ y )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 GGAqM  ;
J'?@4I	  	!!!  eT]3dI	 " 	!!!r8   c                  ,   t        dd      } t               }t        j                  t              5  t        | |       d d d        | j                  t        t               d}t        j                  t        |      5  t        | d dg       d d d        d}t        j                  t        |      5  t        | d g d	       d d d        d
}t        j                  t        |      5  t        | j                  t        t              j                         d d d        t               }t        j                  t              5  t        | |g        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ixY w# 1 sw Y   y xY w)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
BC *C	~	&S! 
' GGAqM PG	z	1T#7 
2 PG	z	1TA 
2 -G	y	01++, 
1 *C	z	"Sb1 
#	"- 
'	& 
2	1 
2	1
 
1	0
 
#	"s;   E=E&2E2(.E>F
E#&E/2E;>F
Fc                  v   t        dd      } | j                  t        t               t	               }t        | |       t        dd      } | j                  t        t               | j                  D ]  }t        |d   |        t        d|j                               D ]  }d|j                         v rJ  y )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
ICGGAqMzHC(+
$!!
DCGGAqM__		!x8 % 0(2C2C2EF000 Gr8   c            
      F   t        d      } t        d      }t        | j                  d      |j                  d      f| j                  d      |j                  dd      ft	        dd	d
      t        d
d	      f      D ]  \  }}}|j                  ||       dD ]   }t        |d |d      }t        d|      D ];  }t        t        d|j                               j                               |d
z   k  r;J  t        |      rd}nd}t        ||      D ];  }t        t        d|j                               j                               |d
z   k(  r;J  t        d|      D ];  }t        t        d|j                               j                               |d
z   k(  r;J   " y )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   !nG!nG			v	&(=(=i(HI			t	$gooago&FG!(qA #QQ?		
		1c 	1I&diDH $$7B6(GMMO<BBDEUVVVV C S!,4 $GX66(GMMO<BBDEUVVVV 7 $NH=6(GMMO<BBDEUVVVV >1  	r8   c                  R   t        dd      } | j                  t        t               d}t	        j
                  t        |      5  t        | dg       d d d        d}t	        j
                  t        |      5  t        | dg	       d d d        y # 1 sw Y   >xY w# 1 sw Y   y xY w)
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  s    
 11
=CGGAqM<G	z	1Cu- 
2	/ 
 
z	1CcU+ 
2	1 
2	1 
2	1s   B9BBB&c                  J   t        dd      } | j                  t        t               t	        d      j                         }t        |       |k(  sJ t        | d      |k(  sJ t        | d      |k(  sJ t	        d      j                         }t        | d	      |k(  sJ t	        d
      j                         }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      } | j                  ||       t	        d      j                         }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      }|j                  ||       t	        d      j                         }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      }|j                  ||       t	        d      j                         }t        |ddg      |k(  sJ t        |dddg      |k(  sJ y )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  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GGHd	 fh  sQwi@OSSSC!$wiP		r8   c                    t        dd      }|j                  t        t               t	        d      j                         }t        | | ddg            |k(  sJ t	        d      j                         }t        | | d	d
g            |k(  sJ y )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GGAqM	 fh  s+sCj*ABoUUU	 fh  sUEN(CDWWWr8   c                    t        dddd      }|j                  t        t               ddg}t	        ||      }t        |      dk(  sJ |d	   j                         d
k(  sJ |d   j                         dk(  sJ |d   j                         dk(  sJ |d   j                         dk(  sJ |d   j                         dk(  sJ y )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 GGAqM "=1Mc7Eu:??aJ	K	K 8"NNNN8(***8"NNNN8)+++r8   fontsize)Nrp      c                    t        dddd      }|j                  t        t               ddg}t	        ||      }t        |      dk(  sJ t        fd	|D              sJ |d
   j                         dk(  sJ |d   j                         dk(  sJ |d   j                         dk(  sJ |d   j                         dk(  sJ |d   j                         dk(  sJ y )Nr   r   r   r   r   r   )r=   r   r^   c              3   D   K   | ]  }|j                         k(    y wN)get_fontsize).0noder   s     r6   	<genexpr>z&test_plot_tree_gini.<locals>.<genexpr>  s      Eut4$$&(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]r`   r   )r   r-   r.   r/   r   rg   allr   )r   r   r3   r=   r   s    `   r6   test_plot_tree_ginir     s    !	C GGAqM "=1McJEu:??EuEEEEaG	H	H 8"KKKK8(***8"KKKK8)+++r8   c                     t               }t        j                  t              5  t	        |       d d d        y # 1 sw Y   y xY wr   )r   rI   rJ   r
   r   )r   r3   s     r6   test_not_fitted_treer     s)    

!C	~	&# 
'	&	&s	   9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      sI        $ & 7 -  	"XBx"bAq6Aq6Aq6:	1gAwQ!Q!Q!Q8
vr rxx(892" :2"j2@1'WT,Vr rxx(89X :X6,, ^4, 5,6r8   