Ë
    ÷Q(h�Â  ã                   óü  — d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z  d d	l!m"Z"m#Z# d d
l$m%Z%  e& ejN                  «       «      Z(e(D � cg c]	  }  | «       ‘Œ c} Z)e) ed¬«       ed¬«       ed¬«       ed ¬«       ed¬«       ed¬«       ed¬«       ed ¬«       ed¬«       ed¬«       ed¬«      gz  Z)d„ Z*	 d‘d„Z+d„ Z,ejZ                  j]                  de)e*¬«      d„ «       Z/ e«       g d¢ej`                   ej`                  gf e«       g d¢ej`                   ej`                  gf e«       g d¢ej`                   ej`                  gf e«       g d¢ej`                   ej`                  gf e«       ddgej`                   ddej`                  gf e«       ddgej`                   ddd ej`                  gf ed¬«      ddgej`                   ej`                  gf ed ¬«      ddgej`                   ej`                  gf ed¬«      ddgej`                   ddej`                  gf ed¬«      ddgej`                   ddd ej`                  gf ed¬«      ddgej`                   ddd ej`                  gf ed¬«      ddgej`                   ej`                  gf ed ¬«      g d ¢ej`                   ej`                  gf ed¬«      ddgej`                   ddej`                  gf ed¬«      ddgej`                   ddd ej`                  gf ed¬«      ddgej`                   ddd ej`                  gf e«       g d!¢ej`                   d"dej`                  gf e«       g ej`                   d"d#ej`                  gfgZ1 e«       d gg f e«       d gg f ed¬«      g d$¢g f ed ¬«      d%d gg f ed¬«      d gg f ed¬«      g d$¢g f ed ¬«      d%d gg f ed¬«      d gg f e«       d dgg f e«       g d&¢g fg
Z2 e«       g d gf ed¬«      g g d'¢f ed ¬«      g g d'¢f ed¬«      g d gf ed¬«      g g d'¢f ed ¬«      g d'¢g f ed¬«      g d gf e«       g d dgf e«       dd(gd dgfg	Z3ejZ                  j]                  d)e1e2z   «      d*„ «       Z4ejZ                  j]                  d+e1e3z   «      d,„ «       Z5ejZ                  j]                  d-g  e«       d.d/d0d1df‘ e«       d.d/d2d.df‘ ed(¬«      d.d/dd(df‘ ed¬«      d.d/dddf‘ ed¬«      d/d.d.d3df‘ ed(d¬4«      d.d/d5ddf‘ ed(d¬4«      d.dd6ddf‘ e«       d6 ejl                  d1«      d1d ejl                  d1«      z  z
  dd1f‘ e«       d6 ejl                  d1«       ejl                  d1«      d(z   d(d(f‘ ed¬«      d6 ejl                  d1«      d7ddf‘ ed¬«      d6d2dd ejl                  d«      z  z
  ddf‘ ed¬«      d6d2 ejl                  d«      d(z
  ddf‘ ed¬«      d6d2d8ddf‘ e«       d ejl                  d1«       ejn                  d1«      d ejl                  d1«      z  z
  ddf‘ e«       d9d:d d d f‘ e«       d.d:d;d"d f‘ e«       d9d<d d d f‘ e«       d.d<d=d"d f‘ e«       d.d>d?d"d f‘ e«       d.d@dAdBdCf‘ e«       d9d@gdCgdz  ¢­‘ e«       d.dDdEdBdFf‘ e«       d9dDgdFgdz  ¢­‘ e«       d9dGdAdHdCf‘ e«       d.dGgdIgdz  ¢­‘ e«       d9d?d?ddJf‘ e«       d9dKdKddLf‘ e«       d.d;d d d f‘ e«       d9d;d;dd f‘ e«       d.dKd dMdLf‘ e«       d.dNd d d f‘ e«       d.d=d d d f‘ e«       d9d=d=dd f‘ ed¬O«      d9g dP¢ eg dP¢«      dQz
  ddf‘ ed¬O«      d.g dP¢ eg dP¢«      d(z
  ddf‘ ed¬O«      d6g dP¢ eg dP¢«      dRz
  ddf‘ ed¬O«      d6g dS¢ eg dS¢«      dTz
  ddf‘e*¬«      dU„ «       Z8ejZ                  j]                  de(«      ejZ                  j]                  dVdWdXg«      ejZ                  j]                  dYejr                  ejt                  g«      ejZ                  j]                  dZejr                  ejt                  g«      ejZ                  j]                  d[ddg«      ejZ                  j]                  d\ddg«      ejZ                  j]                  d]ddg«      ejZ                  j]                  d^ddg«      d_„ «       «       «       «       «       «       «       «       Z;ejZ                  j]                  de)e*¬«      ejZ                  j]                  d[dd`g«      da„ «       «       Z<ejZ                  j]                  de)e*¬«      ejZ                  j]                  d[dd`g«      db„ «       «       Z=ejZ                  j]                  de)e*¬«      ejZ                  j]                  d[dcddg«      de„ «       «       Z>ejZ                  j]                  de)e*¬«      df„ «       Z?ejZ                  j]                  de)e*¬«      ejZ                  j]                  d[dd`g«      dg„ «       «       Z@ejZ                  j]                  de)e*¬«      ejZ                  j]                  d[dd`g«      dh„ «       «       ZAejZ                  j]                  dig dj¢«      e#dk„ «       «       ZBejZ                  j]                  de)e*¬«      ejZ                  j]                  d[dd`g«      dl„ «       «       ZCejZ                  j]                  dm e«       ejˆ                  dnf e«       ejŠ                  dnf ed¬«      do„ dnf e«       ejˆ                  dpf e«       ejˆ                  dqf e«       ejˆ                  dqf e«       ejˆ                  drfg«      ds„ «       ZFdt„ ZGdu„ ZHdv„ ZIejZ                  j]                  dw ej”                  g dx¢«       ej”                  g dy¢«      f«      ejZ                  j]                  dz ej”                  g d{¢«       ej”                  g d|¢«      f«      d}„ «       «       ZKejZ                  j]                  de)e*¬«      d~„ «       ZLejZ                  j]                  de(«      ejZ                  j]                  d[dd`g«      ejZ                  j]                  dejr                  ejt                  f«      ejZ                  j]                  d€d�«      d‚„ «       «       «       «       ZMejZ                  j]                  de(«      ejZ                  j]                  dƒdejœ                  id„ejœ                  › d…�fg«      d†„ «       «       ZOejZ                  j]                  d‡edˆdiePd‰fedˆd ieQdŠfedˆd#ieQd‹fedˆdiePd‰fedˆd ieQdŠfedˆd#ieQd‹fg«      dŒ„ «       ZRejZ                  j]                  de)e*¬«      d�„ «       ZSejZ                  j]                  dŽg d�¢«      d�„ «       ZTyc c} w )’é    N)Úassert_allcloseÚassert_array_equal)Úapprox)ÚLinearConstraintÚminimizeÚminimize_scalarÚnewton)Ú	logsumexp)ÚIdentityLinkÚ_inclusive_low_high)Ú_LOSSESÚAbsoluteErrorÚBaseLossÚHalfBinomialLossÚHalfGammaLossÚHalfMultinomialLossÚHalfPoissonLossÚHalfSquaredErrorÚHalfTweedieLossÚHalfTweedieLossIdentityÚ	HuberLossÚPinballLoss)Úassert_all_finite)Úcreate_memmap_backed_dataÚskip_if_32bit)Ú_IS_WASMg      Ð?)Úquantileg      è?ç      ø¿©Úpoweré   é   ç      @c                 ó�  — t        | t        «      r¬| }|j                  j                  }t        |t        «      r|d|j
                  j                  › d�z  }|S t        |t        «      r|d|j                  › �z  }|S t        |d«      r3t        |j
                  d«      r|d|j
                  j                  › d�z  }|S t        | «      S )Nz
