
    e!h"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>                  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            
      f   t        dddd      } | j                  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      } | 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"] ;
}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      f/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/sklearn/tree/tests/test_export.pytest_graphviz_toyr@       s   
 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                     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   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                  ,   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)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  sB   
 1
BC *C	~	& "S!" GGAqM PG	z	1 8T#78 PG	z	1 BTAB -G	y	0 -1++,- *C	z	" 2Sb12 2-" "8 8B B
- -
2 2s;   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   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__ 9		!x89 0(2C2C2EF 10001rA   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   )     )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?		
	 $W	1c 	1 	WI&diDH $$7B W6(GMMO<BBDEUVVVVW S!,4 $GX6 W6(GMMO<BBDEUVVVVW $NH= W6(GMMO<BBDEUVVVVW1	W$WrA   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   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-.	/ 
 
z	1 ,CcU+, ,. ., ,s   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   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GGHd	 fh  sQwi@OSSSC!$wiP		rA   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   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                    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_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                    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   rb   c              3   D   K   | ]  }|j                         k(    y wN)get_fontsize).0noder   s     r?   	<genexpr>z&test_plot_tree_gini.<locals>.<genexpr>g  s     Et4$$&(2Es    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aG	H	H 8"KKKK8(***8"KKKK8)+++rA   c                     t               }t        j                  t              5  t	        |       d d d        y # 1 sw Y   y xY wr   )r   rM   rN   r
   r   )r   r<   s     r?   test_not_fitted_treer   r  s2    

!C	~	& #  s	   9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   