
    *YHh0                        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#  e$ ejJ                               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jV                  jY                  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Z/ 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
Z0 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	Z1ejV                  jY                  d(e/e0z         d)        Z2ejV                  jY                  d*e/e1z         d+        Z3ejV                  jY                  d,g  e       d-d.d/d0df e       d-d.d1d-df ed'      d-d.dd'df ed
      d-d.dddf ed
      d.d-d-d2df ed'd3      d-d.d4ddf ed'd3      d-dd5ddf e       d5 ejh                  d0      d0d ejh                  d0      z  z
  dd0f e       d5 ejh                  d0       ejh                  d0      d'z   d'd'f ed      d5 ejh                  d0      d6ddf ed      d5d1dd ejh                  d      z  z
  ddf ed      d5d1 ejh                  d      d'z
  ddf ed      d5d1d7ddf e       d
 ejh                  d0       ejj                  d0      d
 ejh                  d0      z  z
  ddf e       d8d9d d d f e       d-d9d:d!d f e       d8d;d d d f e       d-d;d<d!d f e       d-d=d>d!d f e       d-d?d@dAdBf e       d8d?gdBgdz   e       d-dCdDdAdEf e       d8dCgdEgdz   e       d8dFd@dGdBf e       d-dFgdHgdz   e       d8d>d>ddIf e       d8dJdJddKf e       d-d:d d d f e       d8d:d:dd f e       d-dJd dLdKf e       d-dMd d d f e       d-d<d d d f e       d8d<d<dd f edN      d8g dO eg dO      dPz
  ddf edN      d-g dO eg dO      d'z
  ddf edN      d5g dO eg dO      dQz
  ddf edN      d5g dR eg dR      dSz
  ddfe(      dT        Z6ejV                  jY                  de&      ejV                  jY                  dUdVdWg      ejV                  jY                  dXejn                  ejp                  g      ejV                  jY                  dYejn                  ejp                  g      ejV                  jY                  dZddg      ejV                  jY                  d[ddg      ejV                  jY                  d\ddg      ejV                  jY                  d]ddg      d^                                                         Z9ejV                  jY                  de'e(      ejV                  jY                  dZdd_g      d`               Z:ejV                  jY                  de'e(      ejV                  jY                  dZdd_g      da               Z;ejV                  jY                  de'e(      ejV                  jY                  dZdbdcg      dd               Z<ejV                  jY                  de'e(      de        Z=ejV                  jY                  de'e(      ejV                  jY                  dZdd_g      df               Z>ejV                  jY                  de'e(      ejV                  jY                  dZdd_g      dg               Z?ejV                  jY                  dhg di      e#dj               Z@ejV                  jY                  de'e(      ejV                  jY                  dZdd_g      dk               ZAejV                  jY                  dl e       ej                  dmf e       ej                  dmf ed
      dn dmf e       ej                  dof e       ej                  dpf e       ej                  dpf e       ej                  dqfg      dr        ZDds ZEdt ZFdu ZGejV                  jY                  dv ej                  g dw       ej                  g dx      f      ejV                  jY                  dy ej                  g dz       ej                  g d{      f      d|               ZIejV                  jY                  de'e(      d}        ZJejV                  jY                  de&      ejV                  jY                  dZdd_g      ejV                  jY                  d~ejn                  ejp                  f      ejV                  jY                  dd      d                             ZKejV                  jY                  de&      ejV                  jY                  dd~ej                  idej                   dfg      d               ZMejV                  jY                  deddieNdfedd ieOdfedd"ieOdfeddieNdfedd ieOdfedd"ieOdfg      d        ZPejV                  jY                  de'e(      d        ZQejV                  jY                  dg d      d        ZRy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_32bitg      ?)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      V/var/www/html/planif/env/lib/python3.12/site-packages/sklearn/_loss/tests/test_loss.pyloss_instance_namer/   4   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r4      )nprandomRandomStateis_multiclassempty	n_classesuniformflatarangeastypefloatr&   linkr   r   interval_y_predamaxamininterval_y_truemaxminr2   low_inclusiver3   high_inclusive)
r,   	n_samplesy_bound	raw_boundseedrngraw_predictiony_truer2   r3   s
             r.   random_y_true_raw_predictionrR   C   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()>!!r0   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!            (@)r7   	full_like)funcxepsh
f_minus_2h
f_minus_1h	f_plus_1h	f_plus_2hs           r.   numerical_derivativer`   h   sy     	Q3'Aa!a%iJa!eJQUIQQYIJY&Z7*DPSTTr0   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.r6   r   r    num
   N      ?r!   rQ   rP   )r:   r7   tilelinspacer   rF   rI   r_r2   rJ   r3   in_y_true_rangeshaperC   r;   in_y_pred_rangerB   r,   )r,   r<   rQ   r2   r3   ny_predrP   s           r.   test_loss_boundaryrp   v   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;r0   )r   皙?d   rr   rs   皙      ?r6   )rt   ru   r   rr   rs   )rr   rf   ?g?)rq   ru   r   rq   )              ?r!   )rt   ru   r   rf   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)rk   r7   array)r,   y_true_successy_true_failys       r.   test_loss_boundary_y_truer      ^      3##BHHaSM2223 7''!6667r0   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)rm   r7   r|   )r,   y_pred_successy_pred_failr   s       r.   test_loss_boundary_y_predr      r   r0   zDloss, y_true, raw_prediction, loss_true, gradient_true, hessian_truerz   g      @rU      g      @g      п)r   deltag      @       @g      ȿg      ?ry   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<   )皙?rf   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.rg   V瞯<)relabsN)r7   r|   gradientloss_gradientgradient_hessianr   )r,   rQ   rP   	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  r0   readonly_memmapFTdtype_in	dtype_outsample_weightout1out2	n_threadsc                     |        } d}t        | |ddd      \  }	}
|	j                  |      }	|
j                  |      }
|t        j                  dg|z  |      }|t        j                  |	|      }|t        j                  |
|      }|r#t        |	      }	t        |
      }
|t        |      }| j                  |	|
|||	      }|||u sJ 	 | j                  |	|
|||
      }|||u sJ 	 | j                  |	|
||||      \  }}|||u sJ 	 |||u sJ 	 |#| j                  rt        j                  |
|      }| j                  |	|
||||      \  }}|||u sJ 	 |||u sJ 	  | |	|
|       | j                  |	|       | j                  |	|       t        | d      r| j                  |
       t        | d      r-| j                  |	|
||||      \  }}|||u sJ 	 |||u sJ y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.
       rq   rs   re   *   r,   rK   rL   rM   rN   Nr   dtype)rQ   rP   r   loss_outr   )rQ   rP   r   gradient_outr   )rQ   rP   r   r   r   r   )rQ   rP   r   r   hessian_outr   rQ   rP   r   rQ   r   predict_proba)rP   gradient_proba)rQ   rP   r   r   	proba_outr   )rR   r@   r7   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   rK   rQ   rP   lgr[   ps                  r.   test_loss_dtyper   x  s   $ 6DI9FN ]]8$F#**84N #!2(C}}V95}}^9=*622>B$5mDM		%# 	 	A (1922d%# 	 	A (1922d%#  DAq (1922d(1922dD..}}^9=  %# ! DAq (1922d(1922d~]S6G!!}!Mt_%.9t%&"")' # 
1 !,qDy66$ ,qDy66$y 'r0   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                  ||||
       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   rc   rQ   rP   r   r   rQ   rP   r   r   rQ   rP   r   r   r   rQ   rP   r   r   r   N)rR   r7   ri   rl   r   r,   r%   r   r   r   r   )
r,   r   rQ   rP   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#r0   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   rc   r   r   r   r   r   rQ   rP   r   r   r   axisdy=)rtolN)rR   r7   ri   rl   r   r,   r   r   r   r   r   shares_memoryr)   r:   r   sum)r,   r   global_random_seedrQ   rP   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= 'r0   onesr8   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.
    rs   r   r   r   r   )rl   r   r5   r   N)rR   r7   r   float64r8   r9   normalr@   r   r,   r   r:   r   )r,   r   r   rK   rQ   rP   rO   lossesr   	losses_swgradient_swhessian
hessian_sws                r.   test_sample_weight_multipliesr   }  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*Er0   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    Nrg   )rR   ndimr   r,   r   r   r   )r,   rQ   rP   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	
  r0   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   ru   r   rr   r6   re   绽|=re   )rl   rT   r   Nr    r   r   rc   r   r   +=r   )atolr   )r:   r7   r|   r&   rB   r   rC   r2   rI   r3   rJ   clipinverser?   r<   r@   rA   fullexpr>   ri   rl   r,   r   r   )	r,   r   rP   rZ   r2   r3   rQ   
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Gr0   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   rc   r   c                 ,    j                  |       S Nr   r,   rY   r,   r   rQ   s    r.   	loss_funcz6test_gradients_hessians_numerically.<locals>.loss_func4  s"    99 +   r0   gư>)rZ   h㈵>r   r   r   c                 ,    j                  |       S r   r   r  s    r.   	grad_funcz6test_gradients_hessians_numerically.<locals>.grad_func>  s"    == + !  r0   c                 ^    j                         }| |d d f<   j                  |      S r   )copyr,   rY   rawkr,   rP   r   rQ   s     r.   r  z6test_gradients_hessians_numerically.<locals>.loss_funcS  s=    $))+AqD	yy!#&"/ !  r0   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_func_  sK    $))+AqD	}}!#&"/ %  Q$	 r0   )rR   r7   ri   rl   r   r:   r`   r   approx_hessianr   r<   )r,   r   r   rK   r   r[   r  	g_numericr  	h_numericr  rP   rQ   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~~& 	KA  -Yq!t8LRVWIAadGYTF  -Yq!t8LRVWI""!Q$EJ9	Kr0   zloss, x0, y_true)	)squared_errorg       r   )r  g     @]@g?)r  ry   ry   )binomial_lossr   rr   )r  ir   )r     rw   )poisson_lossrV   rz   )r  ry   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   rY   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.
        rg   rQ   )r,   r   rY   r,   rQ   s    r.   rX   ztest_derivatives.<locals>.func  s6     yy!  
)))89 	9r0   c                 *    j                  |       S )Nrg   r  r  s    r.   fprimez test_derivatives.<locals>.fprime  s    }}F1}==r0   c                 0    j                  |       d   S )Nrg   r    )r   r  s    r.   fprime2z!test_derivatives.<locals>.fprime2  s    $$F1$EaHHr0   rs   gHj>)x0r  r  maxitertolr   r   r   rg   gƠ>)r   r7   r|   r   ndarrayr	   ravelr   rB   r   r   )r,   r   rQ   rX   r  r  optimums   ` `    r.   test_derivativesr'  p  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Wr0   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   rc   r   Nr   r   rr   r!   r   c                     j                   st        j                  |       }n6t        j                  t        j                  | j
                  f            } |      S )N)rl   rT   rl   r   )r:   r7   r   ascontiguousarraybroadcast_tor<   )rY   rP   r,   rK   r   rQ   s     r.   funz%test_loss_intercept_only.<locals>.fun  s[    !!WWI1EN11)T^^)DEN )'
 	
