Ë
    ÷Q(he¡  ã                   ó°  — d Z ddlZddlZddlmZ ddlmZ ddl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 dd	lmZmZmZmZmZmZ  G d
„ d«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z  G d„ de«      Z! G d„ de«      Z" G d„ de«      Z# G d„ de«      Z$ G d„ de«      Z% G d„ de«      Z& G d„ de«      Z' G d „ d!e«      Z(eee e!e"e#e$e&e'e(d"œ
Z)y)#z¹
This module contains loss classes suitable for fitting.

It is not part of the public API.
Specific losses are used for regression, binary classification or multiclass
classification.
é    N©Úxlogyé   )Úcheck_scalar)Ú_weighted_percentileé   )ÚCyAbsoluteErrorÚCyExponentialLossÚCyHalfBinomialLossÚCyHalfGammaLossÚCyHalfMultinomialLossÚCyHalfPoissonLossÚCyHalfSquaredErrorÚCyHalfTweedieLossÚCyHalfTweedieLossIdentityÚCyHuberLossÚCyPinballLoss)ÚHalfLogitLinkÚIdentityLinkÚIntervalÚ	LogitLinkÚLogLinkÚMultinomialLogitc                   ó¤   — e Zd ZdZdZdZdZdd„Zd„ Zd„ Z		 	 	 dd„Z
	 	 	 	 dd	„Z	 	 	 dd
„Z	 	 	 	 dd„Zdd„Zdd„Zdd„Zej$                  dfd„Zy)ÚBaseLossa  Base class for a loss function of 1-dimensional targets.

    Conventions:

        - y_true.shape = sample_weight.shape = (n_samples,)
        - y_pred.shape = raw_prediction.shape = (n_samples,)
        - If is_multiclass is true (multiclass classification), then
          y_pred.shape = raw_prediction.shape = (n_samples, n_classes)
          Note that this corresponds to the return value of decision_function.

    y_true, y_pred, sample_weight and raw_prediction must either be all float64
    or all float32.
    gradient and hessian must be either both float64 or both float32.

    Note that y_pred = link.inverse(raw_prediction).

    Specific loss classes can inherit specific link classes to satisfy
    BaseLink's abstractmethods.

    Parameters
    ----------
    sample_weight : {None, ndarray}
        If sample_weight is None, the hessian might be constant.
    n_classes : {None, int}
        The number of classes for classification, else None.

    Attributes
    ----------
    closs: CyLossFunction
    link : BaseLink
    interval_y_true : Interval
        Valid interval for y_true
    interval_y_pred : Interval
        Valid Interval for y_pred
    differentiable : bool
        Indicates whether or not loss function is differentiable in
        raw_prediction everywhere.
    need_update_leaves_values : bool
        Indicates whether decision trees in gradient boosting need to uptade
        leave values after having been fit to the (negative) gradients.
    approx_hessian : bool
        Indicates whether the hessian is approximated or exact. If,
        approximated, it should be larger or equal to the exact one.
    constant_hessian : bool
        Indicates whether the hessian is one for this loss.
    is_multiclass : bool
        Indicates whether n_classes > 2 is allowed.
    TFNc                 óà   — || _         || _        d| _        d| _        || _        t        t        j                   t        j                  dd«      | _        | j                  j                  | _	        y )NF)
ÚclossÚlinkÚapprox_hessianÚconstant_hessianÚ	n_classesr   ÚnpÚinfÚinterval_y_trueÚinterval_y_pred)Úselfr   r   r!   s       úP/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sklearn/_loss/loss.pyÚ__init__zBaseLoss.__init__…   sV   € ØˆŒ
ØˆŒ	Ø#ˆÔØ %ˆÔØ"ˆŒÜ'¬¯©¨´·±¸ÀÓFˆÔØ#Ÿy™y×8Ñ8ˆÕó    c                 ó8   — | j                   j                  |«      S ©zuReturn True if y is in the valid range of y_true.

        Parameters
        ----------
        y : ndarray
        )r$   Úincludes©r&   Úys     r'   Úin_y_true_rangezBaseLoss.in_y_true_rangeŽ   ó   € ð ×#Ñ#×,Ñ,¨QÓ/Ð/r)   c                 ó8   — | j                   j                  |«      S )zuReturn True if y is in the valid range of y_pred.

        Parameters
        ----------
        y : ndarray
        )r%   r,   r-   s     r'   Úin_y_pred_rangezBaseLoss.in_y_pred_range—   r0   r)   c                 óØ   — |€t        j                  |«      }|j                  dk(  r#|j                  d   dk(  r|j	                  d«      }| j
                  j                  |||||¬«       |S )aJ  Compute the pointwise loss value for each input.

        Parameters
        ----------
        y_true : C-contiguous array of shape (n_samples,)
            Observed, true target values.
        raw_prediction : C-contiguous array of shape (n_samples,) or array of             shape (n_samples, n_classes)
            Raw prediction values (in link space).
        sample_weight : None or C-contiguous array of shape (n_samples,)
            Sample weights.
        loss_out : None or C-contiguous array of shape (n_samples,)
            A location into which the result is stored. If None, a new array
            might be created.
        n_threads : int, default=1
            Might use openmp thread parallelism.

        Returns
        -------
        loss : array of shape (n_samples,)
            Element-wise loss function.
        r   r   ©Úy_trueÚraw_predictionÚsample_weightÚloss_outÚ	n_threads)r"   Ú
