a
    “ù»jC ã                   @   sü  d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZmZmZmZmZmZ ddlmZ ddlZddlmZ d	d
lmZmZmZm Z m!Z! d	dl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 d	dl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= g d¢Z>ee*e-e.f Z?ee*e-f Z@ee*e.f ZAeejBe1e2ejCf ZDeeejE eejF eejG eejH f ZIG dd„ dƒZJeeJeKf dœdd„ZLG dd„ deƒZMee& e&dœdd„ZNe&eeO eeeOe'f eeOeKf f dœdd„ZPeeD eDdœdd„ZQeeee  dœdd „ZRe6eeO e6d!œd"d#„ZSeeOef ee6 eeeOeDf  eOeKeKeTeKeJeee6 d$œd%d&„ZUe?eTeeD d'œd(d)„ZVeOeeO eeOeKf d*œd+d,„ZWd@e&e@e?eeOef ee6 eeA ee? eeA eeee@e?f   eeeO  eeeA  eeeeXeOf   eee?  eeeA  ee: eeeeK eeKd-f f  ee6d.œd/d0„ZYeDe6eTeTeTeTeeDd1œd2d3„ZZd4d4d4d4ejEfe6e@e&eTeTeTeTeIeee*ee* f d5œ
d6d7„Z[G d8d9„ d9ƒZ\G d:d;„ d;e5e\ƒZ]G d<d=„ d=e8e\ƒZ^G d>d?„ d?e7e\ƒZ_dS )AzîDistributed training with LightGBM and dask.distributed.

This module enables you to perform distributed training with LightGBM on
dask.Array and dask.DataFrame collections.

It is based on dask-lightgbm, which was based on dask-xgboost.
é    N)Údefaultdict)Údeepcopy)ÚEnumÚauto)Úpartial)ÚAnyÚDictÚIterableÚListÚOptionalÚTupleÚTypeÚUnion)Úurlparseé   )ÚLightGBMErrorÚ_choose_param_valueÚ_ConfigAliasesÚ	_log_infoÚ_log_warning)ÚDASK_INSTALLEDÚPANDAS_INSTALLEDÚSKLEARN_INSTALLEDÚClientÚFutureÚLGBMNotFittedErrorÚconcatÚ
dask_ArrayÚdask_array_from_delayedÚdask_bag_from_delayedÚdask_DataFrameÚdask_SeriesÚdefault_clientÚdelayedÚpd_DataFrameÚ	pd_SeriesÚwait)	ÚLGBMClassifierÚ	LGBMModelÚ
LGBMRankerÚLGBMRegressorÚ#_LGBM_ScikitCustomObjectiveFunctionÚ_LGBM_ScikitEvalMetricTypeÚ_lgbmmodel_doc_custom_eval_noteÚ_lgbmmodel_doc_fitÚ_lgbmmodel_doc_predict)ÚDaskLGBMClassifierÚDaskLGBMRankerÚDaskLGBMRegressorc                   @   s(   e Zd Zedœdd„Zddœdd„ZdS )Ú_RemoteSocket©Úreturnc                 C   s@   t   t jt j¡| _ | j  t jt jd¡ | j  d¡ | j  ¡ d S )Nr   )Ú r   )ÚsocketÚAF_INETÚSOCK_STREAMÚ
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRÚbindÚgetsockname©Úself© rA   ú3E:\soccer\ml_env\Lib\site-packages\lightgbm/dask.pyÚacquireD   s    z_RemoteSocket.acquireNc                 C   s   | j  ¡  d S ©N)r7   Úcloser?   rA   rA   rB   ÚreleaseJ   s    z_RemoteSocket.release)Ú__name__Ú
__module__Ú__qualname__ÚintrC   rF   rA   rA   rA   rB   r3   C   s   r3   r4   c                  C   s   t ƒ } |  ¡ }| |fS rD   )r3   rC   )ÚsÚportrA   rA   rB   Ú_acquire_portN   s    rM   c                   @   s(   e Zd ZdZeƒ Zeƒ Zeƒ Zeƒ ZdS )Ú_DatasetNameszÆPlaceholder names used by lightgbm.dask internals to say 'also evaluate the training data'.

    Avoid duplicating the training data when the validation set refers to elements of training data.
    N)	rG   rH   rI   Ú__doc__r   ÚTRAINSETÚSAMPLE_WEIGHTÚ
INIT_SCOREÚGROUPrA   rA   rA   rB   rN   T   s
   rN   )Úclientr5   c                 C   s   | du rt ƒ S | S dS )z×Choose a Dask client to use.

    Parameters
    ----------
    client : dask.distributed.Client or None
        Dask client.

    Returns
    -------
    client : dask.distributed.Client
        A Dask client.
    N)r"   ©rT   rA   rA   rB   Ú_get_dask_client`   s    rV   )rT   Úworkersr5   c                 C   s~   i }|D ]}| j t|gddd�||< qi }i }| ¡ D ]4\}}|   t d¡|¡||< |   t d¡|¡||< q6|  |¡}||fS )a  Assign an open port to each worker.

    Returns
    -------
    worker_to_socket_future: dict
        mapping from worker address to a future pointing to the remote socket.
    worker_to_port: dict
        mapping from worker address to an open port in the worker's host.
    F)rW   Úallow_other_workersÚpurer   r   )ÚsubmitrM   ÚitemsÚoperatorÚ
