Ë
    íì�i0Â  ã                   óð  — 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(	 d�d„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                  d‚d~ej˜                  idƒej˜                  › d„�fg«      d…„ «       «       ZMejV                  jY                  d†ed‡dieNdˆfed‡d ieOd‰fed‡d"ieOdŠfed‡dieNdˆfed‡d ieOd‰fed‡d"ieOdŠfg«      d‹„ «       ZPejV                  jY                  de'e(¬«      dŒ„ «       ZQejV                  jY                  d�g 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      ú‚/var/www/ITT-ServiceAPI-Services/ITT-Document-Scan/mrzscanner/mrzenv/lib/python3.12/site-packages/sklearn/_loss/tests/test_loss.pyÚloss_instance_namer/   4   s½   € Ü�%œÔ"ØˆØ�~‰~×&Ñ&ˆÜ�dœKÔ(Ø�j §¡×!4Ñ!4Ð 5°QÐ7Ñ7ˆDð
 ˆô	 ˜œiÔ(Ø�j §¡ Ð0Ñ0ˆDð ˆô �T˜7Ô#¬°·
±
¸GÔ(DØ�g˜dŸj™j×.Ñ.Ð/¨qÐ1Ñ1ˆDØˆä�5‹zÐó    c                 ó   — t         j                  j                  |«      }| j                  rŽt        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Ø×ÒÜŸ™ 9¨d¯n©nÐ"=Ó>ˆØ!$§¡Ø˜!‘Ø˜1‘Ø˜TŸ^™^Ñ+ð "-ó "
ˆ×Ñ™AÐô
 —‘˜9Ó%×,Ñ,¬UÓ3°d·n±nÑDˆð, �>Ð!Ð!ô' �d—i‘i¤Ô.Ü+¨D×,@Ñ,@ÓA‰IˆC�Ü—'‘'˜3 	¨!¡Ð-Ó.ˆCÜ—7‘7˜D )¨A¡,Ð/Ó0ˆDØ˜d˜ˆIØŸ™Ø˜!‘ 9¨Q¡<°ið %ó 
ˆô (¨×(<Ñ(<Ó=‰	ˆˆTÜ�#�w˜q‘zÓ"ˆÜ�4˜ ™Ó$ˆØ—‘˜S $¨Y�Ó7ˆà×Ñ×#Ñ# qÒ(¨T×-AÑ-A×-OÒ-OØ*+ˆFÑ&�y A‘~Ð&Ñ'Ø×Ñ×$Ñ$¨Ò)¨d×.BÑ.B×.QÒ.QØ,-ˆF�1Ð(˜ 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   € ô 	�‰�Q 3Ô'€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ÔEÀqÓI‰ä'¨×(<Ñ(<Ó=‰	ˆˆTÜ—‘˜S $¨BÔ/ˆð ×Ñ×)Ò)Ü—‘�v˜t×3Ñ3×7Ñ7Ð7Ñ8ˆØ×Ñ×*Ò*Ü—‘�v˜t×3Ñ3×8Ñ8Ð8Ñ9ˆà×Ñ Ô'Ð'Ð'à�‰�Q‰€AÜ# D×$8Ñ$8Ó9�I€CˆØ×ÒÜ—‘˜1˜i˜.Ó)ˆÜ—{‘{ 3¨°!Ô4ˆŠq�!ˆt‰Ø˜a &ª¨A¨¡,Ñ.Ñ/ˆŠq�!ˆt‰Ø˜a &ª¨A¨¡,Ñ.Ñ/ˆŠq�!ˆtŠä—‘˜S $¨AÔ.ˆà×Ñ Ô'Ð'Ð'ð —Y‘Y—^‘^ FÓ+€NØ‡I�I�V¨N€IÕ;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ˆØ×#Ñ#¤B§H¡H¨a¨S£MÕ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     ÀBÀg     ÀB@g     €BÀé%   gÿÿÿÿÿÿï¿gT`ÊG˜˜<g33333sBÀg33333sB@g)Pç�v.›<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 œŸ™ & Ó*¼2¿8¹8À^ÐDTÓ;UÔV€EØ�M‰MÜ�x‰x˜˜Ó!´"·(±(¸NÐ;KÓ2Lð ó €Eð ×%Ñ%Ü�x‰x˜˜Ó!´"·(±(¸NÐ;KÓ2Lð &ó �L€Eˆ5ð ×'Ñ'Ü�x‰x˜˜Ó!´"·(±(¸NÐ;KÓ2Lð (ó �K€Eˆ4ð ”F˜9¨%°UÔ;Ò;Ð;Ð;Ø”F˜9¨%°UÔ;Ò;Ð;Ð;àÐ Øœ˜}°%¸UÔCÒCÐCÐCØœ˜}°%¸UÔCÒCÐCÐCØœ˜}°%¸UÔCÒCÐCÐCàÐØ”v˜l°¸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ª  € ñ$ ‹6€Dà€IÜ9ØØØØØôÑ€FˆNð �]‰]˜8Ó$€FØ#×*Ñ*¨8Ó4€NàÐ ÜŸ™ # ¨Ñ!2¸(ÔCˆØÐÜ�}‰}˜V¨9Ô5ˆØÐÜ�}‰}˜^°9Ô=ˆáÜ*¨6Ó2ˆÜ2°>ÓBˆØÐ$Ü5°mÓDˆMà�	‰	ØØ%Ø#ØØð 	ó 	€Að Ð(ˆ1�‰9Ð2Ð2¨dØ�‰ØØ%Ø#ØØð 	ó 	€Að Ð(ˆ1�‰9Ð2Ð2¨dØ×ÑØØ%Ø#ØØØð ó �D€A€qð Ð(ˆ1�‰9Ð2Ð2¨dØÐ(ˆ1�‰9Ð2Ð2¨dØÐ˜D×.Ò.Ü�}‰}˜^°9Ô=ˆØ× Ñ ØØ%Ø#ØØØð !ó �D€A€qð Ð(ˆ1�‰9Ð2Ð2¨dØÐ(ˆ1�‰9Ð2Ð2¨dÙ� ~À]ÕSØ×Ñ 6¸ÐÔGØ×!Ñ!¨¸}Ð!ÔMÜˆt�_Ô%Ø×Ñ¨.ÐÔ9ÜˆtÐ%Ô&Ø×"Ñ"ØØ)Ø'ØØØð #ó 
‰ˆˆ1ð !Ð,ˆq�D‰yÐ6Ð6°$Ø Ð,ˆq�D‰yÐ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   € ô :ØØØØØôÑ€FˆNð ˜ÒÜŸ™ A v§|¡|°A¡¸F¿L¹LÈ¹OÔLˆä�]‰]˜6Ó"€FÜ�]‰]˜6Ó"€FÜ�]‰]˜>Ó*€FÜ�]‰]˜>Ó*€FÜ�]‰]˜>Ó*€FÜ�]‰]˜>Ó*€FØ‡I�IØØ%Ø#Øð	 ô ð 	‡J�J‡O�OØØ%Ø#Øð	 ô ô �F˜FÔ#Ø‡M�MØØ%Ø#Øð	 ô ð 	‡J�J×ÑØØ%Ø#Øð	 ô ô �F˜FÔ#Ø‡J�J×ÑØØ%Ø#ØØð ô ð 	‡J�J×ÑØØ%Ø#ØØð ô ô �F˜FÔ#Ü�F˜FÔ#Ø×ÑØØ%Ø#ØØð ô ð 	‡J�J×ÑØØ%Ø#ØØð  ô ô �F˜FÔ#Ü�F˜FÕ#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)z‡Test 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¶   ©Úaxisç•dyáý¥=)Ú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�  € ô :ØØØØØôÑ€FˆNð ˜ÒÜŸ™ A v§|¡|°A¡¸F¿L¹LÈ¹OÔLˆä�]‰]˜6Ó"€FÜ�]‰]˜6Ó"€FÜ�]‰]˜>Ó*€FÜ�]‰]˜>Ó*€FÜ�]‰]˜>Ó*€FÜ�]‰]˜>Ó*€Fà	�‰ØØ%Ø#Øð	 
ó 
€Bð 
�‰ØØ%Ø#Øð	 
ó 
€Bð ×ÑØØ%Ø#ØØð  ó �F€Bˆð ×"Ñ"ØØ%Ø#ØØð #ó �F€Bˆô �B˜ÔÜ�r˜6Ô"Ü×Ñ˜B Ô'Ð'Ð'Ü�r˜6Ô"Ü×Ñ˜B Ô'Ð'Ð'Ü�B˜ÔÜ�B˜ÔÜ�r˜6Ô"Ü×Ñ˜B Ô'Ð'Ð'Ü�r˜6Ô"Ü×Ñ˜B Ô'Ð'Ð'Ü�r˜6Ô"Ü×Ñ˜B Ô'Ð'Ð'äˆtÐ%Ô&Ø×!Ò!Ð!Ð!Ü—‘˜~Ó.ˆÜ—M‘M .Ó1ˆ	Ø×'Ñ'ØØ)Ø'ØØð (ó 
‰	ˆˆEô 	˜˜FÔ#Ü˜˜BÔÜ˜˜yÔ)ÜœŸ™˜u¨1Ô-¨q°uÖ=ð '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	)
zÇTest 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ØØØØØôÑ€FˆNð ˜ÒÜŸ™ i´r·z±zÔB‰ä�i‰i×#Ñ#Ð$6Ó7ˆØŸ
™
¨	˜
Ó2×9Ñ9¼"¿*¹*ÓEˆäØ�	‰	ØØ)Ø'ð 	ó 	
ð
 	Ø
