
    PiE              
          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                            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                                                 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                                                             Zej                            de          ej                            dddg          ej                            dddg          ej                            dedgz             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                                                 Zej                            dddg          d             Z ej                            dddg          d             Z!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                 ~   t           j                            |          || j        z   }t	          ||          }|                     |          }| j        j        r| 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                            |	          }
fd} |t          j        |          |
                              t           j                  }n	                    |d         |d         |          |j
        dd<   | j        r||dd         z  |d         z   }	n||z  }	| 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                     |                     d          }                    |j        d                   d d d f         }||k                         d          }| |         S )Nr   axisr   )cumsumrandshapesum)itemspsrkrngs        /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/sklearn/linear_model/tests/test_linear_loss.pychoice_vectorizedz*random_X_y_coef.<locals>.choice_vectorized8   sZ    a  A$$QQQ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coefr1   raw_predictionprobar(   yr&   s                @r'   random_X_y_coefrC      s    )


%
%C*88E	 	 	A
 ++A..D"0 "
%/9	{{1AU" # 
 
	!!!
 * 	(aaa"f/$qqq"u+=NNZN!+088HH	 	 	 	 	 bi	22e<<<CCBJOO{{1A # 
 
	!!!
 * 	&crc]T"X5NNXN',44S[[Rai[HHH
 
 a:r)   r/   r-   FTr   )r   r   
   dtypec                    t           |             |          }t          j                            |          }|                    d|f          }|                    ||          }|j        j        r.|j        j        }	|j	        |	||z   fk    sJ |j
        d         sJ n|j	        ||z   fk    sJ ||j        |j        k    sJ n|j        |k    sJ t          j        |          dk    sJ dS )z4Test that init_zero_coef initializes coef correctly.r/   r-      )r   )rE   F_CONTIGUOUSNr   )r
   r*   r+   r,   normalr.   r/   r0   r1   r   flagsrE   count_nonzero)
r/   r-   r   rE   global_random_seedlossr&   r>   r?   r1   s
             r'   test_init_zero_coefrO   P   s    YY[[NNND
)

 2
3
3C

J
((Aq..D~# ;N,	zim)CDDDDDz.)))))zj=8:::::}zQW$$$$$zU""""D!!Q&&&&&&r)   sample_weightrangel2_reg_strengthr   csr_containerc           	         t           |             |          }t          |dd|          \  }}}	|                                |                                |	                                }}}
|dk    r-t          j        d|j        d         |j        d                   }|                    |	||||	          }|                    |	||||	          }|                    |	||||	          \  }}|	                    |	||||	          \  }}|
                    |	||||	          \  }}}t          ||           t          ||           t          ||           t          ||           t          ||                    d
          z   ||                              d
                     t          j        |	          }t          j        |	|	j        |	j        f          }|
                    |	||||||          \  }}}t          j        ||          sJ t          j        ||          sJ t          ||           t          ||           t          ||           t          ||            ||          }|                    |	||||	          }|                    |	||||	          }|                    |	||||	          \  }}|	                    |	||||	          \  }} |
                    |	||||	          \  }!}"}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.rG   rD   rH   r:   r   r   r<   rQ   r   r   numrP   rR   Forder)r   )rP   rR   gradient_outhessian_outN)r
   rC   copyr*   linspacer   rN   gradientloss_gradientgradient_hessian_productgradient_hessianr   ravel
empty_liker   shares_memorytoarray)#r/   r-   rP   rR   rS   rM   rN   r>   rB   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   k   sm    YY[[NNND "AS  JAq$ VVXXqvvxx(5EAqwqzqwqzBBB	a- 
 
 
B 
a- 
 
 
B a-    FB **a- +  FB %%a- &  IBA BBBBB,,,bbfflll.E.EFFFM$EM$ty$)&<===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BBrFFEE%LL)))BB AuBJJLL%(((AuD(#####r)   X_containerc           	         t           |             d          }t           |             d          }d\  }}t          ||||          \  }	}
}d|	dddf<   |	ddddf         }| ||	          }	|d	k    r-t          j        d|
j        d
         |
j        d
                   }|                    ||	|