(quantile=ú)Úclossr    z(power=)Ú
isinstancer   Ú	__class__Ú__name__r   r&   r   r   Úhasattrr    Ústr)ÚparamÚlossÚnames      ú[/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sklearn/_loss/tests/test_loss.pyÚloss_instance_namer0   5   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©r5   é   )ÚnpÚrandomÚRandomStateÚis_multiclassÚemptyÚ	n_classesÚuniformÚflatÚarangeÚastypeÚfloatr'   Úlinkr   r   Úinterval_y_predÚamaxÚaminÚinterval_y_trueÚmaxÚminr3   Úlow_inclusiver4   Úhigh_inclusive)
r-   Ú	n_samplesÚy_boundÚ	raw_boundÚseedÚrngÚraw_predictionÚy_truer3   r4   s
             r/   Úrandom_y_true_raw_predictionrS   D   sá  € ô �)‰)×
Ñ
 Ó
%€CØ×ÒÜŸ™ 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™Ð(Ñ)à�>Ð!Ð!r1   c                 óÄ   — t        j                  ||¬«      } | |d|z  z
  «      } | ||z
  «      } | ||z   «      } | |d|z  z   «      }| d|z  z   d|z  z
  |z   d|z  z  S )z2Helper function for numerical (first) derivatives.)Ú
