
    h$,f32              
       ~   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
Zej.                  j1                  de      ej.                  j1                  dddg      ej.                  j1                  dg d      ej.                  j1                  ddej2                  ej4                  ej6                  g      d                             Zej.                  j1                  de      ej.                  j1                  dddg      ej.                  j1                  dddg      ej.                  j1                  dddg      ej.                  j1                  de      d                                    Zej.                  j1                  de      ej.                  j1                  dddg      ej.                  j1                  dddg      ej.                  j1                  dedgz         d                             Zej.                  j1                  de      ej.                  j1                  dddg      ej.                  j1                  dddg      ej.                  j1                  dddg      d                             Zej.                  j1                  dddg      d        Z y)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_CONTAINERSc                    t         j                  j                  |      || j                  z   }t	        ||      }| j                  |      }| j                  j                  r| j                  j                  }j                  |d   |d   ||z        |j                  dd | j                  r#||ddddf   j                  z  |dddf   z   }	n||j                  z  }	| j                  j                  j                  |	      }
fd} |t        j                  |      |
      j                  t         j                         }nj                  |d   |d   |      |j                  dd | j                  r||dd z  |d   z   }	n||z  }	| j                  j                  j                  |	j                  dd|      z         }|||fS )	z-Random generate y, X and coef in valid range.)	n_samples
n_featuresrandom_stater      )lowhighsizeNc                     |j                  d      }j                  |j                  d         d d d f   }||k  j                  d      }| |   S )Nr   axisr   )cumsumrandshapesum)itemspsrkrngs        Klib/python3.12/site-packages/sklearn/linear_model/tests/test_linear_loss.pychoice_vectorizedz*random_X_y_coef.<locals>.choice_vectorized7   sO    a A$QW-AQ#A8O    )r   )nprandomRandomStatefit_interceptr	   init_zero_coef	base_lossis_multiclass	n_classesuniformflatTlinkinversearangeastypefloat64)linear_model_lossr   r   
coef_boundseedn_dofXcoefr-   raw_predictionprobar$   yr"   s                @r#   random_X_y_coefr?      s    ))


%C*888E	A
 ++A.D""00%//99	{{1AU" # 
		!
 **a"f/$q"u+=NZN!++0088H	 bii	2e<CCBJJO{{1A # 
		!
 **cr]T"X5NXN'',,44S[[Rai[HH
 a:r%   r+   r)   FTr   )r   r   
   dtypec                    t         |        |      }t        j                  j                  d      }|j	                  d|f      }|j                  ||      }|j                  j                  r=|j                  j                  }|j                  |||z   fk(  sJ |j                  d   sJ |j                  ||z   fk(  sJ ||j                  |j                  k(  sJ |j                  |k(  sJ t        j                  |      dk(  sJ y)	z4Test that init_zero_coef initializes coef correctly.r+   r)   *      )r   )rA   F_CONTIGUOUSNr   )r
   r&   r'   r(   normalr*   r+   r,   r-   r   flagsrA   count_nonzero)	r+   r)   r   rA   lossr"   r:   r;   r-   s	            r#   test_init_zero_coefrK   O   s     Y[ND
))


#C

J
(Aq.D~~##NN,,	zzim)CDDDDzz.)))zzj=8::::}zzQWW$$$zzU"""D!Q&&&r%   sample_weightrangel2_reg_strengthr   csr_containerc                    t         |        |      }t        |ddd      \  }}}|dk(  r2t        j                  d|j                  d   |j                  d   	      }|j                  |||||
      }	|j                  |||||
      }
|j                  |||||
      \  }}|j                  |||||
      \  }}| j                  s|j                  |||||
      \  }}}n8t        j                  t              5  |j                  |||||
       ddd       t        |	|       t        |
|       t        |
|       | j                  s!t        |
       t        |z   ||              ||      }|j                  |||||
      }|j                  |||||
      }|j                  |||||
      \  }}|j                  |||||
      \  }}| j                  s|j                  |||||
      \  }}}t        |	|       t        |	|       t        |
|       t        |
|       t        |
|       t         ||
       ||             | j                  st        |
       t        z  |z         yy# 1 sw Y   gxY w)zDTest that loss and gradient are the same across different functions.rC   r@   rE   rD   r6   r   r   r8   rM   r   r   numrL   rN   N)r
   r?   r&   linspacer   rJ   gradientloss_gradientgradient_hessian_productr,   gradient_hessianpytestraisesNotImplementedErrorr   )r+   r)   rL   rN   rO   rJ   r:   r>   r;   l1g1l2g2g3h3g4h4_l1_spg1_spl2_spg2_spg3_sph3_spg4_sph4_sps                             r#    test_loss_grad_hess_are_the_samern   h   s    Y[ND "JAq$ AqwwqzqwwqzB	a- 
 
B 
a- 
 
B a-   FB **a- + FB ""))!Qm_ * 
	B ]]./ 	!!+ / " 	 BBB""BRB( 	aAIIa-  E MMa-  E %%a- & LE5 00a- 1 LE5 ""//!Qm_ 0 
