U
    }h1                  
   @   s  d Z ddlZddlZddlmZ ddlmZmZm	Z	 ddl
mZmZmZ ddlmZ ddlmZ ddlmZ eeegZd#ddZejdeejdddgejddddgejddejejejgdd Zejdeejdddgejdddgejdddgdd Zejdeejdddgejdddgejdddgdd Zejdeejdddgejdddgejdddgdd  Zejdddgd!d" ZdS )$z
Tests for LinearModelLoss

Note that correctness of losses (which compose LinearModelLoss) is already well
covered in the _loss module.
    N)assert_allclose)linalgoptimizesparse)HalfBinomialLossHalfMultinomialLossHalfPoissonLoss)make_low_rank_matrix)LinearModelLoss)squared_norm   *   c                    sJ  t j| || j }t|| d}| |}| jjr| jj} j	|d |d || d|j
dd< | jr||ddddf j |dddf  }	n
||j }	| jj|	}
 fdd}|t ||
d	t j}nj j	|d |d |d|j
dd< | jr||dd  |d  }	n|| }	| jj|	 j	dd|d }|||fS )
z-Random generate y, X and coef in valid range.)	n_samples
n_featuresZrandom_stater      )lowhighsizeNc                    s@   |j dd} |jd d d d f }||k jdd}| | S )Nr   Zaxisr   )ZcumsumZrandshapesum)itemspsrkrng O/tmp/pip-unpacked-wheel-ig1s1lm8/sklearn/linear_model/tests/test_linear_loss.pychoice_vectorized6   s    z*random_X_y_coef.<locals>.choice_vectorized)r   )nprandomRandomStatefit_interceptr	   init_zero_coef	base_lossis_multiclass	n_classesuniformZflatTlinkZinverseZarangeZastypefloat64)linear_model_lossr   r   Z
coef_boundseedZn_dofXcoefr+   Zraw_predictionZprobar#   yr!   r   r"   random_X_y_coef   sB    

,
r5   r)   r'   FTr   r   
   dtypec           	      C   s   t |  |d}tjd}|jd|fd}|j||d}|jjrn|jj}|j	||| fks^t
|jd st
n|j	|| fkst
|dkr|j|jkst
n|j|kst
t|dkst
dS )	z4Test that init_zero_coef initializes coef correctly.r)   r'   r      )r   )r7   ZF_CONTIGUOUSNr   )r
   r$   r%   r&   normalr(   r)   r*   r+   r   AssertionErrorflagsr7   Zcount_nonzero)	r)   r'   r   r7   lossr    r2   r3   r+   r!   r!   r"   test_init_zero_coefN   s    r>   sample_weightrangel2_reg_strengthc              	   C   s  t |  |d}t|dddd\}}}|dkrHtjd|jd |jd d	}|j|||||d
}|j|||||d
}	|j|||||d
\}
}|j|||||d
\}}| j	s|j
|||||d
\}}}n*tt |j
|||||d
 W 5 Q R X t||
 t|	| t|	| | j	s.t|	| t|| || t|}|j|||||d
}|j|||||d
}|j|||||d
\}}|j|||||d
\}}| j	s|j
|||||d
\}}}t|| t|| t|	| t|	| t|	| t||	|| | j	st|	| t|| ||  dS )zDTest that loss and gradient are the same across different functions.r8   r6   r9   r   r0   r   r   r1   r@   r   r   numr?   rA   N)r
   r5   r$   linspacer   r=   gradientloss_gradientgradient_hessian_productr*   Zgradient_hessianpytestZraisesNotImplementedErrorr   r   
csr_matrix)r)   r'   r?   rA   r=   r2   r4   r3   l1g1l2g2Zg3h3Zg4h4_Zl1_spZg1_spZl2_spZg2_spZg3_spZh3_spZg4_spZh4_spr!   r!   r"    test_loss_grad_hess_are_the_sameg   s                   
    
    




            
    
    





