o
    mi-                  	   @   s4  d Z ddlmZ ddlmZmZ ddlZddlmZ ddlZddl	m
Z g dZg dZerYdd	lmZmZmZmZmZmZ eeeeeef eeeeeef f ZG d
d deZdededdfddZdddeddddfddZd&ddZG dd dZd'dededefdd Z	!d(ded"ed#eddfd$d%ZdS ))aC  W&B callback for lightgbm.

Really simple callback to get logging for each tree

Example usage:

param_list = [("eta", 0.08), ("max_depth", 6), ("subsample", 0.8), ("colsample_bytree", 0.8), ("alpha", 8), ("num_class", 10)]
config.update(dict(param_list))
lgb = lgb.train(param_list, d_train, callbacks=[wandb_callback()])
    )Path)TYPE_CHECKINGCallableN)Booster)	telemetry)	l1l2rmsemapehuberfairpoissongammabinary_logloss)mapaucaverage_precision)AnyDictList
NamedTupleTupleUnionc                   @   sB   e Zd ZU eed< eed< eed< eed< eed< ee ed< dS )CallbackEnvmodelparams	iterationbegin_interationend_iterationevaluation_result_listN)	__name__
__module____qualname__r   __annotations__r   intr   _EvalResultTuple r&   r&   a/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/wandb/integration/lightgbm/__init__.pyr   ,   s   
 r   datametric_namereturnc                 C   s   dt |v rtj|  d| dd dS t |tv r*tj|  d| dd dS t |tv r?tj|  d| dd dS dS )zsCapture model performance at the best step.

    instead of the last step, of training in your `wandb.summary`
    loss_min)summarymaxN)strlowerwandbdefine_metricMINIMIZE_METRICSMAXIMIZE_METRICS)r(   r)   r&   r&   r'   _define_metric5   s   r6   r   r   r   aliasesz	List[str]c                 C   sb   dt jj }tt jjd| d }| j||d t j|dd}|t| t j	||d dS )	z(Upload model checkpoint as W&B artifact.model_model_ckpt_z.txt)num_iterationr   )nametyper7   N)
r2   runidr   dir
save_modelArtifactadd_filer0   log_artifact)r   r   r7   
model_name
model_pathmodel_artifactr&   r&   r'   _checkpoint_artifactB   s   rH   c                 C   s\   |   }|  }dd t||D }tj|ddgd}tjdtjj|ddddidd	 d
S )zLog feature importance.c                 S   s   g | ]\}}||gqS r&   r&   ).0featfeat_impr&   r&   r'   
<listcomp>U   s    z+_log_feature_importance.<locals>.<listcomp>Feature
Importance)r(   columnszFeature Importance)titleFcommitN)feature_importancefeature_namezipr2   Tablelogplotbar)r   	feat_impsfeatsfi_datatabler&   r&   r'   _log_feature_importanceQ   s   
r^   c                   @   s<   e Zd ZdZddededdfddZdddZdddZdS )_WandbCallbackzInternal class to handle `wandb_callback` logic.

    This callback is adapted form the LightGBM's `_RecordEvaluationCallback`.
    T
log_paramsr3   r*   Nc                 C   s   d| _ d| _|| _|| _d S )N   F)orderbefore_iterationr`   define_metric_bool)selfr`   r3   r&   r&   r'   __init__g   s   
z_WandbCallback.__init__envr   c                 C   s   t  }d|j_W d    n1 sw   Y  | jr"tj|j |j	D ]1}| j
rVt|dkr>|d d \}}t|| q%|d  \}}t|| d t|| d q%d S )NT         -mean-stdv)wb_telemetrycontextfeaturelightgbm_wandb_callbackr`   r2   configupdater   r   rd   lenr6   split)re   rg   telitem	data_name	eval_namer&   r&   r'   _initm   s   


z_WandbCallback._initc                 C   s   |j |jkr| | |jD ]F}t|dkr-|d d \}}}tj|d | |idd q|d  \}}|d }|d }tj|d | d ||d | d	 |idd qtjd
|j idd d S )Nrh      r,   FrQ   rj   ri   rk   rl   r   T)r   begin_iterationry   r   rs   r2   rW   rt   )re   rg   rv   rw   rx   resultres_meanres_stdvr&   r&   r'   __call__   s&   

	z_WandbCallback.__call__TT)rg   r   r*   N)r    r!   r"   __doc__boolrf   ry   r   r&   r&   r&   r'   r_   a   s
    
r_   Tr`   r3   c                 C   s
   t | |S )a  Automatically integrates LightGBM with wandb.

    Args:
        log_params: (boolean) if True (default) logs params passed to lightgbm.train as W&B config
        define_metric: (boolean) if True (default) capture model performance at the best step, instead of the last step, of training in your `wandb.summary`

    Passing `wandb_callback` to LightGBM will:
      - log params passed to lightgbm.train as W&B config (default).
      - log evaluation metrics collected by LightGBM, such as rmse, accuracy etc to Weights & Biases
      - Capture the best metric in `wandb.summary` when `define_metric=True` (default).

    Use `log_summary` as an extension of this callback.

    Example:
        ```python
        params = {
            "boosting_type": "gbdt",
            "objective": "regression",
        }
        gbm = lgb.train(
            params,
            lgb_train,
            num_boost_round=10,
            valid_sets=lgb_eval,
            valid_names=("validation"),
            callbacks=[wandb_callback()],
        )
        ```
    )r_   )r`   r3   r&   r&   r'   wandb_callback   s   
r   FrS   save_model_checkpointc                 C   s   t jdu r
t dt| tst d| jt jjd< | jt jjd< |r(t|  |r3t	| | jdgd t
 }d|j_W d   dS 1 sGw   Y  dS )	a  Log useful metrics about lightgbm model after training is done.

    Args:
        model: (Booster) is an instance of lightgbm.basic.Booster.
        feature_importance: (boolean) if True (default), logs the feature importance plot.
        save_model_checkpoint: (boolean) if True saves the best model and upload as W&B artifacts.

    Using this along with `wandb_callback` will:

    - log `best_iteration` and `best_score` as `wandb.summary`.
    - log feature importance plot.
    - save and upload your best trained model to Weights & Biases Artifacts (when `save_model_checkpoint = True`)

    Example:
        ```python
        params = {
            "boosting_type": "gbdt",
            "objective": "regression",
        }
        gbm = lgb.train(
            params,
            lgb_train,
            num_boost_round=10,
            valid_sets=lgb_eval,
            valid_names=("validation"),
            callbacks=[wandb_callback()],
        )

        log_summary(gbm)
        ```
    Nz1You must call wandb.init() before WandbCallback()z5Model should be an instance of lightgbm.basic.Boosterbest_iteration
best_scorebestr=   T)r2   r>   Error
isinstancer   r   r.   r   r^   rH   rm   rn   ro   lightgbm_log_summary)r   rS   r   ru   r&   r&   r'   log_summary   s   
"




"r   )r   r   r*   Nr   )TF) r   pathlibr   typingr   r   lightgbmr   r2   wandb.sdk.libr   rm   r4   r5   r   r   r   r   r   r   r0   floatr   r%   r   r6   r$   rH   r^   r_   r   r   r&   r&   r&   r'   <module>   sL      	

:"