empty_likeÚndimÚshapeÚsqueezer   Úloss)r&   r5   r6   r7   r8   r9   s         r'   r>   zBaseLoss.loss    ss   € ð< ÐÜ—}‘} VÓ,ˆHà×Ñ !Ò#¨×(<Ñ(<¸QÑ(?À1Ò(DØ+×3Ñ3°AÓ6ˆNà�
‰
�‰ØØ)Ø'ØØð 	ô 	
ð ˆr)   c                 óü  — |€O|€+t        j                  |«      }t        j                  |«      }nEt        j                  ||j                  ¬«      }n#|€!t        j                  ||j                  ¬«      }|j                  dk(  r#|j                  d   dk(  r|j                  d«      }|j                  dk(  r#|j                  d   dk(  r|j                  d«      }| j                  j                  ||||||¬«       ||fS )a¯  Compute loss and gradient w.r.t. raw_prediction for each input.

        Parameters
        ----------
        y_true : C-contiguous array of shape (n_samples,)
            Observed, true target values.
        raw_prediction : C-contiguous array of shape (n_samples,) or array of             shape (n_samples, n_classes)
            Raw prediction values (in link space).
        sample_weight : None or C-contiguous array of shape (n_samples,)
            Sample weights.
        loss_out : None or C-contiguous array of shape (n_samples,)
            A location into which the loss is stored. If None, a new array
            might be created.
        gradient_out : None or C-contiguous array of shape (n_samples,) or array             of shape (n_samples, n_classes)
            A location into which the gradient is stored. If None, a new array
            might be created.
        n_threads : int, default=1
            Might use openmp thread parallelism.

        Returns
        -------
        loss : array of shape (n_samples,)
            Element-wise loss function.

        gradient : array of shape (n_samples,) or (n_samples, n_classes)
            Element-wise gradients.
        ©Údtyper   r   )r5   r6   r7   r8   Úgradient_outr9   )r"   r:   rA   r;   r<   r=   r   Úloss_gradient)r&   r5   r6   r7   r8   rB   r9   s          r'   rC   zBaseLoss.loss_gradientÍ   sõ   € ðL ÐØÐ#ÜŸ=™=¨Ó0�Ü!Ÿ}™}¨^Ó<‘äŸ=™=¨°|×7IÑ7IÔJ‘ØÐ!ÜŸ=™=¨¸x¿~¹~ÔNˆLð ×Ñ !Ò#¨×(<Ñ(<¸QÑ(?À1Ò(DØ+×3Ñ3°AÓ6ˆNØ×Ñ Ò! l×&8Ñ&8¸Ñ&;¸qÒ&@Ø'×/Ñ/°Ó2ˆLà�
‰
× Ñ ØØ)Ø'ØØ%Øð 	!ô 	
ð ˜Ð%Ð%r)   c                 ó<  — |€t        j                  |«      }|j                  dk(  r#|j                  d   dk(  r|j	                  d«      }|j                  dk(  r#|j                  d   dk(  r|j	                  d«      }| j
                  j                  |||||¬«       |S )aª  Compute gradient of loss w.r.t raw_prediction for each input.

        Parameters
        ----------
        y_true : C-contiguous array of shape (n_samples,)
            Observed, true target values.
        raw_prediction : C-contiguous array of shape (n_samples,) or array of             shape (n_samples, n_classes)
            Raw prediction values (in link space).
        sample_weight : None or C-contiguous array of shape (n_samples,)
            Sample weights.
        gradient_out : None or C-contiguous array of shape (n_samples,) or array             of shape (n_samples, n_classes)
            A location into which the result is stored. If None, a new array
            might be created.
        n_threads : int, default=1
            Might use openmp thread parallelism.

        Returns
        -------
        gradient : array of shape (n_samples,) or (n_samples, n_classes)
            Element-wise gradients.
        r   r   )r5   r6   r7   rB   r9   )r"   r:   r;   r<   r=   r   Úgradient)r&   r5   r6   r7   rB   r9   s         r'   rE   zBaseLoss.gradient  s¨   € ð> ÐÜŸ=™=¨Ó8ˆLð ×Ñ !Ò#¨×(<Ñ(<¸QÑ(?À1Ò(DØ+×3Ñ3°AÓ6ˆNØ×Ñ Ò! l×&8Ñ&8¸Ñ&;¸qÒ&@Ø'×/Ñ/°Ó2ˆLà�
