§
    §éUgú;  ã                   ó’   — d dl ZddlmZ ddlmZ ddlm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 d
„ Z G d„ d¦  «        ZdS )é    Né   )Úis_regressor)ÚLabelEncoder)Ú_safe_indexing)Úcheck_matplotlib_support)Ú_get_response_values)Ú_get_adapter_from_container)Ú_is_arraylike_not_scalarÚ_is_pandas_dfÚ_is_polars_dfÚ_num_featuresÚcheck_is_fittedc                 ó6  — t          | d¦  «        }|r+t          | j        d         ¦  «        rd}t          |¦  «        ‚|r:t	          | j        ¦  «        dk    r"|dvr|€d}t          |¦  «        ‚|dk    rd	n|}n|dk    rt          | ¦  «        rd	}ng d
¢}n|}|S )aŠ  Validate the response methods to be used with the fitted estimator.

    Parameters
    ----------
    estimator : object
        Fitted estimator to check.

    response_method : {'auto', 'predict_proba', 'decision_function', 'predict'}
        Specifies whether to use :term:`predict_proba`,
        :term:`decision_function`, :term:`predict` as the target response.
        If set to 'auto', the response method is tried in the following order:
        :term:`decision_function`, :term:`predict_proba`, :term:`predict`.

    class_of_interest : int, float, bool, str or None
        The class considered when plotting the decision. Cannot be None if
        multiclass and `response_method` is 'predict_proba' or 'decision_function'.

        .. versionadded:: 1.4

    Returns
    -------
    prediction_method : list of str or str
        The name or list of names of the response methods to use.
    Úclasses_r   zFMulti-label and multi-output multi-class classifiers are not supportedé   >   ÚautoÚpredictNzµMulticlass classifiers are only supported when `response_method` is 'predict' or 'auto'. Else you must provide `class_of_interest` to plot the decision boundary of a specific class.r   r   )Údecision_functionÚpredict_probar   )Úhasattrr
   r   Ú
ValueErrorÚlenr   )Ú	estimatorÚresponse_methodÚclass_of_interestÚhas_classesÚmsgÚprediction_methods         úi/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/sklearn/inspection/_plot/decision_boundary.pyÚ_check_boundary_response_methodr       sã   € õ2 ˜) ZÑ0Ô0€KØð Õ/°	Ô0BÀ1Ô0EÑFÔFð ØVˆÝ˜‰oŒoÐàð ,•s˜9Ô-Ñ.Ô.°Ò2Ð2ØÐ"5Ð5Ð5Ð:KÐ:SðBð õ
 ˜S‘/”/Ð!Ø)8¸FÒ)BÐ)B˜I˜IÈÐÐØ	˜FÒ	"Ð	"Ý˜	Ñ"Ô"ð 	RØ )ÐÐà QÐ QÐ QÐÐà+ÐàÐó    c            
       óR   — e Zd ZdZdddœd„Zdd„Zedddd	ddddd