itemgetterÚgather)rT   rW   Zworker_to_futureÚworkerÚworker_to_socket_futureZworker_to_port_futureZsocket_futureZworker_to_portrA   rA   rB   Ú_assign_open_ports_to_workerss   s    ü
ra   )Úseqr5   c                 C   sx   t | d tjƒrtj| dd�S t | d ttfƒr<t| dd�S t | d tjƒrZtj	| dd�S t
dt| d ƒj› d�ƒ‚d S )Nr   )ZaxisÚcsr©ÚformatzXData must be one of: numpy arrays, pandas dataframes, sparse matrices (from scipy). Got Ú.)Ú
isinstanceÚnpÚndarrayZconcatenater$   r%   r   ÚssÚspmatrixÚvstackÚ	TypeErrorÚtyperG   )rb   rA   rA   rB   Ú_concat—   s    ÿro   )Úargsr5   c                  G   s   dd„ | D ƒS )Nc                 S   s   g | ]}d d„ |D ƒ‘qS )c                 S   s   g | ]}|d ur|‘qS rD   rA   )Ú.0ÚzrA   rA   rB   Ú
<listcomp>¥   ó    z3_remove_list_padding.<locals>.<listcomp>.<listcomp>rA   )rq   ÚargrA   rA   rB   rs   ¥   rt   z(_remove_list_padding.<locals>.<listcomp>rA   )rp   rA   rA   rB   Ú_remove_list_padding¤   s    rv   )Ú
lgbm_modelÚrequired_namesr5   c                 C   s6   |D ],}|| j vri | j |< || jvri | j|< q| S )a  Append missing (key, value) pairs to a LightGBM model's evals_result_ and best_score_ OrderedDict attrs based on a set of required eval_set names.

    Allows users to rely on expected eval_set names being present when fitting DaskLGBM estimators with ``eval_set``.
    )Zevals_result_Zbest_score_)rw   rx   Z	eval_namerA   rA   rB   Ú_pad_eval_names¨   s    


ry   )ÚparamsÚmodel_factoryÚlist_of_partsÚmachinesÚlocal_listen_portÚnum_machinesÚreturn_modelÚtime_outÚremote_socketÚkwargsr5   c	           (         sT  ||||dœ}
|   |
¡ t|tƒ}tdd„ |D ƒƒ}tdd„ |D ƒƒ}d|d v rftdd„ |D ƒƒ}nd }d|d v rŠtd	d„ |D ƒƒ}nd }d
|d v r®tdd„ |D ƒƒ}nd }tdd„ |D ƒƒ}|	 dd ¡‰|	 d¡‰ d }d }d }d }d }|�rŒtdd„ |D ƒƒ}tdd„ |D ƒƒ}g }g }|�r*g }|�r4g }|�r>g }g ‰t|ƒD �]ô}g }g }g }g }g }|D �]P} |  d¡�s~�qhˆ�rŽˆ| }!n
d|› �}!| d | }"|"t	j
u �rÎ| | d ¡ | | d ¡ n| |"d ¡ | |"d ¡ |!|v�rþ| |!¡ |  d¡}#|#�r<|#| t	ju �r.| | d ¡ n| |#| ¡ |  d¡}$|$�rz|$| t	ju �rl| | d
 ¡ n| |$| ¡ |  d¡}%|%�rh|%| t	ju �rª| | d ¡ n| |%| ¡ �qht|||||ƒ\}}}}}|�rô| t|ƒt|ƒf¡ nˆ |¡ �qJ|�r| t|ƒ¡ |�r*| t|ƒ¡ |�rJ| t|ƒ¡ �qJ‡fdd„t|ƒD ƒ}&ˆ�rp‡fdd„|&D ƒ}ˆ �rŒ‡ fdd„|&D ƒ|	d< |f i | ¤Ž}'|d u�r¬| ¡  zl|�rÜ|'j||f||||||||dœ|	¤Ž n"|'j||f||||||dœ|	¤Ž W t|'dd ƒ�r4|'j ¡  nt|'dd ƒ�r2|'j ¡  0 |�rFt|'|d!�}'|�rP|'S d S )"N)r}   r~   r�   r   c                 S   s   g | ]}|d  ‘qS )ÚdatarA   ©rq   ÚxrA   rA   rB   rs   Í   rt   z_train_part.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS )ÚlabelrA   r…   rA   rA   rB   rs   Î   rt   Úweightr   c                 S   s   g | ]}|d  ‘qS )rˆ   rA   r…   rA   rA   rB   rs   Ñ   rt   Úgroupc                 S   s   g | ]}|d  ‘qS )r‰   rA   r…   rA   rA   rB   rs   Ö   rt   Ú
init_scorec                 S   s   g | ]}|d  ‘qS )rŠ   rA   r…   rA   rA   rB   rs   Û   rt   c                 s   s   | ]}t | d g ¡ƒV  qdS )Úeval_setN)ÚlenÚgetr…   rA   rA   rB   Ú	<genexpr>à   rt   z_train_part.<locals>.<genexpr>Ú
eval_namesÚeval_class_weightc                 s   s   | ]}|  d ¡duV  qdS )Úeval_sample_weightN©r�   r…   rA   rA   rB   rŽ   ê   rt   c                 s   s   | ]}|  d ¡duV  qdS )Úeval_init_scoreNr’   r…   rA   rA   rB   rŽ   ë   rt   r‹   Zvalid_r„   r‡   r   r‘   r“   Ú
eval_groupc                    s   g | ]}|ˆ vr|‘qS rA   rA   ©rq   Úi)Úmissing_eval_component_idxrA   rB   rs   ;  rt   c                    s   g | ]}ˆ | ‘qS rA   rA   r•   )r�   rA   rB   rs   =  rt   c                    s   g | ]}ˆ | ‘qS rA   rA   r•   )r�   rA   rB   rs   ?  rt   )Úsample_weightrŠ   r‰   r‹   r‘   r“   r”   r�   )r˜   rŠ   r‹   r‘   r“   r�   Úfitted_F)rx   )ÚupdateÚ
issubclassr)   ro   ÚmaxÚpopr�   ÚanyÚrangerN   rP   ÚappendÚextendrQ   rR   rS   rv   rF   ÚfitÚgetattrZbooster_Zfree_networkry   )(rz   r{   r|   r}   r~   r   r€   r�   r‚   rƒ   Znetwork_paramsZ	is_rankerr„   r‡   rˆ   r‰   rŠ   Zn_evalsZlocal_eval_setZlocal_eval_namesZlocal_eval_sample_weightZlocal_eval_init_scoreZlocal_eval_groupZhas_eval_sample_weightZhas_eval_init_scoreZevals_result_namesr–   Úx_eÚy_eÚw_eÚinit_score_eÚg_eÚpartZevals_result_namer‹   Zeval_weightr“   r”   Zeval_component_idxÚmodelrA   )r�   r�   r—   rB   Ú_train_part¶   s   ü