�)‰)ØØ)Øð ó 
ñ	
ôð ×)Ñ)ØØ%Øð *ó Ñ€FˆHð
 "×/Ñ/ØØ%Ø#ð 0ó Ñ€Iˆ{ô
 �F˜]Ñ*¨IÔ6Ø×ÒÜ˜ =Ñ0°+Õ>ä˜ =²°D°Ñ#9Ñ9¸;ÔGà×-Ñ-ØØ%Øð .ó Ñ€Hˆgð
 #×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ü   € ô :ØØØØØôÑ€FˆNð ×Ñ˜aÒØ*ª1¨d¨7Ñ3ÐÜØ�I‰I˜VÐ4EˆIÓFØ�I‰I˜V°NˆIÓCô	
ô 	Ø×Ñ fÐ=NÐÓOØ×Ñ f¸^ÐÓLô	
ô 	Ø�M‰M Ð8IˆMÓJØ�M‰M ¸ˆMÓGô	
ô 	Ø×!Ñ!¨Ð@QÐ!ÓRØ×!Ñ!¨ÀÐ!ÓOõ	
ð  r0   c                 óÜ  — | j                   sÈt        j                  g d¢«      }t        | j                  t
        «      r{d}| j                  j                  }| j                  j                  s||z   }| j                  j                  }| j                  j                  s||z
  }t        j                  |||«      }| j                  j                  |«      }nªt        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“  € ð ×ÒäŸ™Ò"<Ó=ˆä�d—i‘i¤Ô.ØˆCØ×&Ñ&×*Ñ*ˆCØ×'Ñ'×5Ò5Ø˜C‘i�Ø×'Ñ'×,Ñ,ˆDØ×'Ñ'×6Ò6Ø˜c‘z�ÜŸW™W ^°S¸$Ó?ˆNØ—‘×"Ñ" >Ó2‰ô —‘˜4Ÿ>™>Ó*×1Ñ1´%Ó8ˆô Ÿ™Ø—>‘> 4§>¡>Ð2ÜŸ™˜r›