‰
×ÑØØ)Ø'Ø%Øð 	ô 	
ð Ðr)   c                 ó0  — |€C|€+t        j                  |«      }t        j                  |«      }n-t        j                  |«      }n|€t        j                  |«      }|j                  dk(  r#|j                  d   dk(  r|j	                  d«      }|j                  dk(  r#|j                  d   dk(  r|j	                  d«      }|j                  dk(  r#|j                  d   dk(  r|j	                  d«      }| j
                  j                  ||||||¬«       ||fS )aÿ  Compute gradient and hessian of loss w.r.t raw_prediction.

        Parameters
        ----------
        y_true : C-contiguous array of shape (n_samples,)
            Observed, true target values.
        raw_prediction : C-contiguous array of shape (n_samples,) or array of             shape (n_samples, n_classes)
            Raw prediction values (in link space).
        sample_weight : None or C-contiguous array of shape (n_samples,)
            Sample weights.
        gradient_out : None or C-contiguous array of shape (n_samples,) or array             of shape (n_samples, n_classes)
            A location into which the gradient is stored. If None, a new array
            might be created.
        hessian_out : None or C-contiguous array of shape (n_samples,) or array             of shape (n_samples, n_classes)
            A location into which the hessian is stored. If None, a new array
            might be created.
        n_threads : int, default=1
            Might use openmp thread parallelism.

        Returns
        -------
        gradient : arrays of shape (n_samples,) or (n_samples, n_classes)
            Element-wise gradients.

        hessian : arrays of shape (n_samples,) or (n_samples, n_classes)
            Element-wise hessians.
        r   r   )r5   r6   r7   rB   Úhessian_outr9   )r"   r:   r;   r<   r=   r   Úgradient_hessian)r&   r5   r6   r7   rB   rG   r9   s          r'   rH   zBaseLoss.gradient_hessian=  s  € ðN ÐØÐ"Ü!Ÿ}™}¨^Ó<�Ü Ÿm™m¨NÓ;‘ä!Ÿ}™}¨[Ó9‘ØÐ ÜŸ-™-¨Ó5ˆKð ×Ñ !Ò#¨×(<Ñ(<¸QÑ(?À1Ò(DØ+×3Ñ3°AÓ6ˆNØ×Ñ Ò! l×&8Ñ&8¸Ñ&;¸qÒ&@Ø'×/Ñ/°Ó2ˆLØ×Ñ˜qÒ  [×%6Ñ%6°qÑ%9¸QÒ%>Ø%×-Ñ-¨aÓ0ˆKà�
‰
×#Ñ#ØØ)Ø'Ø%Ø#Øð 	$ô 	
ð ˜[Ð(Ð(r)   c           	      óX   — t        j                  | j                  ||dd|¬«      |¬«      S )a{  Compute the weighted average loss.

        Parameters
        ----------
        y_true : C-contiguous array of shape (n_samples,)
            Observed, true target values.
        raw_prediction : C-contiguous array of shape (n_samples,) or array of             shape (n_samples, n_classes)
            Raw prediction values (in link space).
        sample_weight : None or C-contiguous array of shape (n_samples,)
            Sample weights.
        n_threads : int, default=1
            Might use openmp thread parallelism.

        Returns
        -------
        loss : float
            Mean or averaged loss function.
        Nr4   ©Úweights)r"   Úaverager>   )r&   r5   r6   r7   r9   s        r'   Ú__call__zBaseLoss.__call__  s:   € ô( �z‰zØ�I‰IØØ-Ø"ØØ#ð ó ð "ô	
ð 		
r)   c                 óê  — t        j                  ||d¬«      }dt        j                  |j                  «      j                  z  }| j
                  j                  t         j                   k(  rd}nF| j
                  j                  r| j
                  j                  }n| j
                  j                  |z   }| j
                  j                  t         j                  k(  rd}nF| j
                  j                  r| j
                  j                  }n| j
                  j                  |z
  }|€|€| j                  j                  |«      S | j                  j                  t        j                  |||«      «      S )a#  Compute raw_prediction of an intercept-only model.

        This can be used as initial estimates of predictions, i.e. before the
        first iteration in fit.

        Parameters
        ----------
        y_true : array-like of shape (n_samples,)
            Observed, true target values.
        sample_weight : None or array of shape (n_samples,)
            Sample weights.

        Returns
        -------
        raw_prediction : numpy scalar or array of shape (n_classes,)
            Raw predictions of an intercept-only model.
        r   ©rK   Úaxisé
   N)r"   rL   ÚfinforA   Úepsr%   Úlowr#   Úlow_inclusiveÚhighÚhigh_inclusiver   Úclip)r&   r5   r7   Úy_predrS   Úa_minÚa_maxs          r'   Úfit_intercept_onlyzBaseLoss.fit_intercept_onlyž  s  € ô( —‘˜F¨MÀÔBˆØ”2—8‘8˜FŸL™LÓ)×-Ñ-Ñ-ˆà×Ñ×#Ñ#¬¯© wÒ.Ø‰EØ×!Ñ!×/Ò/Ø×(Ñ(×,Ñ,‰Eà×(Ñ(×,Ñ,¨sÑ2ˆEà×Ñ×$Ñ$¬¯©Ò.Ø‰EØ×!Ñ!×0Ò0Ø×(Ñ(×-Ñ-‰Eà×(Ñ(×-Ñ-°Ñ3ˆEàˆ=˜U˜]Ø—9‘9—>‘> &Ó)Ð)à—9‘9—>‘>¤"§'¡'¨&°%¸Ó"?Ó@Ð@r)   c                 ó,   — t        j                  |«      S )zpCalculate term dropped in loss.

        With this term added, the loss of perfect predictions is zero.
        )r"   Ú
zeros_like©r&   r5   r7   s      r'   Úconstant_to_optimal_zeroz!BaseLoss.constant_to_optimal_zeroÈ  s   € ô
 �}‰}˜VÓ$Ð$r)   ÚFc                 óV  — |t         j                  t         j                  fvrt        d|› d�«      ‚| j                  r|| j
                  f}n|f}t        j                  |||¬«      }| j                  rt        j                  d|¬«      }||fS t        j                  |||¬«      }||fS )au  Initialize arrays for gradients and hessians.

        Unless hessians are constant, arrays are initialized with undefined values.

        Parameters
        ----------
        n_samples : int
            The number of samples, usually passed to `fit()`.
        dtype : {np.float64, np.float32}, default=np.float64
            The dtype of the arrays gradient and hessian.
        order : {'C', 'F'}, default='F'
            Order of the arrays gradient and hessian. The default 'F' makes the arrays
            contiguous along samples.

        Returns
        -------
        gradient : C-contiguous array of shape (n_samples,) or array of shape             (n_samples, n_classes)
            Empty array (allocated but not initialized) to be used as argument
            gradient_out.
        hessian : C-contiguous array of shape (n_samples,), array of shape
            (n_samples, n_classes) or shape (1,)
            Empty (allocated but not initialized) array to be used as argument
            hessian_out.
            If constant_hessian is True (e.g. `HalfSquaredError`), the array is
            initialized to ``1``.
        zCValid options for 'dtype' are np.float32 and np.float64. Got dtype=z	 instead.)r<   rA   Úorder)r   )r<   rA   )	r"   Úfloat32Úfloat64Ú