þöõþø	÷ÿr«   )r„   Ú	is_matrixr5   c                 C   sX   |   ¡ }t|tjƒrT|r,|jd dksHJ ‚n|jdksH|jd dksHJ ‚| ¡  ¡ }|S )Nr   )Ú
to_delayedrg   rh   ri   ÚshapeÚndimÚflattenÚtolist)r„   r¬   ÚpartsrA   rA   rB   Ú_split_to_partsk  s    r³   )r}   Úworker_addressesr5   c           	      C   s    |   d¡}tt|ƒƒt|ƒkr.td| › d�ƒ‚ttƒ}|D ]$}|  d¡\}}||  t|ƒ¡ q:i }|D ]2}t|ƒj}|sŠtd|› d�ƒ‚||  	¡ ||< qh|S )aÇ  Create a worker_map from machines list.

    Given ``machines`` and a list of Dask worker addresses, return a mapping where the keys are
    ``worker_addresses`` and the values are ports from ``machines``.

    Parameters
    ----------
    machines : str
        A comma-delimited list of workers, of the form ``ip1:port,ip2:port``.
    worker_addresses : list of str
        An iterable of Dask worker addresses, of the form ``{protocol}{hostname}:{port}``, where ``port`` is the port Dask's scheduler uses to talk to that worker.

    Returns
    -------
    result : Dict[str, int]
        Dictionary where keys are work addresses in the form expected by Dask and values are a port for LightGBM to use.
    ú,z Found duplicates in 'machines' (zA). Each entry in 'machines' must be a unique IP-port combination.ú:z/Could not parse host name from worker address 'ú')
ÚsplitrŒ   ÚsetÚ
ValueErrorr   ÚaddrJ   r   Úhostnamer�   )	r}   r´   Zmachine_addressesZmachine_to_portÚaddressÚhostrL   ÚoutZworker_hostrA   rA   rB   Ú_machines_to_worker_mapv  s     

ÿ
rÀ   .)rT   r„   r‡   rz   r{   r˜   rŠ   r‰   r‹   r�   r‘   r�   r“   r”   Úeval_metricÚeval_atrƒ   r5   c           A   
      sè  t ˆƒ‰t‡fdd„t d¡D ƒƒ}t‡fdd„t d¡D ƒƒ}tdˆdd�‰h d	£}ˆd |vr~td