�{Üô
ˆô
 68·V±V¸B³Zˆ×ÑÑ1˜tŸ~™~°Ñ1Ð1Ñ2à˜ÒÜŸ™ A v§|¡|°A¡¸F¿L¹LÈ¹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)zÉTest 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"   ø€ Ø—9‘9ØØ Ø+ð ó ð 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=   ø€ Ø$×)Ñ)Ó+�Ø�’A�q�D‘	Ø—y‘yØ!Ø#&Ø"/ð !ó ð r0   Ngñhãˆµøä>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   ø€ Ø$×)Ñ)Ó+�Ø�’A�q�D‘	Ø—}‘}Ø!Ø#&Ø"/ð %ó ò �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ØØØØØôÑ€FˆNð ˜ÒÜŸ™ A v§|¡|°A¡¸F¿L¹LÈ¹OÔLˆà× Ñ ØØ%Ø#ð !ó �D€A€qð �7‰7�n×*Ñ*Ò*Ð*Ð*Ø�7‰7�n×*Ñ*Ò*Ð*Ð*à×Òö	ô )¨°NÈÔMˆ	Ü˜˜9¨4°eÕ<ö	ô )¨°NÈÔMˆ	Ø×Òàä˜A˜y¨t¸%Ö@ô �t—~‘~Ó&ò 	KˆA÷ð ô -¨Y¸ÂqÈ!ÀtÑ8LÐRVÔWˆIÜ˜Aša ˜d™G Y°TÀÕF÷ð ô -¨Y¸ÂqÈ!ÀtÑ8LÐRVÔWˆIØ×"Ò"àä ¢! Q $¡¨¸ÀEÖJñ9	Kr0   zloss, x0, y_true)	)Úsquared_errorg       Àr«   )r  g     @]@gÍÌÌÌÌÌð?)r  ry   ry   )Úbinomial_lossrŒ   rr   )r  iôÿÿÿr‹   )r  é   rw   )Úpoisson_lossrV   rz   )r  ry   rˆ   )r  g      6Àg      $@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 )z¥Compute 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   ø€ ð �y‰yØ¨!ð ó 
