
    e!hC                     |   d Z ddlZddl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 ddlmZmZ dd	lmZmZmZmZ dd
lmZmZ ddlmZmZmZ ddlmZmZ ddl m!Z!m"Z" g dZ# edgdgdd      d        Z$ edgddg eeddd      dg eeddd      dgdgdd      dddddd       Z% G d deee      Z&y)z8Isotonic regression for obtaining monotonic fit to data.    N)Real)interpolateoptimize)	spearmanr)metadata_routing   )'_inplace_contiguous_isotonic_regression_make_unique)BaseEstimatorRegressorMixinTransformerMixin_fit_context)check_arraycheck_consistent_length)Interval
StrOptionsvalidate_params)parse_versionsp_base_version)_check_sample_weightcheck_is_fitted)check_increasingisotonic_regressionIsotonicRegressionz
array-likexyTprefer_skip_nested_validationc                    t        | |      \  }}|dk\  }|dvrt        |       dkD  rdt        j                  d|z   d|z
  z        z  }dt        j                  t        |       dz
        z  }t        j
                  |d|z  z
        }t        j
                  |d|z  z         }t        j                  |      t        j                  |      k7  rt        j                  d       |S )	a?  Determine whether y is monotonically correlated with x.

    y is found increasing or decreasing with respect to x based on a Spearman
    correlation test.

    Parameters
    ----------
    x : array-like of shape (n_samples,)
            Training data.

    y : array-like of shape (n_samples,)
        Training target.

    Returns
    -------
    increasing_bool : boolean
        Whether the relationship is increasing or decreasing.

    Notes
    -----
    The Spearman correlation coefficient is estimated from the data, and the
    sign of the resulting estimate is used as the result.

    In the event that the 95% confidence interval based on Fisher transform
    spans zero, a warning is raised.

    References
    ----------
    Fisher transformation. Wikipedia.
    https://en.wikipedia.org/wiki/Fisher_transformation

    Examples
    --------
    >>> from sklearn.isotonic import check_increasing
    >>> x, y = [1, 2, 3, 4, 5], [2, 4, 6, 8, 10]
    >>> check_increasing(x, y)
    np.True_
    >>> y = [10, 8, 6, 4, 2]
    >>> check_increasing(x, y)
    np.False_
    r   )g            ?   g      ?r!   r   g\(\?zwConfidence interval of the Spearman correlation coefficient spans zero. Determination of ``increasing`` may be suspect.)
r   lenmathlogsqrttanhnpsignwarningswarn)	r   r   rho_increasing_boolFF_serho_0rho_1s	            X/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/sklearn/isotonic.pyr   r      s    f q!_FCQhO +#a&1*$((C#I#)455499SVaZ(( 		!dTk/*		!dTk/* 775>RWWU^+MM     bothclosedboolean)r   sample_weighty_miny_max
increasingr9   r:   r;   r<   c                   t        | ddt        j                  t        j                  g      } t        t        d      k\  rDt        j                  | ||      }t        j                  |j                  | j                        } n|rt        j                  dd nt        j                  ddd   }t        j                  | |   | j                        } t        || | j                  d	
      }t        j                  ||         }t        | |       | |   } ||=|t        j                    }|t        j                   }t        j"                  | |||        | S )a0  Solve the isotonic regression model.

    Read more in the :ref:`User Guide <isotonic>`.

    Parameters
    ----------
    y : array-like of shape (n_samples,)
        The data.

    sample_weight : array-like of shape (n_samples,), default=None
        Weights on each point of the regression.
        If None, weight is set to 1 (equal weights).

    y_min : float, default=None
        Lower bound on the lowest predicted value (the minimum value may
        still be higher). If not set, defaults to -inf.

    y_max : float, default=None
        Upper bound on the highest predicted value (the maximum may still be
        lower). If not set, defaults to +inf.

    increasing : bool, default=True
        Whether to compute ``y_`` is increasing (if set to True) or decreasing
        (if set to False).

    Returns
    -------
    y_ : ndarray of shape (n_samples,)
        Isotonic fit of y.

    References
    ----------
    "Active set algorithms for isotonic regression; A unifying framework"
    by Michael J. Best and Nilotpal Chakravarti, section 3.

    Examples
    --------
    >>> from sklearn.isotonic import isotonic_regression
    >>> isotonic_regression([5, 3, 1, 2, 8, 10, 7, 9, 6, 4])
    array([2.75   , 2.75   , 2.75   , 2.75   , 7.33...,
           7.33..., 7.33..., 7.33..., 7.33..., 7.33...])
    Fr   )	ensure_2d
