o
    ZÆ&i´J  ã                   @   s@  d dl Zd dlZd dlmZmZ d dlmZmZm	Z	m
Z
 d dlmZmZmZmZ d dlmZ d dlmZ eegZeegZee	eg Zee
eg Zej de¡ej dd	¡ej d
d	¡ej de¡dd„ ƒƒƒƒZej de¡ej dd	¡ej d
d	¡ej dd¡ej de¡dd„ ƒƒƒƒƒZej de¡dd„ ƒZej de¡dd„ ƒZej deeeeg¡dd„ ƒZej de¡dd„ ƒZdd„ Z dd„ Z!d d!„ Z"ej de¡d"d#„ ƒZ#ej de¡ej d$d%¡ej dd	¡ej dd¡d&d'„ ƒƒƒƒZ$d(d)„ Z%d*d+„ Z&ej de¡ej d$d%¡ej dd	¡ej dd¡d,d-„ ƒƒƒƒZ'dS ).é    N)Úmake_classificationÚmake_regression)ÚExtraTreesClassifierÚExtraTreesRegressorÚRandomForestClassifierÚRandomForestRegressor)ÚDecisionTreeClassifierÚDecisionTreeRegressorÚExtraTreeClassifierÚExtraTreeRegressor)Úassert_allclose)ÚCSC_CONTAINERSÚTreeClassifierÚdepth_first_builder)TFÚsparse_splitterÚcsc_containerc                 C   sz  d}d}t |dddd|d\}}|d |… |d |… }	}
||d … ||d … }}t |¡t |¡}}t |¡t |¡}}|d d …df  d7  < |d d …df  d8  < |d d …df  d7  < |d d …df  d8  < t |jd ¡}d|d< d	|d< |r‰| d |d
}n| d ||d}t|dƒrŸ|jdi d|i¤Ž t|dƒr®|jdi ddi¤Ž |r´||	ƒ}	| |	|
¡ | |¡}t 	|dk|dk¡ 
¡ sÏJ dƒ‚t|jdddƒ t 
| |¡d d …df |d d …df k¡sðJ ‚t 
| |¡d d …df |d d …df k¡s	J ‚t 
| |¡d d …df |d d …df k¡s"J ‚t 
| |¡d d …df |d d …df k¡s;J ‚d S )Néè  é„  é   é   r   )Ú	n_samplesÚ	n_classesÚ
n_featuresÚn_informativeZn_redundantÚrandom_stateé
   é   éÿÿÿÿ)Ú	max_depthÚmonotonic_cst)r   r   Úmax_leaf_nodesr   Ún_estimatorsç        g      ð?z-Probability should always be in [0, 1] range.)Zaxis© )r   ÚnpÚcopyÚzerosÚshapeÚhasattrÚ
set_paramsÚfitZpredict_probaÚlogical_andÚallr   Úsum)r   r   r   Úglobal_random_seedr   r   Ún_samples_trainÚXÚyÚX_trainÚy_trainÚX_testÚ_ZX_test_0incrZX_test_0decrZX_test_1incrZX_test_1decrr   ÚestZ
proba_testr#   r#   úQC:\wamp64\www\opt\env\Lib\site-packages\sklearn/tree/tests/test_monotonic_tree.pyÚ*test_monotonic_constraints_classifications    sX   
úý


ÿ0226r8   ÚTreeRegressorÚ	criterion)Zabsolute_errorZsquared_errorc                 C   sj  d}d}t |dd|d\}}	t |¡}
t ||¡}||
 }|	|
 }t || ¡}t |¡}t |¡}|d d …df  d7  < |d d …df  d7  < t |jd ¡}d|d< d|d< |rd| d ||d	}n| d
|||d}t|dƒrw|j|d t|dƒr†|jdi ddi¤Ž |rŒ||ƒ}| ||¡ | 	|¡}	| 	|¡}t 
||	k¡s¥J ‚| 	|¡}t 
||	k¡s³J ‚d S )Nr   r   r   )r   r   r   r   r   r   r   r   )r   r   r:   é   )r   r   r:   r    r   )r   r!   r#   )r   r$   Zaranger%   r&   r'   r(   r)   r*   Úpredictr,   )r9   r   r   r:   r.   r   r   r/   r0   r1   ÚtrainÚtestr2   r3   r4   ZX_test_incrZX_test_decrr   r6   Zy_incrZy_decrr#   r#   r7   Ú&test_monotonic_constraints_regressionsa   sX   
ü


