o
    U|%i                     @   sv   d Z ddlmZm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 ddlmZ G d	d
 d
ee	ZdS )zwClassifier utilities for MySQL Connector/Python.

Provides a scikit-learn compatible classifier backed by HeatWave ML.
    )OptionalUnionN)ClassifierMixin)MyBaseMLModel)ML_TASK)	copy_dict)MySQLConnectionAbstractc                   @   s   e Zd ZdZ				ddedee dee dee dee f
dd	Zd
e	e
jejf dejfddZd
e	e
jejf dejfddZd
e	e
jejf de
jfddZdS )MyClassifiera  
    MySQL HeatWave scikit-learn compatible classifier estimator.

    Provides prediction and probability output from a model deployed in MySQL,
    and manages fit, explain, and prediction options as per HeatWave ML interface.

    Attributes:
        predict_extra_options (dict): Dictionary of optional parameters passed through
            to the MySQL backend for prediction and probability inference.
        _model (MyModel): Underlying interface for database model operations.
        fit_extra_options (dict): See MyBaseMLModel.

    Args:
        db_connection (MySQLConnectionAbstract): Active MySQL connector DB connection.
        model_name (str, optional): Custom name for the model.
        fit_extra_options (dict, optional): Extra options for fitting.
        explain_extra_options (dict, optional): Extra options for explanations.
        predict_extra_options (dict, optional): Extra options for predict/predict_proba.

    Methods:
        predict(X): Predict class labels.
        predict_proba(X): Predict class probabilities.
    Ndb_connection
model_namefit_extra_optionsexplain_extra_optionspredict_extra_optionsc                 C   s.   t j| |tj||d t|| _t|| _dS )a  
        Initialize a MyClassifier.

        Args:
            db_connection: Active MySQL connector database connection.
            model_name: Optional, custom model name.
            fit_extra_options: Optional fit options.
            explain_extra_options: Optional explain options.
            predict_extra_options: Optional predict/predict_proba options.

        Raises:
            DatabaseError:
                If a database connection issue occurs.
                If an operational error occurs during execution.
        )r   r   N)r   __init__r   CLASSIFICATIONr   r   r   )selfr
   r   r   r   r    r   S/home/air/sos_test/back/venv/lib/python3.10/site-packages/mysql/ai/ml/classifier.pyr   G   s   
zMyClassifier.__init__Xreturnc                 C   s   | j j|| jd}|d  S )a  
        Predict class labels for the input features using the MySQL model.

        References:
            https://dev.mysql.com/doc/heatwave/en/mys-hwaml-ml-predict-table.html
                A full list of supported options can be found under "ML_PREDICT_TABLE Options"

        Args:
            X: Input samples as a numpy array or pandas DataFrame.

        Returns:
            ndarray: Array of predicted class labels, shape (n_samples,).

        Raises:
            DatabaseError:
                If provided options are invalid or unsupported,
                or if the model is not initialized, i.e., fit or import has not
                been called
                If a database connection issue occurs.
                If an operational error occurs during execution.
        options
Prediction)_modelpredictr   to_numpyr   r   resultr   r   r   r   h   s   zMyClassifier.predictc                    sH   | j j|| jd}t|d jd d   t|d  fddS )a*  
        Predict class probabilities for the input features using the MySQL model.

        References:
            https://dev.mysql.com/doc/heatwave/en/mys-hwaml-ml-predict-table.html
                A full list of supported options can be found under "ML_PREDICT_TABLE Options"

        Args:
            X: Input samples as a numpy array or pandas DataFrame.

        Returns:
            ndarray: Array of shape (n_samples, n_classes) with class probabilities.

        Raises:
            DatabaseError:
                If provided options are invalid or unsupported,
                or if the model is not initialized, i.e., fit or import has not
                been called
                If a database connection issue occurs.
                If an operational error occurs during execution.
        r   
ml_resultsr   probabilitiesc                    s    fddD S )Nc                    s   g | ]} d  | qS )r   r   ).0
class_name	ml_resultr   r   
<listcomp>   s    z@MyClassifier.predict_proba.<locals>.<lambda>.<locals>.<listcomp>r   r"   classesr"   r   <lambda>   s   
 z,MyClassifier.predict_proba.<locals>.<lambda>)	r   r   r   sortedilockeysnpstackmapr   r   r%   r   predict_proba   s   
zMyClassifier.predict_probac                 C   s   | j j|| jd dS )ai  
        Explain model predictions using provided data.

        References:
            https://dev.mysql.com/doc/heatwave/en/mys-hwaml-ml-explain-table.html
                A full list of supported options can be found under "ML_EXPLAIN_TABLE Options"

        Args:
            X: DataFrame for which predictions should be explained.

        Returns:
            DataFrame containing explanation details (feature attributions, etc.)

        Raises:
            DatabaseError:
                If provided options are invalid or unsupported,
                or if the model is not initialized, i.e., fit or import has not
                been called
                If a database connection issue occurs.
                If an operational error occurs during execution.

        Notes:
            Temporary input/output tables are cleaned up after explanation.
        r   N)r   explain_predictionsr   )r   r   r   r   r   r/      s   z MyClassifier.explain_predictions)NNNN)__name__
__module____qualname____doc__r   r   strdictr   r   pd	DataFramer+   ndarrayr   r.   r/   r   r   r   r   r	   .   s@    
!

$r	   )r3   typingr   r   numpyr+   pandasr6   sklearn.baser   mysql.ai.ml.baser   mysql.ai.ml.modelr   mysql.ai.utilsr   mysql.connector.abstractsr   r	   r   r   r   r   <module>   s   