à×)Ñ)°Ð)Ó8ñ9ð 	9r0   c                 ó*   •— ‰j                  ‰| ¬«      S )Nrg   r  r  s    €€r.   Úfprimez test_derivatives.<locals>.fprime˜  s   ø€ Ø�}‰} F¸1ˆ}Ó=Ð=r0   c                 ó0   •— ‰j                  ‰| ¬«      d   S )Nrg   r    )r”   r  s    €€r.   Úfprime2z!test_derivatives.<locals>.fprime2›  s   ø€ Ø×$Ñ$¨FÀ1Ð$ÓEÀaÑHÐHr0   rs   gH¯¼šò×j>)Ú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Ü�X‰X�v�h¤b§j¡jÔ1€FÜ	�‰�2�$œbŸj™jÔ	)€Bð9”—
‘
ð 9œrŸz™zö 9ð>”"—*‘*ð >¤§¡ö >ðI”2—:‘:ð I¤"§*¡*ö Iô ØØØØØØô€Gð �\‰\‹^€FØ�m‰m‹o€GÜ�D—I‘I×%Ñ% gÓ.°Ô7Ü‘D˜“M 1¨5Õ1Ü�D—M‘M¨À�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                   s°t        |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[   ø€ Ø×!Ò!ÜŸW™W¨IÀ1ÔE‰Nä×1Ñ1Ü—‘ ¨)°T·^±^Ð)DÔEóˆNñ ØØ)Ø'ô
ð 	
r0   gH¯¼šò×z>r!  rs   )r"  Úoptionsr²   ©r�   gê-�™—q=)r‘   g‚vIhÂ%<=Ú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§;¡;¨r°1¸)Ô#DÓE‰ä—‘˜9Ó%×,Ñ,¬R¯Z©ZÓ8¸4¿>¹>ÑIˆØˆ‰s�ˆs‰à˜ÒÜŸ™ C¨°	Ô:ˆà×Ñ v¸]ÐÓK€A÷
ð ×ÒÜ˜c t°iÀÐ5EÔFˆØ�}‰}ØÜŸ<™<¨°Ó2Ø'ð ó 
ˆð
 �w‰wœ%›'Ò!Ð!Ð!Ø�w‰w˜&Ÿ,™,Ò&Ð&Ð&Ü˜!ÔØ	ŒV�C—E‘E˜tÔ$Ò$Ø�‰‹
”f˜Q EÔ*Ó*ô ØÜ�H‰H�d—n‘nÓ&ØØ Ð$ØÜ(¬¯©°!°T·^±^Ð1DÓ)EÀqÈ!ÓLô
ˆð �}‰}ØÜŸ7™7 1 y°! nÓ5Ø'ð ó 
ˆð
 �w‰w˜&Ÿ,™,Ò&Ð&Ð&Ü˜!ÔÜ˜˜3Ÿ5™5 t°%Õ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)zÕTest 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Ó
