
    Mpj?                        S r SSKJrJr  SSKJr  SSKJr  SSKJ	r	  SSK
JrJrJr  SSKJr  \ " S S	5      5       rS
 r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r\\\\\S.rg)zM
Module contains classes for invertible (and differentiable) link functions.
    )ABCabstractmethod)	dataclass)ulp)gmean)_expit_logitget_namespacesoftmaxc                   J    \ rS rSr% \\S'   \\S'   \\S'   \\S'   S rS rSr	g	)
Interval   lowhighlow_inclusivehigh_inclusivec                     U R                   U R                  :  a&  [        SU R                    SU R                   S35      eg)zCheck that low <= highz#One must have low <= high; got low=z, high=.N)r   r   
ValueError)selfs    N/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/sklearn/_loss/link.py__post_init__Interval.__post_init__   s?    88dii5dhhZwtyykQRS       c                    [        U5      u  p#U R                  (       a  UR                  XR                  5      nOUR	                  XR                  5      nUR                  U5      (       d  gU R                  (       a  UR                  XR                  5      nOUR                  XR                  5      n[        UR                  U5      5      $ )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
   r   greater_equalr   greaterallr   
less_equalr   lessbool)r   xxp_r   r   s         r   includesInterval.includes    s     a ""1hh/C**Q)Cvvc{{==II.D771ii(D BFF4L!!r    N)
__name__
__module____qualname____firstlineno__float__annotations__r"   r   r&   __static_attributes__r(   r   r   r   r      s"    	J
K"r   r   c                    S[        S5      -  nU R                  [        S5      * :X  a  SnO;U R                  S:  a  U R                  SU-
  -  U-   nOU R                  SU-   -  U-   nU R                  [        S5      :X  a  SnO;U R                  S:  a  U R                  SU-   -  U-
  nOU R                  SU-
  -  U-
  n[        U5      [        U5      4$ )zGenerate values low and high to be within the interval range.

This is used in tests only.

Returns
-------
low, high : tuple of floats
    The returned values low and high lie within the interval.

      infg    _r   g    _B)r   r   r-   r   )intervalepsr   r   s       r   _inclusive_low_highr6   >   s     s1v+C||e}$		lla#g&,lla#g&,}}e$		}}C(3.}}C(3.:uT{""r   c                   l    \ rS rSrSrSr\" \" S5      * \" S5      SS5      r\	S 5       r
\	S 5       rSrg)	BaseLinkZ   a  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.
Fr3   c                     g)a  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.

Returns
-------
array
    Output array, element-wise link function.
Nr(   r   y_preds     r   linkBaseLink.linkp       r   c                     g)aJ  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).

Returns
-------
array
    Output array, element-wise inverse link function.
Nr(   r   raw_predictions     r   inverseBaseLink.inverse   r?   r   r(   N)r)   r*   r+   r,   __doc__is_multiclassr   r-   interval_y_predr   r=   rC   r/   r(   r   r   r8   r8   Z   sP     M
 e}eElE5IO "  r   r8   c                   "    \ rS rSrSrS r\rSrg)IdentityLink   z"The identity link function g(x)=x.c                     U$ Nr(   r;   s     r   r=   IdentityLink.link   s    r   r(   N)r)   r*   r+   r,   rE   r=   rC   r/   r(   r   r   rI   rI      s    , Gr   rI   c                   F    \ rS rSrSr\" S\" S5      SS5      rS rS r	Sr
g	)
LogLink   z"The log link function g(x)=log(x).r   r3   Fc                 >    [        U5      u  p#UR                  U5      $ rL   )r
   log)r   r<   r$   r%   s       r   r=   LogLink.link   s    f%vvf~r   c                 >    [        U5      u  p#UR                  U5      $ rL   )r
   expr   rB   r$   r%   s       r   rC   LogLink.inverse   s    n-vvn%%r   r(   N)r)   r*   r+   r,   rE   r   r-   rG   r=   rC   r/   r(   r   r   rO   rO      s#    ,q%,u=O&r   rO   c                   :    \ rS rSrSr\" SSSS5      rS rS rSr	g	)
	LogitLink   z&The logit link function g(x)=logit(x).r   r2   Fc                     [        U5      $ rL   r	   r;   s     r   r=   LogitLink.link   s    f~r   c                     [        U5      $ rL   r   rA   s     r   rC   LogitLink.inverse   s    n%%r   r(   N
r)   r*   r+   r,   rE   r   rG   r=   rC   r/   r(   r   r   rY   rY      s    0q!UE2O&r   rY   c                   :    \ rS rSrSr\" SSSS5      rS rS rSr	g	)
HalfLogitLink   zRHalf the logit link function g(x)=1/2 * logit(x).

Used for the exponential loss.
r   r2   Fc                     S[        U5      -  $ )Ng      ?r\   r;   s     r   r=   HalfLogitLink.link   s    VF^##r   c                     [        SU-  5      $ )N   r_   rA   s     r   rC   HalfLogitLink.inverse   s    a.())r   r(   Nra   r(   r   r   rc   rc      s#    
 q!UE2O$*r   rc   c                   D    \ rS rSrSrSr\" SSSS5      rS rS r	S	 r
S
rg)MultinomialLogit   a  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   r2   Fc                 N    [        U5      u  p#XR                  USS9S S 2S 4   -
  $ Nr2   )axis)r
   meanrV   s       r   symmetrize_raw_prediction*MultinomialLogit.symmetrize_raw_prediction   s-    n-Q ?4 HHHr   c                 d    [        U5      u  p#[        USS9nUR                  XS S 2S 4   -  5      $ rn   )r
   r   rR   )r   r<   r$   r%   gms        r   r=   MultinomialLogit.link   s4    f%6"vvf!T'{*++r   c                     [        U5      $ rL   r   rA   s     r   rC   MultinomialLogit.inverse  s    ~&&r   r(   N)r)   r*   r+   r,   rE   rF   r   rG   rq   r=   rC   r/   r(   r   r   rk   rk      s/    +Z Mq!UE2OI,'r   rk   )identityrR   logit
half_logitmultinomial_logitN)rE   abcr   r   dataclassesr   mathr   scipy.statsr   sklearn.utils._array_apir   r	   r
   sklearn.utils.extmathr   r   r6   r8   rI   rO   rY   rc   rk   _LINKSr(   r   r   <module>r      s    $ !   B B ) (" (" ("V#88s 8v8 &h &	& 	&*H *<'x <'@ )
r   