U
    3dS                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
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	 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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*d0d1 Z+d2d3 Z,d4d5 Z-d6d7 Z.d8d9 Z/d:d; Z0d<d= Z1d>d? Z2d@dA Z3ej45dBej6ej7ej8ej9gdCdD Z:dEdF Z;ej45dGej9ej8gdHdI Z<dJdK Z=dLdM Z>ej45dNdOdPgdQdR Z?dSdT Z@dUdV ZAdWdX ZBej45dYdZd[gd\d] ZCdS )^    N)make_regression)check_increasingisotonic_regressionIsotonicRegression_make_unique)check_array)assert_allcloseassert_array_equalassert_array_almost_equal)shuffle)expitc            	      C   s   t  } dddddddg}ddd	dddd
g}dddddddg}t|||dd\}}}| j|||d}| j|||d|}t|| d S )N                     )   3      r   )random_statesample_weight)r   r   fit_transformfit	transformr	   )	irxyr   Zx_sZy_sZsample_weight_sZy_transformedZy_transformed_s r    ?/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/tests/test_isotonic.pytest_permutation_invariance   s    r"   c               	   C   sJ   dddg} dddg}t   t dt t| |}W 5 Q R X |sFtd S )Nr   r   r   g?g?errorwarningscatch_warningssimplefilterUserWarningr   AssertionErrorr   r   is_increasingr    r    r!   -test_check_increasing_small_number_of_samples)   s    


r,   c               	   C   sV   ddddddg} dddd	d	d
g}t   t dt t| |}W 5 Q R X |sRtd S )Nr   r   r   r   r   r         ?g)\(@g{G!@2   r#   r$   r*   r    r    r!   test_check_increasing_up4   s    
r/   c               	   C   sV   ddddddg} ddddddg}t   t dt t| |}W 5 Q R X |sRtd S )Nr   r   r   r   r   r   r#   r$   r*   r    r    r!    test_check_increasing_up_extreme@   s    
r0   c               	   C   sV   ddddddg} dddd	d	d
g}t   t dt t| |}W 5 Q R X |rRtd S )Nr   r   r   r   r   r   g      g)\(g{G!r#   r$   r*   r    r    r!   test_check_increasing_downL   s    
r2   c               	   C   sV   ddddddg} dddd	d
dg}t   t dt t| |}W 5 Q R X |rRtd S )Nr   r   r   r   r   r   r#   r$   r*   r    r    r!   "test_check_increasing_down_extremeX   s    
r8   c               	   C   sT   ddddddg} dddddd	g}d
}t jt|d t| |}W 5 Q R X |rPtd S )Nr   r   r   r   r   r   r3   r5   r7   intervalmatch)pytestZwarnsr(   r   r)   )r   r   msgr+   r    r    r!   test_check_ci_warnd   s    r>   c               	   C   sT  t dddddddg} t dddddddg}t|t|  t ddd	g} t d
d
d
g}t|t|  t t| }tddd}|||  t||| ||	||  t|||
| t jt| }tddd}t|	|| | | |	|| |  t||| |||  t }t|	t t|| t |  d S )Nr   r   r   	      
   r   r   r   r                 ?y_miny_max)nparrayr	   r   arangelenr   r   r   r   predictrandomZpermutationonesZmean)r   y_r   r   permr    r    r!   test_isotonic_regressionp   s"     &rP   c                  C   sx   ddddddg} ddddddg}ddddddg}t  }|| | t|| || || | t||| | d S )Nr   r   r   r   r   r   r-   r   r   r	   r   r   r   r   Zy_truer   r    r    r!   !test_isotonic_regression_ties_min   s     rS   c                  C   sx   ddddddg} ddddddg}ddddddg}t  }|| | t|| || || | t||| | d S )Nr   r   r   r   r   r   g      @rQ   rR   r    r    r!   !test_isotonic_regression_ties_max   s     rT   c                  C   s   dddddddddddg} dddddd	d
