U
    }hx                     @   s  d dl Z d dl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 d dlmZmZmZmZmZ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 d dlmZm Z m!Z!m"Z" e# Z$e$j%e$j& Z'Z(e)e'j*e'Z+e)e'j*e(Z,e(j-Z.ej/0dZ1ej/2deeeeegej/2ddddgdd Z3dd Z4dd Z5dd Z6ej/2dddgej/2ddd gd!d" Z7d#d$ Z8d%d& Z9e1ej/0d'd(d) Z:ej/0d*d+d, Z;d-d. Z<d/d0 Z=d1d2 Z>d3d4 Z?e1ej/2d5ejejejgd6d7 Z@d8d9 ZAd:d; ZBd<d= ZCe1d>d? ZDe1d@dA ZEdBdC ZFdDdE ZGe1dFdG ZHe1d}dHdIZIe1e"dJdK ZJe1dLdM ZKdNdO ZLdPdQ ZMdRdS ZNdTdU ZOdVd iZPdWdXii i dYZQe1dZd[ ZRd\d] ZSd^d_ ZTe1ej/2d`dd gdadb ZUe1ej/2d`dd gdcdd ZVe1ej/2deedfdge fdhdi ZWdjdk ZXdldm ZYej/2dnedi fedi fed i fedi feddodpiffej/2dqejZej[fe1drds Z\ej/2dnedi fedi fed i fedi feddodpiffe1dtdu Z]ej/2dvdwdxgdydz Z^ej/2dVdd gd{d| Z_dS )~    N)linalg)datasetslinear_model)clone)ConvergenceWarning)LarsLarsCV	LassoLarsLassoLarsCVLassoLarsIC	lars_path)_lars_path_residues)train_test_split)make_pipeline)StandardScaler)check_random_state)
TempMemmapassert_allcloseassert_array_almost_equalignore_warningsz!ignore:'normalize' was deprecatedLeastAngleModelznormalize, n_warnings)T   )Fr   )
deprecatedr   c           
   	   C   s   t d}d}d}|||}d||dk < ||}| |d}tjdd}	td	t ||| W 5 Q R X td
d |	D |kst	d S )Nr                 皙?)	normalizeT)recordalwaysc                 S   s   g | ]
}|j qS  )message.0wr    r    O/tmp/pip-unpacked-wheel-ig1s1lm8/sklearn/linear_model/tests/test_least_angle.py
<listcomp>@   s     z6test_assure_warning_when_normalize.<locals>.<listcomp>)
r   randnrandwarningscatch_warningssimplefilterFutureWarningfitlenAssertionError)
r   r   Z
n_warningsrng	n_samples
n_featuresXymodelZrecr    r    r%   "test_assure_warning_when_normalize,   s    

r6   c                  C   s   dd l } ddlm} | j}z| | _tjttddd\}}}|| _t|j	D ]\}}tt
t| }t
tj	|}t
t|}	d}
t||	|
 t|k  }|tjd k r||d kstqL|tjd ksLtqLW 5 || _X d S )Nr   )StringIOlar
   )methodverboseMbP?r   )sysior7   stdoutr   r   r3   r4   	enumerateTnpdotmaxabsr.   shaper/   )r=   r7   Z
old_stdout_
coef_path_icoef_rescovCepsocurr    r    r%   test_simpleC   s"    rP   c            	      C   s   t jtttdd\} } }t|jD ]\}}ttt| }ttj|}t	t
|}d}t||| t
|k  }|tjd k r||d kstq"|tjd ks"tq"d S )Nr8   )Gramr:   r<   r   )r   r   r3   r4   Gr@   rA   rB   rC   rD   rE   r.   rF   r/   )	rG   rH   rI   rJ   rK   rL   rM   rN   rO   r    r    r%   test_simple_precomputeda   s    rS   c                 C   s6   t | t |kstt| |D ]\}}t|| qd S )N)r.   r/   zipr   )Zoutput1Zoutput2Zo1Zo2r    r    r%   _assert_same_lars_path_results   s    rU   r:   r8   lassoreturn_pathTFc              	   C   s.   t tjttt| |dtjttt| |d d S )N)XyrQ   r1   r:   rW   )rQ   r:   rW   )	rU   r   Zlars_path_gramrX   rR   r1   r   r3   r4   r:   rW   r    r    r%   test_lars_path_gram_equivalenty   s        rZ   c               	   C   s:   t tjt} tt tj	d td | d W 5 Q R X d S )N)rQ   rX   )
rB   rC   r3   rA   r4   pytestraises
ValueErrorr   r   )rX   r    r    r%   (test_x_none_gram_none_raises_value_error   s    r^   c                  C   sl   t tjt} t tjt}dD ]F}tjtt|d}tjtt| ||d}t||D ]\}}t|| qRq d S )N)r8   rV   r:   )rQ   rX   r:   )	rB   rC   r3   rA   r4   r   r   rT   r   )rR   rX   r:   outputZ
output_preexpectedgotr    r    r%   test_all_precomputed   s    rc   z%ignore: `rcond` parameter will changec                  C   sF   dt  } tjdd}|| t tjj| td dd }t|j	| d S )N   r   alpha)Zrcondr   )
r3   r   r	   r-   r4   rB   r   lstsqr   rJ   )X1clf
coef_lstsqr    r    r%   test_lars_lstsq   s
    rk   z$ignore:`rcond` parameter will changec                  C   sB   t jttdd\} } }tjttd }t||d d df  d S )NrV   r_   r   )r   r   r3   r4   rB   r   rg   r   )rG   rH   rj   r    r    r%   test_lasso_gives_lstsq_solution   s    rm   c                  C   s   t dddgdddgdddgg} t dddg}t jd}t}|tj| |dd\}}}t | rnt	t 
