o
    iE                  
   @   s  d 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
mZmZ ddl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g d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ejdedd Zejdeejdddgejdddgejde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 ejdddgd%d& Z!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)HalfBinomialLossHalfMultinomialLossHalfPoissonLoss)make_low_rank_matrix)LinearModelLoss)squared_norm)CSR_CONTAINERS   *   c                    sH  t j| || j }t|| d}| |}| jjrk| jj} j	|d |d || d|j
dd< | jrK||ddddf j |dddf  }	n||j }	| jj|	}
 fdd}|t ||
d	t j}n4 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 e/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/linear_model/tests/test_linear_loss.pychoice_vectorized8   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+   raw_predictionprobar#   yr!   r   r"   random_X_y_coef   sB   

,

r7   r)   r'   FTr   )r   r   
   dtypec           
      C   s   t |  |d}tj|}|jd|fd}|j||d}|jjr7|jj}	|j	|	|| fks/J |j
d s6J n
|j	|| fksAJ |du rN|j|jksMJ n|j|ksUJ t|dks^J dS )z4Test that init_zero_coef initializes coef correctly.r)   r'      )r   )r9   ZF_CONTIGUOUSNr   )r	   r$   r%   r&   normalr(   r)   r*   r+   r   flagsr9   Zcount_nonzero)
r)   r'   r   r9   global_random_seedlossr    r2   r3   r+   r!   r!   r"   test_init_zero_coefP   s   r@   sample_weightrangel2_reg_strengthr   csr_containerc           #   	   C   s  t |  |d}t|dd|d\}}}	| | |	 }
}}|dkr2tjd|jd |jd d}|j|	||||d	}|j|	||||d	}|j|	||||d	\}}|j	|	||||d	\}}|j
|	||||d	\}}}t|| t|| t|| t|| t||jd
d ||jd
d t|	}tj|	|	j|	jfd}|j
|	||||||d\}}}t||sJ t||sJ t|| t|| t|| t|| ||}|j|	||||d	}|j|	||||d	}|j|	||||d	\}}|j	|	||||d	\}} |j
|	||||d	\}!}"}t|| t|| t|| t|| t|| t||| | t||! t||" t||
 t| |
 t|| t|	| dS )zDTest that loss and gradient are the same across different functions.r:   r8   r;   r0   r   r   r1   rB   r   r   numrA   rC   Forder)r   )rA   rC   gradient_outhessian_outN)r	   r7   copyr$   linspacer   r?   gradientloss_gradientgradient_hessian_productgradient_hessianr   ravelZ
empty_liker   Zshares_memoryZtoarray)#r)   r'   rA   rC   rD   r>   r?   r2   r6   r3   ZX_oldZy_oldZcoef_oldl1g1l2g2g3Zh3Zg4Zh4_Zg_outZh_outZg5Zh5ZXsZl1_spZg1_spZl2_spZg2_spZg3_spZh3_spZg4_spZh4_spr!   r!   r"    test_loss_grad_hess_are_the_samek   s   










"
	



















r[   X_containerc                 C   s  t |  dd}t |  dd}d\}}t||||d\}	}
}d|	dddf< |	ddddf }|dur7||	}	|d	krItjd|
jd
 |
jd
 d}|j||	|
||d\}}|j||	|
||d\}}|j|||
||d\}}|j|||
||d\}}|t|d| t	|j
d   ksJ |}|j
d  ||j
d  7  < t|| tj|j|j }||}||}|}|j
d  ||j
d  7  < t|| dS )z7Test that loss and gradient handle intercept correctly.Fr:   Tr8   r;   rE   r   Nr   rB   r   rF   rH   g      ?)r	   r7   r$   rO   r   rQ   rR   pytestZapproxr
   r-   r   r%   r&   randn)r)   rA   rC   r\   r>   r?   Z
loss_interr   r   r2   r6   r3   ZX_interlgrZ   hesspZl_interZg_interZhessp_interZg_inter_correctedr   hZh_interZh_inter_correctedr!   r!   r"   #test_loss_gradients_hessp_intercept   sR   









rd   c              	      sv  t |  |dd\}}t|||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.
    r:   r]   rE   rI   rJ   rB   r   r   rF   gư>rH   c                    s   j |   dS )NrH   r?   r3   r2   epsrC   r?   rA   r6   r!   r"   <lambda>*  s    z5test_gradients_hessians_numerically.<locals>.<lambda>r   c                    s   j | d   dS )Nr   rH   re   rf   rg   r!   r"   ri   6  s    
      g{Gz?g:0yE>)rtolZatolgMbP?   c              	      s(   g | ]}j |   d qS )rH   )rP   ).0t)r2   r3   rC   r?   rA   vectorr6   r!   r"   