ˆd › d�ƒ dˆd< t dd¡D ]&}|ˆv rŠtd|› d�ƒ ˆ |¡ qŠt|dd�}t|dd�}dd„ t||ƒD ƒ}t	|ƒ}|du�rt|dd�}t
|ƒD ]}|| || d< �q|du�rRt|dd�}t
|ƒD ]}|| || d< �q:|du�rˆt|dd�}t
|ƒD ]}|| || d< �qp|�rtdd„ |D ƒƒ}ttƒ}|
�r¶ttƒ}|�rÄttƒ} |�rÒttƒ}!t|ƒD �]Ø\}\}"}#|"j}$|"|u �r$|#|u �r$t
|ƒD ]}%||%  tj¡ �q
n¢t|"dd�}&t|#dd�}'t
|ƒD ]€}(|(| }%|(|$k �rl|&|( })|'|( }*nd})d}*|(|k �r–||%  |)g|*gf¡ n,||% d d  |)¡ ||% d d  |*¡ �qD|
�rj|
| |u �rüt
|ƒD ]}%||%  tj¡ �qânnt|
| dd�}+t
|ƒD ]T}(|(|$k �r,|+|( },nd},|(| }%|(|k �rT||%  |,g¡ n||% d  |,¡ �q|�r|| |u �r t
|ƒD ]}%|!|%  tj¡ �q†nnt|| dd�}-t
|ƒD ]T}(|(|$k �rÐ|-|( }.nd}.|(| }%|(|k �rø|!|%  |.g¡ n|!|% d  |.¡ �q¸|�rÚ|| |u �rDt
|ƒD ]}%| |%  tj¡ �q*nnt|| dd�}/t
|ƒD ]T}(|(|$k �rt|/|( }0nd}0|(| }%|(|k �rœ| |%  |0g¡ n| |% d  |0¡ �q\�qÚ| ¡ D ]X\}%}1|1||% d< |
�rè||% ||% d< |�rþ|!|% ||% d< |�r¾| |% ||% d < �q¾ttt|ƒƒ}ˆ  |¡}t|ƒ |D ]}2|2jd!k�r<|2  S �q<d"d#„ |D ƒ}3ˆ  |¡}4ttƒ}5|4 ¡ D ]$\}6}7|5tt|7ƒƒ  |3|6 ¡ �q€|�rú|5D ]H}8d}9|5|8 D ]}2d|2 ¡ v �rÀd}9 �qà�qÀ|9�s°td$|8› d%�ƒ �q°|	�r|	ˆd&< |�r|ˆd'< |�r$|ˆd(< |�r2|ˆd)< tt|5ƒƒ‰ˆ   ¡ ‰	tdˆd*d�‰ˆ d¡‰tdˆdd�‰ˆ d¡‰i ‰
|5 !¡ }:ˆdu�r¢t"d+ƒ t#ˆ|:d,�‰n„|�rðt"d-ƒ d.d/„ |:D ƒ};t	|;ƒt	|:ƒk �rÜd0}<t$|<ƒ‚‡fd1d#„|:D ƒ‰nt"d2ƒ t%ˆ t|5 !¡ ƒƒ\‰
‰d3 &d4d„ ˆ ¡ D ƒ¡‰t	ˆƒ‰‡ ‡‡‡‡‡‡‡‡	‡
f
d5d„|5 ¡ D ƒ}=ˆ  '|=¡}>d6d„ |>D ƒ}>|>d }?|�sœt d¡D ]}@|?j( |@d¡ �q†|�sÂt d¡D ]}@|?j( |@d¡ �q¬t dd7¡D ]}@|?j( |@d¡ �qÎ|?S )8a  Inner train routine.

    Parameters
    ----------
    client : dask.distributed.Client
        Dask client.
    data : Dask Array or Dask DataFrame of shape = [n_samples, n_features]
        Input feature matrix.
    label : Dask Array, Dask DataFrame or Dask Series of shape = [n_samples]
        The target values (class labels in classification, real numbers in regression).
    params : dict
        Parameters passed to constructor of the local underlying model.
    model_factory : lightgbm.LGBMClassifier, lightgbm.LGBMRegressor, or lightgbm.LGBMRanker class
        Class of the local underlying model.
    sample_weight : Dask Array or Dask Series of shape = [n_samples] or None, optional (default=None)
        Weights of training data. Weights should be non-negative.
    init_score : Dask Array or Dask Series of shape = [n_samples] or shape = [n_samples * n_classes] (for multi-class task), or Dask Array or Dask DataFrame of shape = [n_samples, n_classes] (for multi-class task), or None, optional (default=None)
        Init score of training data.
    group : Dask Array or Dask Series or None, optional (default=None)
        Group/query data.
        Only used in the learning-to-rank task.
        sum(group) = n_samples.
        For example, if you have a 100-document dataset with ``group = [10, 20, 40, 10, 10, 10]``, that means that you have 6 groups,
        where the first 10 records are in the first group, records 11-30 are in the second group, records 31-70 are in the third group, etc.
    eval_set : list of (X, y) tuples of Dask data collections, or None, optional (default=None)
        List of (X, y) tuple pairs to use as validation sets.
        Note, that not all workers may receive chunks of every eval set within ``eval_set``. When the returned
        lightgbm estimator is not trained using any chunks of a particular eval set, its corresponding component
        of ``evals_result_`` and ``best_score_`` will be empty dictionaries.
    eval_names : list of str, or None, optional (default=None)
        Names of eval_set.
    eval_sample_weight : list of Dask Array or Dask Series, or None, optional (default=None)
        Weights for each validation set in eval_set. Weights should be non-negative.
    eval_class_weight : list of dict or str, or None, optional (default=None)
        Class weights, one dict or str for each validation set in eval_set.
    eval_init_score : list of Dask Array, Dask Series or Dask DataFrame (for multi-class task), or None, optional (default=None)
        Initial model score for each validation set in eval_set.
    eval_group : list of Dask Array or Dask Series, or None, optional (default=None)
        Group/query for each validation set in eval_set.
    eval_metric : str, callable, list or None, optional (default=None)
        If str, it should be a built-in evaluation metric to use.
        If callable, it should be a custom evaluation metric, see note below for more details.
        If list, it can be a list of built-in metrics, a list of custom evaluation metrics, or a mix of both.
        In either case, the ``metric`` from the Dask model parameters (or inferred from the objective) will be evaluated and used as well.
        Default: 'l2' for DaskLGBMRegressor, 'binary(multi)_logloss' for DaskLGBMClassifier, 'ndcg' for DaskLGBMRanker.
    eval_at : list or tuple of int, optional (default=None)
        The evaluation positions of the specified ranking metric.
    **kwargs
        Other parameters passed to ``fit`` method of the local underlying model.

    Returns
    -------
    model : lightgbm.LGBMClassifier, lightgbm.LGBMRegressor, or lightgbm.LGBMRanker class
        Returns fitted underlying model.

    Note
    ----

    This method handles setting up the following network parameters based on information
    about the Dask cluster referenced by ``client``.

    * ``local_listen_port``: port that each LightGBM worker opens a listening socket on,
            to accept connections from other workers. This can differ from LightGBM worker
            to LightGBM worker, but does not have to.
    * ``machines``: a comma-delimited list of all workers in the cluster, in the
            form ``ip:port,ip:port``. If running multiple Dask workers on the same host, use different
            ports for each worker. For example, for ``LocalCluster(n_workers=3)``, you might
            pass ``"127.0.0.1:12400,127.0.0.1:12401,127.0.0.1:12402"``.
    * ``num_machines``: number of LightGBM workers.
    * ``timeout``: time in minutes to wait before closing unused sockets.

    The default behavior of this function is to generate ``machines`` from the list of
    Dask workers which hold some piece of the training data, and to search for an open
    port on each worker to be used as ``local_listen_port``.

    If ``machines`` is provided explicitly in ``params``, this function uses the hosts
    and ports in that list directly, and does not do any searching. This means that if
    any of the Dask workers are missing from the list or any of those ports are not free
    when training starts, training will fail.

    If ``local_listen_port`` is provided in ``params`` and ``machines`` is not, this function
    constructs ``machines`` from the list of Dask workers which hold some piece of the
    training data, assuming that each one will use the same ``local_listen_port``.
    c                 3   s   | ]}|ˆ v V  qd S rD   rA   ©rq   Úalias©rz   rA   rB   rŽ     rt   z_train.<locals>.<genexpr>r~   c                 3   s   | ]}|ˆ v V  qd S rD   rA   rÃ   rÅ   rA   rB   rŽ     rt   r}   Ztree_learnerr„   )Zmain_param_namerz   Údefault_value>   r„   Zdata_parallelZvoting_parallelZvotingÚfeatureZfeature_parallelzParameter tree_learner set to z/, which is not allowed. Using "data" as defaultr   Únum_threadsz
Parameter z will be ignored.T)r„   r¬   Fc                 S   s   g | ]\}}||d œ‘qS ))r„   r‡   rA   )rq   r†   ÚyrA   rA   rB   rs   +  rt   z_train.<locals>.<listcomp>Nrˆ   r‰   rŠ   c                 s   s   | ]}|d  j V  qdS )r   N)Únpartitionsr…   rA   rA   rB   rŽ   B  rt   éÿÿÿÿr   r   r‹   r‘   r“   r”   Úerrorc                 S   s   i | ]}|j |“qS rA   )Úkey)rq   r©   rA   rA   rB   Ú
<dictcomp>º  rt   z_train.<locals>.<dictcomp>zWorker z† was not allocated eval_set data. Therefore evals_result_ and best_score_ data may be unreliable. Try rebalancing data across workers.r�   r�   rÁ   rÂ   ip0  z$Using passed-in 'machines' parameter)r}   r´   z3Using passed-in 'local_listen_port' for all workersc                 S   s   h | ]}t |ƒj’qS rA   ©r   r¼   )rq   ÚarA   rA   rB   Ú	<setcomp>ù  rt   z_train.<locals>.<setcomp>zË'local_listen_port' was provided in Dask training parameters, but at least one machine in the cluster has multiple Dask worker processes running on it. Please omit 'local_listen_port' or pass 'machines'.c                    s   i | ]
}|ˆ “qS rA   rA   )rq   r½   )r~   rA   rB   rÎ     rt   z%Finding random open ports for workersrµ   c                 S   s$   g | ]\}}t |ƒj› d |› �‘qS )r¶   rÏ   )rq   Zworker_addressrL   rA   rA   rB   rs   
  rt   c                    sf   g | ]^\}}ˆ j tfˆi ˆ¥d ˆ| i¥|ˆˆ| ˆˆ dd¡ˆ	 |d¡|ˆk|gdddœˆ¤Ž‘qS )rÈ   r�   éx   NF)r{   rz   r|   r}   r~   r   r�   r‚   r€   rW   rX   rY   )rZ   r«   r�   )rq   r_   r|   )