fill_valuer"   é   ç      (@)r8   Ú	full_like)ÚfuncÚxÚepsÚhÚ
f_minus_2hÚ
f_minus_1hÚ	f_plus_1hÚ	f_plus_2hs           r/   Únumerical_derivativera   i   sy   € ô 	�‰�Q 3Ô'€AÙ�a˜!˜a™%‘i“€JÙ�a˜!‘e“€JÙ�Q˜‘U“€IÙ�Q˜˜Q™‘Y“€IØˆJ˜˜Y™Ñ&¨¨Z©Ñ7¸*ÑDÈÐPSÉÑTÐTr1   r-   )Úidsc                 óà  — | j                   r2d}t        j                  t        j                  d|dz
  |¬«      d«      }n0t	        | j
                  «      \  }}t        j                  ||d¬«      }| j
                  j                  r)t        j                  || j
                  j                  f   }| j
                  j                  r)t        j                  || j
                  j                  f   }| j                  |«      sJ ‚|j                  d   }t	        | j                  «      \  }}| j                   rct        j                  |f«      }t        j                  |||¬«      |dd…df<   dd|dd…df   z
  z  |dd…df<   dd|dd…df   z
  z  |dd…df<   nt        j                  |||¬«      }| j                  |«      sJ ‚| j                   j!                  |«      }| j#                  ||¬	«       y)
z4Test interval ranges of y_true and y_pred in losses.r7   r   r!   ©Únumé
   Nç      à?r"   ©rR   rQ   )r;   r8   ÚtileÚlinspacer   rG   rJ   Úr_r3   rK   r4   Úin_y_true_rangeÚshaperD   r<   Úin_y_pred_rangerC   r-   )r-   r=   rR   r3   r4   ÚnÚy_predrQ   s           r/   Útest_loss_boundaryrq   w   s©  € ð ×ÒØˆ	Ü—‘œŸ™ Q¨	°A©¸9Ô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Õ;r1   )éœÿÿÿr   çš™™™™™¹?éd   rs   rt   éýÿÿÿçš™™™™™¹¿ç      ø?r7   )ru   rv   r   rs   rt   )rs   rg   çÍÌÌÌÌÌì?éÿÿÿÿgš™™™™™ñ?)rr   rv   r   rr   )ç        ç      ð?r"   )ru   rv   r   rg   z!loss, y_true_success, y_true_failc                 ó¼   — |D ])  }| j                  t        j                  |g«      «      rŒ)J ‚ |D ])  }| j                  t        j                  |g«      «      sŒ)J ‚ y)z-Test boundaries of y_true for loss functions.N)rl   r8   Úarray)r-   Úy_true_successÚy_true_failÚys       r/   Útest_loss_boundary_y_truer�   Î   ó^   € ð
 ò 3ˆØ×#Ñ#¤B§H¡H¨a¨S£MÕ2Ð2Ð2ð3àò 7ˆØ×'Ñ'¬¯©°!°«Õ6Ð6Ð6ñ7r1   z!loss, y_pred_success, y_pred_failc                 ó¼   — |D ])  }| j                  t        j                  |g«      «      rŒ)J ‚ |D ])  }| j                  t        j                  |g«      «      sŒ)J ‚ y)z-Test boundaries of y_pred for loss functions.N)rn   r8   r}   )r-   Úy_pred_successÚy_pred_failr€   s       r/   Útest_loss_boundary_y_predr†   Ù   r‚   r1   zDloss, y_true, raw_prediction, loss_true, gradient_true, hessian_truer{   g      @rV   é   g      @g      Ð¿)r   Údeltag      @ç       @g      È¿g      °?rz   g@Œµx¯Äg@Œµx¯Dg     @�Àg     @�@g     À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=   )çš™™™™™É?rg   ç333333Ó?rŒ   r�   )g     ˆÃ@r   ç_eGô|§>rŽ   c                 óÄ  —  | t        j                  |g«      t        j                  |g«      ¬«      }| j                  t        j                  |g«      t        j                  |g«      ¬«      }| j                  t        j                  |g«      t        j                  |g«      ¬«      \  }}	| j	                  t        j                  |g«      t        j                  |g«      ¬«      \  }
}|t        |dd¬«      k(  sJ ‚|t        |dd¬«      k(  sJ ‚|�9|t        |dd¬«      k(  sJ ‚|	t        |dd¬«      k(  sJ ‚|
t        |dd¬«      k(  sJ ‚|�|t        |dd¬«      k(  sJ ‚yy)z7Test losses, gradients and hessians at specific values.rh   çVçž¯Ò<)ÚrelÚabsN)r8   r}   ÚgradientÚloss_gradientÚgradient_hessianr   )r-   rR   rQ   Ú	loss_trueÚgradient_trueÚhessian_trueÚloss1Úgrad1Úloss2Úgrad2Úgrad3Úhesss               r/   Útest_loss_on_specific_valuesrŸ   ä   sb  € ñx œŸ™ & Ó*¼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ð  r1   Úreadonly_memmapFTÚdtype_inÚ	dtype_outÚsample_weightÚout1Úout2Ú	n_threadsc                 ó*  — t         r|rt        j                  d¬«        | «       } d}t        | |ddd¬«      \  }	}
|	j	                  |«      }	|
j	                  |«      }
|�t        j                  d	g|z  |¬
«      }|�t        j                  |	|¬
«      }|�t        j                  |
|¬
«      }|r#t        |	«      }	t        |
«      }
|�t        |«      }| j                  |	|
|||¬«      }|�||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.
    zmemmap not fully supported)Úreasoné   ©rr   rt   ©éöÿÿÿrf   é*   ©r-   rL   rM   rN   rO   Nr‰   ©Údtype)rR   rQ   r£   Úloss_outr¦   )rR   rQ   r£   Úgradient_outr¦   )rR   rQ   r£   r±   r²   r¦   )rR   rQ   r£   r²   Úhessian_outr¦   ©rR   rQ   r£   ©rR   r£   Úpredict_proba)rQ   Úgradient_proba)rR   rQ   r£   r²   Ú	proba_outr¦   )r   ÚpytestÚxfailrS   rA   r8   r}   Ú
