U
    2d5,                     @   sV  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 d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZmZ ejdd Zejdd Zejdddgdd Zejddejjeedkdddd Zejddd ddgdd ddgd d ddgdd!ddgdd"d#d ggd$d% Zejd&d'd(gd)d* Z ejd+dd,d-gd.d/ Z!d0d1 Z"ejjeedk d2dejd3d4dd5gd6d7 Z#ejd3d4dd5gd8d9 Z$ej%d:d;d< Z&eejjeedkddejd=ej'ej(ej)gejdd>d?d@gejd&d'd(gdAdB Z*dCdD Z+dEdF Z,dS )G    N)approx)minimize)sparsemake_regression)ConvergenceWarning)HuberRegressorQuantileRegressor)mean_pinball_loss)assert_allclose)skip_if_32bit)parse_version
sp_versionc                  C   s   t ddddd\} }| |fS )N
      r   	n_samples
n_featuresrandom_statenoiser   )Xy r   L/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/linear_model/tests/test_quantile.pyX_y_data   s    r   c                   C   s   t tdkrdS dS )N1.6.0highsinterior-point)r   r   r   r   r   r   default_solver   s    r   solverr   zrevised simplexc              	   C   sN   | \}}t |}d| d}tjt|d t|d|| W 5 Q R X d S )NzSolver z; does not support sparse X. Use solver 'highs' for example.matchr   )r   
csc_matrixpytestraises
ValueErrorr	   fit)r   r   r   r   X_sparseerr_msgr   r   r   )test_incompatible_solver_for_sparse_input   s    

r*   )highs-ds	highs-ipmr   r   z'Solvers are available as of scipy 1.6.0)reasonc              	   C   s8   | \}}t jtdd t|d|| W 5 Q R X dS )z.Test that highs solver raises for scipy<1.6.0.zscipy>=1.6.0r    r"   N)r$   r%   r&   r	   r'   )r   r   r   r   r   r   r   'test_too_new_solver_methods_raise_error*   s    r.   z quantile, alpha, intercept, coef      ?r   gRQ?r   g\(\?{Gz?d      c                 C   s   dgdgdgg}dddg}t | ||d||}t|j|dd |d k	r\t|jd |dd |dk rv|jd dksvt|jd d	kstd S )
Nr   r   r2      quantilealphar   r0   Zatolr1   r   )r	   r'   r   
intercept_coef_AssertionError)r5   r6   	interceptcoefr   r   r   modelr   r   r   test_quantile_toy_example6   s     
   r>   fit_interceptTFc                 C   s   t ddddd\}}d}td|| d||}t|| |d	||}t|j|jd
d | r|jt|jd
dksrtt	
|||k tdd
dkstd S )Nr1      r         ?r   -C6?gqh ?)epsilonr6   r?   r6   r?   r   g?r7   absr/   )r   r   r'   r	   r   r9   r8   r   r:   npmeanpredict)r?   r   r   r   r6   Zhuberquantr   r   r   *test_quantile_equals_huber_for_low_epsilonT   s,          rK   qg?g?c                 C   sR   t ddddd\}}t| d|d||}t|||k t| ddksNtd S )	N  r@   r   rA   r   r4   r0   rE   )r   r	   r'   rG   rH   rI   r   r:   )rL   r   r   r   rJ   r   r   r   #test_quantile_estimates_calibratione   s     rN   c                 C   s   d}t |dddd\}}t|}d||| k< tdd| d	}|j|||d
 t|||k }|dkspttj|||k |d}|t	dddkstd S )NrM      r   g      $@r   r1   r/   g:0yE>r4   )Zsample_weight)weightsgQ?rE   )
r   rG   ZonesrH   r	   r'   rI   r:   Zaverager   )r   nr   r   ZweightrJ   Zfraction_belowZweighted_fraction_belowr   r   r   test_quantile_sample_weightq   s    
rR   z<The `highs` solver is available from the 1.6.0 scipy versionr5   皙?g?c           
         s  d}t jd}t jt ||dddf |jd|dfd fdd d}t d	d