dddd	g}dddddddddddg}t  }|| | t|| |d t|| ||d dS )aw  
    Test isotonic regression fit, transform  and fit_transform
    against the "secondary" ties method and "pituitary" data from R
     "isotone" package, as detailed in: J. d. Leeuw, K. Hornik, P. Mair,
     Isotone Optimization in R: Pool-Adjacent-Violators Algorithm
    (PAVA) and Active Set Methods

    Set values based on pituitary example and
     the following R command detailed in the paper above:
    > library("isotone")
    > data("pituitary")
    > res1 <- gpava(pituitary$age, pituitary$size, ties="secondary")
    > res1$x

    `isotone` version: 1.0-2, 2014-09-07
    R version: R version 3.1.1 (2014-07-10)
    r@   rA            g     7@   r      g     5@      gbh86@g     @8@r   N)r   r   r
   r   r   rR   r    r    r!   (test_isotonic_regression_ties_secondary_   s$    r\   c                  C   sz   t ddddddg} t ddddddg}t ddddddg}t }|| | t|| | t|| || d	S )
ax  
    Non-regression test to handle issue 9432:
    https://github.com/scikit-learn/scikit-learn/issues/9432

    Compare against output in R:
    > library("isotone")
    > x <- c(0, 1, 1, 2, 3, 4)
    > y <- c(0, 0, 1, 0, 0, 1)
    > res1 <- gpava(x, y, ties="secondary")
    > res1$x

    `isotone` version: 1.1-0, 2015-07-24
    R version: R version 3.3.2 (2016-10-31)
    r   r   r   r   r   rB   g      ?rC   N)rG   rH   r   r   r
   r   r   rR   r    r    r!   >test_isotonic_regression_with_ties_in_differently_sized_groups   s    r]   c               	   C   sj   t dddddddg} tddt t| | }tt |d d	 j|d d	 |d
d   dk d S )NrA   r?   r   r   ffffff@r   F
increasingr3   r   r   )	rG   rH   r   r   rI   rJ   r	   rM   shape)r   rN   r    r    r!   !test_isotonic_regression_reversed   s    rb   c               	   C   s   t dddddddg} t t| }tdd}tjd	d
2}td ||| }t	dd |D sjt
W 5 Q R X |d |d k }|rt
d S )NrA   r?   r   r   r^   r   autor_   Trecordalwaysc                 S   s   g | ]}d t |jkqS zinvalid value encountered in strmessage.0warnr    r    r!   
<listcomp>   s     z<test_isotonic_regression_auto_decreasing.<locals>.<listcomp>r   r3   rG   rH   rI   rJ   r   r%   r&   r'   r   allr)   r   r   r   wrN   r+   r    r    r!   (test_isotonic_regression_auto_decreasing   s    

 rs   c               	   C   s   t dddddddg} t t| }tdd}tjd	d
2}td ||| }t	dd |D sjt
W 5 Q R X |d |d k }|st
d S )Nr   r^   r   r   rA   r?   rc   r_   Trd   rf   c                 S   s   g | ]}d t |jkqS rg   rh   rk   r    r    r!   rn     s     z<test_isotonic_regression_auto_increasing.<locals>.<listcomp>r   r3   ro   rq   r    r    r!   (test_isotonic_regression_auto_increasing   s    

 rt   c               	   C   s   t  } tjd}d}tjt|d$ | dddgddd	gd
dg W 5 Q R X tjt|d | dddgddg W 5 Q R X d}tjt|d  | |d	ddddg W 5 Q R X d}tjt|d | 	|d	d W 5 Q R X d S )N*   z:Found input variables with inconsistent numbers of samplesr:   r   r   r   r   r   r   皙?g333333?zX should be a 1d arrayrA   z0Isotonic regression input X should be a 1d array)
r   rG   rL   RandomStater<   raises
ValueErrorr   Zrandnr   )r   rngr=   r    r    r!   test_assert_raises_exceptions  s    ( $r{   c                  C   s~   t  } tjd}d}t|}|jdd|fddtdt|   }t|}| j|||d}| ||}t	|| d S )	Nru   d   r1   r.   sizeg      I@r   r   )
r   rG   rL   rw   rI   randintlogrM   r   r	   )r   rz   nr   r   weightsZy_set_valueZy_default_valuer    r    r!   3test_isotonic_sample_weight_parameter_default_value#  s    
*
r   c                  C   sT   t ddd} d}t|}t|}ddddddg}t| ||}t|| d S )Nr   r   rD   r   r   )r   rG   rI   roundr   r	   )r   r   r   r   Zy_testZy_resultr    r    r!    test_isotonic_min_max_boundaries3  s    