3€CØ�jÒ Ø—,‘,˜q #¨C�,Ó0‰à+”'˜#˜{Ó+°Ô5ˆØ×1Ñ1¸Ð1ÓAÐô Ð)Ô*Ø¤&¨¯©¯©¹¸W»Ó)FÓ"GÒGÐGÐGØ�9‰9×ÑÐ0Ó1´V¹DÀ»MÓ5JÒJÐJÐJÜ�$œÔ%Ü˜Ÿ	™	×)Ñ)Ð*=Ó>Ð@SÔTð ×Ñ×)Ò)Ø�‰�T×)Ñ)×-Ñ-Ô.Ø"×5Ñ5¸WÐ5ÓEÐÜÐ-Ô.Ø×Ñ×*Ò*Ø�‰�T×)Ñ)×.Ñ.Ô/Ø"×5Ñ5¸WÐ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Ü¨Ô3€Dð �k‰k˜!˜Y¨™]°ˆkÓ5×<Ñ<¼R¿Z¹ZÓH€GØ×1Ñ1¸Ð1ÓAÐØ×$Ñ$¨¨Ò4Ð4Ð4Ü
�‰� '§-¡-Ô0€AÜ�9Óò %ˆØ˜1‘×"Ñ"Ó$ˆˆ!Šð%äÐ'¬¯©°«´R·W±W¼R¿V¹VÀA»YÓ5GÑ)GÔHÜÐ'¨ªa¨Ñ0°$·)±)·.±.ÀÀ4ÊÀ7ÁÓ2LÔMä—H‘H 2Ô&¬¯©°bÔ(9Ð:ò /ˆØ—.‘.¤§¡Ó,ˆØ"×5Ñ5¸WÐ5ÓEÐØ"×(Ñ(¨G¯M©MÒ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Ü¨Ô3€DÜ9ØØØôÑ€FˆNô
 —K‘K  Q¨IÔ6€Mà�J‰J×(Ñ(ØØ%Ø#ð )ó €Eð
 �M‰MØØ%Ø#ð ó €Eô
 �E˜5Õ!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Ó
3€CØ€IÜÓ€EÜ"¨QÔ/€HØ�k‰k˜!˜Q YˆkÓ/×6Ñ6´r·z±zÓB€GØ—Z‘Z Y�ZÓ/€NÜ—8‘8˜Y¨˜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;   € Ø�‰E�A‰IˆÜ�w‰w”r—v‘v˜a¤"§&¡&¨!¨¨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.   € à�‰E�A‰IˆØˆr�QœŸ™  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Ðœv¡h°Ð&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
«      rÝd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ØØØØØôÑ€FˆNô ˆt�_Ô%Ø×"Ñ" >Ó2ˆØ�{‰{˜y¨$¯.©.Ð9Ò9Ð9Ð9Ü�v‰v�e !Ô$¬¨q°eÔ(<Ò<Ð<Ð<äˆtÐ%Ô&àØ”2—=‘= Ó0Ð1Ü�]‰]˜>Ó*¨DÐ1Ü�]‰]˜>Ó*¬B¯M©M¸.Ó,IÐJð	
ò 	‰KˆD�%ð ×-Ñ-ØØ-Ø"Ø!Øð .ó ‰KˆD�%ð —;‘; 9¨d¯n©nÐ"=Ò=Ð=Ð=Ü—6‘6˜% aÔ(¬F°1¸%Ô,@Ò@Ð@Ð@ÜØØ—‘Ø!Ø#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)zÊTest 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ó Ñ€Hˆgð
 ×ÒØ�~‰~ ) Ò-Ð-Ð-Ø�}‰} Ò$Ð$Ð$Ø	×	Ò	Ø�~‰~ )¨T¯^©^Ð!<Ò<Ð<Ð<Ø�}‰} ¨D¯N©NÐ ;Ò;Ð;Ð;à�}‰}  Ò,Ð,Ð,Ø�}‰}  Ò,Ð,Ð,à�>‰>˜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   € ñ ‹6€DÜ	�‰œ
¤IÐ.°gÔ	>ñ RØ:˜D×:Ñ:ÑQÀQÐ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 
�‰�x wÔ	/ñ Ù‰ˆ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ØØØØØôÑ€FˆNô —<‘< Ó%€LÜ—\‘\ ,Ó/€NÙ�v¨nÔ=ÄÙ˜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Ø¨¸ôÑ€FˆNð ×"Ñ"×*Ñ*¨>Ó:€Fð  ×$Ñ$Ø nð %ó à×1Ñ1°&Ó9ñ:€Hð *×.Ñ.Ø fð /ó à×6Ñ6°vÓ>ñ?€Mô �H˜mÔ,ð !1× AÑ AØ nð !Bó !Ñ€L�+ð +@×*PÑ*PØ fð +Qó +Ñ'ÐÐ'ô �L &Ð+<Ñ"<Ô=ÜØ�VÐ/Ñ/°&¸!±)Ð>NÑ2NÑ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á�.�'—.‘.Ó"Ó#€
à%/Ö0˜T‘$•&Ò0€à Ù˜ÔÙ�tÔÙ˜$ÔÙ˜!ÔÙ˜!ÔÙ˜!ÔÙ˜#ÔÙ !Ô$Ù !Ô$Ù !Ô$Ù #Ô&ðñ €òð  CEó""òJUð ‡�×Ñ˜ Ð5GÐÓHñ <ó Ið <ñL ÓÒ,°·±¨w¸¿¹Ð.?Ð@Ùƒ_Ò)¨R¯V©V¨G°R·V±VÐ+<Ð=Ùƒ]Ò'¨2¯6©6¨'°2·6±6Ð):Ð;Ùƒ[Ò%¨¯©¨°·±Ð'8Ð9ÙÓ˜˜c˜
 b§f¡f W¨b°$¸¿¹Ð$?Ð@Ùƒ_�s˜C�j B§F¡F 7¨B°°a¸¿¹Ð"@ÐAÙ˜2Ô  c 