ýü




r?   c                 C   s   t dddddd\}}d|d< t |jd ¡}d|d< d|d< | d |dd}d	}tjt|d
 | ||¡ W d   ƒ d S 1 sAw   Y  d S )Néd   r   é   r   ©r   r   r   r   r   r   r   ©r   r   r   zIMonotonicity constraints are not supported with multiclass classification©Úmatch)r   r$   r&   r'   ÚpytestÚraisesÚ
ValueErrorr*   )r   r0   r1   r   r6   Úmsgr#   r#   r7   Útest_multiclass_raises¤   s   

ÿ"ÿrJ   c                 C   s|   g d¢g d¢g}g d¢g d¢g}| d t  ddg¡dd}d}tjt|d	 | ||¡ W d   ƒ d S 1 s7w   Y  d S )
N)r   r   rA   é   r   )é   é   r;   é	   r   ©r   r   r   r   r   r   r   r   rC   z?Monotonicity constraints are not supported with multiple outputrD   ©r$   ÚarrayrF   rG   rH   r*   )r   r0   r1   r6   rI   r#   r#   r7   Útest_multiple_output_raises´   s   ÿ"ÿrR   ÚTreec                 C   sŠ   t dddddd\}}tj|d< t |jd ¡}d|d< | d |dd	}d
}tjt|d | ||¡ W d   ƒ d S 1 s>w   Y  d S )Nr@   r   r   rA   r   rB   )r   r   r   rC   zInput X contains NaNrD   )	r   r$   Únanr&   r'   rF   rG   rH   r*   )rS   r0   r1   r   r6   rI   r#   r#   r7   Útest_missing_values_raisesÁ   s   


ÿ
"ÿrU   c                 C   s2  ddgddgddgddgd	d
gg}g d¢}d}| d t  g d¢¡dd}tjt|d | ||¡ W d   ƒ n1 s;w   Y  d}| d t  ddg¡dd}tjt|d | ||¡ W d   ƒ n1 sfw   Y  | d t  ddg¡dd}tjt|d d | ||¡ W d   ƒ d S 1 s’w   Y  d S )Nr   r   rA   rK   r   rL   rM   r;   rN   r   rO   z>monotonic_cst has shape 3 but the input data X has 2 features.)r   r   r   r   rC   rD   z:monotonic_cst must be None or an array-like of -1, 0 or 1.éþÿÿÿr   gš™™™™™é?z(.*)0.8]rP   )r   r0   r1   rI   r6   r#   r#   r7   Útest_bad_monotonic_cst_raisesØ   s,   "ÿÿÿÿÿ"ÿrW   c           	      C   s,  | j }t| jƒD ]‹}| j| |kr“| j| |kr“| j| }| j| }|dkr1|| || ks0J ‚n|dkr?|| || ks?J ‚|| ||  d }| j| dkrn| j| }|dkrb|| |ksaJ ‚n|dkrn|| |ksnJ ‚| j| dkr“| j| }|dkr‡||| ks†J ‚q|dkr“||| ks“J ‚qd S )Nr   r   r   r   )ÚvalueÚrangeÚ
node_countÚchildren_leftÚchildren_rightÚfeature)	Útree_Úmonotonic_signÚvaluesÚiÚi_leftÚi_rightZ
val_middleZi_left_rightZi_right_leftr#   r#   r7   Ú-assert_1d_reg_tree_children_monotonic_boundedò   s0   



