o
    tBhUB                     @   s<  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d Zdd Zdd Zdd Zdd Z dd Z!d d! Z"d"d# Z#d$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               
   C   s  t ddddd} | tt t| d d}d}||ksJ t| ddgd d	}d
}||ks-J t| ddgd d}d}||ks>J t| dddddd dd}d}||ksRJ t| ddd d}d}||ksbJ t| ddd dd}d}||kssJ t ddddd} | jtttd} t| ddd d}d}||ksJ tddddd} | tt t| ddd dddd}d}||ksJ t dd} | tt t| d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	contents2 r9   u/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/sklearn/tree/tests/test_export.pytest_graphviz_toy   s   



r;   c                  C   s  t ddd} t }tt t| | W d    n1 sw   Y  | tt d}tjt	|d t| d dgd W d    n1 sEw   Y  d}tjt	|d t| d g d	d W d    n1 sgw   Y  d
}tjt
|d t| ttj W d    n1 sw   Y  t }tt t| |g d W d    n1 sw   Y  t }tjt	dd t| |dd W d    n1 sw   Y  tjt	dd t| |dd W d    d S 1 sw   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)r>   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
   r0   r1   r2   
ValueError	TypeErrortree_
IndexError)r6   outmessager9   r9   r:   test_graphviz_errors   s:   "rL   c                  C   s   t ddd} | tt t }t| |d tddd} | tt | jD ]
}t|d |d q$td|	 D ]
}d|
 v s@J q6d S )Nfriedman_mser   )r   r   r   r   )n_estimatorsr   z\[.*?samples.*?\])r   r0   r1   r2   r   r
   r	   estimators_r   getvaluegroup)r6   dot_data	estimatorfindingr9   r9   r:   test_friedman_mse_in_graphviz#  s   
rU   c            	      C   s4  t d} t d}t| d|df| d|jdddftdd	d
dtd
d	dfD ]l\}}}||| dD ]^}t|d |dd}td|D ]}t	t
d|  |d
 ksZJ qGt|rbd}nd}t||D ]}t	t
d|  |d
 ks|J qitd|D ]}t	t
d|  |d
 ksJ qq8q+d S )Nr      )   r   )     )rW   )rX   )sizerM   r   r   )r   r   r   r   r   )rY   r   T)r   rB   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   r0   r
   r   lenr   rQ   r   )	rng_regrng_clfr1   r2   r6   rB   rR   rT   patternr9   r9   r:   test_precision2  s8   
$$$rc   c                  C   s  t ddd} | tt d}tjt|d t| dd W d    n1 s&w   Y  d}tjt|d t| d	gd
 W d    n1 sFw   Y  d}tjt|d t| dd W d    n1 sew   Y  d}tjt|d t| dd W d    d S 1 sw   Y  d S )Nr   r   r[   z max_depth bust be >= 0, given -1r<   r   r/   z,feature_names must contain 2 elements, got 1r>   r?   zdecimals must be >= 0, given -1decimalszspacing must be > 0, given 0spacing)r   r0   r1   r2   rD   rE   rF   r   )r6   err_msgr9   r9   r:   test_export_text_errors^  s$   "ri   c                  C   sF  t ddd} | tt td }t| |ksJ t| dd|ks$J t| dd|ks.J td }t| dd	gd
|ks@J td }t| dd|ksPJ td }t| d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d} | || td }t| dd|ksJ 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d}||| td }t|dd|ksJ t|ddd|ksJ dgdgdgdgdgdgg}tddd}||| td }t|ddgd|ksJ t|dddgd|ks!J d S )Nr   r   r[   zh
    |--- feature_1 <= 0.00
    |   |--- class: -1
    |--- feature_1 >  0.00
    |   |--- class: 1
    r/   
   zX
    |--- b <= 0.00
    |   |--- class: -1
    |--- b >  0.00
    |   |--- class: 1
    r>   r@   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   rf   r   r   )r   r   r   r   r   r   r   rY   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]
    rd   )re   rk   zq
    |--- first <= 0.0
    |   |--- value: [-1.0, -1.0]
    |--- first >  0.0
    |   |--- value: [1.0, 1.0]
    first)re   r   )re   rk   r   )r   r0   r1   r2   r   lstripr   r   )r6   expected_reportX_ly_lX_moy_moregX_singler9   r9   r:   test_export_textp  sz   	.((ru   c                 C      t ddddd}|tt ddg}t||d}t|dks J |d  d	ks*J |d
  dks4J |d  dks>J d S )Nr   r   entropyr   
first featsepal_widthr?   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   r0   r1   r2   r   r_   get_textpyplotr6   r   nodesr9   r9   r:   test_plot_tree_entropy     
r   c                 C   rv   )Nr   r   r   r   rx   ry   r?   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]rz   r|   r9   r9   r:   test_plot_tree_gini  r   r   c                 C   s>   t  }tt t| W d    d S 1 sw   Y  d S )N)r   rD   rE   r   r   )r}   r6   r9   r9   r:   test_not_fitted_tree  s   
"r   )%__doc__rer   r   textwrapr   numpy.randomr   rD   sklearn.baser   sklearn.treer   r   sklearn.ensembler	   r
   r   r   ior   sklearn.exceptionsr   r1   r2   r3   r4   r5   r;   rL   rU   rc   ri   ru   r   r   r   r9   r9   r9   r:   <module>   s4    (( d',c