empty_liker   r-   r“   r”   r;   r•   Úfit_intercept_onlyÚconstant_to_optimal_zeror*   r¶   r·   )r-   r    r¡   r¢   r£   r¤   r¥   r¦   rL   rR   rQ   ÚlÚgr\   Úps                  r/   Útest_loss_dtyperÁ   w  s¼  € õ$ ‘OÜ�‰Ð8Õ9á‹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ð 'r1   Úrangec                 óâ  — t        | dddd¬«      \  }}|dk(  r2t        j                  d|j                  d   |j                  d   ¬	«      }t        j                  |«      }t        j                  |«      }t        j                  |«      }t        j                  |«      }t        j                  |«      }t        j                  |«      }	| j                  ||||¬
«       | j                  j                  ||||¬
«      f t        ||«       | j                  ||||¬«       | j                  j                  ||||¬«       t        ||«       | j                  j                  |||||¬«       | j                  j                  |||||¬«       t        ||«       t        ||«       | j                  |||||¬«       | j                  j                  |||||	¬«       t        ||«       t        ||	«       y)z:Test that Python and Cython functions return same results.é   rª   r«   r­   r®   rÂ   r!   r   rd   ©rR   rQ   r£   r±   ©rR   rQ   r£   r²   ©rR   rQ   r£   r±   r²   ©rR   rQ   r£   r²   r³   N)rS   r8   rj   rm   r»   r-   r&   r   r“   r”   r•   )
r-   r£   rR   rQ   Úout_l1Úout_l2Úout_g1Úout_g2Úout_h1Úout_h2s
             r/   Útest_loss_same_as_C_functionsrÏ   Þ  s  € ô :ØØØØØôÑ€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Õ#r1   c                 óF  — t        | ddd|¬«      \  }}|dk(  r2t        j                  d|j                  d   |j                  d   ¬«      }t        j                  |«      }t        j                  |«      }t        j                  |«      }t        j                  |«      }t        j                  |«      }	t        j                  |«      }
| j                  ||||¬	«      }| j                  ||||¬
«      }| j                  |||||¬«      \  }}| j                  ||||	|
¬«      \  }}t        ||«       t        ||«       t        j                  ||«      sJ ‚t        ||«       t        j                  ||«      sJ ‚t        ||«       t        ||«       t        ||«       t        j                  ||«      sJ ‚t        ||«       t        j                  ||«      sJ ‚t        ||	«       t        j                  ||	«      sJ ‚t        | d«      r™| j                  sJ ‚t        j                  |«      }t        j                  |«      }| j                  |||||¬«      \  }}t        ||«       t        ||«       t        ||«       t        t        j                  |d¬«      dd¬«       yy)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   rd   rÅ   rÆ   rÇ   rÈ   r·   ©rR   rQ   r£   r²   r¸   ©Úaxisç•dyáý¥=)ÚrtolN)rS   r8   rj   rm   r»   r-   r“   r”   r•   r   r   Úshares_memoryr*   r;   r·   Úsum)r-   r£   Úglobal_random_seedrR   rQ   rÉ   rÊ   rË   rÌ   Úout_g3Úout_h3Úl1Úg1Úl2Úg2Úg3Úh3Úout_g4Ú	out_probaÚg4Úprobas                        r/   Ú test_loss_gradients_are_the_samerå   .  s�  € ô :ØØØØØôÑ€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Ö=ð 'r1   Úonesr9   c           	      ón  — d}t        | |dd|¬«      \  }}|dk(  r&t        j                  |t        j                  ¬«      }nNt        j                  j                  |«      }|j                  |¬«      j                  t        j                  «      }t        | j                  |||¬«      || j                  ||d	¬«      z  «       | j                  ||d	¬«      \  }}| j                  |||¬«      \  }	}
t        ||z  |	«       | j                  st        ||z  |
«       nt        ||d	d	…d	f   z  |
«       | j                  ||d	¬«      \  }}| j                  |||¬«      \  }
}| j                  st        ||z  |
«       t        ||z  |«       y	t        ||d	d	…d	f   z  |
«       t        ||d	d	…d	f   z  |«       y	)
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.
    rt   rª   ©éûÿÿÿr©   r®   ræ   )rm   r°   r6   r´   N)rS   r8   ræ   Úfloat64r9   r:   ÚnormalrA   r   r-   r”   r;   r•   )r-   r£   rØ   rL   rR   rQ   rP   Úlossesr“   Ú	losses_swÚgradient_swÚhessianÚ