| |d d df | }|d	  dk st	d
}||d} t |}tj| |dddddddd	\}}}t|t | d S )Ng      @      ?       @r   r   {Gz?)	alpha_minrl   r   r9      autoFrV   i  )rQ   copy_XZ	copy_Gramrq   r:   r;   max_iter)rB   arrayrandomRandomStater   r   r   isnananyr/   rC   sumr(   zerosr   Z
zeros_like)r3   r4   r0   frG   rH   Zresidualr1   r    r    r%   test_collinearity   s.    "
r~   c                  C   sX   t jttdd\} }}t jttddd\}}}t||d d df  || d ksTtd S )Nr8   r_   FrY   rl   )r   r   r3   r4   r   r/   alphas_rG   rH   alpha_coefr    r    r%   test_no_path   s    r   c                  C   s\   t jttdtd\} }}t jttdtdd\}}}t||d d df  || d ksXtd S )Nr8   )r:   rQ   F)r:   rQ   rW   rl   )r   r   r3   r4   rR   r   r/   r   r    r    r%   test_no_path_precomputed   s        r   c            	   	   C   s   dt j t j } }t| j| }t| j|}tj| |d||dd\}}}tj| |d||ddd\}}}t||d d df  ||d kst	d S )Nrd   rV   ?)r:   rX   rQ   rq   F)r:   rQ   rX   rq   rW   rl   )
diabetesdatatargetrB   rC   rA   r   r   r   r/   )	r3   r4   rR   rX   r   rG   rH   r   r   r    r    r%   test_no_path_all_precomputed   s,               r   
classifierc                 C   s^   t tjt}| |d}t|jttj}dD ]*}| |d}|ttj}t||dd q.d S )N
precompute)TFrs   N   decimal)	rB   rC   r3   rA   r   r-   r4   rJ   r   )r   rR   ri   Zoutput_1r   Zoutput_2r    r    r%   test_lars_precompute   s    

r   c                  C   sR   t ddgddgg} t ddg}t| |\}}}t|jddgddgg d S )Nr   rn   r   )rB   rv   r   r   r   rA   )rh   y1rG   Z	coef_pathr    r    r%   test_singular_matrix   s    r   c               	   C   s   dddg} ddgddgddggdddgdddgdddggfD ]}t d}||| j}dt| t|| d  dt|d  }t jdd	d
}||| j}dt| t|| d  dt|d  }||d k s<t	q<d S )Nrr   r   r9   g3#I9r   r   gUUUUUU?r   ư>tol1  ?)
r   r	   r-   rJ   r   normrB   rC   Lassor/   )r4   r3   larsZ
coef_lars_Zobj_larscoord_descentZcoef_cd_Zobj_cdr    r    r%   test_rank_deficient_design  s*    
6
r   c                  C   s  dt j } tj| tdd\}}}tjddd}t|j|D ]@\}}|dkrLq:||_|	| t t
||j }|dk s:tq:tdd	d
D ]L}tj|d	| t}	tj|dd	| t}
t
|	j|
j }|dk stqt j} | | jdd } | tj
j| dd } tj| tdd\}}}tjddd}t|j|D ]H\}}|dkrHq2||_|	| t t
||j }|dk s2tq2d S )Nrd   rV   r_   F:0yE>fit_interceptr   r   rp   Gz?   re   rf   r   r<   Zaxisr   r   r   r   r4   r   rT   rA   rf   r-   r   r   rJ   r/   rB   Zlinspacer	   r{   r3   alphasrG   
lasso_pathlasso_cdcaerrorrf   Zclf1Zclf2errr    r    r%   test_lasso_lars_vs_lasso_cd  s6    

r   c                  C   s  dddg} t j}| D ]h}tj|td|d\}}}tjddd}|d	 |_||t t	|d d d	f |j
 }|d
