
    {Kg                        d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z  d d	l!m"Z"m#Z# d d
l$m%Z%  e& ejN                               Z(e(D  cg c]	  }  |         c} Z)e) ed       ed       ed       ed        ed       ed       ed       ed        ed       ed       ed      gz  Z)d Z*	 ddZ+d Z,ejZ                  j]                  de)e*      d        Z/ e       g dej`                   ej`                  gf e       g dej`                   ej`                  gf e       g dej`                   ej`                  gf e       g dej`                   ej`                  gf e       ddgej`                   ddej`                  gf e       ddgej`                   ddd ej`                  gf ed      ddgej`                   ej`                  gf ed       ddgej`                   ej`                  gf ed      ddgej`                   ddej`                  gf ed      ddgej`                   ddd ej`                  gf ed      ddgej`                   ddd ej`                  gf ed      ddgej`                   ej`                  gf ed       g d ej`                   ej`                  gf ed      ddgej`                   ddej`                  gf ed      ddgej`                   ddd ej`                  gf ed      ddgej`                   ddd ej`                  gf e       g d!ej`                   d"dej`                  gf e       g ej`                   d"d#ej`                  gfgZ1 e       d gg f e       d gg f ed      g d$g f ed       d%d gg f ed      d gg f ed      g d$g f ed       d%d gg f ed      d gg f e       d dgg f e       g d&g fg
Z2 e       g d gf ed      g g d'f ed       g g d'f ed      g d gf ed      g g d'f ed       g d'g f ed      g d gf e       g d dgf e       dd(gd dgfg	Z3ejZ                  j]                  d)e1e2z         d*        Z4ejZ                  j]                  d+e1e3z         d,        Z5ejZ                  j]                  d-g  e       d.d/d0d1df e       d.d/d2d.df ed(      d.d/dd(df ed      d.d/dddf ed      d/d.d.d3df ed(d4      d.d/d5ddf ed(d4      d.dd6ddf e       d6 ejl                  d1      d1d ejl                  d1      z  z
  dd1f e       d6 ejl                  d1       ejl                  d1      d(z   d(d(f ed      d6 ejl                  d1      d7ddf ed      d6d2dd ejl                  d      z  z
  ddf ed      d6d2 ejl                  d      d(z
  ddf ed      d6d2d8ddf e       d ejl                  d1       ejn                  d1      d ejl                  d1      z  z
  ddf e       d9d:d d d f e       d.d:d;d"d f e       d9d<d d d f e       d.d<d=d"d f e       d.d>d?d"d f e       d.d@dAdBdCf e       d9d@gdCgdz   e       d.dDdEdBdFf e       d9dDgdFgdz   e       d9dGdAdHdCf e       d.dGgdIgdz   e       d9d?d?ddJf e       d9dKdKddLf e       d.d;d d d f e       d9d;d;dd f e       d.dKd dMdLf e       d.dNd d d f e       d.d=d d d f e       d9d=d=dd f edO      d9g dP eg dP      dQz
  ddf edO      d.g dP eg dP      d(z
  ddf edO      d6g dP eg dP      dRz
  ddf edO      d6g dS eg dS      dTz
  ddfe*      dU        Z8ejZ                  j]                  de(      ejZ                  j]                  dVdWdXg      ejZ                  j]                  dYejr                  ejt                  g      ejZ                  j]                  dZejr                  ejt                  g      ejZ                  j]                  d[ddg      ejZ                  j]                  d\ddg      ejZ                  j]                  d]ddg      ejZ                  j]                  d^ddg      d_                                                         Z;ejZ                  j]                  de)e*      ejZ                  j]                  d[dd`g      da               Z<ejZ                  j]                  de)e*      ejZ                  j]                  d[dd`g      db               Z=ejZ                  j]                  de)e*      ejZ                  j]                  d[dcddg      de               Z>ejZ                  j]                  de)e*      df        Z?ejZ                  j]                  de)e*      ejZ                  j]                  d[dd`g      dg               Z@ejZ                  j]                  de)e*      ejZ                  j]                  d[dd`g      dh               ZAejZ                  j]                  dig dj      e#dk               ZBejZ                  j]                  de)e*      ejZ                  j]                  d[dd`g      dl               ZCejZ                  j]                  dm e       ej                  dnf e       ej                  dnf ed      do dnf e       ej                  dpf e       ej                  dqf e       ej                  dqf e       ej                  drfg      ds        ZFdt ZGdu ZHejZ                  j]                  dv ej                  g dw       ej                  g dx      f      ejZ                  j]                  dy ej                  g dz       ej                  g d{      f      d|               ZJejZ                  j]                  de)e*      d}        ZKejZ                  j]                  de(      ejZ                  j]                  d[dd`g      ejZ                  j]                  d~ejr                  ejt                  f      ejZ                  j]                  dd      d                             ZLejZ                  j]                  de(      ejZ                  j]                  dd~ej                  idej                   dfg      d               ZNejZ                  j]                  deddieOdfedd iePdfedd#iePdfeddieOdfedd iePdfedd#iePdfg      d        ZQejZ                  j]                  de)e*      d        ZRejZ                  j]                  dg d      d        ZSyc c} w )    N)assert_allcloseassert_array_equal)approx)LinearConstraintminimizeminimize_scalarnewton)	logsumexp)IdentityLink_inclusive_low_high)_LOSSESAbsoluteErrorBaseLossHalfBinomialLossHalfGammaLossHalfMultinomialLossHalfPoissonLossHalfSquaredErrorHalfTweedieLossHalfTweedieLossIdentity	HuberLossPinballLoss)assert_all_finite)create_memmap_backed_dataskip_if_32bit)_IS_WASMg      ?)quantileg      ?      power            @c                    t        | t              r| }|j                  j                  }t        |t              r|d|j
                  j                   dz  }|S t        |t              r|d|j                   z  }|S t        |d      r3t        |j
                  d      r|d|j
                  j                   dz  }|S t        |       S )Nz