hessian_sws                r/   Útest_sample_weight_multipliesrñ     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¸*ÕEr1   c                 óÌ  — t        | dddd¬«      \  }}|j                  dk(  rÂ|dd…df   }t        | j                  ||¬«      | j                  ||¬«      «       t        | j	                  ||¬«      | j	                  ||¬«      «       t        | j                  ||¬«      | j                  ||¬«      «       t        | j                  ||¬«      | j                  ||¬«      «       yy)	z5Test that reshaped raw_prediction gives same results.rÄ   rª   r«   r­   r®   r!   Nrh   )rS   Úndimr   r-   r”   r“   r•   )r-   rR   rQ   Úraw_prediction_2ds       r/   Útest_graceful_squeezingrõ   Æ  sü   € ô :ØØØØØôÑ€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õ	
ð  r1   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¬   rv   r   rs   r7   rf   ç»½×Ùß|Û=rf   )rm   rU   r°   Nr!   rÂ   r   rd   r´   rµ   ç›+¡†›„=r�   )ÚatolrÕ   )r;   r8   r}   r'   rC   r   rD   r3   rJ   r4   rK   ÚclipÚinverser@   r=   rA   rB   ÚfullÚexpr?   rj   rm   r-   r½   r   )	r-   r£   rQ   r[   r3   r4   rR   Ú
loss_valueÚconstant_terms	            r/   Útest_loss_of_perfect_predictionr   å  s“  € ð ×ÒäŸ™Ò"<Ó=ˆä�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ÀÖGr1   c                 ó"  ‡ ‡‡
‡‡— d}t        ‰ |dd|¬«      \  ŠŠ‰dk(  r2t        j                  d‰j                  d   ‰j                  d   ¬«      Š‰ j	                  ‰‰‰¬	«      \  }}|j                  ‰j                  k(  sJ ‚|j                  ‰j                  k(  sJ ‚‰ j
                  sVˆ ˆˆfd
„}t        |‰d¬«      }t        ||dd¬«       ˆ ˆˆfd„}t        |‰d¬«      }	‰ j                  ryt        ||	dd¬«       yt        ‰ j                  «      D ]w  Š
ˆ
ˆ ˆˆˆfd„}t        |‰dd…‰
f   d¬«      }t        |dd…‰
f   |dd¬«       ˆ
ˆ ˆˆˆfd„}t        |‰dd…‰
f   d¬«      }	‰ j                  rŒbt        |dd…‰
f   |	dd¬«       Œy y)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   rd   r´   c                 ó,   •— ‰j                  ‰| ‰¬«      S ©Nr´   ©r-   ©rZ   r-   r£   rR   s    €€€r/   Ú	loss_funcz6test_gradients_hessians_numerically.<locals>.loss_func6  s"   ø€ Ø—9‘9ØØ Ø+ð ó ð r1   g�íµ ÷Æ°>)r[   çñhãˆµøÔ>r÷   ©rÕ   rù   c                 ó,   •— ‰j                  ‰| ‰¬«      S r  ©r“   r  s    €€€r/   Ú	grad_funcz6test_gradients_hessians_numerically.<locals>.grad_func@  s"   ø€ Ø—=‘=ØØ Ø+ð !ó ð r1   c                 ó^   •— ‰j                  «       }| |d d …‰f<   ‰j                  ‰|‰¬«      S r  )Úcopyr-   ©rZ   ÚrawÚkr-   rQ   r£   rR   s     €€€€€r/   r  z6test_gradients_hessians_numerically.<locals>.loss_funcU  s=   ø€ Ø$×)Ñ)Ó+�Ø�’A�q�D‘	Ø—y‘yØ!Ø#&Ø"/ð !ó ð r1   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_funca  sK   ø€ Ø$×)Ñ)Ó+�Ø�’A�q�D‘	Ø—}‘}Ø!Ø#&Ø"/ð %ó ò �Q�$ñ	ð r1   )rS   r8   rj   rm   r•   r;   ra   r   Úapprox_hessianrÂ   r=   )r-   r£   rØ   rL   r¿   r\   r  Ú	g_numericr  Ú	h_numericr  rQ   rR   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r1   zloss, x0, y_true)	)Úsquared_errorg       Àr­   )r  g     @]@gÍÌÌÌÌÌð?)r  rz   rz   )Úbinomial_lossr�   rs   )r  iôÿÿÿrŒ   )r  é   rx   )Úpoisson_lossrW   r{   )r  rz   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¯   rZ   Ú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.
        rh   ©rR   )r-   r½   ©rZ   r-   rR   s    €€r/   rY   ztest_derivatives.<locals>.func�  s6   ø€ ð �y‰yØ¨!ð ó 