ValueErrorÚis_multiclassr!   Úemptyr    Úones)r&   Ú	n_samplesrA   rc   r<   rE   Úhessians          r'   Úinit_gradient_and_hessianz"BaseLoss.init_gradient_and_hessianÏ  s°   € ð8 œŸ™¤R§Z¡ZÐ0Ñ0ÜðØ"˜G 9ð.óð ð
 ×ÒØ §¡Ð/‰Eà�LˆEÜ—8‘8 %¨u¸EÔBˆà× Ò ô
 —g‘g D°Ô6ˆGð ˜Ð Ð ô —h‘h U°%¸uÔEˆGà˜Ð Ð r)   ©N)NNr   ©NNNr   ©Nr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚdifferentiableÚneed_update_leaves_valuesrg   r(   r/   r2   r>   rC   rE   rH   rM   r\   r`   r"   re   rl   © r)   r'   r   r   F   s•   „ ñ/ðt €NØ %ÐØ€Mó9ò0ò0ð ØØó+ðb ØØØó=&ðF ØØó/ðj ØØØó@)óD
ó>(AóT%ð :<¿¹È3ô 1!r)   r   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚHalfSquaredErroraÜ  Half squared error with identity link, for regression.

    Domain:
    y_true and y_pred all real numbers

    Link:
    y_pred = raw_prediction

    For a given sample x_i, half squared error is defined as::

        loss(x_i) = 0.5 * (y_true_i - raw_prediction_i)**2

    The factor of 0.5 simplifies the computation of gradients and results in a
    unit hessian (and is consistent with what is done in LightGBM). It is also
    half the Normal distribution deviance.
    c                 óZ   •— t         ‰| �  t        «       t        «       ¬«       |d u | _        y )N©r   r   )Úsuperr(   r   r   r    ©r&   r7   Ú	__class__s     €r'   r(   zHalfSquaredError.__init__  s(   ø€ Ü‰ÑÔ1Ó3¼,».ÐÔIØ -°Ð 5ˆÕr)   rm   ©rp   rq   rr   rs   r(   Ú__classcell__©r}   s   @r'   rx   rx     s   ø„ ñ÷"6ñ 6r)   rx   c                   ó4   ‡ — e Zd ZdZdZdZdˆ fd„	Zdd„Zˆ xZS )ÚAbsoluteErroraÖ  Absolute error with identity link, for regression.

    Domain:
    y_true and y_pred all real numbers

    Link:
    y_pred = raw_prediction

    For a given sample x_i, the absolute error is defined as::

        loss(x_i) = |y_true_i - raw_prediction_i|

    Note that the exact hessian = 0 almost everywhere (except at one point, therefore
    differentiable = False). Optimization routines like in HGBT, however, need a
    hessian > 0. Therefore, we assign 1.
    FTc                 óh   •— t         ‰| �  t        «       t        «       ¬«       d| _        |d u | _        y )Nrz   T)r{   r(   r	   r   r   r    r|   s     €r'   r(   zAbsoluteError.__init__3  s/   ø€ Ü‰ÑœÓ0´|³~ÐÔFØ"ˆÔØ -°Ð 5ˆÕr)   c                 óN   — |€t        j                  |d¬«      S t        ||d«      S )ú•Compute raw_prediction of an intercept-only model.

        This is the weighted median of the target, i.e. over the samples
        axis=0.
        r   ©rP   é2   )r"   Úmedianr   r_   s      r'   r\   z AbsoluteError.fit_intercept_only8  s*   € ð Ð Ü—9‘9˜V¨!Ô,Ð,ä'¨°¸rÓBÐBr)   rm   ©	rp   rq   rr   rs   rt   ru   r(   r\   r   r€   s   @r'   r‚   r‚     s    ø„ ñð" €NØ $Ðõ6÷
	Cr)   r‚   c                   ó4   ‡ — e Zd ZdZdZdZdˆ fd„	Zdd„Zˆ xZS )ÚPinballLossa  Quantile loss aka pinball loss, for regression.

    Domain:
    y_true and y_pred all real numbers
    quantile in (0, 1)

    Link:
    y_pred = raw_prediction

    For a given sample x_i, the pinball loss is defined as::

        loss(x_i) = rho_{quantile}(y_true_i - raw_prediction_i)

        rho_{quantile}(u) = u * (quantile - 1_{u<0})
                          = -u *(1 - quantile)  if u < 0
                             u * quantile       if u >= 0

    Note: 2 * PinballLoss(quantile=0.5) equals AbsoluteError().

    Note that the exact hessian = 0 almost everywhere (except at one point, therefore
    differentiable = False). Optimization routines like in HGBT, however, need a
    hessian > 0. Therefore, we assign 1.

    Additional Attributes
    ---------------------
    quantile : float
        The quantile level of the quantile to be estimated. Must be in range (0, 1).
    FTc                 ó¼   •— t        |dt        j                  ddd¬«       t        ‰| �  t        t        |«      ¬«      t        «       ¬«       d| _        |d u | _	        y )	NÚquantiler   r   Úneither©Útarget_typeÚmin_valÚmax_valÚinclude_boundaries)r�   rz   T)
r   ÚnumbersÚRealr{   r(   r   Úfloatr   r   r    )r&   r7   r�   r}   s      €r'   r(   zPinballLoss.__init__e  s]   ø€ ÜØØÜŸ™ØØØ(õ	
ô 	‰ÑÜ¬¨x«Ô9Ü“ð 	ô 	
ð #ˆÔØ -°Ð 5ˆÕr)   c                 ó¬   — |€/t        j                  |d| j                  j                  z  d¬«      S t	        ||d| j                  j                  z  «      S )r…   éd   r   r†   )r"   Ú
percentiler   r�   r   r_   s      r'   r\   zPinballLoss.fit_intercept_onlyu  sO   € ð Ð Ü—=‘= ¨¨t¯z©z×/BÑ/BÑ)BÈÔKÐKä'Ø˜ s¨T¯Z©Z×-@Ñ-@Ñ'@óð r)   )Nç      à?rm   r‰   r€   s   @r'   r‹   r‹   D  s   ø„ ñð: €NØ $Ðõ6÷ r)   r‹   c                   ó4   ‡ — e Zd ZdZdZdZdˆ fd„	Zdd„Zˆ xZS )Ú	HuberLossaê  Huber loss, for regression.

    Domain:
    y_true and y_pred all real numbers
    quantile in (0, 1)

    Link:
    y_pred = raw_prediction

    For a given sample x_i, the Huber loss is defined as::

        loss(x_i) = 1/2 * abserr**2            if abserr <= delta
                    delta * (abserr - delta/2) if abserr > delta

        abserr = |y_true_i - raw_prediction_i|
        delta = quantile(abserr, self.quantile)

    Note: HuberLoss(quantile=1) equals HalfSquaredError and HuberLoss(quantile=0)
    equals delta * (AbsoluteError() - delta/2).

    Additional Attributes
    ---------------------
    quantile : float
        The quantile level which defines the breaking point `delta` to distinguish
        between absolute error and squared error. Must be in range (0, 1).

     Reference
    ---------
    .. [1] Friedman, J.H. (2001). :doi:`Greedy function approximation: A gradient
      boosting machine <10.1214/aos/1013203451>`.
      Annals of Statistics, 29, 1189-1232.
    FTc                 óÆ   •— t        |dt        j                  ddd¬«       || _        t        ‰| �  t        t        |«      ¬«      t        «       ¬«       d| _	        d	| _
        y )
Nr�   r   r   rŽ   r�   )Údeltarz   TF)r   r”   r•   r�   r{   r(   r   r–   r   r   r    )r&   r7   r�   rž   r}   s       €r'   r(   zHuberLoss.__init__¨  s_   ø€ ÜØØÜŸ™ØØØ(õ	
ð !ˆŒÜ‰ÑÜ¤E¨%£LÔ1Ü“ð 	ô 	
ð #ˆÔØ %ˆÕr)   c                 ó6  — |€t        j                  |dd¬«      }nt        ||d«      }||z
  }t        j                  |«      t        j                  | j
                  j                  t        j                  |«      «      z  }|t        j                  ||¬«      z   S )r…   r‡   r   r†   rJ   )	r"   r™   r   ÚsignÚminimumr   rž   ÚabsrL   )r&   r5   r7   rˆ   ÚdiffÚterms         r'   r\   zHuberLoss.fit_intercept_only¹  sx   € ð Ð Ü—]‘] 6¨2°AÔ6‰Fä)¨&°-ÀÓDˆFØ˜‰ˆÜ�w‰w�t‹}œrŸz™z¨$¯*©*×*:Ñ*:¼B¿F¹FÀ4»LÓIÑIˆØœŸ
™
 4°Ô?Ñ?Ð?r)   )NgÍÌÌÌÌÌì?rš   rm   r‰   r€   s   @r'   rœ   rœ   ƒ  s!   ø„ ñðB €NØ $Ðõ&÷"@r)   rœ   c                   ó,   ‡ — e Zd ZdZdˆ fd„	Zdd„Zˆ xZS )ÚHalfPoissonLossaƒ  Half Poisson deviance loss with log-link, for regression.

    Domain:
    y_true in non-negative real numbers
    y_pred in positive real numbers

    Link:
    y_pred = exp(raw_prediction)

    For a given sample x_i, half the Poisson deviance is defined as::

        loss(x_i) = y_true_i * log(y_true_i/exp(raw_prediction_i))
                    - y_true_i + exp(raw_prediction_i)

    Half the Poisson deviance is actually the negative log-likelihood up to
    constant terms (not involving raw_prediction) and simplifies the
    computation of the gradients.
    We also skip the constant term `y_true_i * log(y_true_i) - y_true_i`.
    c                 óŠ   •— t         ‰| �  t        «       t        «       ¬«       t	        dt
        j                  dd«      | _        y )Nrz   r   TF)r{   r(   r   r   r   r"   r#   r$   r|   s     €r'   r(   zHalfPoissonLoss.__init__á  s2   ø€ Ü‰ÑÔ0Ó2¼»ÐÔCÜ'¨¬2¯6©6°4¸Ó?ˆÕr)   c                 ó2   — t        ||«      |z
  }|�||z  }|S rm   r   ©r&   r5   r7   r¤   s       r'   r`   z(HalfPoissonLoss.constant_to_optimal_zeroå  s(   € Ü�V˜VÓ$ vÑ-ˆØÐ$Ø�MÑ!ˆDØˆr)   rm   ©rp   rq   rr   rs   r(   r`   r   r€   s   @r'   r¦   r¦   Ì  s   ø„ ñõ(@÷r)   r¦   c                   ó,   ‡ — e Zd ZdZdˆ fd„	Zdd„Zˆ xZS )ÚHalfGammaLossaV  Half Gamma deviance loss with log-link, for regression.

    Domain:
    y_true and y_pred in positive real numbers

    Link:
    y_pred = exp(raw_prediction)

    For a given sample x_i, half Gamma deviance loss is defined as::

        loss(x_i) = log(exp(raw_prediction_i)/y_true_i)
                    + y_true/exp(raw_prediction_i) - 1

    Half the Gamma deviance is actually proportional to the negative log-
    likelihood up to constant terms (not involving raw_prediction) and
    simplifies the computation of the gradients.
    We also skip the constant term `-log(y_true_i) - 1`.
    c                 óŠ   •— t         ‰| �  t        «       t        «       ¬«       t	        dt
        j                  dd«      | _        y )Nrz   r   F)r{   r(   r   r   r   r"   r#   r$   r|   s     €r'   r(   zHalfGammaLoss.__init__   s1   ø€ Ü‰ÑœÓ0´w³yÐÔAÜ'¨¬2¯6©6°5¸%Ó@ˆÕr)   c                 óF   — t        j                  |«       dz
  }|�||z  }|S ro   )r"   Úlogr©   s       r'   r`   z&HalfGammaLoss.constant_to_optimal_zero  s+   € Ü—‘�v“ˆ Ñ"ˆØÐ$Ø�MÑ!ˆDØˆr)   rm   rª   r€   s   @r'   r¬   r¬   ì  s   ø„ ñõ&A÷r)   r¬   c                   ó,   ‡ — e Zd ZdZdˆ fd„	Zdd„Zˆ xZS )ÚHalfTweedieLossaÿ  Half Tweedie deviance loss with log-link, for regression.

    Domain:
    y_true in real numbers for power <= 0
    y_true in non-negative real numbers for 0 < power < 2
    y_true in positive real numbers for 2 <= power
    y_pred in positive real numbers
    power in real numbers

    Link:
    y_pred = exp(raw_prediction)

    For a given sample x_i, half Tweedie deviance loss with p=power is defined
    as::

        loss(x_i) = max(y_true_i, 0)**(2-p) / (1-p) / (2-p)
                    - y_true_i * exp(raw_prediction_i)**(1-p) / (1-p)
                    + exp(raw_prediction_i)**(2-p) / (2-p)

    Taking the limits for p=0, 1, 2 gives HalfSquaredError with a log link,
    HalfPoissonLoss and HalfGammaLoss.

    We also skip constant terms, but those are different for p=0, 1, 2.
    Therefore, the loss is not continuous in `power`.

    Note furthermore that although no Tweedie distribution exists for
    0 < power < 1, it still gives a strictly consistent scoring function for
    the expectation.
    c                 óª  •— t         ‰| �  t        t        |«      ¬«      t	        «       ¬«       | j
                  j                  dk  r1t        t        j                   t        j                  dd«      | _
        y | j
                  j                  dk  r"t        dt        j                  dd«      | _
        y t        dt        j                  dd«      | _
        y ©N)Úpowerrz   r   Fr   T)r{   r(   r   r–   r   r   r´   r   r"   r#   r$   ©r&   r7   r´   r}   s      €r'   r(   zHalfTweedieLoss.__init__*  s—   ø€ Ü‰ÑÜ#¬%°«,Ô7Ü“ð 	ô 	
ð �:‰:×Ñ˜qÒ Ü#+¬R¯V©V¨G´R·V±V¸UÀEÓ#JˆDÕ Ø�Z‰Z×Ñ Ò!Ü#+¨A¬r¯v©v°t¸UÓ#CˆDÕ ä#+¨A¬r¯v©v°u¸eÓ#DˆDÕ r)   c                 óê  — | j                   j                  dk(  rt        «       j                  ||¬«      S | j                   j                  dk(  rt	        «       j                  ||¬«      S | j                   j                  dk(  rt        «       j                  ||¬«      S | j                   j                  }t        j                  t        j                  |d«      d|z
  «      d|z
  z  d|z
  z  }|�||z  }|S )Nr   )r5   r7   r   r   )r   r´   rx   r`   r¦   r¬   r"   Úmaximum)r&   r5   r7   Úpr¤   s        r'   r`   z(HalfTweedieLoss.constant_to_optimal_zero6  sò   € Ø�:‰:×Ñ˜qÒ Ü#Ó%×>Ñ>Ø¨]ð ?ó ð ð �Z‰Z×Ñ Ò"Ü"Ó$×=Ñ=Ø¨]ð >ó ð ð �Z‰Z×Ñ Ò"Ü “?×;Ñ;Ø¨]ð <ó ð ð —
‘
× Ñ ˆAÜ—8‘8œBŸJ™J v¨qÓ1°1°q±5Ó9¸QÀ¹UÑCÀqÈ1ÁuÑMˆDØÐ(Ø˜Ñ%�ØˆKr)   ©Ng      ø?rm   rª   r€   s   @r'   r±   r±     s   ø„ ñõ<
E÷r)   r±   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚHalfTweedieLossIdentityan  Half Tweedie deviance loss with identity link, for regression.

    Domain:
    y_true in real numbers for power <= 0
    y_true in non-negative real numbers for 0 < power < 2
    y_true in positive real numbers for 2 <= power
    y_pred in positive real numbers for power != 0
    y_pred in real numbers for power = 0
    power in real numbers

    Link:
    y_pred = raw_prediction

    For a given sample x_i, half Tweedie deviance loss with p=power is defined
    as::

        loss(x_i) = max(y_true_i, 0)**(2-p) / (1-p) / (2-p)
                    - y_true_i * raw_prediction_i**(1-p) / (1-p)
                    + raw_prediction_i**(2-p) / (2-p)

    Note that the minimum value of this loss is 0.

    Note furthermore that although no Tweedie distribution exists for
    0 < power < 1, it still gives a strictly consistent scoring function for
    the expectation.
    c                 ó€  •— t         ‰| �  t        t        |«      ¬«      t	        «       ¬«       | j
                  j                  dk  r1t        t        j                   t        j                  dd«      | _
        n\| j
                  j                  dk  r"t        dt        j                  dd«      | _
        n!t        dt        j                  dd«      | _
        | j
                  j                  dk(  r1t        t        j                   t        j                  dd«      | _        y t        dt        j                  dd«      | _        y r³   )r{   r(   r   r–   r   r   r´   r   r"   r#   r$   r%   rµ   s      €r'   r(   z HalfTweedieLossIdentity.__init__g  sÝ   ø€ Ü‰ÑÜ+´%¸³,Ô?Ü“ð 	ô 	
ð �:‰:×Ñ˜qÒ Ü#+¬R¯V©V¨G´R·V±V¸UÀEÓ#JˆDÕ Ø�Z‰Z×Ñ Ò!Ü#+¨A¬r¯v©v°t¸UÓ#CˆDÕ ä#+¨A¬r¯v©v°u¸eÓ#DˆDÔ à�:‰:×Ñ˜qÒ Ü#+¬R¯V©V¨G´R·V±V¸UÀEÓ#JˆDÕ ä#+¨A¬r¯v©v°u¸eÓ#DˆDÕ r)   r¹   r~   r€   s   @r'   r»   r»   K  s   ø„ ñ÷6Eñ Er)   r»   c                   ó2   ‡ — e Zd ZdZdˆ fd„	Zdd„Zd„ Zˆ xZS )ÚHalfBinomialLossaY  Half Binomial deviance loss with logit link, for binary classification.

    This is also know as binary cross entropy, log-loss and logistic loss.

    Domain:
    y_true in [0, 1], i.e. regression on the unit interval
    y_pred in (0, 1), i.e. boundaries excluded

    Link:
    y_pred = expit(raw_prediction)

    For a given sample x_i, half Binomial deviance is defined as the negative
    log-likelihood of the Binomial/Bernoulli distribution and can be expressed
    as::

        loss(x_i) = log(1 + exp(raw_pred_i)) - y_true_i * raw_pred_i

    See The Elements of Statistical Learning, by Hastie, Tibshirani, Friedman,
    section 4.4.1 (about logistic regression).

    Note that the formulation works for classification, y = {0, 1}, as well as
    logistic regression, y = [0, 1].
    If you add `constant_to_optimal_zero` to the loss, you get half the
    Bernoulli/binomial deviance.

    More details: Inserting the predicted probability y_pred = expit(raw_prediction)
    in the loss gives the well known::

        loss(x_i) = - y_true_i * log(y_pred_i) - (1 - y_true_i) * log(1 - y_pred_i)
    c                 óp   •— t         ‰| �  t        «       t        «       d¬«       t	        dddd«      | _        y ©Nr   ©r   r   r!   r   r   T)r{   r(   r   r   r   r$   r|   s     €r'   r(   zHalfBinomialLoss.__init__™  s8   ø€ Ü‰ÑÜ$Ó&Ü“Øð 	ô 	
ô
  (¨¨1¨d°DÓ9ˆÕr)   c                 óR   — t        ||«      t        d|z
  d|z
  «      z   }|�||z  }|S ro   r   r©   s       r'   r`   z)HalfBinomialLoss.constant_to_optimal_zero¡  s7   € ä�V˜VÓ$¤u¨Q°©Z¸¸V¹Ó'DÑDˆØÐ$Ø�MÑ!ˆDØˆr)   c                 ó4  — |j                   dk(  r#|j                  d   dk(  r|j                  d«      }t        j                  |j                  d   df|j
                  ¬«      }| j                  j                  |«      |dd…df<   d|dd…df   z
  |dd…df<   |S ©a=  Predict probabilities.

        Parameters
        ----------
        raw_prediction : array of shape (n_samples,) or (n_samples, 1)
            Raw prediction values (in link space).

        Returns
        -------
        proba : array of shape (n_samples, 2)
            Element-wise class probabilities.
        r   r   r   r@   N©r;   r<   r=   r"   rh   rA   r   Úinverse©r&   r6   Úprobas      r'   Úpredict_probazHalfBinomialLoss.predict_proba¨  ó”   € ð ×Ñ !Ò#¨×(<Ñ(<¸QÑ(?À1Ò(DØ+×3Ñ3°AÓ6ˆNÜ—‘˜.×.Ñ.¨qÑ1°1Ð5¸^×=QÑ=QÔRˆØ—i‘i×'Ñ'¨Ó7ˆŠa�ˆd‰Ø˜%¢ 1 ™+‘oˆŠa�ˆd‰Øˆr)   rm   ©rp   rq   rr   rs   r(   r`   rÉ   r   r€   s   @r'   r¾   r¾   y  s   ø„ ñõ>:óör)   r¾   c                   óL   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zd	d„Zd„ Z	 	 	 	 d