(quantile=)clossr    z(power=)
isinstancer   	__class____name__r   r&   r   r   hasattrr    str)paramlossnames      a/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/_loss/tests/test_loss.pyloss_instance_namer0   5   s    %"~~&&dK(j!4!4 5Q77D
 	 i(j00D  T7#

G(Dgdjj../q11D5z    c                     t         j                  j                  |      }| j                  rt        j                  || j
                  f      }|j                  |d   |d   || j
                  z        |j                  dd t        j                  |      j                  t              | j
                  z  }||fS t        | j                  t              rPt        | j                        \  }}	t        j                   ||d   g      }t        j"                  |	|d   g      }	||	f}|j                  |d   |d   |      }t        | j$                        \  }}	t'        ||d         }t)        |	|d         }	|j                  ||	|      }| j$                  j*                  dk(  r!| j$                  j,                  rd|dd|dz  <   | j$                  j.                  dk(  r!| j$                  j0                  rd|dd|dz  <   ||fS )z9Random generate y_true and raw_prediction in valid range.r   r!   )lowhighsizeNr5      )nprandomRandomStateis_multiclassempty	n_classesuniformflatarangeastypefloatr'   linkr   r   interval_y_predamaxamininterval_y_truemaxminr3   low_inclusiver4   high_inclusive)
r-   	n_samplesy_bound	raw_boundseedrngraw_predictiony_truer3   r4   s
             r/   random_y_true_raw_predictionrS   D   s    ))


%C9dnn"=>!$!1T^^+ "- "
A
 9%,,U3dnnD, >!!' dii.+D,@,@AIC''3	!-.C77D)A,/0DdI!9Q<i % 
 ((<(<=	T#wqz"4$S$Y7##q(T-A-A-O-O*+F&yA~&'$$)d.B.B.Q.Q,-F1(a()>!!r1   c                     t        j                  ||      } | |d|z  z
        } | ||z
        } | ||z         } | |d|z  z         }| d|z  z   d|z  z
  |z   d|z  z  S )z2Helper function for numerical (first) derivatives.)
fill_valuer"            (@)r8   	full_like)funcxepsh
f_minus_2h
f_minus_1h	f_plus_1h	f_plus_2hs           r/   numerical_derivativera   i   sy     	Q3'Aa!a%iJa!eJQUIQQYIJY&Z7*DPSTTr1   r-   )idsc                    | j                   r2d}t        j                  t        j                  d|dz
  |      d      }n0t	        | j
                        \  }}t        j                  ||d      }| j
                  j                  r)t        j                  || j
                  j                  f   }| j
                  j                  r)t        j                  || j
                  j                  f   }| j                  |      sJ |j                  d   }t	        | j                        \  }}| j                   rct        j                  |f      }t        j                  |||      |dddf<   dd|dddf   z
  z  |dddf<   dd|dddf   z
  z  |dddf<   nt        j                  |||      }| j                  |      sJ | j                   j!                  |      }| j#                  ||	       y)