à×)Ñ)°Ð)Ó8ñ9ð 	9r1   c                 ó*   •— ‰j                  ‰| ¬«      S )Nrh   r
  r  s    €€r/   Úfprimez test_derivatives.<locals>.fprimeš  s   ø€ Ø�}‰} F¸1ˆ}Ó=Ð=r1   c                 ó0   •— ‰j                  ‰| ¬«      d   S )Nrh   r!   )r•   r  s    €€r/   Úfprime2z!test_derivatives.<locals>.fprime2�  s   ø€ Ø×$Ñ$¨FÀ1Ð$ÓEÀaÑHÐHr1   rt   gH¯¼šò×j>)Úx0r!  r#  ÚmaxiterÚtolr   rø   ©rù   rh   g�íµ ÷Æ >)r   r8   r}   rê   Úndarrayr	   Úravelr   rC   rû   r“   )r-   r$  rR   rY   r!  r#  Úoptimums   ` `    r/   Útest_derivativesr+  r  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ÖWr1   c                 óÄ  ‡ ‡‡‡— dŠ‰ j                   s2‰ j                  j                  t        j                  dd‰¬«      «      ŠnGt        j
                  ‰«      j                  t        j                  «      ‰ j                  z  Šd‰ddd…<   ‰dk(  rt        j                  d	d
‰¬«      Š‰ j                  ‰‰¬«      }ˆ ˆˆˆfd„}‰ j                   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‡   rd   r   Nr©   rÂ   rs   r"   rµ   c                 óÎ   •— ‰j                   st        j                  ‰| ¬«      }n6t        j                  t        j                  | ‰‰j
                  f¬«      «      } ‰‰|‰¬«      S )N)rm   rU   ©rm   r´   )r;   r8   rü   ÚascontiguousarrayÚbroadcast_tor=   )rZ   rQ   r-   rL   r£   rR   s     €€€€r/   Úfunz%test_loss_intercept_only.<locals>.funÆ  s[   ø€ Ø×!Ò!ÜŸW™W¨IÀ1ÔE‰Nä×1Ñ1Ü—‘ ¨)°T·^±^Ð)DÔEóˆNñ ØØ)Ø'ô
ð 	
r1   gH¯¼šò×z>r%  rt   )r&  Úoptionsr´   ©r‘   gê-�™—q=)r’   g‚vIhÂ%<=ÚSLSQPr!   )r&  r4  ÚmethodÚconstraintsr  r  rÒ   r'  )r;   rC   rû   r8   rj   r@   rA   rê   r=   r¼   r   r“   rX   rm   Útupler°   r   r   rZ   r×   r   Úzerosr   ræ   ri   r   )r-   r£   Úar3  ÚoptÚgradrL   rR   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˜Ó(¨!°%Ö8r1   zloss, func, random_distrë   c                 ó0   — t        j                  | d¬«      S )Né   )Úq)r8   Ú
percentile)rZ   s    r/   ú<lambda>rC  ú  s   € ¬r¯}©}¸QÀ"Ô/E€ r1   Ú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.
    rF  r!   rg   rt   r6   r  N)r8   r9   r:   rF  Úgetattrr¼   r   r   rC   rû   r'   r   r   rG   rJ   Úfillr3   rK   r4   )r-   rY   Úrandom_distrØ   rP   Úy_trainÚbaseline_predictions          r/   Ú test_specific_fit_intercept_onlyrM  õ  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ÐÜÐ-Õ.ð +r1   c            	      ó¢  — t         j                  j                  d«      } d}t        |¬«      }| j	                  d|dz   d¬«      j                  t         j                  «      }|j                  |¬«      }|j                  |fk(  sJ ‚t        j                  ||j                  ¬«      }t        |«      D ]  }||k(  j                  «       ||<   Œ t        |t        j                  |«      t        j                  t        j                  |«      «      z
  «       t        |d	d	d	…f   |j                  j                  |d	d	d	…f   «      «       t        j                  d