||          \  }}|                    ||	|
||          \  }}|                    |||
||          \  }}|                    |||
||          \  }}|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        |j         } ||          } ||          }|}|j
        dxx         ||j
        d         z  z  cc<   t          ||           dS )z7Test that loss and gradient handle intercept correctly.FrG   TrD   rH   rU   r   Nr   rQ   r   rV   rX   g      ?)r
   rC   r*   r_   r   ra   rb   pytestapproxr   r4   r   r+   r,   randn)r/   rP   rR   r   rM   rN   
loss_interr   r   r>   rB   r?   X_interlgrs   hesspl_interg_interhessp_interg_inter_correctedr#   hh_interh_inter_correcteds                            r'   #test_loss_gradients_hessp_interceptr      s    YY[[FFFD 99;;dKKKJ!Iz 	  JAq$ AaaaeH	3B3G KNNAqwqzqwqzBBBa-   DAq ,,a- -  HAu "//gq 0  GW  88gq 9  NA{
 #',tvbz*B*BBB       ;;A()))
	0117DAaAk!nnGR88A()))))r)   c           	         t           |             |          d\  }}t          |||          \                      d          dk    r-t          j        dj        d         j        d         	          d
                              \  }}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        fd|D                       }||                    d          z  }t          j        |ddt          j        f         |          d                                         }t          ||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.
    rG   r   rU   rY   rZ   rQ   r   r   rV   gư>rX   c                 >                         | z
            S )NrX   rN   r?   r>   epsrR   rN   rP   rB   s    r'   <lambda>z5test_gradients_hessians_numerically.<locals>.<lambda>*  s-    TYY3J'+  
 
 r)   r   c                 D                         | dz  z
            S )Nr   rX   r   r   s    r'   r   z5test_gradients_hessians_numerically.<locals>.<lambda>6  s1    TYY1s7N'+  
 
 r)         g{Gz?g:0yE>)rtolatolgMbP?   c           	      P    g | ]"}                     |z  z              #S )rX   )r`   )	.0tr>   r?   rR   rN   rP   vectorrB   s	     r'   
<listcomp>z7test_gradients_hessians_numerically.<locals>.<listcomp>N  sV     		
 		
 		
  MMq6z!+ /   		
 		
 		
r)   r   N)r   )r
   rC   rd   r*   r_   r   rb   r   approx_fprimer   
zeros_likearraymeanr   lstsqnewaxis)r/   r-   rP   rR   rM   r   r   r   r   	approx_g1	approx_g2approx_ghess_cold_xd_gradapprox_hess_colr>   r?   r   rN   r   rB   s     ``            @@@@@@r'   #test_gradients_hessians_numericallyr     s    YY[[NNND!Iz 	  JAq$ ::C:  DAqwqzqwqzBBB C,,a- -  HAu &	
 	
 	
 	
 	
 	
 	
 	
 	
 	
C
 
I &	
 	
 	
 	
 	
 	
 	
 	
 	
 	
C
 
I I	)Q.HAxd6666 ]1FF1IuV}}H C
+sdC
$
$CX		
 		
 		
 		
 		
 		
 		
 		
 		
 		
 		
 		
 		
 F fkkqk!!!Fl3qqq"*}#5v>>qAGGIIOOXD999999r)   c                    t          t                      |           }d\  }}t          ||||          \  }}}t          j                            |          j        |j         }|                    |||          \  }	}
|	                    |||          }|
                    |||          \  }} ||          }|
j        |j        k    sJ |j        |j        k    sJ t          |
|           t          |
|           |                    |||          \  }}}|j        |j        k    sJ |j        |j        |j        fk    sJ |                    d          }|                    d          }|                    |||          \  }}|	                    |||          }|
                    |||          \  }} ||          }|j        |j        k    sJ |j        |j        k    sJ t          ||           t          ||           t          |