z4Test interval ranges of y_true and y_pred in losses.r7   r   r!   num
   N      ?r"   rR   rQ   )r;   r8   tilelinspacer   rG   rJ   r_r3   rK   r4   in_y_true_rangeshaperD   r<   in_y_pred_rangerC   r-   )r-   r=   rR   r3   r4   ny_predrQ   s           r/   test_loss_boundaryrq   w   s    	Q	A9EqI'(<(<=	TS$B/ ))vt337778**vt338889'''QA#D$8$89IC1i.){{3!4q!ta&A,./q!ta&A,./q!tS$A.''' YY^^F+NIIVNI;r1   )r   皙?d   rs   rt   皙      ?r7   )ru   rv   r   rs   rt   )rs   rg   ?g?)rr   rv   r   rr   )              ?r"   )ru   rv   r   rg   z!loss, y_true_success, y_true_failc                     |D ])  }| j                  t        j                  |g            r)J  |D ])  }| j                  t        j                  |g            s)J  y)z-Test boundaries of y_true for loss functions.N)rl   r8   array)r-   y_true_successy_true_failys       r/   test_loss_boundary_y_truer      T    
 ##BHHaSM222 ''!666 r1   z!loss, y_pred_success, y_pred_failc                     |D ])  }| j                  t        j                  |g            r)J  |D ])  }| j                  t        j                  |g            s)J  y)z-Test boundaries of y_pred for loss functions.N)rn   r8   r}   )r-   y_pred_successy_pred_failr   s       r/   test_loss_boundary_y_predr      r   r1   zDloss, y_true, raw_prediction, loss_true, gradient_true, hessian_truer{   g      @rV      g      @g      п)r   deltag      @       @g      ȿg      ?rz   g@xg@xDg     @g     @@g     Bg     B@g     B%   ggT`G<g33333sBg33333sB@g)Pv.<g     B@g?gU`G<g0fՍ<gm@g       +g       gm@r=   )皙?rg   333333?r   r   )g     @r   _eG|>r   c                     | t        j                  |g      t        j                  |g            }| j                  t        j                  |g      t        j                  |g            }| j                  t        j                  |g      t        j                  |g            \  }}	| j	                  t        j                  |g      t        j                  |g            \  }
}|t        |dd      k(  sJ |t        |dd      k(  sJ |9|t        |dd      k(  sJ |	t        |dd      k(  sJ |
t        |dd      k(  sJ ||t        |dd      k(  sJ yy)z7Test losses, gradients and hessians at specific values.rh   V瞯<)relabsN)r8   r}   gradientloss_gradientgradient_hessianr   )r-   rR   rQ   	loss_truegradient_truehessian_trueloss1grad1loss2grad2grad3hesss               r/   test_loss_on_specific_valuesr      sb   x &*288^DT;UVEMMxx!"((N;K2L  E %%xx!"((N;K2L & LE5 ''xx!"((N;K2L ( KE4 F9%U;;;;F9%U;;;; }%UCCCC}%UCCCC}%UCCCCvl5AAAA  r1   readonly_memmapFTdtype_in	dtype_outsample_weightout1out2	n_threadsc                    t         r|rt        j                  d        |        } d}t        | |ddd      \  }	}
|	j	                  |      }	|
j	                  |      }
|t        j                  d	g|z  |
      }|t        j                  |	|
      }|t        j                  |
|
      }|r#t        |	      }	t        |
      }
|t        |      }| j                  |	|
|||       | j                  |	|
|||       | j                  |	|
||||       |#| j                  rt        j                  |
|
      }| j                  |	|
||||        | |	|
|       | j                  |	|       | j                  |	|       t!        | d      r| j#                  |
       t!        | d      r| j%                  |	|
||||       yy)a0  Test acceptance of dtypes, readonly and writeable arrays in loss functions.

    Check that loss accepts if all input arrays are either all float32 or all
    float64, and all output arrays are either all float32 or all float64.

    Also check that input arrays can be readonly, e.g. memory mapped.
    zmemmap not fully supported)reason   rr   rt   rf   *   r-   rL   rM   rN   rO   Nr   dtype)rR   rQ   r   loss_outr   )rR   rQ   r   gradient_outr   )rR   rQ   r   r   r   r   )rR   rQ   r   r   hessian_outr   rR   rQ   r   rR   r   predict_proba)rQ   gradient_proba)rR   rQ   r   r   	proba_outr   )r   pytestxfailrS   rA   r8   r}   
empty_liker   r-   r   r   r;   r   fit_intercept_onlyconstant_to_optimal_zeror*   r   r   )r-   r   r   r   r   r   r   r   rL   rR   rQ   s              r/   test_loss_dtyper   w  s   $ O896DI9FN ]]8$F#**84N #!2(C}}V95}}^9=*622>B$5mDMII%#   	MM%#   	%#   D..}}^9=%#   	~]S6G!!}!Mt_%.9t%&)' 	 	
 'r1   rangec                    t        | dddd      \  }}|dk(  r2t        j                  d|j                  d   |j                  d   	      }t        j                  |      }t        j                  |      }t        j                  |      }t        j                  |      }t        j                  |      }t        j                  |      }	| j                  ||||
       | j                  j                  ||||
      f t        ||       | j                  ||||       | j                  j                  ||||       t        ||       | j                  j                  |||||       | j                  j                  |||||       t        ||       t        ||       | j                  |||||       | j                  j                  |||||	       t        ||       t        ||	       y)z:Test that Python and Cython functions return same results.   r   r   r   r   r   r!   r   rd   rR   rQ   r   r   rR   rQ   r   r   rR   rQ   r   r   r   rR   rQ   r   r   r   N)rS   r8   rj   rm   r   r-   r&   r   r   r   r   )