¨b¯f©f¨W°b·f±fÐ,=Ð>Ù˜1Ô  S˜z¨R¯V©V¨G°R·V±VÐ+<Ð=Ù˜3Ô # s ¨r¯v©v¨g°r¸4ÀÇÁÐ-HÐIÙ˜1Ô  S˜z¨R¯V©V¨G°R¸¸qÀ"Ç&Á&Ð+IÐJÙ˜1Ô  S˜z¨R¯V©V¨G°R¸¸qÀ"Ç&Á&Ð+IÐJÙ 2Ô&¨¨c¨
°b·f±f°W¸b¿f¹fÐ4EÐFÙ 1Ô%Ò'>À"Ç&Á&ÀÈ"Ï&É&Ð@QÐRÙ 3Ô'¨#¨s¨°r·v±v°g¸rÀ4ÈÏÉÐ5PÐQÙ 1Ô%¨¨S z°R·V±V°G¸RÀÀqÈ"Ï&É&Ð3QÐRÙ 1Ô%¨¨S z°R·V±V°G¸RÀÀqÈ"Ï&É&Ð3QÐRÙÓš¨B¯F©F¨7°B¸¸2¿6¹6Ð*BÐCÙÓ˜B "§&¡& ¨"¨c°2·6±6Ð :Ð;ð'€ñ2 Ó˜˜˜RÐ Ùƒ[�1�#�rÐÙ˜2Ô¢°Ð4Ù˜1Ô  a˜y¨"Ð-Ù˜3Ô !  bÐ)Ù 2Ô&ª¸Ð<Ù 1Ô%¨¨a y°"Ð5Ù 3Ô'¨!¨¨bÐ1ÙÓ˜!˜Q˜ Ð$ÙÓšM¨2Ð.ð€ñ Ó˜˜Q˜CÐ Ù˜2Ô ¢MÐ2Ù˜1Ô˜r¢=Ð1Ù˜3Ô  a SÐ)Ù 2Ô&¨ªMÐ:Ù 1Ô%¢}°bÐ9Ù 3Ô'¨¨a¨SÐ1ÙÓ˜˜a ˜VÐ$ÙÓ˜S #˜J¨¨A¨Ð/ð€ð ‡�×ÑØ'Ø�mÑ#óñ7ó	ð7ð ‡�×ÑØ'Ø�mÑ#óñ7ó	ð7ð ‡�×ÑØJðsÙ	Ó	˜S # q¨!¨QÐ/ðsá	‹˜#˜s C¨¨dÐ3ðsñ 
˜cÔ	" C¨¨a°°dÐ;ðsñ 
˜dÔ	# S¨#¨~¸xÈÐNð	sñ
 