œd„¦   «         ZdS )ÚDecisionBoundaryDisplaya…	  Decisions boundary visualization.

    It is recommended to use
    :func:`~sklearn.inspection.DecisionBoundaryDisplay.from_estimator`
    to create a :class:`DecisionBoundaryDisplay`. All parameters are stored as
    attributes.

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

    .. versionadded:: 1.1

    Parameters
    ----------
    xx0 : ndarray of shape (grid_resolution, grid_resolution)
        First output of :func:`meshgrid <numpy.meshgrid>`.

    xx1 : ndarray of shape (grid_resolution, grid_resolution)
        Second output of :func:`meshgrid <numpy.meshgrid>`.

    response : ndarray of shape (grid_resolution, grid_resolution)
        Values of the response function.

    xlabel : str, default=None
        Default label to place on x axis.

    ylabel : str, default=None
        Default label to place on y axis.

    Attributes
    ----------
    surface_ : matplotlib `QuadContourSet` or `QuadMesh`
        If `plot_method` is 'contour' or 'contourf', `surface_` is a
        :class:`QuadContourSet <matplotlib.contour.QuadContourSet>`. If
        `plot_method` is 'pcolormesh', `surface_` is a
        :class:`QuadMesh <matplotlib.collections.QuadMesh>`.

    ax_ : matplotlib Axes
        Axes with decision boundary.

    figure_ : matplotlib Figure
        Figure containing the decision boundary.

    See Also
    --------
    DecisionBoundaryDisplay.from_estimator : Plot decision boundary given an estimator.

    Examples
    --------
    >>> import matplotlib.pyplot as plt
    >>> import numpy as np
    >>> from sklearn.datasets import load_iris
    >>> from sklearn.inspection import DecisionBoundaryDisplay
    >>> from sklearn.tree import DecisionTreeClassifier
    >>> iris = load_iris()
    >>> feature_1, feature_2 = np.meshgrid(
    ...     np.linspace(iris.data[:, 0].min(), iris.data[:, 0].max()),
    ...     np.linspace(iris.data[:, 1].min(), iris.data[:, 1].max())
    ... )
    >>> grid = np.vstack([feature_1.ravel(), feature_2.ravel()]).T
    >>> tree = DecisionTreeClassifier().fit(iris.data[:, :2], iris.target)
    >>> y_pred = np.reshape(tree.predict(grid), feature_1.shape)
    >>> display = DecisionBoundaryDisplay(
    ...     xx0=feature_1, xx1=feature_2, response=y_pred
    ... )
    >>> display.plot()
    <...>
    >>> display.ax_.scatter(
    ...     iris.data[:, 0], iris.data[:, 1], c=iris.target, edgecolor="black"
    ... )
    <...>
    >>> plt.show()
    N)ÚxlabelÚylabelc                óL   — || _         || _        || _        || _        || _        d S )N©Úxx0Úxx1Úresponser$   r%   )Úselfr(   r)   r*   r$   r%   s         r   Ú__init__z DecisionBoundaryDisplay.__init__Ž   s)   € ØˆŒØˆŒØ ˆŒØˆŒØˆŒˆˆr!   Úcontourfc                 óä  — t          d¦  «         ddlm} |dvrt          d¦  «        ‚|€|                     ¦   «         \  }}t          ||¦  «        } || j        | j        | j        fi |¤Ž| _	        |€| 
                    ¦   «         s |€| j        n|}|                     |¦  «         |€|                     ¦   «         s |€| j        n|}|                     |¦  «         || _        |j        | _        | S )aó  Plot visualization.

        Parameters
        ----------
        plot_method : {'contourf', 'contour', 'pcolormesh'}, default='contourf'
            Plotting method to call when plotting the response. Please refer
            to the following matplotlib documentation for details:
            :func:`contourf <matplotlib.pyplot.contourf>`,
            :func:`contour <matplotlib.pyplot.contour>`,
            :func:`pcolormesh <matplotlib.pyplot.pcolormesh>`.

        ax : Matplotlib axes, default=None
            Axes object to plot on. If `None`, a new figure and axes is
            created.

        xlabel : str, default=None
            Overwrite the x-axis label.

        ylabel : str, default=None
            Overwrite the y-axis label.

        **kwargs : dict
            Additional keyword arguments to be passed to the `plot_method`.

        Returns
        -------
        display: :class:`~sklearn.inspection.DecisionBoundaryDisplay`
            Object that stores computed values.
        zDecisionBoundaryDisplay.plotr   N©r-   ÚcontourÚ
pcolormeshz:plot_method must be 'contourf', 'contour', or 'pcolormesh')r   Úmatplotlib.pyplotÚpyplotr   ÚsubplotsÚgetattrr(   r)   r*   Úsurface_Ú
get_xlabelr$   Ú
set_xlabelÚ
get_ylabelr%   Ú
set_ylabelÚax_ÚfigureÚfigure_)	r+   Úplot_methodÚaxr$   r%   ÚkwargsÚpltÚ_Ú	plot_funcs	            r   ÚplotzDecisionBoundaryDisplay.plot•   s  € õ< 	!Ð!?Ñ@Ô@Ð@Ø'Ð'Ð'Ð'Ð'Ð'àÐCÐCÐCÝØLñô ð ð ˆ:Ø—L’L‘N”N‰EˆAˆrå˜B Ñ,Ô,ˆ	Ø!˜	 $¤(¨D¬H°d´mÐNÐNÀvÐNÐNˆŒàÐ R§]¢]¡_¤_ÐØ$* N�T”[�[¸ˆFØ�MŠM˜&Ñ!Ô!Ð!ØÐ R§]¢]¡_¤_ÐØ$* N�T”[�[¸ˆFØ�MŠM˜&Ñ!Ô!Ð!àˆŒØ”yˆŒØˆr!   éd   g      ð?r   )Úgrid_resolutionÚepsr>   r   r   r$   r%   r?   c                óê  — t          | j        › d�¦  «         t          |¦  «         |dk    st          d|› d�¦  «        ‚|dk    st          d|› d�¦  «        ‚d}||vr+d                     |¦  «        }t          d	|› d
|› d�¦  «        ‚t          |¦  «        }|dk    rt          d|› d�¦  «        ‚t          |dd¬¦  «        t          |dd¬¦  «        }}|                     ¦   «         |z
  |                     ¦   «         |z   }}|                     ¦   «         |z
  |                     ¦   «         |z   }}t          j
        t          j        |||¦  «        t          j        |||¦  «        ¦  «        \  }}t          j        |                     ¦   «         |                     ¦   «         f         }t          |¦  «        st          |¦  «        r,t!          |¦  «        }|                     |||j        ¬¦  «        }t'          |||¦  «        }	 t)          ||||d¬¦  «        \  }}}n?# t          $ r2}dt+          |¦  «        v rt          d|› d|j        › �¦  «        |‚‚ d}~ww xY w|dk    r?t/          |d¦  «        r/t1          ¦   «         }|j        |_        |                     |¦  «        }|j        dk    rMt7          |¦  «        rt          d¦  «        ‚t          j        |j        |k    ¦  «        d         }|dd…|f         }|€t/          |d¦  «        r|j        d         nd}|	€t/          |d¦  «        r|j        d         nd}	 | |||                     |j        ¦  «        ||	¬¦  «        }  | j        d|