rT   rƒ   r}   Úmaster_workerr{   r   rz   Úworker_address_to_portÚworker_ncoresr`   rA   rB   rs     s&   ðÿ

óòc                 S   s   g | ]}|r|‘qS rA   rA   )rq   ÚvrA   rA   rB   rs   ,  rt   Útimeout))r   rž   r   r�   r   r   r�   r³   ÚziprŒ   rŸ   rœ   r   ÚlistÚ	enumeraterÊ   r    rN   rP   rQ   rR   rS   r[   Úmapr#   Úcomputer&   ÚstatusÚwho_hasÚnextÚiterÚresultZncoresÚkeysr   rÀ   r   ra   Újoinr^   Ú_other_params)ArT   r„   r‡   rz   r{   r˜   rŠ   r‰   r‹   r�   r‘   r�   r“   r”   rÁ   rÂ   rƒ   Zlisten_port_in_paramsZmachines_in_paramsZallowed_tree_learnersZparam_aliasZ
data_partsZlabel_partsr²   Zn_partsZweight_partsr–   Zgroup_partsZinit_score_partsZn_largest_eval_partsZ	eval_setsZeval_sample_weightsZeval_groupsZeval_init_scoresZX_evalZy_evalZn_this_eval_partsZ	parts_idxZeval_x_partsZeval_y_partsÚjr¤   r¥   Zeval_w_partsr¦   Zeval_init_score_partsr§   Zeval_g_partsr¨   Ze_setr©   Zkey_to_part_dictrÞ   Z
worker_maprÍ   rW   r_   Zhas_eval_setr´   Zunique_hostsÚmsgZfutures_classifiersÚresultsrª   ÚparamrA   )rT   rƒ   r~   r}   rÓ   r{   r   rz   rÔ   rÕ   r`   rB   Ú_trainž  s„   gýÿ


þÿ















ÿý
ý

þÿÿÿ
ï
ré   )r©   rª   Ú	raw_scoreÚ
pred_probaÚ	pred_leafÚpred_contribrƒ   r5   c                 K   s�   | j d dkrt g ¡}n:|r:|j| f|||dœ|¤Ž}n|j| f|||dœ|¤Ž}t| tƒrŒt|j ƒdkr|t|| jd�}nt	|| jdd�}|S )Nr   )rê   rì   rí   é   )ÚindexZpredictions)rï   Úname)
r®   rh   ÚarrayÚpredict_probaÚpredictrg   r$   rŒ   rï   r%   )r©   rª   rê   rë   rì   rí   rƒ   rá   rA   rA   rB   Ú_predict_partA  s4    
ÿüûÿüû	
rô   F)
rª   r„   rT   rê   rë   rì   rí   Údtyperƒ   r5   c                 K   sv  t tttfƒstdƒ‚t|tƒr@|jtf| ||||dœ|¤Žj	S t|t
ƒ�r\| j}	|	dk�rÐ|�rÐt|jtjƒ�rÐttf| d|dddœ|¤Ž}
| ¡ }t|dd…df ƒ}ttt ttdœd	d
„ƒ}| |
¡}| jd }|jd }dd„ t|	ƒD ƒ}|j}t| ¡ ƒD ]D\}}t|	ƒD ]0}t|||ƒ|| |f|d�}||  |¡ �q�qt|tjƒ�rjttjdd�}n$t|tjƒ�rˆttjdd�}ntj}g }t|	ƒD ]0}| tt|ƒ|| ƒ|jd |f|d�¡ �qš|S |  |dg ¡ !¡ }ttf| ||||dœ|¤Ž}||ƒ}|jd f}i }t"|jƒdk�r:||jd f7 }nd|d< |j#|f|||dœ|¤ŽS t$dt%|ƒj&› d�ƒ‚dS )a  Inner predict routine.

    Parameters
    ----------
    model : lightgbm.LGBMClassifier, lightgbm.LGBMRegressor, or lightgbm.LGBMRanker class
        Fitted underlying model.
    data : Dask Array or Dask DataFrame of shape = [n_samples, n_features]
        Input feature matrix.
    raw_score : bool, optional (default=False)
        Whether to predict raw scores.
    pred_proba : bool, optional (default=False)
        Should method return results of ``predict_proba`` (``pred_proba=True``) or ``predict`` (``pred_proba=False``).
    pred_leaf : bool, optional (default=False)
        Whether to predict leaf index.
    pred_contrib : bool, optional (default=False)
        Whether to predict feature contributions.
    dtype : np.dtype, optional (default=np.float32)
        Dtype of the output.
    **kwargs
        Other parameters passed to ``predict`` or ``predict_proba`` method.

    Returns
    -------
    predicted_result : Dask Array of shape = [n_samples] or shape = [n_samples, n_classes]
        The predicted values.
    X_leaves : Dask Array of shape = [n_samples, n_trees] or shape = [n_samples, n_trees * n_classes]
        If ``pred_leaf=True``, the predicted leaf of every tree for each sample.
    X_SHAP_values : Dask Array of shape = [n_samples, n_features + 1] or shape = [n_samples, (n_features + 1) * n_classes] or (if multi-class and using sparse inputs) a list of ``n_classes`` Dask Arrays of shape = [n_samples, n_features + 1]
        If ``pred_contrib=True``, the feature contributions for each sample.
    ú<dask, pandas and scikit-learn are required for lightgbm.dask)rª   rê   rë   rì   rí   rî   FTNr   )r[   r–   r5   c                 S   s   | | S rD   rA   )r[   r–   rA   rA   rB   Ú_extract°  s    z_predict.<locals>._extractr   c                 S   s   g | ]}g ‘qS rA   rA   )rq   Ú_rA   rA   rB   rs   »  rt   z_predict.<locals>.<listcomp>)Úvaluer®   Úmetarc   rd   ZcscZ	drop_axis)Úchunksrú   rõ   z6Data must be either Dask Array or Dask DataFrame. Got rf   )'Úallr   r   r   r   rg   r    Zmap_partitionsrô   Úvaluesr   Z