r   c                  C   sl   t  } dddddddg}ddd	dddd
g}dddddddg}ddddddd
g}| j|||d}t|| d S )Nr   r   r   r   r   r   r   r   r   r   gfffff+@r   )r   r   r	   )r   r   r   r   Z
expected_yZ
received_yr    r    r!   test_isotonic_sample_weight>  s    r   c               	   C   s~   t dddddddg} t t| }tddd	}|||  d
}tjt|d$ |	t
|d t|d g W 5 Q R X d S )Nr   r   r   r?   r@   rA   rc   raiser`   out_of_boundsz)in x_new is below the interpolation ranger:   )rG   rH   rI   rJ   r   r   r<   rx   ry   rK   minmax)r   r   r   r=   r    r    r!   "test_isotonic_regression_oob_raiseI  s    r   c               	   C   s   t dddddddg} t t| }tddd	}|||  |t|d t|d g}||}t|t|kszt	t|t|kst	d S 
Nr   r   r   r?   r@   rA   rc   clipr   )
rG   rH   rI   rJ   r   r   rK   r   r   r)   )r   r   r   y1y2r    r    r!   !test_isotonic_regression_oob_clipX  s    
r   c               	   C   sv   t dddddddg} t t| }tddd	}|||  |t|d t|d g}t	t 
|d
ksrtd S )Nr   r   r   r?   r@   rA   rc   nanr   r   )rG   rH   rI   rJ   r   r   rK   r   r   sumisnanr)   )r   r   r   r   r    r    r!    test_isotonic_regression_oob_nanh  s    r   c               	   C   st   t dddddddg} t t| }tddd	}|||  t|tj}t	|}t j
|||| d S r   )rG   rH   rI   rJ   r   r   pickledumpsHIGHEST_PROTOCOLloadsZtestingr	   rK   )r   r   r   Zir_serZir2r    r    r!   test_isotonic_regression_picklev  s    
r   c                  C   sN   dddg} dddg}t ddd}|| | tt|| }|sJtd S )Nr   r   Tr   r   )r   r   rG   rp   isfiniterK   r)   )r   r   r   Zall_predictions_finiter    r    r!   !test_isotonic_duplicate_min_entry  s    

r   c                  C   s   t ddddddddd	d
ddddddddddg} t| ddd}t |dksRtt |dksdtt| dddd}t |dkstt |dkstt| ddd}t |dkstd S )Ngh|?5?gJ+?gMgS?g9vgI+ƿg/$gl?gtV?g"~?gzG?gy&1?g#~jg"~j?g;On?gT㥛 ؿgy&1gZd;g
ףp=
?rB   rv   rD   r   F)rE   rF   r`   )rE   r`   )rG   rH   r   rp   r)   )r   r   r    r    r!   test_isotonic_ymin_ymax  s>    r   c                  C   sp   t jd} t }d}t dd|}|| j|d }| j|d}d|dd< |j|||d	 |j|||d	 d S )
Nru   r.   r5   r   r}   r   r   r@   r   )rG   rL   rw   r   Zlinspaceuniformr   )rz   Z
regression	n_samplesr   r   rr   r    r    r!   test_isotonic_zero_weight_loop  s    r   c                  C   s   t jd} d}d| | d }t | |t|dd}| |}d|| |dk < tdd	d
d}tdd	d
d}|j|||dd\}}|	|| |j
|||d d| | d }	||	}
||	}t|
| d S )N{   i  g      4@rA   int64float64r   rv   r   r   )rE   rF   r   F)r   Ztrim_duplicatesr   )rG   rL   rw   ZrandZlessr   astyper   Z_build_yZ_build_fr   rK   r	   )rz   r   ZX_trainZy_trainr   Z
slow_modelZ
fast_modelZX_train_fitZy_train_fitZX_testZy_pred_slowZy_pred_fastr    r    r!   test_fast_predict  s*     
   


r   c                  C   s   t  } t|  d S )N)r   copy)r   r    r    r!   test_isotonic_copy_before_fit  s    r   c            	      C   s   dddddg} t jdddddgt jd}t }t jt jt jt jfD ]}d |t j|fD ]}t j| |d}t|t jt jgdd	j	}t
||d
}|j	|kstt t| |}|j|||d
 ||}|j	|ksXtqXqBd S )Nr   r   r   r   r   g?dtypeF)r   Z	ensure_2dr   )rG   rH   r   r   int32r   float32r   r   r   r   r)   rI   rJ   r   rK   )	r   r   regr   r   Zy_npZexpected_dtyperesXr    r    r!   test_isotonic_dtype  s"     
 
r   y_dtypec                 C   sX   t  }tjdddddg| d}tjt|tjd}||| ||j|jksTt	d S )Nr   r   r   r   r   r   )
r   rG   rH   rI   rJ   r   r   rK   r   r)   )r   r   r   r   r    r    r!   test_isotonic_mismatched_dtype  s
    r   c                  C   sf   dddddg} t jt jfD ]F}t j| |d}| }t |}t|||\}}}t|dddg qd S )Nr   r   r   r   )rG   r   r   rH   r   	ones_liker   r	   )Zx_listr   r   r   rr   r    r    r!   test_make_unique_dtype  s    
r   r   c                 C   sr   t jddddg| d}| }t |}t|||\}}}| t jkrVt dddg}nt ddg}t|| d S )Nr   gؗҜ<r   g-     ?r   )rG   rH   r   r   r   r   r	   )r   r   r   rr   Zx_outr    r    r!   test_make_unique_tolerance$  s    

r   c               	   C   s   t jddddgt jd} t jddddgt jd}t | |}|dddddg}t|t dd	dd
dg t|jt dddg t|jt dddg d S )Nr   r   rC   r   r   r   g      ?r-   g      ?g      @rB   g       @g      @)	rG   rH   r   r   r   rK   r	   X_thresholds_y_thresholds_r   r   iregZy_predr    r    r!   #test_isotonic_make_unique_tolerance2  s    r   c                  C   sb   t ddddg} t ddddg}t | |}|t ddd	d
g}t t |s^td S )NrB   gj       gJ/   rC   gzG?g)\(?r   g      gA    g|=)rG   rH   r   r   rK   rp   r   r)   r   r    r    r!   &test_isotonic_non_regression_inf_slope?  s
    r   r`   TFc                 C   s   t jd}d}|j|d}|j|d}t| d||}|j|j }}|j|jksXt	|jd |jd k spt	t 