|dœ|¤ŽS )aÎ  Plot decision boundary given an estimator.

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

        Parameters
        ----------
        estimator : object
            Trained estimator used to plot the decision boundary.

        X : {array-like, sparse matrix, dataframe} of shape (n_samples, 2)
            Input data that should be only 2-dimensional.

        grid_resolution : int, default=100
            Number of grid points to use for plotting decision boundary.
            Higher values will make the plot look nicer but be slower to
            render.

        eps : float, default=1.0
            Extends the minimum and maximum values of X for evaluating the
            response function.

        plot_method : {'contourf', 'contour', 'pcolormesh'}, default='contourf'
            Plotting method to call when plotting the response. Please refer
            to the following matplotlib documentation for details:
            :func:`contourf <matplotlib.pyplot.contourf>`,
            :func:`contour <matplotlib.pyplot.contour>`,
            :func:`pcolormesh <matplotlib.pyplot.pcolormesh>`.

        response_method : {'auto', 'predict_proba', 'decision_function',                 'predict'}, default='auto'
            Specifies whether to use :term:`predict_proba`,
            :term:`decision_function`, :term:`predict` as the target response.
            If set to 'auto', the response method is tried in the following order:
            :term:`decision_function`, :term:`predict_proba`, :term:`predict`.
            For multiclass problems, :term:`predict` is selected when
            `response_method="auto"`.

        class_of_interest : int, float, bool or str, default=None
            The class considered when plotting the decision. If None,
            `estimator.classes_[1]` is considered as the positive class
            for binary classifiers. Must have an explicit value for
            multiclass classifiers when `response_method` is 'predict_proba'
            or 'decision_function'.

            .. versionadded:: 1.4

        xlabel : str, default=None
            The label used for the x-axis. If `None`, an attempt is made to
            extract a label from `X` if it is a dataframe, otherwise an empty
            string is used.

        ylabel : str, default=None
            The label used for the y-axis. If `None`, an attempt is made to
            extract a label from `X` if it is a dataframe, otherwise an empty
            string is used.

        ax : Matplotlib axes, default=None
            Axes object to plot on. If `None`, a new figure and axes is
            created.

        **kwargs : dict
            Additional keyword arguments to be passed to the
            `plot_method`.

        Returns
        -------
        display : :class:`~sklearn.inspection.DecisionBoundaryDisplay`
            Object that stores the result.

        See Also
        --------
        DecisionBoundaryDisplay : Decision boundary visualization.
        sklearn.metrics.ConfusionMatrixDisplay.from_estimator : Plot the
            confusion matrix given an estimator, the data, and the label.
        sklearn.metrics.ConfusionMatrixDisplay.from_predictions : Plot the
            confusion matrix given the true and predicted labels.

        Examples
        --------
        >>> import matplotlib.pyplot as plt
        >>> from sklearn.datasets import load_iris
        >>> from sklearn.linear_model import LogisticRegression
        >>> from sklearn.inspection import DecisionBoundaryDisplay
        >>> iris = load_iris()
        >>> X = iris.data[:, :2]
        >>> classifier = LogisticRegression().fit(X, iris.target)
        >>> disp = DecisionBoundaryDisplay.from_estimator(
        ...     classifier, X, response_method="predict",
        ...     xlabel=iris.feature_names[0], ylabel=iris.feature_names[1],
        ...     alpha=0.5,
        ... )
        >>> disp.ax_.scatter(X[:, 0], X[:, 1], c=iris.target, edgecolor="k")
        <...>
        >>> plt.show()
        z.from_estimatoré   z,grid_resolution must be greater than 1. Got z	 instead.r   z,eps must be greater than or equal to 0. Got r/   z, zplot_method must be one of z. Got r   z#n_features must be equal to 2. Got )Úaxis)ÚcolumnsT)r   Ú	pos_labelÚreturn_response_method_usedzis not a valid labelzclass_of_interest=z+ is not a valid label: It should be one of Nr   r   z)Multi-output regressors are not supportedrK   Ú r'   )r?   r>   © ) r   Ú__name__r   r   Újoinr   r   ÚminÚmaxÚnpÚmeshgridÚlinspaceÚc_Úravelr   r   r	   Úcreate_containerrK   r    r   Ústrr   r   r   Ú	transformÚndimr   ÚflatnonzeroÚreshapeÚshaperD   )!Úclsr   ÚXrF   rG   r>   r   r   r$   r%   r?   r@   Úpossible_plot_methodsÚavailable_methodsÚnum_featuresÚx0Úx1Úx0_minÚx0_maxÚx1_minÚx1_maxr(   r)   ÚX_gridÚadapterr   r*   rB   Úresponse_method_usedÚexcÚencoderÚcol_idxÚdisplays!                                    r   Úfrom_estimatorz&DecisionBoundaryDisplay.from_estimatorÌ   s5  € õ^ 	! C¤LÐ!AÐ!AÐ!AÑBÔBÐBÝ˜	Ñ"Ô"Ð"à Ò"Ð"Ýð/Ø#ð/ð /ð /ñô ð ð
 �aŠxˆxÝØM¸sÐMÐMÐMñô ð ð !FÐØÐ3Ð3Ð3Ø $§	¢	Ð*?Ñ @Ô @ÐÝð.Ð.?ð .ð .Ø"ð.ð .ð .ñô ð õ
 % QÑ'Ô'ˆØ˜1ÒÐÝØM°lÐMÐMÐMñô ð õ    1¨1Ð-Ñ-Ô-­~¸aÀÈÐ/KÑ/KÔ/KˆBˆàŸš™œ C™¨¯ª©¬°C©�ˆØŸš™œ C™¨¯ª©¬°C©�ˆå”;ÝŒK˜ ¨Ñ8Ô8ÝŒK˜ ¨Ñ8Ô8ñ