r0   gHz>r!  rs   )r"  optionsr   r   g-q=)r   gvIh%<=SLSQPr    )r"  r0  methodconstraintsr  r  r   r#  )r:   rB   r   r7   ri   r?   r@   r   r<   r   r   r   rW   rl   tupler   r   r   rY   r   r   zerosr   r   rh   r   )r,   r   ar/  optgradrK   rQ   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(!%8r0   zloss, func, random_distr   c                 0    t        j                  | d      S )N   )q)r7   
percentile)rY   s    r.   <lambda>r?    s    r}}Q"/E r0   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.
    rB  r    rf   rs   r5   r  N)r7   r8   r9   rB  getattrr   r   r   rB   r   r&   r   r   rF   rI   fillr2   rJ   r3   )r,   rX   random_distr   rO   y_trainbaseline_predictions          r.    test_specific_fit_intercept_onlyrI    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-. +r0   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    rs   r5   r  r   Nre   r,  )r7   r8   r9   r   randintr@   r   r   rl   r6  r   r   meanr   logrB   r   r   )rO   r<   r,   rG  rH  r   r  s          r.   (test_multinomial_loss_fit_intercept_onlyrN    su   
))


"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-.	/r0   c                     d}d}t        |      }t        |||       \  }}t        j                  dd|      }|j                  j                  |||      }|j                  |||      }t        ||       y	)
a  Test that Multinomial cy_gradient gives the same result as gradient.

    CyHalfMultinomialLoss does not inherit from CyLossFunction and has a different API.
    As a consequence, the functions like `loss` and `gradient` do not rely on `cy_loss`
    and `cy_gradient`.
    rs   r   r   r,   rK   rN   rr   r!   rc   r   N)r   rR   r7   ri   r%   _test_cy_gradientr   r   )	r   rK   r<   r,   rQ   rP   r   r   r   s	            r.   test_multinomial_cy_gradientrR  5  s     II3D9FN
 KKQI6MJJ((%# ) E
 MM%#  E
 E5!r0   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   r5   g      Nrf   r    rg   )r7   r8   r9   r   r   rK  r@   r   r   r;   r   r,   )r   rO   rK   binommultinomrG  rP   raw_multinoms           r.   "test_binomial_and_multinomial_lossrW  S  s    
))

 2
