
    sgD              
          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 ej.                  j1                  dddg      d        Z!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        ^/var/www/html/venv/lib/python3.12/site-packages/sklearn/linear_model/tests/test_linear_loss.pychoice_vectorizedz*random_X_y_coef.<locals>.choice_vectorized8   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   P   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      \  }}}|j                         |j                         |j                         }}
}	|dk(  r2t        j                  d|j
                  d   |j
                  d   	      }|j                  |||||
      }|j                  |||||
      }|j                  |||||
      \  }}|j                  |||||
      \  }}|j                  |||||
      \  }}}t        ||       t        ||       t        ||       t        ||       t        ||j                  d      z   ||      j                  d             t        j                  |      }t        j                  ||j                  |j                  f      }|j                  |||||||      \  }}}t        j                  ||      sJ t        j                  ||      sJ t        ||       t        ||       t        ||       t        ||        ||      }|j                  |||||
      }|j                  |||||
      }|j                  |||||
      \  }}|j                  |||||
      \  }}|j                  |||||
      \  } }!}t        ||       t        ||       t        ||       t        ||       t        ||       t         ||       ||             t        ||        t        ||!       t        ||	       t        |j!                         |	       t        ||
       t        ||       y)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   Forder)r   )rL   rN   gradient_outhessian_outN)r
   r?   copyr&   linspacer   rJ   gradientloss_gradientgradient_hessian_productgradient_hessianr   ravel
empty_liker   shares_memorytoarray)"r+   r)   rL   rN   rO   rJ   r:   r>   r;   X_oldy_oldcoef_oldl1g1l2g2g3h3g4h4_g_outh_outg5h5Xsl1_spg1_spl2_spg2_spg3_sph3_spg4_sph4_sps"                                     r#    test_loss_grad_hess_are_the_samer}   i   st    Y[ND "JAq$ VVXqvvx(5EAqwwqzqwwqzB	a- 
 
B 
a- 
 
B a-   FB **a- + FB %%a- & IBA BBBBB,,bflll.EFMM$EMM$tyy$))&<=E%%		#' & IBA B&&&B&&&BBBB 
q	BIIb!=/  E MMb!=/  E %%b!=/ & LE5 00b!=/ 1 LE5 ++b!=/ , OE5! BBBBBBrFE%L)BB AuBJJL%(AuD(#r%   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&   r[   r   r]   r^   pytestapproxr   r0   r   r'   r(   randn)r+   rL   rN   r~   rJ   
loss_interr   r   r:   r>   r;   X_interlgro   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   r   rD   rQ   rU   rV   rM   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?   r`   r&   r[   r   r^   r   approx_fprimer   
zeros_likearrayr\   meanr   lstsqnewaxis)r+   r)   rL   rN   r   r   r;   r   r   	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                  |||      \  }}}|j                  |j                  k(  sJ |j                  |j                  |j                  fk(  sJ |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   r   rD   rQ   rU   rV   r   N)r
   r   r?   r&   r'   r(   r   r   r]   r\   r^   r   r_   r   r`   reshaper+   r-   )r)   rJ   r   r   r:   r>   r;   r   r   r   rh   rj   r   r   rk   hessro   coef_rs_rl_rg_rg1_rg2_rhessp_rh_rs                            r#   test_multinomial_coef_shaper   Q  s(    %8%:-XD!Iz )
QSJAq$ 			b!''4AdAq)DAq	tQ	"B--dAq9IBaA77djj   77djj   ArAr''a3KBa88tzz!!!::$))TYY////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%   c           	         d\  }}}t        t        |      d      }t        |||d      \  }}}|j                  d      }| d	k(  r2t	        j
                  d
|j                  d   |j                  d         } |j                  |||| d      \  }}	}
t        |	|	j                         |j                  ||      \  }}}|j                  j                  |||       \  }}t	        j                  |dddf         t	        j                  |ddd
f         t	        j                  |dddf         t	        j                  t	        j                  d            f\  }}}}t	        j                  |||z
  z  | |z  | |z  g| |z  |||z
  z  | |z  g| |z  | |z  |||z
  z  gg      }|j!                  ||||f      }| ||z  }n|| t	        j"                  |       z  z  }t	        j$                  d|||      }t	        j&                  |dd      }|j!                  ||z  ||z  d      }t        ||j                         t        |	|       y)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   rE   r   )r-   FrC   rD   rQ   rU   rV   rM   r   r   rR   rT   )y_truer<   rL   Nr   zij, mini, ik->jmnkr   C)r
   r   r?   r`   r&   r[   r   r_   r   r0   weight_intercept_rawr+   gradient_probadiagonesblockr   r   einsummoveaxis)rL   r   r   r-   rJ   r:   r>   r;   gradr   ro   weights	interceptr<   grad_pointwiser=   p0dp1dp2donedr   hess_expecteds                         r#   "test_multinomial_hessian_3_classesr   w  sq    (/$Iz9%	:%D !)
QSJAq$ ::C: DAqwwqzqwwqzB))		# * MD$ D$&&!)-)B)B4)K&GY NN99%# : NE 	ad
ad
ad

	Cc4 	D3J#cTCZ8TCZs
+cTCZ8TCZ#SD3J%78	
	A 	
		9iI>?A	Y	]RVVM222II2Aq!<MKKq!4M!))J	J 6c * M M=??3D-(r%   c                     d\  } }}t        t               d      }t        j                  | |f      }t        j                  |       }|j	                  |      }t        j
                  d      }t        j                  t        d      5  |j                  ||||d       ddd       t        j
                  d      }t        j                  t        d	      5  |j                  |||d|       ddd       t        t               d      }|j	                  |      }t        j
                  d
|z  |f      ddd
   }t        j                  t        d      5  |j                  ||||       ddd       t        j
                  d
|z  |z  ||z  f      ddd
   }t        j                  t        d      5  |j                  |||d|       ddd       y# 1 sw Y   9xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z;Test that wrong gradient_out and hessian_out raises errors.)rE   r   r   FrC   r   z1gradient_out is required to have shape coef.shape)matchN)r;   r:   r>   rX   rY   z%hessian_out is required to have shaper   z!gradient_out must be F-contiguous)r;   r:   r>   rX   zhessian_out must be contiguous)r
   r   r&   r   r*   zerosr   raises
ValueErrorr_   r   )	r   r   r-   rJ   r:   r>   r;   rX   rY   s	            r#   =test_linear_loss_gradient_hessian_raises_wrong_out_parametersr     s   '.$Iz9%5%7uMD
J'(A
	Aq!D88A;L	M
 	
 	% 	 	
	
 ((1+K	z)P	Q 
# 	 	

 %8%:%PDq!D88Q]J781=L	z)L	M 
%	 	 	

 ((A	MJ6	J8NOPQTSTQTUK	z)I	J 
# 	 	

 
?	
 	

 

 

 
s0   	GG$G07G<G!$G-0G9<H))r   rD   )#__doc__numpyr&   r   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   r}   r   r   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S$ : 4 ; 9 .
S$l 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J 4/:B) ;B)J.
r%   