
    0Ph                     L   d Z ddlmZmZ ddlmZ ddlZddlm	Z	m
Z
 ddlmZ ddlmZ e G d	 d
                      Zej        f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eeeeedZdS )zM
Module contains classes for invertible (and differentiable) link functions.
    )ABCabstractmethod)	dataclassN)expitlogit)gmean   )softmaxc                   D    e Zd ZU eed<   eed<   eed<   eed<   d Zd ZdS )Intervallowhighlow_inclusivehigh_inclusivec                 f    | j         | j        k    r t          d| j          d| j         d          dS )zCheck that low <= highz#One must have low <= high; got low=z, high=.N)r   r   
ValueError)selfs    R/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sklearn/_loss/link.py__post_init__zInterval.__post_init__   sE    8diSdhSStySSS        c                 `   | j         rt          j        || j                  }nt          j        || j                  }t          j        |          sdS | j        rt          j        || j                  }nt          j	        || j                  }t          t          j        |                    S )zTest whether all values of x are in interval range.

        Parameters
        ----------
        x : ndarray
            Array whose elements are tested to be in interval range.

        Returns
        -------
        result : bool
        F)r   npgreater_equalr   greaterallr   
less_equalr   lessbool)r   xr   r   s       r   includeszInterval.includes    s      	*"1dh//CC*Q))Cvc{{ 	5 	)=DI..DD71di((D BF4LL!!!r   N)__name__
__module____qualname__float__annotations__r   r   r!    r   r   r   r      s^         	JJJ
KKK  " " " " "r   r   c                 T   dt          j        |          j        z  }| j        t           j         k    rd}n,| j        dk     r| j        d|z
  z  |z   }n| j        d|z   z  |z   }| j        t           j        k    rd}n,| j        dk     r| j        d|z   z  |z
  }n| j        d|z
  z  |z
  }||fS )zGenerate values low and high to be within the interval range.

    This is used in tests only.

    Returns
    -------
    low, high : tuple
        The returned values low and high lie within the interval.
    
   g    _r      g    _B)r   finfoepsr   infr   )intervaldtyper,   r   r   s        r   _inclusive_low_highr0   =   s     rx"
"C|w			la#g&,la#g&,}			}C(3.}C(3.9r   c                   x    e Zd ZdZdZ eej         ej        dd          Ze	dd            Z
e	dd            ZdS )BaseLinka   Abstract base class for differentiable, invertible link functions.

    Convention:
        - link function g: raw_prediction = g(y_pred)
        - inverse link h: y_pred = h(raw_prediction)

    For (generalized) linear models, `raw_prediction = X @ coef` is the so
    called linear predictor, and `y_pred = h(raw_prediction)` is the predicted
    conditional (on X) expected value of the target `y_true`.

    The methods are not implemented as staticmethods in case a link function needs
    parameters.
    FNc                     dS )aX  Compute the link function g(y_pred).

        The link function maps (predicted) target values to raw predictions,
        i.e. `g(y_pred) = raw_prediction`.

        Parameters
        ----------
        y_pred : array
            Predicted target values.
        out : array
            A location into which the result is stored. If provided, it must
            have a shape that the inputs broadcast to. If not provided or None,
            a freshly-allocated array is returned.

        Returns
        -------
        out : array
            Output array, element-wise link function.
        Nr'   r   y_predouts      r   linkzBaseLink.linko         r   c                     dS )a  Compute the inverse link function h(raw_prediction).

        The inverse link function maps raw predictions to predicted target
        values, i.e. `h(raw_prediction) = y_pred`.

        Parameters
        ----------
        raw_prediction : array
            Raw prediction values (in link space).
        out : array
            A location into which the result is stored. If provided, it must
            have a shape that the inputs broadcast to. If not provided or None,
            a freshly-allocated array is returned.

        Returns
        -------
        out : array
            Output array, element-wise inverse link function.
        Nr'   r   raw_predictionr6   s      r   inversezBaseLink.inverse   r8   r   N)r"   r#   r$   __doc__is_multiclassr   r   r-   interval_y_predr   r7   r<   r'   r   r   r2   r2   Y   s          M
 hwu==O   ^*    ^  r   r2   c                       e Zd ZdZddZeZdS )IdentityLinkz"The identity link function g(x)=x.Nc                 8    |t          j        ||           |S |S r=   )r   copytor4   s      r   r7   zIdentityLink.link   s#    ?Ic6"""JMr   r=   )r"   r#   r$   r>   r7   r<   r'   r   r   rB   rB      s/        ,,    GGGr   rB   c                   H    e Zd ZdZ edej        dd          ZddZddZ	dS )LogLinkz"The log link function g(x)=log(x).r   FNc                 .    t          j        ||          S Nr6   )r   logr4   s      r   r7   zLogLink.link   s    vf#&&&&r   c                 .    t          j        ||          S rH   )r   expr:   s      r   r<   zLogLink.inverse   s    vn#....r   r=   )
r"   r#   r$   r>   r   r   r-   r@   r7   r<   r'   r   r   rF   rF      sY        ,,hq"&%77O' ' ' '/ / / / / /r   rF   c                   >    e Zd ZdZ edddd          ZddZddZdS )		LogitLinkz&The logit link function g(x)=logit(x).r   r*   FNc                 $    t          ||          S rH   r   r4   s      r   r7   zLogitLink.link   s    V%%%%r   c                 $    t          ||          S rH   r   r:   s      r   r<   zLogitLink.inverse   s    ^----r   r=   r"   r#   r$   r>   r   r@   r7   r<   r'   r   r   rN   rN      sW        00hq!UE22O& & & &. . . . . .r   rN   c                   >    e Zd ZdZ edddd          ZddZddZdS )	HalfLogitLinkzZHalf the logit link function g(x)=1/2 * logit(x).

    Used for the exponential loss.
    r   r*   FNc                 2    t          ||          }|dz  }|S )NrI   g      ?rP   r4   s      r   r7   zHalfLogitLink.link   s"    F$$$s

r   c                 (    t          d|z  |          S )Nr	   rR   r:   s      r   r<   zHalfLogitLink.inverse   s    Q'---r   r=   rS   r'   r   r   rU   rU      s]         
 hq!UE22O   
. . . . . .r   rU   c                   H    e Zd ZdZdZ edddd          Zd Zd
dZd
d	Z	dS )MultinomialLogita  The symmetric multinomial logit function.

    Convention:
        - y_pred.shape = raw_prediction.shape = (n_samples, n_classes)

    Notes:
        - The inverse link h is the softmax function.
        - The sum is over the second axis, i.e. axis=1 (n_classes).

    We have to choose additional constraints in order to make

        y_pred[k] = exp(raw_pred[k]) / sum(exp(raw_pred[k]), k=0..n_classes-1)

    for n_classes classes identifiable and invertible.
    We choose the symmetric side constraint where the geometric mean response
    is set as reference category, see [2]:

    The symmetric multinomial logit link function for a single data point is
    then defined as

        raw_prediction[k] = g(y_pred[k]) = log(y_pred[k]/gmean(y_pred))
        = log(y_pred[k]) - mean(log(y_pred)).

    Note that this is equivalent to the definition in [1] and implies mean
    centered raw predictions:

        sum(raw_prediction[k], k=0..n_classes-1) = 0.

    For linear models with raw_prediction = X @ coef, this corresponds to
    sum(coef[k], k=0..n_classes-1) = 0, i.e. the sum over classes for every
    feature is zero.

    Reference
    ---------
    .. [1] Friedman, Jerome; Hastie, Trevor; Tibshirani, Robert. "Additive
        logistic regression: a statistical view of boosting" Ann. Statist.
        28 (2000), no. 2, 337--407. doi:10.1214/aos/1016218223.
        https://projecteuclid.org/euclid.aos/1016218223

    .. [2] Zahid, Faisal Maqbool and Gerhard Tutz. "Ridge estimation for
        multinomial logit models with symmetric side constraints."
        Computational Statistics 28 (2013): 1017-1034.
        http://epub.ub.uni-muenchen.de/11001/1/tr067.pdf
    Tr   r*   Fc                 \    |t          j        |d          d d t           j        f         z
  S )Nr*   axis)r   meannewaxis)r   r;   s     r   symmetrize_raw_predictionz*MultinomialLogit.symmetrize_raw_prediction  s+    Q ? ? ?2: NNNr   Nc                 ~    t          |d          }t          j        ||d d t          j        f         z  |          S )Nr*   r[   rI   )r   r   rJ   r^   )r   r5   r6   gms       r   r7   zMultinomialLogit.link  s=    6"""vfr!!!RZ-00c::::r   c                 x    |t          |d          S t          j        ||           t          |d           |S )NT)copyF)r
   r   rD   r:   s      r   r<   zMultinomialLogit.inverse  sD    ;>5555Ic>***Ce$$$$Jr   r=   )
r"   r#   r$   r>   r?   r   r@   r_   r7   r<   r'   r   r   rY   rY      su        + +Z Mhq!UE22OO O O; ; ; ;
     r   rY   )identityrJ   r   
half_logitmultinomial_logit)r>   abcr   r   dataclassesr   numpyr   scipy.specialr   r   scipy.statsr   utils.extmathr
   r   float64r0   r2   rB   rF   rN   rU   rY   _LINKSr'   r   r   <module>ro      s    $ # # # # # # # ! ! ! ! ! !     & & & & & & & &       # # # # # # '" '" '" '" '" '" '" '"T )+
    8@ @ @ @ @s @ @ @F
 
 
 
 
8 
 
 
	/ 	/ 	/ 	/ 	/h 	/ 	/ 	/	. 	. 	. 	. 	. 	. 	. 	.. . . . .H . . ."? ? ? ? ?x ? ? ?F )
 
r   