g}t  | | dksvt	|j
 | |  t d  |dtd|d }|jt|ddkst	t|j|dd tt | kdd d|jd  t j|j|jf } fdd}t|dddgddddid}	||t||	jksjt	t|j|	jd  t|j|	jdd  tt | kdd dS )z<Test quantile regression for asymmetric distributed targets.rM   *   Nr2   r   )size)ZaxisgGz?r/   r   ZscalerU   r4   rS   relg333333?Zrtolr0   r7   r6   c                    sF   t  | dd   | d  d}tt| dd  }||  S )Nr   r   r[   )r
   rG   sumrF   )r<   ZlossZL1r   r6   r5   r   r   r   func   s    "z#test_asymmetric_error.<locals>.funczNelder-Meadg-q=maxiteri  )ZfunZx0methodZtoloptions)rG   randomRandomStateZconcatenaterF   randnrandintarrayminr:   exponentiallogr	   r'   r8   r   r   r9   rH   rI   Z
set_paramsZr_r   x)
r5   r   r   rngr;   r<   r=   Z
model_coefr^   resr   r]   r   test_asymmetric_error   sR      	rn   c                 C   s  t jd}d\}}t|||d|dd\}}||jd|jd7 }td|d}tf d	| i|||}d
}	tf d	| i|||	| }
|
j	t
|	|j	 ddkstt|
j|	|j dd tf d	d|  i|||	 | }
|
j	t
|	 |j	 ddkstt|
j|	 |j dd | || }}tf d	| i|}
|
||||  |  |
j	t
|j	| ksltt|
j|j| dd |||}tf d	| i|}
|
|| | |
j	t
|j	ddkstt|
jt j||jdd dS )ziTest equivariace of quantile regression.

    See Koenker (2005) Quantile Regression, Chapter 2.2.3.
    rT   )r1   rO   r   F)r   r   Zn_informativer   r   shuffler1   rW   )r6   r   r5   g      @gh㈵>rX   rZ   r   gư>N)rG   rc   rd   r   ri   shapedictr	   r'   r8   r   r:   r   r9   re   ZlinalgZsolve)r5   r   rl   r   r   r   r   paramsZmodel1aZmodel2Zg_interceptZg_coefAr   r   r   test_equivariance   s<    
	$ru   z.ignore:`method='interior-point'` is deprecatedc               	   C   sh   t jdddddd} t jdddd}tddddid}d	}tjt|d
 || | W 5 Q R X dS )zTest that linprog fails.r   r   )numr_   r   r   r`   )r6   r   Zsolver_optionsz9Linear programming for QuantileRegressor did not succeed.r    N)rG   ZlinspaceZreshaper	   r$   warnsr   r'   )r   r   regmsgr   r   r   test_linprog_failure   s      rz   sparse_formatr   r+   r,   c           
      C   s   t ddddd\}}| |}d}t|||d||}t|||d||}	t|	j|jdd	 |r|	jt|jksvtd
t	||	
|k   krdksn tdS )z/Test that sparse and dense X give same results.r1   r@   r   rA   r   rB   rD   r0   rZ   g?g?N)r   r	   r'   r   r9   r8   r   r:   rG   rH   rI   )
r{   r   r?   r   r   r   r(   r6   Zquant_denseZquant_sparser   r   r   test_sparse_input   s.          r|   c              	   C   s8   | \}}t  }tjtdd ||| W 5 Q R X dS )z0Check that we warn about the new default solver.zThe default solver will changer    N)r	   r$   rw   FutureWarningr'   )r   r   r   r=   r   r   r   test_warning_new_default  s    r~   c              
   C   sn   | \}}ddl }| L}||jjdtd d}tjt|d t	dd
|| W 5 Q R X W 5 Q R X dS )	zlCheck that we will raise a proper error when requesting
    `solver='interior-point'` in SciPy >= 1.11.
    r   Nr   z1.11.0zBSolver interior-point is not anymore available in SciPy >= 1.11.0.r    r   r"   )Zsklearn.linear_model._quantilecontextsetattrZlinear_modelZ	_quantiler   r$   r%   r&   r	   r'   )r   Zmonkeypatchr   r   Zsklearnmr)   r   r   r    test_error_interior_point_future#  s    
r   )-ZnumpyrG   r$   r   Zscipy.optimizer   Zscipyr   Zsklearn.datasetsr   Zsklearn.exceptionsr   Zsklearn.linear_modelr   r	   Zsklearn.metricsr
   Zsklearn.utils._testingr   r   Zsklearn.utils.fixesr   r   Zfixturer   r   markZparametrizer*   Zskipifr.   r>   rK   rN   rR   rn   ru   filterwarningsrz   r#   Z
csr_matrixZ
coo_matrixr|   r~   r   r   r   r   r   <module>   s|   













;
.


 