_n_classesÚ_metarj   rk   r   r­   r   r#   r
   r   rJ   Zn_features_rû   rŸ   rÚ   r   r    Z
csr_matrixrl   Z
csc_matrixr®   rÜ   rá   rŒ   Z
map_blocksrm   rn   rG   )rª   r„   rT   rê   rë   rì   rí   rõ   rƒ   Znum_classesZpredict_functionZdelayed_chunksZbagr÷   ÚpredsZnum_colsZnrows_per_chunkr¿   Z	pred_metarå   Ú	partitionr–   r©   Z	concat_fnZ
out_arraysZdata_rowZ
predict_fnZpred_rowrû   Zmap_blocks_kwargsrA   rA   rB   Ú_predicth  s°    )
ÿúù	 ÿúù




ýýÿÿúù	ÿüûr  c                   @   s  e Zd Zeedœdd„ƒZeeef dœdd„Zde	e
 eeee ee ee eeeeef   eee  eee  eeeeef   eee  eee  ee eeee eedf f  ed dœd	d
„Ze	e
 e
dœdd„Zeed e
f ed e
f ddœdd„ƒZdS )Ú_DaskLGBMModelr4   c                 C   s    t | ddƒstdƒ‚t| jd�S )zª:obj:`dask.distributed.Client`: Dask client.

        This property can be passed in the constructor or updated
        with ``model.set_params(client=client)``.
        r™   Fz4Cannot access property client_ before calling fit().rU   )r£   r   rV   rT   r?   rA   rA   rB   Úclient_ý  s    z_DaskLGBMModel.client_c                 C   s>   | j  dd¡}| j dd¡ t| j ƒ}| ddi¡ || _|S )z4Remove un-picklable attributes before serialization.rT   N)Ú__dict__r�   rä   r   rš   rT   )r@   rT   r¿   rA   rA   rB   Ú_lgb_dask_getstate	  s    
z!_DaskLGBMModel._lgb_dask_getstateN.)r{   ÚXrÉ   r˜   rŠ   r‰   r‹   r�   r‘   r�   r“   r”   rÁ   rÂ   rƒ   r5   c                 K   s’   t stdƒ‚tt ttfƒs"tdƒ‚|  d¡}| dd ¡ tf t| j	ƒ||||||||||	|
||||dœ|¤Ž}| j
f i | ¡ ¤Ž |  || ¡ | S )Nz"dask is required for lightgbm.daskrö   TrT   )rT   r„   r‡   rz   r{   r˜   rŠ   r‰   r‹   r�   r‘   r�   r“   r”   rÁ   rÂ   )r   r   rü   r   r   Ú
get_paramsr�   ré   rV   rT   Z
set_paramsÚ_lgb_dask_copy_extra_params)r@   r{   r  rÉ   r˜   rŠ   r‰   r‹   r�   r‘   r�   r“   r”   rÁ   rÂ   rƒ   rz   rª   rA   rA   rB   Ú_lgb_dask_fit  s:    
ðïz_DaskLGBMModel._lgb_dask_fit)r{   r5   c                 C   s@   |   ¡ }| dd ¡ |f i |¤Ž}|  | |¡ |j dd ¡ |S )NrT   )r  r�   r  rä   )r@   r{   rz   rª   rA   rA   rB   Ú_lgb_dask_to_localE  s    z!_DaskLGBMModel._lgb_dask_to_local)ÚsourceÚdestr5   c                 C   sB   |   ¡ }| j}t| ¡ ƒ | ¡ ¡}|D ]}t|||| ƒ q(d S rD   )r  r  r¹   râ   Ú
differenceÚsetattr)r  r  rz   Ú
attributesZextra_param_namesrð   rA   rA   rB   r  M  s
    z*_DaskLGBMModel._lgb_dask_copy_extra_params)NNNNNNNNNNN)rG   rH   rI   Úpropertyr   r  r   r   r  r   r(   Ú_DaskMatrixLikeÚ_DaskCollectionr   Ú_DaskVectorLiker
   r   Ústrr   Údictr,   rJ   r	  r
  Ústaticmethodr  rA   rA   rA   rB   r  ü  sL              ñ



ï3

ýr  c                       sl  e Zd ZdZddddddddd	d
ddddd	d	dddddœeeeeeeeeee	f  eee
ef  eeeeeeeeeeeejjdf  ee eee edœ‡ fdd„ZejjZe d¡\ZZZde› ddd›de› e› d�e_eeef dœdd„Zd>eeee ee eeeeef   eee  eee  eeee
ef   eee  ee ed dœdd„Ze j!d d!d"d#d$d%d&d%d'�Zede "d(¡… ee "d)¡d…  Zede "d*¡… ee "d+¡d…  Zede "d,¡… › d-e#› d�e_d?ee$eee e$e$e$ee%d/œ	d0d1„Z&e'j!d2d d3d4d5d6d7�e&_d@ee$eee e$e$e$ee%d/œ	d8d9„Z(e'j!d:d d;d4d5d6d7�e(_edœd<d=„Z)‡  Z*S )Ar0   z/Distributed version of lightgbm.LGBMClassifier.Úgbdté   rË   çš™™™™™¹?éd   é@ Nç        çü©ñÒMbP?é   ç      ð?r   r¸   ©Úboosting_typeÚ
num_leavesÚ	max_depthÚlearning_rateÚn_estimatorsÚsubsample_for_binÚ	objectiveÚclass_weightÚmin_split_gainÚmin_child_weightÚmin_child_samplesÚ	subsampleÚsubsample_freqÚcolsample_bytreeÚ	reg_alphaÚ
reg_lambdaÚrandom_stateÚn_jobsÚimportance_typerT   únp.random.Generator©r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  rT   rƒ   c                   sD   || _ tƒ jf |||||||||	|
|||||||||dœ|¤Ž dS )zADocstring is inherited from the lightgbm.LGBMClassifier.__init__.©r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  N©rT   ÚsuperÚ__init__©r@   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  rT   rƒ   ©Ú	__class__rA   rB   r9  \  s0    íìzDaskLGBMClassifier.__init__ú**kwargsú	
        úJclient : dask.distributed.Client or None, optional (default=None)
        ú Ú4ú±Dask client. If ``None``, ``distributed.default_client()`` will be used at runtime. The Dask client used by this class will not be saved if the model object is pickled.
        r4   c                 C   s   |   ¡ S rD   ©r  r?   rA   rA   rB   Ú__getstate__–  s    zDaskLGBMClassifier.__getstate__)r  rÉ   r˜   rŠ   r‹   r�   r‘   r�   r“   rÁ   rƒ   r5   c                 K   s,   | j f t|||||||||	|