input_namedtypez1.12.0)r   weightsr<   rA   NT)rA   copy)r   r(   float64float32r   r   r   r   asarrayr   rA   s_arrayr   ascontiguousarrayr	   infclip)r   r9   r:   r;   r<   resorders          r3   r   r   f   s   n 	A3rzz2::>VWA-11**:
 JJsuuAGG, 'aBEE$B$KHHQuXQWW-,]AQWWSWX,,]5-AB/=AeHE-=VVGE=FFE
5%#Hr4   c                   <    e Zd ZU dZdej
                  iZdej
                  iZ ee	ddd      dg ee	ddd      dgd e
dh      g e
h d      gd	Zeed
<   ddddd	dZd Zd ZddZ ed      dd       Zd Zd Zd ZddZ fdZ fdZ fdZ xZS )r   a  Isotonic regression model.

    Read more in the :ref:`User Guide <isotonic>`.

    .. versionadded:: 0.13

    Parameters
    ----------
    y_min : float, default=None
        Lower bound on the lowest predicted value (the minimum value may
        still be higher). If not set, defaults to -inf.

    y_max : float, default=None
        Upper bound on the highest predicted value (the maximum may still be
        lower). If not set, defaults to +inf.

    increasing : bool or 'auto', default=True
        Determines whether the predictions should be constrained to increase
        or decrease with `X`. 'auto' will decide based on the Spearman
        correlation estimate's sign.

    out_of_bounds : {'nan', 'clip', 'raise'}, default='nan'
        Handles how `X` values outside of the training domain are handled
        during prediction.

        - 'nan', predictions will be NaN.
        - 'clip', predictions will be set to the value corresponding to
          the nearest train interval endpoint.
        - 'raise', a `ValueError` is raised.

    Attributes
    ----------
    X_min_ : float
        Minimum value of input array `X_` for left bound.

    X_max_ : float
        Maximum value of input array `X_` for right bound.

    X_thresholds_ : ndarray of shape (n_thresholds,)
        Unique ascending `X` values used to interpolate
        the y = f(X) monotonic function.

        .. versionadded:: 0.24

    y_thresholds_ : ndarray of shape (n_thresholds,)
        De-duplicated `y` values suitable to interpolate the y = f(X)
        monotonic function.

        .. versionadded:: 0.24

    f_ : function
        The stepwise interpolating function that covers the input domain ``X``.

    increasing_ : bool
        Inferred value for ``increasing``.

    See Also
    --------
    sklearn.linear_model.LinearRegression : Ordinary least squares Linear
        Regression.
    sklearn.ensemble.HistGradientBoostingRegressor : Gradient boosting that
        is a non-parametric model accepting monotonicity constraints.
    isotonic_regression : Function to solve the isotonic regression model.

    Notes
    -----
    Ties are broken using the secondary method from de Leeuw, 1977.

    References
    ----------
    Isotonic Median Regression: A Linear Programming Approach
    Nilotpal Chakravarti
    Mathematics of Operations Research
    Vol. 14, No. 2 (May, 1989), pp. 303-308

    Isotone Optimization in R : Pool-Adjacent-Violators
    Algorithm (PAVA) and Active Set Methods
    de Leeuw, Hornik, Mair
    Journal of Statistical Software 2009

    Correctness of Kruskal's algorithms for monotone regression with ties
    de Leeuw, Psychometrica, 1977

    Examples
    --------
    >>> from sklearn.datasets import make_regression
    >>> from sklearn.isotonic import IsotonicRegression
    >>> X, y = make_regression(n_samples=10, n_features=1, random_state=41)
    >>> iso_reg = IsotonicRegression().fit(X, y)
    >>> iso_reg.predict([.1, .2])
    array([1.8628..., 3.7256...])
    TNr5   r6   r8   auto>   nanrM   raiser:   r;   r<   out_of_bounds_parameter_constraintsTrS   c                <    || _         || _        || _        || _        y NrU   )selfr:   r;   r<   rV   s        r3   __init__zIsotonicRegression.__init__   s    