ô 
‰ˆˆSõ
 ”�s—y’y‘{”{ C§I¢I¡K¤KÐ/Ô0ˆÝ˜ÑÔð 	�}¨QÑ/Ô/ð 	Ý1°!Ñ4Ô4ˆGØ×-Ò-ØØØœ	ð .ñ ô ˆFõ <Ø�Ð(9ñ
ô 
Ðð	Ý0DØØØ 1Ø+Ø,0ð1ñ 1ô 1Ñ-ˆH�aÐ-Ð-øõ ð 		ð 		ð 		Ø%­¨S©¬Ð1Ð1õ !ð=Ð):ð =ð =Ø(1Ô(:ð=ð =ñô ð ðð øøøøð		øøøð   9Ò,Ð,µ¸ÀJÑ1OÔ1OÐ,Ý"‘n”nˆGØ(Ô1ˆGÔØ×(Ò(¨Ñ2Ô2ˆHàŒ=˜AÒÐÝ˜IÑ&Ô&ð NÝ Ð!LÑMÔMÐMõ
 ”n YÔ%7Ð;LÒ%LÑMÔMÈaÔPˆGØ    7 
Ô+ˆHàˆ>Ý%,¨Q°	Ñ%:Ô%:ÐB�Q”Y˜q”\�\ÀˆFàˆ>Ý%,¨Q°	Ñ%:Ô%:ÐB�Q”Y˜q”\�\ÀˆFà�#ØØØ×%Ò% c¤iÑ0Ô0ØØð
ñ 
ô 
ˆð ˆwŒ|ÐE˜r¨{ÐEÐE¸fÐEÐEÐEs   ÈH È
IÈ)-IÉI)r-   NNN)rP   Ú
__module__Ú__qualname__Ú__doc__r,   rD   Úclassmethodrr   rO   r!   r   r#   r#   D   s£   € € € € € ðGð GðR 6:À$ð ð ð ð ð ð5ð 5ð 5ð 5ðn ð ØØØØØØØðPFð PFð PFð PFñ „[ðPFð PFð PFr!   r#   )ÚnumpyrT   Úbaser   Úpreprocessingr   Úutilsr   Úutils._optional_dependenciesr   Úutils._responser   Úutils._set_outputr	   Úutils.validationr
   r   r   r   r   r    r#   rO   r!   r   ú<module>r      s  ðØ Ð Ð Ð à  Ð  Ð  Ð  Ð  Ð  Ø )Ð )Ð )Ð )Ð )Ð )Ø #Ð #Ð #Ð #Ð #Ð #Ø DÐ DÐ DÐ DÐ DÐ DØ 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø <Ð <Ð <Ð <Ð <Ð <ðð ð ð ð ð ð ð ð ð ð ð ð ð ð/ð /ð /ðdYFð YFð YFð YFð YFñ YFô YFð YFð YFð YFr!   