|| st	| | kst	| | kst	tt |dkst	| rtt |dkst	ntt |dkst	d S )Nru      r}   r_   r   )rG   rL   rw   normalr   r   r   r   ra   r)   Zin1drp   r   r   Zdiff)r`   rz   r   r   r   r   ZX_thresholdsZy_thresholdsr    r    r!   test_isotonic_thresholdsI  s    r   c                  C   s   t d} | dd}t d}t | |}t ||}|j|jksLt|j|jks\t|j|jkslt|j	|j	ks|tt
|j|j t
|j|j || }||}t|| d S )NrA   r3   r   )rG   rI   reshaper   r   ZX_max_r)   ZX_min_rF   rE   r	   r   r   rK   r   )r   X_2dr   iso_regZ
iso_reg_2dZy_pred1Zy_pred2r    r    r!   test_input_shape_validationd  s    



r   c               	   C   s   t d} t j| | f }t d}d}tjt|d t || W 5 Q R X t | |}tjt|d || W 5 Q R X tjt|d |	| W 5 Q R X d S )NrA   z/should be a 1d array or 2d array with 1 featurer:   )
rG   rI   Zc_r<   rx   ry   r   r   rK   r   )r   r   r   r=   r   r    r    r!   )test_isotonic_2darray_more_than_1_featurez  s    

r   c                  C   sb   t dddd\} }t|}d|d< | }t||d t|| t j| ||d t|| dS )zCheck that calling fitting function of isotonic regression will not
    overwrite `sample_weight`.
    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/20508
    rA   r   r   )r   Z
n_featuresr   r   r   N)r   rG   r   r   r   r   r   r   )r   r   Zsample_weight_originalZsample_weight_fitr    r    r!   6test_isotonic_regression_sample_weight_not_overwritten  s    

r   ra   Z1d2dc                 C   sl   t d}| dkr|dd}t d}t ||}| }t|t jsNt|j	t
ks\ttdg| dS )z7Check `get_feature_names_out` for `IsotonicRegression`.rA   r   r3   r   Zisotonicregression0N)rG   rI   r   r   r   Zget_feature_names_out
isinstanceZndarrayr)   r   objectr	   )ra   r   r   Zisonamesr    r    r!   test_get_feature_names_out  s    

r   )Dr%   ZnumpyrG   r   r   r<   Zsklearn.datasetsr   Zsklearn.isotonicr   r   r   r   Zsklearn.utils.validationr   Zsklearn.utils._testingr   r	   r
   Zsklearn.utilsr   Zscipy.specialr   r"   r,   r/   r0   r2   r8   r>   rP   rS   rT   r\   r]   rb   rs   rt   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   markZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r    r    r!   <module>   sj   )
,%