r-   r   rR   rQ   out_l1out_l2out_g1out_g2out_h1out_h2s
             r/   test_loss_same_as_C_functionsr     s    :FN Av||AFLLOL]]6"F]]6"F]]>*F]]>*F]]>*F]]>*FII%#	   	JJOO%#	    FF#MM%#	   	JJ%#	   FF#JJ%#   	JJ%#   FF#FF#%#   	JJ%#    FF#FF#r1   c                 F   t        | ddd|      \  }}|dk(  r2t        j                  d|j                  d   |j                  d         }t        j                  |      }t        j                  |      }t        j                  |      }t        j                  |      }t        j                  |      }	t        j                  |      }
| j                  ||||	      }| j                  ||||
      }| j                  |||||      \  }}| j                  ||||	|
      \  }}t        ||       t        ||       t        j                  ||      sJ t        ||       t        j                  ||      sJ t        ||       t        ||       t        ||       t        j                  ||      sJ t        ||       t        j                  ||      sJ t        ||	       t        j                  ||	      sJ t        | d      r| j                  sJ t        j                  |      }t        j                  |      }| j                  |||||      \  }}t        ||       t        ||       t        ||       t        t        j                  |d      dd       yy)zTest that loss and gradient are the same across different functions.

    Also test that output arguments contain correct results.
    r   r   r   r   r   r!   r   rd   r   r   r   r   r   rR   rQ   r   r   r   axisdy=)rtolN)rS   r8   rj   rm   r   r-   r   r   r   r   r   shares_memoryr*   r;   r   sum)r-   r   global_random_seedrR   rQ   r   r   r   r   out_g3out_h3l1g1l2g2g3h3out_g4	out_probag4probas                        r/    test_loss_gradients_are_the_samer   &  s    :FN Av||AFLLOL]]6"F]]6"F]]>*F]]>*F]]>*F]]>*F	%#	 
 
B 
%#	 
 
B %#   FB ""%# # FB Br6"B'''r6"B'''BBr6"B'''r6"B'''r6"B'''t%&!!!!~.MM.1	'')' ( 
	E 	F#By)u1-qu= 'r1   onesr9   c           	      n   d}t        | |dd|      \  }}|dk(  r&t        j                  |t        j                        }nNt        j                  j                  |      }|j                  |      j                  t        j                        }t        | j                  |||      || j                  ||d	      z         | j                  ||d	      \  }}| j                  |||      \  }	}
t        ||z  |	       | j                  st        ||z  |
       nt        ||d	d	d	f   z  |
       | j                  ||d	      \  }}| j                  |||      \  }
}| j                  st        ||z  |
       t        ||z  |       y	t        ||d	d	d	f   z  |
       t        ||d	d	d	f   z  |       y	)
zTest sample weights in loss, gradients and hessians.

    Make sure that passing sample weights to loss, gradient and hessian
    computation methods is equivalent to multiplying by the weights.
    rt   r   r   r   r   )rm   r   r6   r   N)rS   r8   r   float64r9   r:   normalrA   r   r-   r   r;   r   )r-   r   r   rL   rR   rQ   rP   lossesr   	losses_swgradient_swhessian
hessian_sws                r/   test_sample_weight_multipliesr   w  s    I9FN irzzBii##$67

	
299"**E		)' 	 	

 	
)))  
	
 ))% * FH
 "//%# 0 I{
 F]*I6=0+>=D#99;G--% . Hg
 #33%# 4 K
 =0+>-/<=D#99;G-4"88*Er1   c                    t        | dddd      \  }}|j                  dk(  r|dddf   }t        | j                  ||      | j                  ||             t        | j	                  ||      | j	                  ||             t        | j                  ||      | j                  ||             t        | j                  ||      | j                  ||             yy)	z5Test that reshaped raw_prediction gives same results.r   r   r   r   r   r!   Nrh   )rS   ndimr   r-   r   r   r   )r-   rR   rQ   raw_prediction_2ds       r/   test_graceful_squeezingr     s     :FN a*1d73IIV4EIFIIVNIC	
 	f=NOf^L	
 	MM8IMJMMMG	
 	!!@Q!R!!!O	
  r1   c                    | j                   st        j                  g d      }t        | j                  t
              r{d}| j                  j                  }| j                  j                  s||z   }| j                  j                  }| j                  j                  s||z
  }t        j                  |||      }| j                  j                  |      }nt        j                  | j                        j                  t               }t        j"                  | j                  | j                  ft        j$                  d       t               }t        j$                  d      |j&                  dd| j                  dz   <   |dk(  r2t        j(                  d|j*                  d   |j*                  d   	      }| j-                  |||
      }| j/                  ||      }t1        || dd       y)z~Test value of perfect predictions.

    Loss of y_pred = y_true plus constant_to_optimal_zero should sums up to
    zero.
    )r   rv   r   rs   r7   rf   绽|=rf   )rm   rU   r   Nr!   r   r   rd   r   r   +=r   )atolr   )r;   r8   r}   r'   rC   r   rD   r3   rJ   r4   rK   clipinverser@   r=   rA   rB   fullexpr?   rj   rm   r-   r   r   )	r-   r   rQ   r[   r3   r4   rR   