3CIE"Q/Hkk!QYk/66rzzBGZZYZ/N88YN+L.LA~-LA

'.
AW\Br0   rQ   )ry   r   r   )rz   r    r    ro   )g      r   r   )r"   r6   r6   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    )r7   rL  rM  r   r   raw_predzs      r.   alt_lossz:test_binomial_vs_alternative_formulation.<locals>.alt_lossu  s;    EAIwwrvva"&&!h"77899r0   c                 P    d| z  dz
  }| dt        j                  ||z        z   z  S rZ  )r7   r   r[  s      r.   alt_gradientz>test_binomial_vs_alternative_formulation.<locals>.alt_gradienty  s.    EAIrQH--..r0   N)r   r@   r   r   r   )rQ   ro   global_dtyper^  r`  bin_lossdatums          r.   (test_binomial_vs_alternative_formulationrd  d  sv    ":/
  !H]]<(F]]<(FVEUvh&67777%H%%u-|U/CDr0   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   r1  r   )NNNr   r   )rR   r)   r   rl   r<   r7   r   r   r   r   r   r   )r,   r   rK   rQ   rP   r   r9  s          r.   test_predict_probarf    sq    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"&!%	  	 'r0   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  )rK   r   rg  )r    rh  N)r7   r   init_gradient_and_hessianconstant_hessianrl   r:   r<   r   flagsc_contiguousf_contiguous)r,   r   r   rg  rK   r   r   s          r.   test_init_gradient_and_hessiansrp    s[    I	*m,D66 7 Hg
 ~~)---}}$$$			~~)T^^!<<<<}}DNN ;;;;}},,,}},,,>>U"""==E!!!|~~****}}))))~~****}}))))r0   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.matchrK   r   N )pytestraises
ValueError	TypeErrorrk  )r,   paramserr_msgr   r   s        r.   %test_init_gradient_and_hessian_raisesr{    sV     6D	
I.g	> R:D::QQQ&Q'R R R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.rr  Nrt  )ru  rv  )r,   ry  err_typerz  s       r.   #test_loss_init_parameter_validationr~    s1    B 
xw	/ v  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   rg   N)rR   pickledumpsloadsr   )r,   rK   rQ   rP   pickled_lossunpickled_losss         r.   test_loss_pickler    sp     I9FN <<%L\\,/Nvn=f^DB   r0   r   )r   r   r    rv   r!   r6   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   re   r   rP  rg   r!   N)	r   r   rR   rB   r   r,   r   r   r   )r   half_tweedie_loghalf_tweedie_identityrK   rQ   rP   ro   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r0   )r   r   r   )Sr  numpyr7   ru  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   listvalues
ALL_LOSSESLOSS_INSTANCESr/   rR   r`   markparametrizerp   infY_COMMON_PARAMSY_TRUE_PARAMSY_PRED_PARAMSr   r   rM  log1pr   float32r   r   r   r   r   r   r   r  r'  r:  rL  medianrI  rN  rR  rW  r|   rd  rf  rp  int64r{  rx  rw  r~  r  r  r   s   0r.   <module>r     s      =   $ @    , K.'.."#
%/0T$&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/ 'm#7	7 'm#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-Y7 . , , 5 @ ? ; -Y7x 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)E( 1s   :w3