<listcomp>N  s    
z7test_gradients_hessians_numerically.<locals>.<listcomp>r   N)rl   )r	   r7   rT   r$   rO   r   rR   r   Zapprox_fprimer   Z
zeros_likearraymeanr   ZlstsqZnewaxis)r)   r'   rA   rC   r>   r   r   ra   rb   Z	approx_g1Z	approx_g2Zapprox_gZhess_colZd_xZd_gradZapprox_hess_colr!   )r2   r3   rh   rC   r?   rA   rp   r6   r"   #test_gradients_hessians_numerically  sP   


"rt   c                 C   s  t t | d}d\}}t||||d\}}}tj|j|j }||||\}	}
|	|||}|
|||\}}||}|
j|jksEJ |j|jksMJ t|
| t|
| ||||\}}}|j|jksiJ |j|j|jfkstJ |jdd}|jdd}||||\}}|	|||}|
|||\}}||}|j|jksJ |j|jksJ 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.r:   r]   rE   rI   rJ   r   N)r	   r   r7   r$   r%   r&   r_   r   rQ   rP   rR   r   rS   r   rT   reshaper)   r+   )r'   r>   r?   r   r   r2   r6   r3   r   r`   ra   rV   rX   rb   rc   rY   hessrZ   Zcoef_rZs_rZl_rZg_rZg1_rZg2_rZhessp_rZh_rr!   r!   r"   test_multinomial_coef_shape^  s@   



rw   c              	   C   s  d\}}}t t|ddd}t||||d\}}}|jdd}| dkr1tjd	|jd
 |jd
 d} |j|||| d
d\}	}
}t|
|
j	 |
||\}}}|jj||| d\}}t|ddd
f t|ddd	f t|dddf ttdf\}}}}t|||  | | | | g| | |||  | | g| | | | |||  gg}|||||f}| du r|| }n	|| t|  9 }td|||}t|dd}|j|| || dd}t||j	 t|
| dS )a  Test multinomial hessian for 3 classes and 2 points.

    For n_classes = 3 and n_samples = 2, we have
      p0 = [p0_0, p0_1]
      p1 = [p1_0, p1_1]
      p2 = [p2_0, p2_1]
    and with 2 x 2 diagonal subblocks
      H = [p0 * (1-p0),    -p0 * p1,    -p0 * p2]
          [   -p0 * p1, p1 * (1-p1),    -p1 * p2]
          [   -p0 * p2,    -p1 * p2, p2 * (1-p2)]
      hess = X' H X
    )r   r;   rk   )r+   Fr:   rE   rI   rJ   rB   r   r   rF   rH   )Zy_truer4   rA   Nr   zij, mini, ik->jmnkrk   C)r	   r   r7   rT   r$   rO   r   rS   r   r-   Zweight_intercept_rawr)   Zgradient_probaZdiagonesblockru   r   ZeinsumZmoveaxis)rA   r>   r   r   r+   r?   r2   r6   r3   Zgradrv   rZ   weightsZ	interceptr4   Zgrad_pointwiser5   Zp0dZp1dZp2dZonedrc   Zhess_expectedr!   r!   r"   "test_multinomial_hessian_3_classes  sb   



r|   c            	      C   s  d\} }}t t dd}t| |f}t| }||}td}tjtdd |j	||||dd W d   n1 s>w   Y  td}tjtd	d |j	|||d|d W d   n1 sdw   Y  t t
 dd}||}td
| |fddd
 }tjtdd |j	||||d W d   n1 sw   Y  td
| | || fddd
 }tjtdd |j	|||d|d W d   dS 1 sw   Y  dS )z;Test that wrong gradient_out and hessian_out raises errors.)r;   r   rk   Fr:   r   z1gradient_out is required to have shape coef.shape)matchN)r3   r2   r6   rL   rM   z%hessian_out is required to have shaper   z!gradient_out must be F-contiguous)r3   r2   r6   rL   zhessian_out must be contiguous)r	   r   r$   ry   r(   Zzerosr^   Zraises
ValueErrorrS   r   )	r   r   r+   r?   r2   r6   r3   rL   rM   r!   r!   r"   =test_linear_loss_gradient_hessian_raises_wrong_out_parameters  s`   





	
$"r   )r   r   )#__doc__numpyr$   r^   Znumpy.testingr   Zscipyr   r   Zsklearn._loss.lossr   r   r   Zsklearn.datasetsr   Z!sklearn.linear_model._linear_lossr	   Zsklearn.utils.extmathr
   Zsklearn.utils.fixesr   ZLOSSESr7   markZparametrizeZfloat32r/   Zint64r@   r[   rd   rt   rw   r|   r   r!   r!   r!   r"   <module>   sN    

4[7T
(
H