|                    |j        j        dd                     t          ||                    |j        j        dd                     dS )z=Test that multinomial LinearModelLoss respects shape of coef.rG   r   rU   rY   rZ   r   N)r
   r   rC   r*   r+   r,   r   r   ra   r`   rb   r   rc   r   rd   reshaper/   r1   )r-   rM   rN   r   r   r>   rB   r?   r#   r   r   rl   rn   r   r   ro   hessrs   coef_rs_rl_rg_rg1_rg2_rhessp_rh_rs                             r'   test_multinomial_coef_shaper   ^  s{    %8%:%:-XXXD!Iz 	  JAq$ 		0117DAdAq))DAq	tQ	"	"B--dAq99IBaA7dj    7dj    ArAr''a33KBa8tz!!!!:$)TY/////ZZcZ""F
'''

C!!&!Q//HC==A&&D11&!Q??MD'
'#,,C9$$$$9$$$$CCAs{{4>#;Rs{KKLLLAs{{4>#;Rs{KKLLLLLr)   c           	         d\  }}}t          t          |          d          }t          ||||          \  }}}|                    d          }| dk    r-t	          j        d	|j        d
         |j        d
                   } |                    |||| d
          \  }	}
}t          |
|
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          }|                    ||||f          }| ||z  }n|| t	          j        |           z  z  }t	          j        d|||          }t	          j        |dd          }|                    ||z  ||z  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   rH   r   )r1   FrG   rU   rY   rZ   rQ   r   r   rV   rX   )y_truer@   rP   Nr   zij, mini, ik->jmnkr   C)r
   r   rC   rd   r*   r_   r   rc   r   r4   weight_intercept_rawr/   gradient_probadiagonesblockr   r    einsummoveaxis)rP   rM   r   r   r1   rN   r>   rB   r?   gradr   rs   weights	interceptr@   grad_pointwiserA   p0dp1dp2donedr   hess_expecteds                          r'   "test_multinomial_hessian_3_classesr     s    (/$Iz9%	:::%  D !	  JAq$ ::C:  DAqwqzqwqzBBB))		# *  MD$ D$&!!!)-)B)B4)K)K&GY N99%# :  NE 	aaad
aaad
aaad


	Cc4 	D3J#cTCZ8TCZs
+cTCZ8TCZ#SD3J%78	
	 	A 	
		9iI>??A	Y	]RVM2222I2Aq!<<MKq!44M!))J	J 6c *  M M=?333D-(((((r)   c                  z   d\  } }}t          t                      d          }t          j        | |f          }t          j        |           }|                    |          }t          j        d          }t          j        t          d          5  |	                    ||||d           ddd           n# 1 swxY w Y   t          j        d          }t          j        t          d	          5  |	                    |||d|           ddd           n# 1 swxY w Y   t          t                      d          }|                    |          }t          j        d
|z  |f          ddd
         }t          j        t          d          5  |	                    ||||           ddd           n# 1 swxY w Y   t          j        d
|z  |z  ||z  f          ddd
         }t          j        t          d          5  |	                    |||d|           ddd           dS # 1 swxY w Y   dS )z;Test that wrong gradient_out and hessian_out raises errors.)rH   r   r   FrG   r   z1gradient_out is required to have shape coef.shape)matchN)r?   r>   rB   r\   r]   z%hessian_out is required to have shaper   z!gradient_out must be F-contiguous)r?   r>   rB   r\   zhessian_out must be contiguous)r
   r   r*   r   r.   zerosr   raises
ValueErrorrc   r   )	r   r   r1   rN   r>   rB   r?   r\   r]   s	            r'   =test_linear_loss_gradient_hessian_raises_wrong_out_parametersr     sn   '.$Iz9%5%7%7uMMMD
J'((A
	Aq!!D8A;;L	M
 
 
 	
 	
 	% 	 	
 	
 	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 (1++K	z)P	Q	Q	Q 
 
# 	 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 %8%:%:%PPPDq!!D8Q]J7881=L	z)L	M	M	M 
 
%	 	 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 (A	MJ6	J8NOPPQTQTSTQTUK	z)I	J	J	J 
 
# 	 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
sH   B99B= B=3DD!DF::F>F>H00H47H4)r   r   )#__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   LOSSESrC   markparametrizefloat32r9   int64rO   r   r   r   r   r   r    r)   r'   <module>r      s         ) ) ) ) ) ) " " " " " " " "         
 2 1 1 1 1 1 = = = = = = . . . . . . . . . . . . /	A HJ1 1 1 1h f--5$-88zzz224RZ"JKK' ' LK 32 98 .-'. f--5$-884/::*QF33.99X$ X$ :9 43 ;: 98 .-
X$v f--4/::*QF33$(?@@4* 4* A@ 43 ;: .-4*n f--5$-884/::*QF33Q: Q: 43 ;: 98 .-Q:h 5$-88%M %M 98%MP 4/::E) E) ;:E)P.
 .
 .
 .
 .
r)   