loss_valueconstant_terms	            r/   test_loss_of_perfect_predictionr     s    "<=dii.C&&**C''55Ci'',,D''66czWW^S$?N"">2 4>>*11%8 >>4>>2r
{

 68VVBZ1t~~112Av||AFLLOL%#  J
 11] 2 M
 JUGr1   c                 "   
 d}t         |dd|      \  dk(  r2t        j                  dj                  d   j                  d          j	                  	      \  }}|j                  j                  k(  sJ |j                  j                  k(  sJ  j
                  sV fd
}t        |d      }t        ||dd        fd}t        |d      }	 j                  ryt        ||	dd       yt         j                        D ]w  

 fd}t        |dd
f   d      }t        |dd
f   |dd       
 fd}t        |dd
f   d      }	 j                  rbt        |dd
f   |	dd       y y)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   r   r   r   r!   r   rd   r   c                 ,    j                  |       S Nr   r-   rZ   r-   r   rR   s    r/   	loss_funcz6test_gradients_hessians_numerically.<locals>.loss_func.  s"    99 +   r1   gư>)r[   h㈵>r   r   r   c                 ,    j                  |       S r   r   r  s    r/   	grad_funcz6test_gradients_hessians_numerically.<locals>.grad_func8  s"    == + !  r1   c                 ^    j                         }| |d d f<   j                  |      S r   )copyr-   rZ   rawkr-   rQ   r   rR   s     r/   r  z6test_gradients_hessians_numerically.<locals>.loss_funcM  s=    $))+AqD	yy!#&"/ !  r1   Ngh㈵>c                 l    j                         }| |d d f<   j                  |      d d f   S r   )r
  r   r  s     r/   r  z6test_gradients_hessians_numerically.<locals>.grad_funcY  sK    $))+AqD	}}!#&"/ %  Q$	 r1   )rS   r8   rj   rm   r   r;   ra   r   approx_hessianr   r=   )r-   r   r   rL   gr\   r  	g_numericr  	h_numericr  rQ   rR   s   ``        @@@r/   #test_gradients_hessians_numericallyr    s    I9FN Av||AFLLOL  %# ! DAq 77n*****77n*****	 )NM	94e<	 )NM	Ayt%@ t~~&A  -Yq!t8LRVWIAadGYTF  -Yq!t8LRVWI""!Q$EJ9 'r1   zloss, x0, y_true)	)squared_errorg       r   )r  g     @]@g?)r  rz   rz   )binomial_lossr   rs   )r  ir   )r     rx   )poisson_lossrW   r{   )r  rz   r   )r  g      6g      $@c                     t            d       t        j                  gt        j                        t        j                  |gt        j                        }dt        j                  dt        j                  f fd}dt        j                  dt        j                  f fd}dt        j                  dt        j                  f fd}t        ||||d	d
      }j                         |j                         }t         j                  j                  |             t         ||      dd       t         j                  |      dd       y)ac  Test that gradients are zero at the minimum of the loss.

    We check this on a single value/sample using Halley's method with the
    first and second order derivatives computed by the Loss instance.
    Note that methods of Loss instances operate on arrays while the newton
    root finder expects a scalar or a one-element array for this purpose.
    Nr   r   rZ   returnc                 P    j                  |       j                        z   S )zCompute loss plus constant term.

        The constant term is such that the minimum function value is zero,
        which is required by the Newton method.
        rh   rR   )r-   r   rZ   r-   rR   s    r/   rY   ztest_derivatives.<locals>.func  s6     yy!  
)))89 	9r1   c                 *    j                  |       S )Nrh   r  r  s    r/   fprimez test_derivatives.<locals>.fprime  s    }}F1}==r1   c                 0    j                  |       d   S )Nrh   r!   )r   r  s    r/   fprime2z!test_derivatives.<locals>.fprime2  s    $$F1$EaHHr1   rt   gHj>)x0r  r!  maxitertolr   r   r   rh   gƠ>)r   r8   r}   r   ndarrayr	   ravelr   rC   r   r   )r-   r"  rR   rY   r  r!  optimums   ` `    r/   test_derivativesr)  j  s   4 4=t,DXXvhbjj1F	2$bjj	)B9

 9rzz 9>"** > >I2:: I"** I G \\^FmmoGDII%%g.7DM151DMMMH!RVWr1   c                     d j                   s2 j                  j                  t        j                  dd            nGt        j
                        j                  t        j                         j                  z  dddd<   dk(  rt        j                  d	d
       j                        } fd} j                   st        |dddi      } j                  t        j                  |            }|j                  t               k(  sJ |j                  j                  k(  sJ t!        |       |t#        |j$                  d      k(   |j'                         t#        dd      k(   yt)        |t        j*                   j                        dddidt-        t        j.                  d j                  f      dd            } j                  t        j0                  |df            }|j                  j                  k(  sJ t!        |       t3        ||j$                  dd       t3        |j'                  d      dd       y)zzTest that fit_intercept_only returns the argmin of the loss.

    Also test that the gradient is zero at the minimum.
    2   r   rd   r   Nr   r   rs   r"   r   c                     j                   st        j                  |       }n6t        j                  t        j                  | j
                  f            } |      S )N)rm   rU   rm   r   )r;   r8   r   ascontiguousarraybroadcast_tor=   )rZ   rQ   r-   rL   r   rR   s     r/   funz%test_loss_intercept_only.<locals>.fun  s[    !!WWI1EN11)T^^)DEN )'
 	