$*r4   c                     |j                   dk(  s/|j                   dk(  r|j                  d   dk(  sd}t        |      y y )Nr      zKIsotonic regression input X should be a 1d array or 2d array with 1 feature)ndimshape
ValueError)rZ   Xmsgs      r3   _check_input_data_shapez*IsotonicRegression._check_input_data_shape&  sC    !!
a*  S/! 1@r4   c                     | j                   dk(  }t              dk(  rfd| _        yt        j                  |d|      | _        y)zBuild the f_ interp1d function.rT   r   c                 :    j                  | j                        S rY   )repeatr_   r   s    r3   <lambda>z-IsotonicRegression._build_f.<locals>.<lambda>4  s     1 r4   linear)kindbounds_errorN)rV   r#   f_r   interp1d)rZ   ra   r   rj   s     ` r3   _build_fzIsotonicRegression._build_f.  sB     ))W4q6Q;1DG!**18,DGr4   c           	      ^   | j                  |       |j                  d      }| j                  dk(  rt        ||      | _        n| j                  | _        t        |||j                        }|dkD  }||   ||   ||   }}}t        j                  ||f      }|||fD cg c]  }||   	 c}\  }}}t        |||      \  }}	}
|}t        |	|
| j                  | j                  | j                        }t        j                  |      t        j                  |      c| _        | _        |r|t        j"                  t%        |      ft&              }t        j(                  t        j*                  |dd |dd       t        j*                  |dd |d	d             |dd ||   ||   fS ||fS c c}w )
z Build the y_ IsotonicRegression.rD   rR   rC   r   r=   r   Nr]   )rc   reshaper<   r   increasing_r   rA   r(   lexsortr
   r   r:   r;   minmaxX_min_X_max_onesr#   bool
logical_or	not_equal)rZ   ra   r   r9   trim_duplicatesmaskrO   rJ   unique_Xunique_yunique_sample_weight	keep_datas               r3   _build_yzIsotonicRegression._build_y:  s   $$Q'IIbM ??f$/15D#D -]AQWWMq gqwd0Cm1

Aq6":;Q9NOuU|O1m3?1m3T0(0.****''
 $&66!9bffQi T[Q	6I !mmQqWaf-r||AaGQqrU/KIaO Y<9-- a4K; Ps   F*r   c                 4   t        dd      }t        |fdt        j                  t        j                  gd|}t        |fd|j
                  d|}t        |||       | j                  |||      \  }}||c| _        | _	        | j                  ||       | S )a  Fit the model using X, y as training data.

        Parameters
        ----------
        X : array-like of shape (n_samples,) or (n_samples, 1)
            Training data.

            .. versionchanged:: 0.24
               Also accepts 2d array with 1 feature.

        y : array-like of shape (n_samples,)
            Training target.

        sample_weight : array-like of shape (n_samples,), default=None
            Weights. If set to None, all weights will be set to 1 (equal
            weights).

        Returns
        -------
        self : object
            Returns an instance of self.

        Notes
        -----
        X is stored for future use, as :meth:`transform` needs X to interpolate
        new input data.
        F)accept_sparser?   ra   )r@   rA   r   )dictr   r(   rF   rG   rA   r   r   X_thresholds_y_thresholds_rm   )rZ   ra   r   r9   check_paramss        r3   fitzIsotonicRegression.fitk  s    : %5A