dœ|¤Ž | S )z<Docstring is inherited from the lightgbm.LGBMClassifier.fit.)r{   r  rÉ   r˜   rŠ   r‹   r�   r‘   r�   r“   rÁ   )r	  r'   )r@   r  rÉ   r˜   rŠ   r‹   r�   r‘   r�   r“   rÁ   rƒ   rA   rA   rB   r¢   ™  s     õôzDaskLGBMClassifier.fitú?Dask Array or Dask DataFrame of shape = [n_samples, n_features]ú@Dask Array, Dask DataFrame or Dask Series of shape = [n_samples]úQDask Array or Dask Series of shape = [n_samples] or None, optional (default=None)zæDask Array or Dask Series of shape = [n_samples] or shape = [n_samples * n_classes] (for multi-class task), or Dask Array or Dask DataFrame of shape = [n_samples, n_classes] (for multi-class task), or None, optional (default=None)ú:Dask Array or Dask Series or None, optional (default=None)úClist of Dask Array or Dask Series, or None, optional (default=None)zjlist of Dask Array, Dask Series or Dask DataFrame (for multi-class task), or None, optional (default=None)©ÚX_shapeZy_shapeZsample_weight_shapeZinit_score_shapeZgroup_shapeZeval_sample_weight_shapeZeval_init_score_shapeZeval_group_shapeúgroup :ú
eval_set :úeval_group :úeval_metric :úcallbacks :z©**kwargs
        Other parameters passed through to ``LGBMClassifier.fit()``.

    Returns
    -------
    self : lightgbm.DaskLGBMClassifier
        Returns self.

    F©	r  rê   Ústart_iterationÚnum_iterationrì   rí   Úvalidate_featuresrƒ   r5   c           	      K   s2   t f |  ¡ || jjt| jƒ||||||dœ
|¤ŽS )z@Docstring is inherited from the lightgbm.LGBMClassifier.predict.)
rª   r„   rõ   rT   rê   rR  rS  rì   rí   rT  )r  Úto_localZclasses_rõ   rV   rT   ©	r@   r  rê   rR  rS  rì   rí   rT  rƒ   rA   rA   rB   ró   Ô  s    öõzDaskLGBMClassifier.predictú+Return the predicted value for each sample.Úpredicted_resultzCDask Array of shape = [n_samples] or shape = [n_samples, n_classes]zVDask Array of shape = [n_samples, n_trees] or shape = [n_samples, n_trees * n_classes]zÝDask Array of shape = [n_samples, n_features + 1] or shape = [n_samples, (n_features + 1) * n_classes] or (if multi-class and using sparse inputs) a list of ``n_classes`` Dask Arrays of shape = [n_samples, n_features + 1]©ÚdescriptionrK  Zoutput_nameZpredicted_result_shapeZX_leaves_shapeZX_SHAP_values_shapec           	      K   s.   t f |  ¡ |dt| jƒ||||||dœ
|¤ŽS )zFDocstring is inherited from the lightgbm.LGBMClassifier.predict_proba.T)
rª   r„   rë   rT   rê   rR  rS  rì   rí   rT  ©r  rU  rV   rT   rV  rA   rA   rB   rò   ÷  s    öõz DaskLGBMClassifier.predict_probaz@Return the predicted probability for each class for each sample.Zpredicted_probabilityc                 C   s
   |   t¡S )zÅCreate regular version of lightgbm.LGBMClassifier from the distributed version.

        Returns
        -------
        model : lightgbm.LGBMClassifier
            Local underlying model.
        )r
  r'   r?   rA   rA   rB   rU    s    zDaskLGBMClassifier.to_local)NNNNNNNN)Fr   NFFF)Fr   NFFF)+rG   rH   rI   rO   r  rJ   Úfloatr   r   r+   r  rh   ÚrandomÚRandomStater   r   r9  r'   Ú	_base_docr   Ú_before_kwargsÚ_kwargsÚ_after_kwargsr   rD  r  r  r  r
   r   r,   r¢   r.   re   Úfindr-   Úboolr   ró   r/   rò   rU  Ú__classcell__rA   rA   r;  rB   r0   Y  s   êé2ÿþýý
        õ


óø$$ø
      øöú      øöú	r0   c                       sB  e Zd ZdZddddddddd	d
ddddd	d	dddddœeeeeeeeeee	f  eee
ef  eeeeeeeeeeeejjdf  ee eee edœ‡ fdd„ZejjZe d¡\ZZZde› ddd›de› e› d�e_eeef dœdd„Zd:eeee ee eeeeef   eee  eee  eee  ee ed dœdd„Ze j!d d!d"d"d#d$d$d$d%�Zede "d&¡… ee "d'¡d…  Zede "d(¡… ee "d)¡d…  Zede "d*¡… ee "d+¡d…  Zede "d,¡… › d-e#› d�e_d;ee$eee e$e$e$ee%d/œ	d0d1„Z&e'j!d2d d3d4d5d6d7�e&_edœd8d9„Z(‡  Z)S )<r2   z.Distributed version of lightgbm.LGBMRegressor.r  r  rË   r  r  r  Nr  r  r  r  r   r¸   r   r4  r5  c                   sD   || _ tƒ jf |||||||||	|
|||||||||dœ|¤Ž dS )z@Docstring is inherited from the lightgbm.LGBMRegressor.__init__.r6  Nr7  r:  r;  rA   rB   r9  (  s0    íìzDaskLGBMRegressor.__init__r=  r>  r?  r@  rA  rB  r4   c                 C   s   |   ¡ S rD   rC  r?   rA   rA   rB   rD  b  s    zDaskLGBMRegressor.__getstate__)r  rÉ   r˜   rŠ   r‹   r�   r‘   r“   rÁ   rƒ   r5   c
                 K   s*   | j f t|||||||||	dœ