€êrd   c                  C   s´   t  ddd¡ dd¡} t  dt j |  ¡  ¡}td dd | |¡}t 	t
¡ t|jdƒ W d   ƒ n1 s7w   Y  t 	t
¡ t|jdƒ W d   ƒ d S 1 sSw   Y  d S )Nr   r   rM   r   r   ©r   r   )r$   ÚlinspaceÚreshapeÚsinÚpiÚravelr	   r*   rF   rG   ÚAssertionErrorrd   r^   ©r0   r1   Úregr#   r#   r7   Ú2test_assert_1d_reg_tree_children_monotonic_bounded  s   ÿ"ÿrn   c                 C   sh   t  |||¡ dd¡}|  |¡}|dkr!t  |¡dk ¡ sJ ‚d S |dkr0t  |¡dk ¡ s2J ‚d S d S )Nr   r   r"   )r$   rf   rg   r<   Údiffr,   )Úclfr_   Zmin_xZmax_xZn_stepsZX_gridZy_pred_gridr#   r#   r7   Úassert_1d_reg_monotonic  s   
ÿrq   c                 C   sœ   t  ddd¡ dd¡}| ¡ }| dgd}| ||¡ |jjdks#J ‚|jjd dks-J ‚| dgd}| || ¡ |jjdksBJ ‚|jjd dksLJ ‚d S )	NrV   r   r   r   r   )r   r   r"   )r$   rf   rg   rj   r*   r^   rZ   rX   )r9   r0   r1   rp   r#   r#   r7   Ú&test_1d_opposite_monotonicity_cst_data#  s   rr   r_   )r   r   c                 C   sŠ   t j |¡}d}d}| ||¡}| |¡}	|r | |g||d}
n	| |g|||d}
|
 ||	¡ t|
j|ƒ t|
|t  |¡t  	|¡dƒ d S )Nr   r   ©r   r:   r   ©r   r    r:   r   r@   )
r$   ÚrandomÚRandomStateÚrandr*   rd   r^   rq   ÚminÚmax)r9   r_   r   r:   r.   Úrngr   r   r0   r1   rp   r#   r#   r7   Útest_1d_tree_nodes_values5  s(   
ýü r{   c           
      C   sÀ  t  | jt j¡}t  | jt j ¡}t| jƒD ]Ç}| j| }| j| d d }t  |¡t  || ¡ks4J ‚t  |¡t  || ¡ksBJ ‚|dk rGq| j| }| j	| }| j| d d | j| d d  d }	|| dkr„|| ||< || ||< || ||< || ||< q|| dkr«| j| | j| ks–J ‚|| ||< |	||< |	||< || ||< q|| dkrÒ| j| | j| ks½J ‚|	||< || ||< || ||< |	||< qt
d|› d|| › ƒ‚d S )Nr   r   r   r   zmonotonic_cst[z]=)r$   ÚfullrZ   ÚinfrY   r]   rX   Zfloat32r[   r\   rH   )
r^   r   Úupper_boundÚlower_boundra   r]   Z
node_valuerb   rc   Zmiddle_valuer#   r#   r7   Ú-assert_nd_reg_tree_children_monotonic_boundedh  s>   


(
Àr€   c                  C   s~  t  ddt j d¡ dd¡} t  | ¡ ¡ }td dd | |¡}t 	t
¡ t|jdgƒ W d   ƒ n1 s6w   Y  t 	t
¡ t|jdgƒ W d   ƒ n1 sRw   Y  t|jdgƒ t  ddd¡ dd¡} |  ¡ d	 }td dd | |¡}t 	t
¡ t|jdgƒ W d   ƒ n1 sw   Y  td dd | | ¡}t 	t
¡ t|jdgƒ W d   ƒ d S 1 s¸w   Y  d S )
Nr   r   é   r   r   re   éûÿÿÿr   rA   )r$   rf   ri   rg   rh   rj   r	   r*   rF   rG   rk   r€   r^   rl   r#   r#   r7   Ú2test_assert_nd_reg_tree_children_monotonic_bounded®  s(   ÿÿÿ"ÿrƒ   c                 C   sr   t j |¡}d}d}|dg}| ||¡}	| |¡}
|r#| |||d}n| ||||d}| |	|
¡ t|j|ƒ d S )Nr   r   r   rs   rt   )r$   ru   rv   rw   r*   r€   r^   )r9   r_   r   r:   r.   rz   r   r   r   r0   r1   rp   r#   r#   r7   Útest_nd_tree_nodes_valuesÎ  s(   
ýür„   )(Únumpyr$   rF   Zsklearn.datasetsr   r   Zsklearn.ensembler   r   r   r   Zsklearn.treer   r	   r
   r   Zsklearn.utils._testingr   Zsklearn.utils.fixesr   ZTREE_CLASSIFIER_CLASSESZTREE_REGRESSOR_CLASSESZTREE_BASED_CLASSIFIER_CLASSESZTREE_BASED_REGRESSOR_CLASSESÚmarkZparametrizer8   r?   rJ   rR   rU   rW   rd   rn   rq   rr   r{   r€   rƒ   r„   r#   r#   r#   r7   Ú<module>   sx    þþ=>

üþ
	
	
/F 