r1   gHz>r#  rt   )r$  optionsr   r   g-q=)r   gvIh%<=SLSQPr!   )r$  r2  methodconstraintsr  r  r   r%  )r;   rC   r   r8   rj   r@   rA   r   r=   r   r   r   rX   rm   tupler   r   r   rZ   r   r   zerosr   r   ri   r   )r-   r   ar1  optgradrL   rR   s   ``    @@r/   test_loss_intercept_onlyr<    s    I""2;;r1)#DE9%,,RZZ84>>IssC	:v]KA
 cti5EF}}<<2'  

 ww%'!!!ww&,,&&&!	VCEEt$$
fQE** HHdnn&$(!T^^1D)Eq!L
 }}771y!n5'  

 ww&,,&&&!355t%8a(!%8r1   zloss, func, random_distr   c                 0    t        j                  | d      S )N   )q)r8   
percentile)rZ   s    r/   <lambda>rA    s    r}}Q"/Er1   poissonexponentialbinomialc                 ^   t         j                  j                  |      }|dk(  r|j                  ddd      }n t	        ||      d      }| j                  |      }t        |       |t        | j                  j                   ||                  k(  sJ | j                  j                  |      t         ||            k(  sJ t        | t              r%t        | j                  j                  |      |       | j                  j                  rB|j                  | j                  j                          | j                  |      }t        |       | j                  j"                  rC|j                  | j                  j$                         | j                  |      }t        |       yy)zTest that fit_intercept_only returns the correct functional.

    We test the functional for specific, meaningful distributions, e.g.
    squared error estimates the expectation of a probability distribution.
    rD  r!   rg   rt   r6   r  N)r8   r9   r:   rD  getattrr   r   r   rC   r   r'   r   r   rG   rJ   fillr3   rK   r4   )r-   rY   random_distr   rP   y_trainbaseline_predictions          r/    test_specific_fit_intercept_onlyrK    sf   $ ))

 2
3Cj ,,q#C,0+'#{+5111A )*&W)F"GGGG9901VDM5JJJJ$%		))*=>@ST ))T))--."55W5E-.**T))../"55W5E-. +r1   c            	         t         j                  j                  d      } d}t        |      }| j	                  d|dz   d      j                  t         j                        }|j                  |      }|j                  |fk(  sJ t        j                  ||j                        }t        |      D ]  }||k(  j                         ||<    t        |t        j                  |      t        j                  t        j                  |            z
         t        |d	d	d	f   |j                  j                  |d	d	d	f                t        j                  d
      t        j                   d
      fD ]Y  }|j                  t         j                        }|j                  |      }|j                  |j                  k(  sJ t#        |       [ y	)zATest that fit_intercept_only returns the mean functional for CCE.r   r   r   r!   rt   r6   r  r   Nrf   r.  )r8   r9   r:   r   randintrA   r   r   rm   r8  r   r   meanr   logrC   r   r   )rP   r=   r-   rI  rJ  pr  s          r/   (test_multinomial_loss_fit_intercept_onlyrQ    sk   
))


"CI3D kk!Y]k5<<RZZHG111A$$444
'--0A91""$! 'RWWRVVAY5G)GH'a0$))..472LMHH2&b(9:..,"55W5E"((GMM999-.	 ;r1   c                    t         j                  j                  |       }d}t               }t	        d      }|j                  dd|      j                  t         j                        }|j                  |      }t        j                  |df      }d|z  |dddf<   d|z  |ddd	f<   t        |j                  ||
      |j                  ||
             y)zKTest that multinomial loss with n_classes = 2 is the same as binomial loss.r   r"   r   r   r6   g      Nrg   r!   rh   )r8   r9   r:   r   r   rM  rA   r   r   r<   r   r-   )r   rP   rL   binommultinomrI  rQ   raw_multinoms           r/   "test_binomial_and_multinomial_lossrV  /  s    
))

 2
3CIE"Q/Hkk!QYk/66rzzBGZZYZ/N88YN+L.LA~-LA