k stqt jt jjdd }|tjj	|dd }| D ]f}tj|td|d\}}}tjdd}|d	 |_||t t	|d d d	f |j
 }|d
k stqd S )Nr9   r   -C6?rV   )r:   rq   Fr   r   rl   rp   r   r   r   )r   r   r   r   r4   r   rf   r-   r   r   rJ   r/   r{   rB   )Z
alphas_minr3   rq   r   rG   r   r   r   r    r    r%   *test_lasso_lars_vs_lasso_cd_early_stoppingB  s8    
   
   
r   c                  C   sf   t  } | tt t j| jd d}|tt t| jd d |j tt	| jdk sbt
d S )Nr   re   rd   r   )r   r	   r-   r3   r4   r   r   rB   allZdiffr/   )rV   Zlasso2r    r    r%   test_lasso_lars_path_lengthd  s    r   c                  C   s   t jd} d\}}d}| ||}t |df}t d|}| | |d | }t | |d| |dd  ||< t 	||}d}	||	| j|j
  7 }| }tj||dd\}
}}tj|||
d	d
\}}}t||dd d S )N*   )F   d   rr   r   r   g?rV   r_   r   )r   r   r   )rB   rw   rx   r'   r|   arangeshufflesignr(   rC   rF   Zsqueezer   r   r   r   )r0   nmkr3   r$   rI   Zsuppr4   sigmaZlars_alphasrG   Z	lars_coefZlasso_coef2r    r    r%   +test_lasso_lars_vs_lasso_cd_ill_conditionedp  s     
&r   c               	      s   dddgdddgdddgg dddgd fdd} t jd	}d
}tjt|d |  W 5 Q R X |j}| |}t jdd}| j}| |}||d k std S )Ng@xDr   g3#Ir   r9   r   c                    s:   ddt    tt |  d  t| d  S )Nrn   ro   r   r   )r.   r   r   rB   rC   )r   r3   rf   r4   r    r%   objective_function  s    zHtest_lasso_lars_vs_lasso_cd_ill_conditioned2.<locals>.objective_functionre   z$Regressors in active set degenerate.matchr   r   )	r   r	   r[   Zwarnsr   r-   rJ   r   r/   )r   r   Zwarning_messageZ
lars_coef_Zlars_objr   Zcd_coef_Zcd_objr    r   r%   ,test_lasso_lars_vs_lasso_cd_ill_conditioned2  s    
r   c                  C   sd   d} dt d| d t | d d t jf   }tjdd|t | }t t |js`t	d S )Nrr   rn   r   Fr   )
rB   r   Znewaxisr   r   r-   r   isfiniterJ   r/   )r   Hri   r    r    r%   test_lars_add_features  s    ,r   c                 C   sJ   t jd| d}|tt t|j d dks4tt|j	dksFtd S )N   )n_nonzero_coefsr;   r      )
r   r   r-   r3   r4   r.   rJ   Znonzeror/   r   )r;   r   r    r    r%   test_lars_n_nonzero_coefs  s    r   c                  C   s  t ttd gj} | jd }t t tjddtjddg}|D ]}|t	|  |
t	}|j|j|j|jf\}}}}t|D ]|}	|t	| d d |	f  |
t	}
t||	 |j t||	 |j t||	 |j t||	 |j t|d d |	f |
 qqFd S )Nr   r   Fr   )rB   Zvstackr4   rA   rF   r   r	   r   r-   r3   predictr   Zactive_rJ   rH   ranger   )Y	n_targetsZ
estimators	estimatorZY_predr   activer   pathr   Zy_predr    r    r%   test_multitarget  s.    




r   c                  C   sf   d} t  }dD ]B}tjd | }tjd | }||| tj| |j	 |j	} qt
|drbtd S )Nr   )i  r   r   r   )r   r
   r   r   r   r-   rB   testingZassert_array_lessr   hasattrr/   )Z	old_alphalars_cvlengthr3   r4   r    r    r%   test_lars_cv  s    r   c              	   C   s   t d tjdddh tj}tj}tjd}|	t
|}tj}tj|||f }t |}tjddd}||| W 5 Q R X dd | D }t
|d	kstd S )
Nr   raise)divideinvalidr   rr   )ru   Zcvc                 S   s   g | ]}t |qS r    )strr"   r    r    r%   r&     s     z)test_lars_cv_max_iter.<locals>.<listcomp>r   )r)   r+   rB   Zerrstater   r   r   rw   rx   r'   r.   c_r   fit_transformr   r
   r-   r/   )Zrecwarnr3   r4   r0   xr   Zrecorded_warningsr    r    r%   test_lars_cv_max_iter  s    
r   c                  C   s   t d} t d}tjd}tj}tj|||j	d df }t
 |}| |t ||t t| jd }t|jd }| j|jkstt|t|k stt|tjj	d k std S )Nbicaicr   r   rr   r   )r   r   rB   rw   rx   r   r   r   r'   rF   r   r   r-   r4   whererJ   r   r/   r.   rD   )Zlars_bicZlars_aicr0   r3   Znonzero_bicZnonzero_aicr    r    r%   test_lasso_lars_ic  s    

r   c               	   C   s@   t ttdd} t|  \}}}}t||||dd W 5 Q R X d S )Nr   )random_stateF)copy)r   r3   r4   r   r   )Zsplitted_dataZX_trainZX_testZy_trainZy_testr    r    r%   test_lars_path_readonly_data  s    r   c               	   C   s   d} t jt| d  tjtd td ddd W 5 Q R X d}tjttd|d	d
\}}}| dk sft	tjttd|dd
\}}}| dkst	d S )Nz:Positive constraint not supported for 'lar' coding method.r   r   r   r8   Tr:   positiverV   F)rW   r:   r   r   )
r[   r\   r]   r   r   r   r3   r4   minr/   )err_msgr:   rG   Zcoefsr    r    r%   "test_lars_path_positive_constraint&  s2    
           r   r   rf   r   r	   r
   r   c                  C   s   ddi} ddii i d}|D ]}|   }|||  tt|f ddi|}|tt |j dk slt	tt|f ddi|}|tt t|jdkst	qd S )	Nr   Frf   r   r   r   r   T)
r   updategetattrr   r-   r3   r4   rJ   r   r/   )default_parameterestimator_parameter_mapZestnameparamsr   r    r    r%   )test_estimatorclasses_positive_constraintM  s    r   c                  C   s  dt j } tj| tddd\}}}tjdddd}t|j|D ]@\}}|dkrPq>||_|	| t t
||j }|d	k s>tq>td
ddD ]T}tjd|dd	| t}	tjd|ddd	| t}
t
|	j|
j }|dk stqt jt jjdd } | tj
j| dd } tj| tddd\}}}tjdddd}t|jd d |d d D ]:\}}||_|	| t t
||j }|d	k sPtqPd S )Nrd   rV   Tr   Fr   )r   r   r   r   rp   g333333?r   r   )r   rf   r   )r   rf   r   r   r<   r   rl   r   r   r    r    r%   $test_lasso_lars_vs_lasso_cd_positivec  sN    	
       $r   c                  C   s
  t dddddg} t dddddgdd	dddgd
ddddgdddddgdddddgg}|j}t ddddddddddg
ddddddddddg
ddddd d!ddd"d#g
dddd$d%d&d'd(d)d*g
ddd+d,d-d.d/d0d1d2g
g}tjdd3d4}|||  |j}t||d5d6 d S )7NgMPg~5j2gW:!g>ޒ}@g@Jk3gJE?r   g!?gŖX~s?g%haE?g;4g\P?g8k荿g0HUngx2Fڤ?gYQ?g{J2ghXJ?g=Da?g%7g{?gZ,SgrTg[0Tg#l/TgJ#Ug޿g)44ә?gW]g` g&gdug
fտg>S?gQ7X?gnrCO;@g/z@@g|~@g#B@gN)@gS@gQT잇@gVs5~gtTXlgFgBFgm_gGg8GgӫGg`HF)rf   r      r   )rB   rv   rA   r   r	   r-   rH   r   )r4   r   r3   rZmodel_lasso_larsZ	skl_betasr    r    r%   #test_lasso_lars_vs_R_implementation  s|    