˜dÔ	# S¨#¨x¸ÀÐEðsñ 
˜C qÔ	)¨3°°_ÀdÈDÐQðsñ 
˜C qÔ	)¨3°°ZÀÀtÐLðsñ 
Ó	˜C  §¡¨£¨A°°F°B·F±F¸1³I±Ñ,=¸uÀaÐHðsñ 
‹˜#˜v˜rŸv™v a›y¨&¨"¯&©&°«)°eÑ*;¸YÈÐNðsñ 
˜qÔ	! 3¨¨¯©¨q«	Ð3DÀdÈDÐQðsñ 
! qÔ	)¨3°°Q¸¸V¸R¿V¹VÀA»Y¹Ñ5FÈÈdÐSðsñ 
! qÔ	)¨3°°V°R·V±V¸A³YÀÑ5FÈÈdÐSðsñ $¨!Ô,ØØØ)ØØð	
ðsñ, ÓØØˆB�F‰F�1‹IØˆB�H‰H�Q‹K˜$  §¡¨£Ñ*Ñ*ØØð	
ð+sñr 
Ó	˜S %¨¨A¨qÐ1ðssñt 
Ó	˜S %¨¨r°1Ð5ðusñv 
Ó	˜S $¨¨1¨aÐ0ðwsñx 
Ó	˜S $¨¨R°Ð3ðysñz 
Ó	˜S %¨¨r°1Ð5ð{sñ| 
Ó	˜S %¨¨YÐ8MÐNð}sñ~ 
Ó	˜S %ÐFÐ+@Ð*AÀAÑ*EÑFðsñ@ 
Ó	˜S %¨¨yÐ:OÐPðAsñB 
Ó	˜S %ÐFÐ+@Ð*AÀAÑ*EÑFðCsñD 
Ó	˜S $¨¨IÐ7LÐMðEsñF 
Ó	˜S $ÐEÐ*?Ð)@À1Ñ)DÑEðGsñH 
Ó	˜S $¨¨aÐ1FÐGðIsñJ 
Ó	˜S %¨°Ð3JÐKðKsñL 
Ó	˜S $¨¨1¨aÐ0ðMsñN 
Ó	˜S $¨¨a°Ð3ðOsñR ÓØØØØ$Ø#ð	
ðQsñ` 
Ó	˜S %¨¨A¨qÐ1ðasñb 
Ó	˜S # q¨!¨QÐ/ðcsñd 
Ó	˜S # s¨A¨qÐ1ðe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 ‡�×Ñ˜ Ó,Ø‡�×ÑÐ*¨U°D¨MÓ:Ø‡�×Ñ˜ b§j¡j°"·*±*Ð%=Ó>Ø‡�×Ñ˜ r§z¡z°2·:±:Ð&>Ó?Ø‡�×Ñ˜¨4°¨)Ó4Ø‡�×Ñ˜ $¨ Ó+Ø‡�×Ñ˜ $¨ Ó+Ø‡�×Ñ˜ q¨! fÓ-ñY7ó .ó ,ó ,ó 5ó @ó ?ó ;ó -ðY7ðx ‡�×Ñ˜ Ð5GÐÓHØ‡�×Ñ˜¨4°¨/Ó:ñK$ó ;ó IðK$ð\ ‡�×Ñ˜ Ð5GÐÓHØ‡�×Ñ˜¨4°¨/Ó:ñL>ó ;ó IðL>ð^ ‡�×Ñ˜ Ð5GÐÓHØ‡�×Ñ˜¨6°8Ð*<Ó=ñ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ð>9ðB ‡�×ÑØá	Ó	˜RŸW™W hÐ/Ù	‹˜"Ÿ)™) XÐ.Ù	˜dÔ	#Ñ%EÀxÐPÙ	Ó	˜BŸG™G YÐ/Ù	‹˜"Ÿ'™' =Ð1Ù	Ó	˜BŸG™G ]Ð3Ù	Ó	˜RŸW™W jÐ1ðóñ/óð/ò>/ò."ò<ð" ‡�×Ñ˜ H B§H¡Hª[Ó$9¸8¸2¿8¹8ÂKÓ;PÐ#QÓRØ‡�×Ñ˜ H B§H¡Hª^Ó$<¸h¸b¿h¹hÂ{Ó>SÐ#TÓUñEó Vó SðEðD ‡�×Ñ˜ Ð5GÐÓHñ(ó Ið(ðV ‡�×Ñ˜ Ó,Ø‡�×Ñ˜¨4°¨/Ó:Ø‡�×Ñ˜ 2§:¡:¨r¯z©zÐ":Ó;Ø‡�×Ñ˜ *Ó-ñ!*ó .ó <ó ;ó -ð!*ðH ‡�×Ñ˜ Ó,Ø‡�×ÑØð �b—h‘hÐØ9¸"¿(¹(¸À9ÐMð	
ðóñRóó -ðRð ‡�×ÑØ%ð Ø˜ÐØØBð		
ð Ø˜ˆOØØ)ð		
ð 
�z 3Ð'¨Ð5TÐUàØ˜ÐØØBð		
ð Ø˜ˆOØØ)ð		
ð 
�Z Ð% zÐ3RÐSð5óñ>ó?ð>ð ‡�×Ñ˜ Ð5GÐÓHñó Iðð" ‡�×Ñ˜Ò5Ó6ñ)ó 7ñ)ùòE( 1s   Á:w3