ua BBBBBBrFE%L)""E"R/ #S	 	s   ;I77JX_containerc           	         t         |        d      }t         |        d      }d\  }}t        |||d      \  }}	}
d|ddd	f<   |dddd	f   }| ||      }|d
k(  r2t        j                  d|	j                  d   |	j                  d         }|j                  |
||	||      \  }}|j                  |
||	||      \  }}|j                  |
||	||      \  }}|j                  |
||	||      \  }}|t        j                  |d|z  t        |
j                  d	         z  z         k(  sJ |}|j                  d	xx   ||
j                  d	   z  z  cc<   t        ||       t        j                  j                  d      j                  |
j                   } ||      } ||      }|}|j                  d	xx   ||j                  d	   z  z  cc<   t        ||       y)z7Test that loss and gradient handle intercept correctly.FrC   Tr@   rE   rD   rQ   r   Nr   rM   r   rR   rT   g      ?)r
   r?   r&   rU   r   rW   rX   rZ   approxr   r0   r   r'   r(   randn)r+   rL   rN   ro   rJ   
loss_interr   r   r:   r>   r;   X_interlgre   hesspl_interg_interhessp_interg_inter_correctedr   hh_interh_inter_correcteds                           r#   #test_loss_gradients_hessp_interceptr      s    Y[FD 9;dKJ!Iz )
QSJAq$ AaeH	3B3G NAqwwqzqwwqzBa-  DAq ,,a- - HAu "//gq 0 GW  88gq 9 NA{
 #',tvvbz*BBB     ;;A()
		b!''4AaA!nGR88A()r%   c                    t         |        |      d\  }}t        ||d      \  }|j                  d      }dk(  r2t        j                  dj
                  d	   j
                  d	   
      dj                  |      \  }}t        j                  |fddz        }	t        j                  |fddz        }
d|	z  |
z
  dz  }t        ||dd       t        j                  |      }d|d<    ||      }dt        j                   d      }t        j                  |D cg c]  }j                  |||z  z           c}      }||j                  d	      z  }t        j                  |ddt        j                   f   |      d	   j                         }t        ||d       yc c}w )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.
    rC   rq   rD   rQ   ForderrM   r   r   rR   gư>rT   c                 6    j                  | z
        S )NrT   rJ   r;   r:   epsrN   rJ   rL   r>   s    r#   <lambda>z5test_gradients_hessians_numerically.<locals>.<lambda>  s(    TYY3J'+  
 r%      c                 <    j                  | dz  z
        S )Nr   rT   r   r   s    r#   r   z5test_gradients_hessians_numerically.<locals>.<lambda>  s,    TYY1s7N'+  
 r%         g{Gz?g:0yE>)rtolatolgMbP?   r   N)r   )r
   r?   ravelr&   rU   r   rX   r   approx_fprimer   
zeros_likearrayrV   meanr   lstsqnewaxis)r+   r)   rL   rN   r   r   r;   rw   rx   	approx_g1	approx_g2approx_gvectorhess_cold_xtd_gradapprox_hess_colr:   r   rJ   r>   s     ``              @@@@r#   #test_gradients_hessians_numericallyr      s    Y[ND!Iz )
QSJAq$ ::C: DAqwwqzqwwqzB C,,a- - HAu &&	
 	
 	
C
I &&	
 	
 	
C
I I	)Q.HAxd6 ]]1FF1IV}H C
++sdC
$CXX 		
  MMq6z!+ /  		
F fkkqk!!Fll3q"**}#5v>qAGGIOOXD9		
s   #Gc                 ,   t        t               |       }d\  }}t        |||d      \  }}}t        j                  j                  d      j                  |j                   }|j                  |||      \  }}	|j                  |||      }
|j                  |||      \  }} ||      }|	j                  |j                  k(  sJ |j                  |j                  k(  sJ t        |	|
       t        |	|       |j                  d      }|j                  d      }|j                  |||      \  }}|j                  |||      }|j                  |||      \  }} ||      }|j                  |j                  k(  sJ |j                  |j                  k(  sJ t        ||       t        ||       t        |	|j                  |j                  j                  dd             t        ||j                  |j                  j                  dd             y)	z=Test that multinomial LinearModelLoss respects shape of coef.rC   rq   rD   rQ   r   r   r   N)r
   r   r?   r&   r'   r(   rs   r   rW   rV   rX   r   r   reshaper+   r-   )r)   rJ   r   r   r:   r>   r;   r   rv   rw   r^   r`   rx   r}   coef_rs_rl_rg_rg1_rg2_rhessp_rh_rs                         r#   test_multinomial_coef_shaper   E  s    %8%:-XD!Iz )
QSJAq$ 			b!''4AdAq)DAq	tQ	"B--dAq9IBaA77djj   77djj   ArArZZcZ"F
'''
C!!&!Q/HC==A&D11&!Q?MD'
#,C99$$$99$$$CCAs{{4>>#;#;Rs{KLAs{{4>>#;#;Rs{KLr%   ))r   rD   )!__doc__numpyr&   rZ   numpy.testingr   scipyr   r   sklearn._loss.lossr   r   r   sklearn.datasetsr	   !sklearn.linear_model._linear_lossr
   sklearn.utils.extmathr   sklearn.utils.fixesr   LOSSESr?   markparametrizefloat32r5   int64rK   rn   r   r   r    r%   r#   <module>r      s     ) " 
 2 = . . /	A HJ1h f-5$-8z24RZZ"JK' L 3 9 .'* f-5$-84/:*QF3.9H0 : 4 ; 9 .
H0V f-4/:*QF3$(?@1* A 4 ; .1*h f-5$-84/:*QF3N: 4 ; 9 .N:b 5$-8M 9Mr%   