'.
AW\Br1   rR   )rz   r   r   )r{   r!   r!   rp   )g      r   r   )r#   r7   r7   c                     d }d }t               }| j                  |      } |j                  |      }| |f} || t         ||       k(  sJ t         |j                  |  ||        y)a  Test that both formulations of the binomial deviance agree.

    Often, the binomial deviance or log loss is written in terms of a variable
    z in {-1, +1}, but we use y in {0, 1}, hence z = 2 * y - 1.
    ESL II Eq. (10.18):

        -loglike(z, f) = log(1 + exp(-2 * z * f))

    Note:
        - ESL 2*f = raw_prediction, hence the factor 2 of ESL disappears.
        - Deviance = -2*loglike + .., but HalfBinomialLoss is half of the
          deviance, hence the factor of 2 cancels in the comparison.
    c           	          d| z  dz
  }t        j                  t        j                  dt        j                  | |z        z               S Nr"   r!   )r8   rN  rO  r   r   raw_predzs      r/   alt_lossz:test_binomial_vs_alternative_formulation.<locals>.alt_lossQ  s;    EAIwwrvva"&&!h"77899r1   c                 P    d| z  dz
  }| dt        j                  ||z        z   z  S rY  )r8   r   rZ  s      r/   alt_gradientz>test_binomial_vs_alternative_formulation.<locals>.alt_gradientU  s.    EAIrQH--..r1   N)r   rA   r   r   r   )rR   rp   global_dtyper]  r_  bin_lossdatums          r/   (test_binomial_vs_alternative_formulationrc  @  sv    ":/
  !H]]<(F]]<(FVEUvh&67777%H%%u-|U/CDr1   c           
         d}t        | |dd|      \  }}t        | d      rU| j                  |      }|j                  || j                  fk(  sJ t        j                  |d      t        dd	      k(  sJ t        | d
      rddt        j                  |      ft        j                  |      dft        j                  |      t        j                  |      ffD ]  \  }}| j                  ||d||      \  }}|j                  || j                  fk(  sJ t        j                  |d      t        dd	      k(  sJ t        || j                  ||dd              yy)z<Test that predict_proba and gradient_proba work as expected.r   r   r   r   r   r!   r   r   r3  r   )NNNr   r   )rS   r*   r   rm   r=   r8   r   r   r   r   r   r   )r-   r   rL   rR   rQ   r   r;  s          r/   test_predict_probare  d  sl    I9FN t_%"">2{{y$..9999vve!$qe(<<<<t%&2==01]]>*D1]]>*BMM.,IJ	