|
¤Ž | S )z;Docstring is inherited from the lightgbm.LGBMRegressor.fit.)
r{   r  rÉ   r˜   rŠ   r‹   r�   r‘   r“   rÁ   )r	  r*   )r@   r  rÉ   r˜   rŠ   r‹   r�   r‘   r“   rÁ   rƒ   rA   rA   rB   r¢   e  s    öõzDaskLGBMRegressor.fitrE  rF  rG  rH  rI  rJ  rL  rM  úeval_class_weight :úeval_init_score :rN  rO  rP  z§**kwargs
        Other parameters passed through to ``LGBMRegressor.fit()``.

    Returns
    -------
    self : lightgbm.DaskLGBMRegressor
        Returns self.

    FrQ  c           	      K   s,   t f |  ¡ |t| jƒ||||||dœ	|¤ŽS )z?Docstring is inherited from the lightgbm.LGBMRegressor.predict.©	rª   r„   rT   rê   rR  rS  rì   rí   rT  r[  rV  rA   rA   rB   ró      s    ÷
özDaskLGBMRegressor.predictrW  rX  ú!Dask Array of shape = [n_samples]ú*Dask Array of shape = [n_samples, n_trees]ú1Dask Array of shape = [n_samples, n_features + 1]rY  c                 C   s
   |   t¡S )zÃCreate regular version of lightgbm.LGBMRegressor from the distributed version.

        Returns
        -------
        model : lightgbm.LGBMRegressor
            Local underlying model.
        )r
  r*   r?   rA   rA   rB   rU  Â  s    zDaskLGBMRegressor.to_local)NNNNNNN)Fr   NFFF)*rG   rH   rI   rO   r  rJ   r\  r   r   r+   r  rh   r]  r^  r   r   r9  r*   r_  r   r`  ra  rb  r   rD  r  r  r  r
   r   r,   r¢   r.   re   rc  r-   rd  r   ró   r/   rU  re  rA   rA   r;  rB   r2   %  sì   êé2ÿþýý
       ö


ôø$$$ø
      øöú	r2   c                       s^  e Zd ZdZddddddddd	d
ddddd	d	dddddœeeeeeeeeee	f  eee
ef  eeeeeeeeeeeejjdf  ee eee edœ‡ fdd„ZejjZe d¡\ZZZde› ddd›de› e› d�e_eeef dœdd„Zd<eeee ee ee eeeeef   eee  eee  eee  eee  ee eee eedf f ed dœd d!„Ze j!d"d#d$d$d%d&d&d&d'�Zede "d(¡… ee "d)¡d…  Zede "d*¡… d+ dd,›d-� dd›ee "d*¡d… › � Zede "d.¡… › d/e#› d�e_d=ee$eee e$e$e$ee%d1œ	d2d3„Z&e'j!d4d"d5d6d7d8d9�e&_edœd:d;„Z(‡  Z)S )>r1   z+Distributed version of lightgbm.LGBMRanker.r  r  rË   r  r  r  Nr  r  r  r  r   r¸   r   r4  r5  c                   sD   || _ tƒ jf |||||||||	|
|||||||||dœ|¤Ž dS )z=Docstring is inherited from the lightgbm.LGBMRanker.__init__.r6  Nr7  r:  r;  rA   rB   r9  Ð  s0    íìzDaskLGBMRanker.__init__r=  r>  r?  r@  rA  rB  r4   c                 C   s   |   ¡ S rD   rC  r?   rA   rA   rB   rD  
  s    zDaskLGBMRanker.__getstate__©r   rî   é   é   é   .)r  rÉ   r˜   rŠ   r‰   r‹   r�   r‘   r“   r”   rÁ   rÂ   rƒ   r5   c                 K   s0   | j f t|||||||||	|
||dœ|¤Ž | S )z8Docstring is inherited from the lightgbm.LGBMRanker.fit.)r{   r  rÉ   r˜   rŠ   r‰   r‹   r�   r‘   r“   r”   rÁ   rÂ   )r	  r)   )r@   r  rÉ   r˜   rŠ   r‰   r‹   r�   r‘   r“   r”   rÁ   rÂ   rƒ   rA   rA   rB   r¢     s$    óòzDaskLGBMRanker.fitrE  rF  rG  rH  rI  rJ  rf  rg  zfeature_name :zCeval_at : list or tuple of int, optional (default=(1, 2, 3, 4, 5))
Ú8z2The evaluation positions of the specified metric.
rP  z¡**kwargs
        Other parameters passed through to ``LGBMRanker.fit()``.

    Returns
    -------
    self : lightgbm.DaskLGBMRanker
        Returns self.

    FrQ  c           	      K   s,   t f |  ¡ |t| jƒ||||||dœ	|¤ŽS )z<Docstring is inherited from the lightgbm.LGBMRanker.predict.rh  r[  rV  rA   rA   rB   ró   Q  s    ÷
özDaskLGBMRanker.predictrW  rX  ri  rj  rk  rY  c                 C   s
   |   t¡S )z½Create regular version of lightgbm.LGBMRanker from the distributed version.

        Returns
        -------
        model : lightgbm.LGBMRanker
            Local underlying model.
        )r
  r)   r?   rA   rA   rB   rU  s  s    zDaskLGBMRanker.to_local)
NNNNNNNNNrl  )Fr   NFFF)*rG   rH   rI   rO   r  rJ   r\  r   r   r+   r  rh   r]  r^  r   r   r9  r)   r_  r   r`  ra  rb  r   rD  r  r  r  r
   r   r,   r¢   r.   re   rc  r-   rd  r   ró   r/   rU  re  rA   rA   r;  rB   r1   Í  s  êé2ÿþýý
          ó



ñ#ø$ÿ
þýÿø
      øöú	r1   )NNNNNNNNNNN)`rO   r\   r7   Úcollectionsr   Úcopyr   Úenumr   r   Ú	functoolsr   Útypingr   r   r	   r
   r   r   r   r   Úurllib.parser   Únumpyrh   Zscipy.sparseÚsparserj   Úbasicr   r   r   r   r   Úcompatr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   Zsklearnr'   r(   r)   r*   r+   r,   r-   r.   r/   Ú__all__r  r  r  ri   rk   Z	_DaskPartZfloat32Zfloat64Zint32Zint64Z_PredictionDtyper3   rJ   rM   rN   rV   r  ra   ro   rv   ry   rd  r«   r³   rÀ   r  ré   rô   r  r  r0   r2   r1   rA   rA   rA   rB   Ú<module>   sà   (L,(ý$
õ 6.           ð




î   'ø+øö ] M )