d„Z	ˆ xZ
S )ÚHalfMultinomialLossa”  Categorical cross-entropy loss, for multiclass classification.

    Domain:
    y_true in {0, 1, 2, 3, .., n_classes - 1}
    y_pred has n_classes elements, each element in (0, 1)

    Link:
    y_pred = softmax(raw_prediction)

    Note: We assume y_true to be already label encoded. The inverse link is
    softmax. But the full link function is the symmetric multinomial logit
    function.

    For a given sample x_i, the categorical cross-entropy loss is defined as
    the negative log-likelihood of the multinomial distribution, it
    generalizes the binary cross-entropy to more than 2 classes::

        loss_i = log(sum(exp(raw_pred_{i, k}), k=0..n_classes-1))
                - sum(y_true_{i, k} * raw_pred_{i, k}, k=0..n_classes-1)

    See [1].

    Note that for the hessian, we calculate only the diagonal part in the
    classes: If the full hessian for classes k and l and sample i is H_i_k_l,
    we calculate H_i_k_k, i.e. k=l.

    Reference
    ---------
    .. [1] :arxiv:`Simon, Noah, J. Friedman and T. Hastie.
        "A Blockwise Descent Algorithm for Group-penalized Multiresponse and
        Multinomial Regression".
        <1311.6529>`
    Tc                 ó²   •— t         ‰| �  t        «       t        «       |¬«       t	        dt
        j                  dd«      | _        t	        dddd«      | _        y )NrÁ   r   TFr   )	r{   r(   r   r   r   r"   r#   r$   r%   )r&   r7   r!   r}   s      €r'   r(   zHalfMultinomialLoss.__init__ã  sP   ø€ Ü‰ÑÜ'Ó)Ü!Ó#Øð 	ô 	
ô
  (¨¬2¯6©6°4¸Ó?ˆÔÜ'¨¨1¨e°UÓ;ˆÕr)   c                 ó’   — | j                   j                  |«      xr+ t        j                  |j	                  t
        «      |k(  «      S r+   )r$   r,   r"   ÚallÚastypeÚintr-   s     r'   r/   z#HalfMultinomialLoss.in_y_true_rangeì  s6   € ð ×#Ñ#×,Ñ,¨QÓ/ÒN´B·F±F¸1¿8¹8ÄC»=ÈAÑ;MÓ4NÐNr)   c                 ó¼  — t        j                  | j                  |j                  ¬«      }t        j                  |j                  «      j
                  }t        | j                  «      D ]@  }t        j                  ||k(  |d¬«      ||<   t        j                  ||   |d|z
  «      ||<   ŒB | j                  j                  |ddd…f   «      j                  d«      S )z¥Compute raw_prediction of an intercept-only model.

        This is the softmax of the weighted average of the target, i.e. over
        the samples axis=0.
        r@   r   rO   r   Néÿÿÿÿ)r"   Úzerosr!   rA   rR   rS   ÚrangerL   rX   r   Úreshape)r&   r5   r7   ÚoutrS   Úks         r'   r\   z&HalfMultinomialLoss.fit_intercept_onlyõ  s¬   € ô �h‰h�t—~‘~¨V¯\©\Ô:ˆÜ�h‰h�v—|‘|Ó$×(Ñ(ˆÜ�t—~‘~Ó&ò 	3ˆAÜ—Z‘Z ¨!¡°]ÈÔKˆC�‰FÜ—W‘W˜S ™V S¨!¨c©'Ó2ˆC�ŠFð	3ð �y‰y�~‰~˜c $ª '™lÓ+×3Ñ3°BÓ7Ð7r)   c                 ó8   — | j                   j                  |«      S )a=  Predict probabilities.

        Parameters
        ----------
        raw_prediction : array of shape (n_samples, n_classes)
            Raw prediction values (in link space).

        Returns
        -------
        proba : array of shape (n_samples, n_classes)
            Element-wise class probabilities.
        )r   rÆ   )r&   r6   s     r'   rÉ   z!HalfMultinomialLoss.predict_proba  s   € ð �y‰y× Ñ  Ó0Ð0r)   c                 ó  — |€C|€+t        j                  |«      }t        j                  |«      }n-t        j                  |«      }n|€t        j                  |«      }| j                  j                  ||||||¬«       ||fS )aK  Compute gradient and class probabilities fow raw_prediction.

        Parameters
        ----------
        y_true : C-contiguous array of shape (n_samples,)
            Observed, true target values.
        raw_prediction : array of shape (n_samples, n_classes)
            Raw prediction values (in link space).
        sample_weight : None or C-contiguous array of shape (n_samples,)
            Sample weights.
        gradient_out : None or array of shape (n_samples, n_classes)
            A location into which the gradient is stored. If None, a new array
            might be created.
        proba_out : None or array of shape (n_samples, n_classes)
            A location into which the class probabilities are stored. If None,
            a new array might be created.
        n_threads : int, default=1
            Might use openmp thread parallelism.

        Returns
        -------
        gradient : array of shape (n_samples, n_classes)
            Element-wise gradients.

        proba : array of shape (n_samples, n_classes)
            Element-wise class probabilities.
        )r5   r6   r7   rB   Ú	proba_outr9   )r"   r:   r   Úgradient_proba)r&   r5   r6   r7   rB   rÜ   r9   s          r'   rÝ   z"HalfMultinomialLoss.gradient_proba  s…   € ðH ÐØÐ Ü!Ÿ}™}¨^Ó<�ÜŸM™M¨.Ó9‘	ä!Ÿ}™}¨YÓ7‘ØÐÜŸ™ lÓ3ˆIà�
‰
×!Ñ!ØØ)Ø'Ø%ØØð 	"ô 	
ð ˜YÐ&Ð&r)   )Né   rm   rn   )rp   rq   rr   rs   rg   r(   r/   r\   rÉ   rÝ   r   r€   s   @r'   rÍ   rÍ   ¾  s8   ø„ ñ ðD €Mõ<òOó8ò1ð& ØØØ÷5'r)   rÍ   c                   ó2   ‡ — e Zd ZdZdˆ fd„	Zdd„Zd„ Zˆ xZS )ÚExponentialLossa"  Exponential loss with (half) logit link, for binary classification.

    This is also know as boosting loss.

    Domain:
    y_true in [0, 1], i.e. regression on the unit interval
    y_pred in (0, 1), i.e. boundaries excluded

    Link:
    y_pred = expit(2 * raw_prediction)

    For a given sample x_i, the exponential loss is defined as::

        loss(x_i) = y_true_i * exp(-raw_pred_i)) + (1 - y_true_i) * exp(raw_pred_i)

    See:
    - J. Friedman, T. Hastie, R. Tibshirani.
      "Additive logistic regression: a statistical view of boosting (With discussion
      and a rejoinder by the authors)." Ann. Statist. 28 (2) 337 - 407, April 2000.
      https://doi.org/10.1214/aos/1016218223
    - A. Buja, W. Stuetzle, Y. Shen. (2005).
      "Loss Functions for Binary Class Probability Estimation and Classification:
      Structure and Applications."

    Note that the formulation works for classification, y = {0, 1}, as well as
    "exponential logistic" regression, y = [0, 1].
    Note that this is a proper scoring rule, but without it's canonical link.

    More details: Inserting the predicted probability
    y_pred = expit(2 * raw_prediction) in the loss gives::

        loss(x_i) = y_true_i * sqrt((1 - y_pred_i) / y_pred_i)
            + (1 - y_true_i) * sqrt(y_pred_i / (1 - y_pred_i))
    c                 óp   •— t         ‰| �  t        «       t        «       d¬«       t	        dddd«      | _        y rÀ   )r{   r(   r
   r   r   r$   r|   s     €r'   r(   zExponentialLoss.__init__m  s8   ø€ Ü‰ÑÜ#Ó%Ü“Øð 	ô 	
ô
  (¨¨1¨d°DÓ9ˆÕr)   c                 óP   — dt        j                  |d|z
  z  «      z  }|�||z  }|S )Néþÿÿÿr   )r"   Úsqrtr©   s       r'   r`   z(ExponentialLoss.constant_to_optimal_zerou  s3   € à”B—G‘G˜F a¨&¡jÑ1Ó2Ñ2ˆØÐ$Ø�MÑ!ˆDØˆr)   c                 ó4  — |j                   dk(  r#|j                  d   dk(  r|j                  d«      }t        j                  |j                  d   df|j
                  ¬«      }| j                  j                  |«      |dd…df<   d|dd…df   z
  |dd…df<   |S rÄ   rÅ   rÇ   s      r'   rÉ   zExponentialLoss.predict_proba|  rÊ   r)   rm   rË   r€   s   @r'   rà   rà   I  s   ø„ ñ!õF:óör)   rà   )
Úsquared_errorÚabsolute_errorÚpinball_lossÚ
huber_lossÚpoisson_lossÚ
gamma_lossÚtweedie_lossÚbinomial_lossÚmultinomial_lossÚexponential_loss)*rs   r”   Únumpyr"   Úscipy.specialr   Úutilsr   Úutils.statsr   Ú_lossr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rx   r‚   r‹   rœ   r¦   r¬   r±   r»   r¾   rÍ   rà   Ú_LOSSESrv   r)   r'   ú<module>rö      s  ðñó* ã Ý å  Ý .÷÷ ÷ ñ ÷÷ ÷8z!ñ z!ôB6�xô 6ô.#C�Hô #CôL<�(ô <ô~F@�ô F@ôR�hô ô@�Hô ô>=�hô =ô@+E˜hô +Eô\B�xô BôJH'˜(ô H'ôVF�hô FðT &Ø#ØØØ#ØØ#Ø%Ø+Ø'ñ�r)   