6r   rt   c                 C   sb   t | dd}tjd}|ddd}| }|dddf }||| | t||ks^tdS )zq
    Test that user input regarding copy_X is not being overridden (it was until
    at least version 0.21)

    F)rt   r   r   r   r   rr   Nr   	r   rB   rw   rx   normalr   r-   Zarray_equalr/   rt   Z
lasso_larsr0   r3   ZX_copyr4   r    r    r%   test_lasso_lars_copyX_behaviour  s    r   c                 C   sd   t dd}tjd}|ddd}| }|dddf }|j||| d | t||ks`tdS )	zS
    Test that user input to .fit for copy_X overrides default __init__ value

    Fr   r   r   r   Nr   )rt   r   r   r    r    r%   #test_lasso_lars_fit_copyX_behaviour  s    
r   estr<   re   c                 C   s   t dddddgdddddgg}ddg}dddddg}| jdd t| jddd	}| || ||| t | j|j d
 dkstt jj	|j|dd d S )Nr   g      g      r   g      @Fr   gHz>)jitterr   r   r   r<   )rtol)
rB   rv   
set_paramsr   r-   ZmeanrJ   r/   r   r   )r   r3   r4   Zexpected_coefZ
est_jitterr    r    r%   test_lars_with_jitter  s    "r   c                	   C   s.   t jtdd td dgdd W 5 Q R X d S )Nz$X cannot be None if Gram is not Noner   r   znot None)r3   r4   rQ   )r[   r\   r]   r   r    r    r    r%   test_X_none_gram_not_none%  s    r   c                  C   sL   t jd} | dd}| d}| }tj||dddd t|| d S )Nr   r   rs   TrV   )rQ   rt   r:   )rB   rw   rx   r(   r   r   r   r   )r0   r3   r4   ZX_beforer    r    r%   test_copy_X_with_auto_gram*  s    
r  zLARS, has_coef_path, argsru   rr   dtypec                 C   s|   t jd}|dd|}|d|}| f |}||| |jj|ksTt|rh|j	j|ksht|j
j|ksxtd S )Nr   r   r   )rB   rw   rx   r(   astyper-   rJ   r  r/   rH   
intercept_)LARShas_coef_pathargsr  r0   r3   r4   r5   r    r    r%   test_lars_dtype_match7  s    
r  c           
      C   s   d}d}t jd}|dd}|d}| f |||}| f ||t j|t j}	t|j|	j||d |rt|j	|	j	||d t|j
|	j
||d d S )Ngh㈵>r   r9   r   )r   atol)rB   rw   rx   r(   r-   r  float32r   rJ   rH   r  )
r  r  r  r   r	  r0   ZX_64Zy_64Zmodel_64Zmodel_32r    r    r%   test_lars_numeric_consistencyR  s    
"r  	criterionr   r   c                 C   s>   t t t| d}|tt t|d j}|dks:t	dS )zCheck that we properly compute the AIC and BIC score.

    In this test, we reproduce the example of the Fig. 2 of Zou et al.
    (reference [1] in LassoLarsIC) In this example, only 7 features should be
    selected.
    )r  rl   r   N)
r   r   r   r-   r3   r4   rB   ZargminZ
criterion_r/   )r  r5   Zbest_alpha_selectedr    r    r%    test_lassolarsic_alpha_selectionq  s    r  c              	   C   s   t jd}tjdd|  |d\}}tt t| d}d}tj	t
|d ||| W 5 Q R X |jdd	 |||| d
S )ziCheck the behaviour when `n_samples` < `n_features` and that one needs
    to provide the noise variance.r   r9      )r1   r2   r   r   zhYou are using LassoLarsIC in the case where the number of samples is smaller than the number of featuresr   rn   )Zlassolarsic__noise_varianceN)rB   rw   rx   r   Zmake_regressionr   r   r   r[   r\   r]   r-   r   r   )r   r0   r3   r4   r5   r   r    r    r%   test_lassolarsic_noise_variance  s      
r  )F)`r)   ZnumpyrB   r[   Zscipyr   Zsklearnr   r   Zsklearn.baser   Zsklearn.exceptionsr   Zsklearn.linear_modelr   r   r	   r
   r   r   Z!sklearn.linear_model._least_angler   Zsklearn.model_selectionr   Zsklearn.pipeliner   Zsklearn.preprocessingr   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   r   Zload_diabetesr   r   r   r3   r4   rC   rA   rR   rX   sizer1   markfilterwarningsZfilterwarnings_normalizeZparametrizer6   rP   rS   rU   rZ   r^   rc   rk   rm   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  Zfloat64r  r  r  r  r    r    r    r%   <module>   s      	



	 %
!


	

4W