¬«      t        j                   d
¬«      fD ]Y  }|j                  t         j                  «      }|j                  |¬«      }|j                  |j                  k(  sJ ‚t#        |«       Œ[ y	)zATest that fit_intercept_only returns the mean functional for CCE.r   r‡   r‹   r!   rt   r6   r  r¯   Nrf   r0  )r8   r9   r:   r   ÚrandintrA   rê   r¼   rm   r:  r°   rÂ   Úmeanr   ÚlogrC   ræ   r   )rP   r=   r-   rK  rL  rÀ   r  s          r/   Ú(test_multinomial_loss_fit_intercept_onlyrR     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ÜÐ-Õ.ñ	/r1   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`.
    rt   r©   r‹   ©r-   rL   rO   rs   r"   rd   r´   N)r   rS   r8   rj   r&   Ú_test_cy_gradientr“   r   )	rØ   rL   r=   r-   rR   rQ   r£   rš   rœ   s	            r/   Útest_multinomial_cy_gradientrV  7  s�   € ð €IØ€IÜ¨Ô3€DÜ9ØØØôÑ€FˆNô
 —K‘K  Q¨IÔ6€Mà�J‰J×(Ñ(ØØ%Ø#ð )ó €Eð
 �M‰MØØ%Ø#ð ó €Eô
 �E˜5Õ!r1   c                 ó²  — t         j                  j                  | «      }d}t        «       }t	        d¬«      }|j                  dd|¬«      j                  t         j                  «      }|j                  |¬«      }t        j                  |df«      }d|z  |dd…df<   d|z  |dd…d	f<   t        |j                  ||¬
«      |j                  ||¬
«      «       y)zKTest that multinomial loss with n_classes = 2 is the same as binomial loss.rÄ   r"   r‹   r   r6   g      à¿Nrg   r!   rh   )r8   r9   r:   r   r   rO  rA   rê   rë   r<   r   r-   )rØ   rP   rL   ÚbinomÚmultinomrK  rQ   Úraw_multinoms           r/   Ú"test_binomial_and_multinomial_lossr[  U  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õr1   rR   )rz   r   r   )r{   r!   r!   rp   )g      Àré   ré   )r#   r7   r7   c                 óÔ   — d„ }d„ }t        «       }| j                  |«      } |j                  |«      }| |f} ||Ž t         ||Ž «      k(  sJ ‚t         |j                  |Ž  ||Ž «       y)aÿ  Test that both formulations of the binomial deviance agree.

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

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

    Note:
        - ESL 2*f = raw_prediction, hence the factor 2 of ESL disappears.
        - Deviance = -2*loglike + .., but HalfBinomialLoss is half of the
          deviance, hence the factor of 2 cancels in the comparison.
    c           	      ó–   — d| z  dz
  }t        j                  t        j                  dt        j                  | |z  «      z   «      «      S ©Nr"   r!   )r8   rP  rQ  rý   ©r€   Úraw_predÚzs      r/   Úalt_lossz:test_binomial_vs_alternative_formulation.<locals>.alt_lossw  s;   € Ø�‰E�A‰IˆÜ�w‰w”r—v‘v˜a¤"§&¡&¨!¨¨h©Ó"7Ñ7Ó8Ó9Ð9r1   c                 óP   — d| z  dz
  }| dt        j                  ||z  «      z   z  S r^  )r8   rý   r_  s      r/   Úalt_gradientz>test_binomial_vs_alternative_formulation.<locals>.alt_gradient{  s.   € à�‰E�A‰IˆØˆr�QœŸ™  H¡Ó-Ñ-Ñ.Ð.r1   N)r   rA   r   r   r“   )rR   rp   Úglobal_dtyperb  rd  Úbin_lossÚdatums          r/   Ú(test_binomial_vs_alternative_formulationrh  f  sv   € ò":ò/ô
  Ó!€Hà�]‰]˜<Ó(€FØ�]‰]˜<Ó(€FØ�VÐ€Eá�UÐœv¡h°Ð&6Ó7Ò7Ð7Ð7ÜÐ%�H×%Ñ% uÐ-©|¸UÐ/CÕDr1   c           
      óÂ  — d}t        | |dd|¬«      \  }}t        | d«      rU| j                  |«      }|j                  || j                  fk(  sJ ‚t        j                  |d¬«      t        dd¬	«      k(  sJ ‚t        | d
«      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Ô   r5  r·   )NNNrÑ   rÆ   )rS   r*   r¶   rm   r=   r8   r×   r   r»   r·   r   r“   )r-   rØ   rL   rR   rQ   rä   r=  s          r/   Útest_predict_probarj  Š  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Ø"&Ø!%ð	 ó õñ	ð 'r1   r°   Úorder)ÚCÚFc                 ó¾  — d}|dk(  rt        j                  |«      } | |¬«      } | j                  |||¬«      \  }}| j                  r#|j                  |fk(  sJ ‚|j                  dk(  slJ ‚| j
                  r:|j                  || j                  fk(  sJ ‚|j                  || j                  fk(  s&J ‚|j                  |fk(  sJ ‚|j                  |fk(  sJ ‚|j                  |k(  sJ ‚|j                  |k(  sJ ‚|dk(  r1|j                  j                  sJ ‚|j                  j                  sJ ‚y|j                  j                  sJ ‚|j                  j                  sJ ‚y)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  )rL   r°   rk  )r!   rl  N)r8   ræ   Úinit_gradient_and_hessianÚconstant_hessianrm   r;   r=   r°   ÚflagsÚc_contiguousÚf_contiguous)r-   r£   r°   rk  rL   r“   rï   s          r/   Útest_init_gradient_and_hessiansrt  ¶  s[  € ð €IØ˜ÒÜŸ™ 	Ó*ˆÙ˜mÔ,€DØ×6Ñ6ØØØð 7ó Ñ€Hˆgð
 ×ÒØ�~‰~ ) Ò-Ð-Ð-Ø�}‰} Ò$Ð$Ð$Ø	×	Ò	Ø�~‰~ )¨T¯^©^Ð!<Ò<Ð<Ð<Ø�}‰} ¨D¯N©NÐ ;Ò;Ð;Ð;à�}‰}  Ò,Ð,Ð,Ø�}‰}  Ò,Ð,Ð,à�>‰>˜UÒ"Ð"Ð"Ø�=‰=˜EÒ!Ð!Ð!à�‚|Ø�~‰~×*Ò*Ð*Ð*Ø�}‰}×)Ò)Ð)Ñ)à�~‰~×*Ò*Ð*Ð*Ø�}‰}×)Ò)Ð)Ñ)r1   zparams, err_msgz+Valid options for 'dtype' are .* Got dtype=z	 instead.c                 ó¬   —  | «       } t        j                  t        t        f|¬«      5   | j                  dddi|¤Ž\  }}ddd«       y# 1 sw Y   yxY w)zDTest that init_gradient_and_hessian raises errors for invalid input.©ÚmatchrL   r©   N© )r¹   ÚraisesÚ