KD% ---"! . KD% ;;9dnn"====66%a(F1%,@@@@!#1"&!%	  
 'r1   r   order)CFc                    d}|dk(  rt        j                  |      } | |      } | j                  |||      \  }}| j                  r#|j                  |fk(  sJ |j                  dk(  slJ | j
                  r:|j                  || j                  fk(  sJ |j                  || j                  fk(  s&J |j                  |fk(  sJ |j                  |fk(  sJ |j                  |k(  sJ |j                  |k(  sJ |dk(  r1|j                  j                  sJ |j                  j                  sJ y|j                  j                  sJ |j                  j                  sJ y)zTest that init_gradient_and_hessian works as expected.

    passing sample_weight to a loss correctly influences the constant_hessian
    attribute, and consequently the shape of the hessian array.
    r   r   r  )rL   r   rf  )r!   rg  N)r8   r   init_gradient_and_hessianconstant_hessianrm   r;   r=   r   flagsc_contiguousf_contiguous)r-   r   r   rf  rL   r   r   s          r/   test_init_gradient_and_hessiansro    s[    I	*m,D66 7 Hg
 ~~)---}}$$$			~~)T^^!<<<<}}DNN ;;;;}},,,}},,,>>U"""==E!!!|~~****}}))))~~****}}))))r1   zparams, err_msgz+Valid options for 'dtype' are .* Got dtype=z	 instead.c                      |        } t        j                  t        t        f|      5   | j                  dddi|\  }}ddd       y# 1 sw Y   yxY w)zDTest that init_gradient_and_hessian raises errors for invalid input.matchrL   r   N )r   raises
ValueError	TypeErrorrj  )r-   paramserr_msgr   r   s        r/   %test_init_gradient_and_hessian_raisesry    sI     6D	
I.g	>:D::QQQ&Q' 
?	>	>s   A

Azloss, params, err_type, err_msgr   z4quantile must be an instance of float, not NoneType.zquantile == 0, must be > 0.zquantile == 1.1, must be < 1.c                 l    t        j                  ||      5   | di | ddd       y# 1 sw Y   yxY w)z/Test that loss raises errors for invalid input.rq  Nrs  )r   rt  )r-   rw  err_typerx  s       r/   #test_loss_init_parameter_validationr|    s(    B 
xw	/v 
0	/	/s   	*3c                     d}t        | |ddd      \  }}t        j                  |       }t        j                  |      } | ||      t	         |||            k(  sJ y)z Test that losses can be pickled.r   r   r   r   r   rh   N)rS   pickledumpsloadsr   )r-   rL   rR   rQ   pickled_lossunpickled_losss         r/   test_loss_pickler    sp     I9FN <<%L\\,/Nvn=f^DB   r1   rP  )r   r   r!   rw   r"   r7   c                    t        |       }t        |       }d}t        ||d      \  }}|j                  j	                  |      }|j                  ||      |j                  |      z   }|j                  ||      |j                  |      z   }t        ||       |j                  ||      \  }	}
|j                  ||      \  }}t        |	||z         t        |
||z  |dz  |z  z          y)zCTest for identical losses when only the link function is different.r   rf   r   )r-   rL   rO   rh   r"   N)	r   r   rS   rC   r   r-   r   r   r   )rP  half_tweedie_loghalf_tweedie_identityrL   rR   rQ   rp   loss_logloss_identitygradient_loghessian_loggradient_identityhessian_identitys                r/   %test_tweedie_log_identity_consistencyr     s2    'Q/3!<I9FN ""**>:F  $$n % 11&9:H *..f / 66v>?M Hm, !1 A An !B !L+ +@*P*Pf +Q +'' L&+<"<=V//&!)>N2NNr1   )r   r   r   )Tr~  numpyr8   r   numpy.testingr   r   r   scipy.optimizer   r   r   r	   scipy.specialr
   sklearn._loss.linkr   r   sklearn._loss.lossr   r   r   r   r   r   r   r   r   r   r   r   sklearn.utilsr   sklearn.utils._testingr   r   sklearn.utils.fixesr   listvalues
ALL_LOSSESLOSS_INSTANCESr0   rS   ra   markparametrizerq   infY_COMMON_PARAMSY_TRUE_PARAMSY_PRED_PARAMSr   r   rO  log1pr   float32r   r   r   r   r   r   r   r  r)  r<  rN  medianrK  rQ  rV  r}   rc  re  ro  int64ry  rv  ru  r|  r  r  r  s   0r/   <module>r     s      =   $ @    , K (.'.."#
%/0ZT$&Z0 t$!!!#!$!$!$#&   CE""JU 5GH < I <L ,w.?@_)RVVGRVV+<=]'266'266):;[%'89c
bffWb$$?@_sCjBFF7Ba"@A2c
bffWbff,=>1SzRVVGRVV+<=3#srvvgr4-HI1SzRVVGRq"&&+IJ1SzRVVGRq"&&+IJ2&c
bffWbff4EF1%'>"&&"&&@QR3'#srvvgr45PQ1%SzRVVGRq"&&3QR1%SzRVVGRq"&&3QRBFF7B266*BCB"&&"c266 :;'2 R [1#r241ay"-3!b)2&<1%ay"53'!b1!Q$M2. QC 2M21r=13aS)2&M:1%}b93'aS1aV$S#JA/ '=)H77 '=)H77 Js		S#q!Q/s	#sCd3s 
c	"Cad;s 
d	#S#~xN	s
 
d	#S#xEs 
Cq	)3_dDQs 
Cq	)3ZtLs 
	CAFBFF1I,=uaHs 
#vrvvay&"&&)e*;YNs 
q	!3q	3DdDQs 
!q	)3QVRVVAY5FdSs 
!q	)3VRVVAY5FdSs $!,)	
s, BFF1IBHHQK$**	
+sr 
	S%Aq1sst 
	S%r15usv 
	S$1a0wsx 
	S$R3ysz 
	S%r15{s| 
	S%Y8MN}s~ 
	S%F+@*AA*EFs@ 
	S%y:OPAsB 
	S%F+@*AA*EFCsD 
	S$I7LMEsF 
	S$E*?)@1)DEGsH 
	S$a1FGIsJ 
	S%3JKKsL 
	S$1a0MsN 
	S$a3OsR $#	
Qs` 
	S%Aq1asb 
	S#q!Q/csd 
	S#sAq1esh  !,o&,	
gsx  !,o&,	
wsH  !,o&,	
GsX  !,n%.	
Wsh 	m  wpBqwpB6 ,*UDM:bjj"**%=>rzz2::&>?4)4$+$+q!f-T
 . , , 5 @ ? ; -T
n 5GH4/:K$ ; IK$\ 5GH4/:L> ; IL>^ 5GH68*<=BF > IBFJ 5GH
 I
< 5GH4/:-H ; I-H` 5GH4/:VK ; IVKr " +X #$+X\ 5GH4/:>9 ; I>9B 		RWWh/	"))X.	d	#%ExP		BGGY/	"''=1		BGG]3		RWWj1//>/." HBHH[$98288K;P#QRHBHH^$<hbhh{>S#TUE V SED 5GH( I(V ,4/:2::rzz":;*-!* . < ; -!*H , bhh9"((9M	
R -R % B		
 O)		
 
z3'5TUB		
 O)		
 
Z%z3RS5>?> 5GH I" 56) 7){& 1s    w6