rT   X_sparsec                 C   s  t |  dd}t |  dd}d\}}t|||dd\}}	}
d|ddd	f< |dddd	f }|rlt|}|d
krtjd|	jd |	jd d}|j|
||	||d\}}|j|
||	||d\}}|j|
||	||d\}}|j|
||	||d\}}|t	
|d| t|
jd	   kst|}|jd	  ||
jd	  7  < t|| tjdj|
j }||}||}|}|jd	  ||jd	  7  < t|| dS )z7Test that loss and gradient handle intercept correctly.Fr8   Tr6   r9   r   rB   r   Nr   r@   r   rC   rE   g      ?)r
   r5   r   rL   r$   rF   r   rH   rI   rJ   Zapproxr   r-   r;   r   r%   r&   randn)r)   r?   rA   rU   r=   Z
loss_interr   r   r2   r4   r3   ZX_interlgrS   hesspZl_interZg_interZhessp_interZg_inter_correctedr   hZh_interZh_inter_correctedr!   r!   r"   #test_loss_gradients_hessp_intercept   sr       

    
    
    
    

r\   c              	      sv  t |  |dd\}}t||dd\ jdddkr\tjdjd	 jd	 d
dj d\}}t fddd }t fddd }	d| |	 d }
t	||
ddd t
|dd< |}dt d}t fdd|D }||jd	d8 }t|ddtjf |d	  }t	||dd dS )zTest gradients and hessians with numerical derivatives.

    Gradient should equal the numerical derivatives of the loss function.
    Hessians should equal the numerical derivatives of gradients.
    r8   rV   r   rB   Forderr@   r   r   rC   gư>rE   c                    s   j |   dS )NrE   r=   r3   r2   epsrA   r=   r?   r4   r!   r"   <lambda>  s   z5test_gradients_hessians_numerically.<locals>.<lambda>r   c                    s   j | d   dS )Nr   rE   r`   ra   rb   r!   r"   rd     s   
      g{Gz?g:0yE>)rtolZatolgMbP?   c              	      s(   g | ] }j |   d qS )rE   )rG   ).0t)r2   r3   rA   r=   r?   vectorr4   r!   r"   
<listcomp>3  s   
z7test_gradients_hessians_numerically.<locals>.<listcomp>r   N)rg   )r
   r5   ravelr$   rF   r   rI   r   Zapprox_fprimer   Z
zeros_likearrayZmeanr   ZlstsqZnewaxis)r)   r'   r?   rA   r   r   rY   rZ   Z	approx_g1Z	approx_g2Zapprox_gZhess_colZd_xZd_gradZapprox_hess_colr!   )r2   r3   rc   rA   r=   r?   rk   r4   r"   #test_gradients_hessians_numerically   sX           

"ro   c                 C   sp  t t | d}d\}}t|||dd\}}}tjdj|j }||||\}}	|	|||}
|
|||\}}||}|	j|jkst|j|jkstt|	|
 t|	| |jdd}|jdd}||||\}}|	|||}|
|||\}}||}|j|jkst|j|jks$tt|| t|| t|	|j|jjddd t||j|jjddd dS )	z=Test that multinomial LinearModelLoss respects shape of coef.r8   rV   r   rB   r]   r^   r   N)r
   r   r5   r$   r%   r&   rW   r   rH   rG   rI   r;   r   rm   Zreshaper)   r+   )r'   r=   r   r   r2   r4   r3   r   rX   rY   rN   rP   rZ   r[   Zcoef_rZs_rZl_rZg_rZg1_rZg2_rZhessp_rZh_rr!   r!   r"   test_multinomial_coef_shapeC  s:       



rp   )r   r   ) __doc__Znumpyr$   rJ   Znumpy.testingr   Zscipyr   r   r   Zsklearn._loss.lossr   r   r   Zsklearn.datasetsr	   Z!sklearn.linear_model._linear_lossr
   Zsklearn.utils.extmathr   ZLOSSESr5   markZparametrizeZfloat32r/   Zint64r>   rT   r\   ro   rp   r!   r!   r!   r"   <module>   sD   
   
4K4Q