ValueErrorÚ	TypeErrorro  )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.rv  Nrx  )r¹   ry  )r-   r|  Úerr_typer}  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®   rh   N)rS   ÚpickleÚdumpsÚloadsr   )r-   rL   rR   rQ   Úpickled_lossÚunpickled_losss         r/   Útest_loss_picklerˆ    sp   € ð €IÜ9ØØØØØôÑ€FˆNô —<‘< Ó%€LÜ—\‘\ ,Ó/€NÙ�v¨nÔ=ÄÙ˜f°^ÔDóBò ð ñ r1   rÀ   )r   r   r!   rw   r"   r7   c                 óâ  — t        | ¬«      }t        | ¬«      }d}t        ||d¬«      \  }}|j                  j	                  |«      }|j                  ||¬«      |j                  |«      z   }|j                  ||¬«      |j                  |«      z   }t        ||«       |j                  ||¬«      \  }	}
|j                  ||¬«      \  }}t        |	||z  «       t        |
||z  |dz  |z  z   «       y)zCTest for identical losses when only the link function is different.r   rf   r­   rT  rh   r"   N)	r   r   rS   rC   rû   r-   r½   r   r•   )rÀ   Úhalf_tweedie_logÚhalf_tweedie_identityrL   rR   rQ   rp   Úloss_logÚloss_identityÚgradient_logÚhessian_logÚgradient_identityÚhessian_identitys                r/   Ú%test_tweedie_log_identity_consistencyr’  &  s2  € ô '¨QÔ/ÐÜ3¸!Ô<ÐØ€IÜ9Ø¨¸ôÑ€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õr1   )rª   rè   r­   )Urƒ  Únumpyr8   r¹   Únumpy.testingr   r   r   Úscipy.optimizer   r   r   r	   Úscipy.specialr
   Úsklearn._loss.linkr   r   Úsklearn._loss.lossr   r   r   r   r   r   r   r   r   r   r   r   Úsklearn.utilsr   Úsklearn.utils._testingr   r   Úsklearn.utils.fixesr   ÚlistÚvaluesÚ
ALL_LOSSESÚLOSS_INSTANCESr0   rS   ra   ÚmarkÚparametrizerq   ÚinfÚY_COMMON_PARAMSÚY_TRUE_PARAMSÚY_PRED_PARAMSr�   r†   rQ  Úlog1prŸ   Úfloat32rê   rÁ   rÏ   rå   rñ   rõ   r   r  r+  r>  rP  ÚmedianrM  rR  rV  r[  r}   rh  rj  rt  Úint64r~  r{  rz  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¨Ð/ð€ð ‡�×ÑØ'¨¸=Ñ)Hóñ7óð7ð ‡�×ÑØ'¨¸=Ñ)Hóñ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Ó-ñ\7ó .ó ,ó ,ó 5ó @ó ?ó ;ó -ð\7ð~ ‡�×Ñ˜ Ð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ñ)ùòG( 1s   Â w9