bjj"**%=
AM
 IcILI1m4 }}Q=11 23A.D. 	ar4   c                    t        | d      r| j                  j                  }nt        j                  }t        ||d      }| j                  |       |j                  d      }| j                  dk(  r+t        j                  || j                  | j                        }| j                  |      }|j                  |j                        }|S )a  `_transform` is called by both `transform` and `predict` methods.

        Since `transform` is wrapped to output arrays of specific types (e.g.
        NumPy arrays, pandas DataFrame), we cannot make `predict` call `transform`
        directly.

        The above behaviour could be changed in the future, if we decide to output
        other type of arrays when calling `predict`.
        r   F)rA   r?   rD   rM   )hasattrr   rA   r(   rF   r   rc   rp   rV   rM   ru   rv   rk   astype)rZ   rQ   rA   rN   s       r3   
_transformzIsotonicRegression._transform  s     4)&&,,EJJE%8$$Q'IIbM'4;;4Aggaj jj!
r4   c                 $    | j                  |      S )a  Transform new data by linear interpolation.

        Parameters
        ----------
        T : array-like of shape (n_samples,) or (n_samples, 1)
            Data to transform.

            .. versionchanged:: 0.24
               Also accepts 2d array with 1 feature.

        Returns
        -------
        y_pred : ndarray of shape (n_samples,)
            The transformed data.
        r   rZ   rQ   s     r3   	transformzIsotonicRegression.transform  s      q!!r4   c                 $    | j                  |      S )a%  Predict new data by linear interpolation.

        Parameters
        ----------
        T : array-like of shape (n_samples,) or (n_samples, 1)
            Data to transform.

        Returns
        -------
        y_pred : ndarray of shape (n_samples,)
            Transformed data.
        r   r   s     r3   predictzIsotonicRegression.predict  s     q!!r4   c                     t        | d       | j                  j                  j                         }t	        j
                  | dgt              S )aK  Get output feature names for transformation.

        Parameters
        ----------
        input_features : array-like of str or None, default=None
            Ignored.

        Returns
        -------
        feature_names_out : ndarray of str objects
            An ndarray with one string i.e. ["isotonicregression0"].
        rk   0rC   )r   	__class____name__lowerr(   rH   object)rZ   input_features
class_names      r3   get_feature_names_outz(IsotonicRegression.get_feature_names_out  sA     	d#^^,,224
zzj\+,F;;r4   c                 H    t         |          }|j                  dd       |S )z0Pickle-protocol - return state of the estimator.rk   N)super__getstate__poprZ   stater   s     r3   r   zIsotonicRegression.__getstate__  s#    $&		$r4   c                     t         |   |       t        | d      r4t        | d      r'| j                  | j                  | j
                         yyy)znPickle-protocol - set state of the estimator.

        We need to rebuild the interpolation function.
        r   r   N)r   __setstate__r   rm   r   r   r   s     r3   r   zIsotonicRegression.__setstate__  sH    
 	U#4)gdO.LMM$,,d.@.@A /M)r4   c                 h    t         |          }d|j                  _        d|j                  _        |S )NTF)r   __sklearn_tags__
input_tagsone_d_arraytwo_d_array)rZ   tagsr   s     r3   r   z#IsotonicRegression.__sklearn_tags__  s-    w')&*#&+#r4   )TrY   )r   
__module____qualname____doc__r   UNUSED._IsotonicRegression__metadata_request__predict0_IsotonicRegression__metadata_request__transformr   r   r   rW   r   __annotations__r[   rc   rm   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r3   r   r      s    [| $'(8(?(?"@%(*:*A*A$B! 4tF;TB4tF;TB *fX"67$%=>?	$D  !%DTQV +"
/b 5/ 6/b<"$"&<"B r4   r   )'r   r$   r*   numbersr   numpyr(   scipyr   r   scipy.statsr   sklearn.utilsr   	_isotonicr	   r
   baser   r   r   r   utilsr   r   utils._param_validationr   r   r   utils.fixesr   r   utils.validationr   r   __all__r   r   r    r4   r3   <module>r      s    >
     ' ! * L O O 7 J J 7 C
K ^^ #'BBJ ^&-4tF;TB4tF;TB k #'	 DD	DNN)9= Nr4   