
    :[g3                       d Z ddlZddlZddl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mZmZmZmZmZmZmZ ddlZddlm Z m!Z! dd	l"m#Z#m$Z$m%Z%m&Z& dd
l'm(Z( ddl)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZH ddlImJZJ ddlKmLZM ddlNmOZO erddlPZPddlQZQddlPmRZS ddlPmTZU ddlPmVZW nK e+d eX       d      ZW e+d eX       d      ZS e+d eX       d      ZU e+d eX       d      ZP e+d eX       d      ZQed   ZYed    ZZ ed!e/ed"      Z[g d#Z\ ej                  d$      Z^d%e_d&eeee`   eee`e_f      f      d'ee`ee_e`f   f   fd(Zad%e_d)ee`   d*eee`e_f      d'ee`ee_e`f   f   fd+Zbdd,Zc G d- d.e j                        Zdd/ee#   d'e#fd0Zed1ed2   d'd2fd3Zf G d4 d5      Zg ed6      Zhd1ed2   d7ed8ehf   d9ed:ee`   d'ehf
d;Zieee`ef      Zjd<ejd'ee`ee   f   fd=Zk G d> d?e0      Zl G d@ dAeg      Zm G dB dCem      Zn	 ddDee$   dEeeeee   f      dFee   dGeodHe_dIeej   dJe_dKepdLee1   d'e4fdMZqdDee$   dEeeeee   f      dFee   dGeodHe_dKepdIeej   d'e1fdNZrdOepdPed'e1fdQZsd%e_dReee`ef      d1d2d'ee`ee`e_f   f   fdSZtd'eee`ef      fdTZudUegdVeeeege`f         d'ee`   fdWZvd:ee`   d1d2d'dfdXZwdYexdZe_d9exd[ee_   d\ee`   d]e_d'ee1eee1e`f      f   fd^Zyd1d2d_ee`ef   dReee`ef      d`ee`ef   dUegdae_dVeeeege`f         dbee3   dcee2   ddee_   deee_epf   dfee/   dgeee(      dhee2   d'ee[   fdiZze7	 dddddddjdddkd1d2d`ee`ef   dUegdae_dVeeeege`f         dbee3   dcee2   ddee_   dfee/   deee_epf   dgeee(      dhee2   d'efdl       ZLdmepdned'epfdoZ{dpedqedree_   dmepd'ef
dsZ|dtedudvdpeZdweeY   dnee_d8f   dxee_e`f   d'eYfdyZ}due/dze_dmepd{epdPed'eee_d8f   ee_e`f   f   fd|Z~d1d2d}ee/edvf   d'dvfd~Zd1d2d_ee`ef   d}ee/edvf   dpeZdepdGeodepdepdepdepdepde&depd'eYfdZdej                  dddddjddf	d1ed2   d}ee[e/dvf   dpeegeZf   depdGeodepdepdepdepdepde&depd'efdZd1d2d_ee`ef   d}ee/edvf   dpeZde&de`dGeodepdweeY   depd'eYfdZdd/ej                  djddfd1ed2   d}ee[e/dvf   dpeZde&de`dGeodepdweeY   depd'efdZd1ed2   dee`   dJee_   dPed'eegeeeege`f         f   f
dZed}dd1d2d'efd       Z G d de?      Z eHddd}g       G d deeB             Z eHddd}g       G d dee>             Z eHddd}gd       G d deeA             Z eHdd}dgd       G d de             Z eHdd}dgd       G d de             Zy)a  
Dask extensions for distributed training
----------------------------------------

See :doc:`Distributed XGBoost with Dask </tutorials/dask>` for simple tutorial.  Also
:doc:`/python/dask-examples/index` for some examples.

There are two sets of APIs in this module, one is the functional API including
``train`` and ``predict`` methods.  Another is stateful Scikit-Learner wrapper
inherited from single-node Scikit-Learn interface.

The implementation is heavily influenced by dask_xgboost:
https://github.com/dask/dask-xgboost

Optional dask configuration
===========================

- **xgboost.scheduler_address**: Specify the scheduler address, see :ref:`tracker-ip`.

  .. versionadded:: 1.6.0

  .. code-block:: python

      dask.config.set({"xgboost.scheduler_address": "192.0.0.100"})
      # We can also specify the port.
      dask.config.set({"xgboost.scheduler_address": "192.0.0.100:12345"})

    N)defaultdict)contextmanager)partialupdate_wrapper)Thread)TYPE_CHECKINGAny	AwaitableCallableDict	GeneratorIterableListOptionalSequenceSetTuple	TypedDictTypeVarUnion)
collectiveconfig)_TFeatureNamesFeatureTypesIterationRange)TrainingCallback)	DataFrame
LazyLoaderconcatlazy_isinstance)
BoosterDataIterDMatrixMetric	ObjectiveQuantileDMatrixXGBoostError_check_distributed_params_deprecate_positional_args_expect)_is_cudf_ser_is_cupy_alike)XGBClassifierXGBClassifierBaseXGBModel	XGBRankerXGBRankerMixInXGBRegressorBase_can_use_qdm_check_rf_callback_cls_predict_proba_objective_decorator_wrap_evaluation_matricesxgboost_model_doc)RabitTracker)train   )get_n_threads)array)bag)	dataframeddzdask.dataframedaz
dask.arraydbzdask.bagdaskdistributedzdask.distributed)da.Arraydd.DataFramez	dd.Series)rF   rG   TrainReturnTboosterhistory)CommunicatorContextDaskDMatrixDaskQuantileDMatrixDaskXGBRegressorDaskXGBClassifierDaskXGBRankerDaskXGBRFRegressorDaskXGBRFClassifierr;   predictinplace_predictz[xgboost.dask]	n_workersaddrsreturnc           	      T   i }	 t        |d   t              r |d   d   }|d   d   }t        | ||d      }n'|d   }t        |t              s|J t        | |d      }|j	                          t        |j                        }d|_        |j	                          |j                  |j                                |S # t        $ rb}t        |      dk  r t        j                  d	t        |d         t        |d         t        |             t        | |dd        }Y d }~|S d }~ww xY w)
Nr   r<   task)rV   host_ipportsortby)rV   r[   r]   )targetT   zCFailed to bind address '%s', trying to use '%s' instead. Error:
 %s)
isinstancetupler:   strstartr   wait_fordaemonupdateworker_argsr(   lenLOGGERwarning_try_start_tracker)	rV   rW   envr[   r\   rabit_trackeraddrthreades	            P/var/www/html/bid-api/venv/lib/python3.12/site-packages/xgboost/dask/__init__.pyrk   rk      s+    ')C 7eAh&AhqkG8A;D(#	M 8DdC(DL88(#T&M 	}556

=,,./ J  	7u:>RaMaMF		
 !E!"I6J	7s   B6B< <	D'AD""D'addr_from_daskaddr_from_userc                 "    t        | ||g      }|S )z8Start Rabit tracker, recurse to try different addresses.)rk   )rV   rr   rs   rl   s       rq   _start_trackerru      s     Y(H
ICJ    c                      	 dd l } t        j                         dk(  rd}|dz  }t        j                  |       y y # t        $ r}t        d      |d }~ww xY w)Nr   z6Dask needs to be installed in order to use this moduleWindowsz5Windows is not officially supported for dask/xgboost,z contribution are welcomed.)rD   ImportErrorplatformsystemri   rj   )rD   rp   msgs      rq   _assert_dask_supportr}      sa     I%E,,s &  D
	s   ; 	AAAc                   ,     e Zd ZdZdeddf fdZ xZS )rL   zNA context controlling collective communicator initialization and finalization.argsrX   Nc                 >   t        |   di | t        j                         }t        j                         5 }|j                         }|d   |j                     }|d   }d d d        d dt        |j                        z   | j                  d<   y # 1 sw Y   3xY w)Nworkersidz[xgboost.dask-z]:DMLC_TASK_ID )	super__init__rE   
get_workerworker_clientscheduler_infoaddressrb   r   )selfr   workerclientinfowwid	__class__s          rq   r   zCommunicatorContext.__init__   s     4 '')&&(F((*DY/AD'C ) '5SE$<s6>>?R$R		.! )(s   (BB__name__
__module____qualname____doc__r	   r   __classcell__r   s   @rq   rL   rL      s"    XSs St S Srv   rL   valuec                     	 t        |       S # t        $ r- t        j                  j                  t	        |       d      cY S w xY w)z#Concatenate sequence of partitions.r   axis)r    	TypeErrorrA   multilist)r   s    rq   dconcatr      s;    4e} 4xxtE{334s   
 3AAr   distributed.Clientc                 &   t        | t        t        j                               t        d      f      sDt	        t        t        t        j                               t        d      gt        |                   | t        j                         }|S | }|S )z#Simple wrapper around testing None.N)r`   typerE   
get_clientr   r+   )r   rets     rq   _xgb_get_clientr      s{    ftK$:$:$<=tDzJKT+0023T$Z@$v,O
 	
 '-n+
 
 
"CJ ;ACJrv   c            #       `   e Zd ZdZe	 dddddddddddddddddedee   d	ee   d
ee   dee   de	dee
   dee   dee   dee   dee   dee   dee   de	ddf d       ZdefdZ	 	 	 	 	 	 	 ddddedee   dee   d
ee   dee   dee   dee   dee   dd fdZdedeeef   fdZdefdZy)rM   a  DMatrix holding on references to Dask DataFrame or Dask Array.  Constructing a
    `DaskDMatrix` forces all lazy computation to be carried out.  Wait for the input
    data explicitly if you want to see actual computation of constructing `DaskDMatrix`.

    See doc for :py:obj:`xgboost.DMatrix` constructor for other parameters.  DaskDMatrix
    accepts only dask collection.

    .. note::

        DaskDMatrix does not repartition or move data between workers.  It's
        the caller's responsibility to balance the data.

    .. versionadded:: 1.0.0

    Parameters
    ----------
    client :
        Specify the dask client used for training.  Use default client returned from
        dask if it's set to None.

    NF)weightbase_marginmissingsilentfeature_namesfeature_typesgroupqidlabel_lower_boundlabel_upper_boundfeature_weightsenable_categoricalr   r   datalabelr   r   r   r   r   r   r   r   r   r   r   r   rX   c                   t                t        |      }|| _        |	| _        ||nt        j
                  | _        || _        ||t        d      |
t        d      t        |j                        dk7  rt        d|j                         t        |t        j                  t        j                   f      s<t#        t%        t        j                  t        j                   ft'        |                  t        |t        j                  t        j                   t        j(                  t'        d       f      sKt#        t%        t        j                  t        j                   t        j(                  ft'        |                  |j                  d   | _        t        | j*                  t,              sJ t/        t0              | _        d| _        |j7                  | j8                  |||||||||
      | _        y )Nz$per-group weight is not implemented.z4group structure is not implemented, use qid instead.r_   z$Expecting 2 dimensional input, got: r<   F)r   weightsr   r   r   r   r   )r}   r   r   r   numpynanr   r   NotImplementedErrorrh   shape
ValueErrorr`   rA   r   rB   Arrayr   r+   r   Series_n_colsintr   r   
worker_mapis_quantilesync_map_local_data_init)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                   rq   r   zDaskDMatrix.__init__$  s   ( 	 (**")"5w599"4?v1%&LMM%F  tzz?aCDJJ<PQQ$rxx 89GR\\288$<d4jIJJ%",,"))T$Z!PQGR\\288RYY$GeUVVzz!}$,,,,,?J4?P!&[[  #+// ! 

rv   c                 6    | j                   j                         S N)r   	__await__r   s    rq   r   zDaskDMatrix.__await__a  s    zz##%%rv   r   c
           
      *   !"#K   ddl m dt        t           dt        dt        t           dt        dt        f
d!d	t
        j                  dd
fd dt        dt           f fd#dt        t           dt        t              f#fd}
 #|       |
|      } |
|      } |
|      } |
|      } |
|      } |
|	      }di"dt        t              dt        dd
f!"fd} ||d        ||d        ||d        ||d        ||d        ||d       g }t        t                    D ]5  }i }"j                         D ]  \  }}||   ||<    |j                  |       7 t        t        t        j                   |            }j#                  |      }t%        j&                  |       d
{    |D ]"  }|j(                  dk(  rJ |j(                          i | _        t-        |      D ]  \  }}|| j*                  |j.                  <     |D ci c]  }|j.                  | }}j0                  j3                  |D cg c]  }|j.                   c}       d
{   }t5        t              }|j                         D ].  \  }}|t7        t9        |               j                  ||          0 || _        |	d
| _        | S j#                  |      j?                          d
{   | _        | S 7 Ec c}w c c}w 7 7 w)z Obtain references to local data.r   )Delayedleft	left_nameright
right_namerX   c           
      H    d| d| dt        |        dt        |       d	}|S )NzPartitions between z and z are not consistent: z != z/.  Please try to repartition/rechunk your data.rh   )r   r   r   r   r|   s        rq   inconsistentz1DaskDMatrix._map_local_data.<locals>.inconsistents  sA     &i[j\ B"4ykc%j\ :?@ 
 Jrv   partsNc                 P    | j                   dk(  s| j                  d   sJ d       y y )Nr<   zData should be partitioned by row. To avoid this specify the number of columns for your dask Array explicitly. e.g. chunks=(partition_size, X.shape[1]))ndimr   )r   s    rq   check_columnsz2DaskDMatrix._map_local_data.<locals>.check_columns}  s-    ::?ekk!n 74n?rv   dc                     j                  |       } | j                         }t        |t        j                        r( |       |j                         j                         }|S |}|S )zBreaking data into partitions, a trick borrowed from dask_xgboost. `to_delayed`
            downgrades high-level objects into numpy or pandas equivalents .

            )persist
to_delayedr`   r   ndarrayflattentolist)r   delayed_objdelayed_listr   r   r   s      rq   r   z/DaskDMatrix._map_local_data.<locals>.to_delayed  s`    
 q!A,,.K+u}}5k*.9.A.A.C.J.J.L    +rv   metac                     | 
 |       }|S y r   r   )r   
meta_partsr   r   s     rq   flatten_metaz1DaskDMatrix._map_local_data.<locals>.flatten_meta  s    ,6t,<
!!rv   r   m_partsnamec                 d    | -t              t        |       k(  sJ  d| |             | |<   y y )NXr   )r   r   X_partsr   r   s     rq   append_metaz0DaskDMatrix._map_local_data.<locals>.append_meta  sF    "7|s7|3 \S'46 3 &d	 #rv   r   r   r   r   r   r   finished)keys) dask.delayedr   r   r	   rb   r   r   _DaskCollectionr   rangerh   itemsappendr   maprD   delayedcomputerE   waitstatuspartition_order	enumeratekey	schedulerwho_hasr   nextiterr   r   result)$r   r   r   r   r   r   r   r   r   r   r   y_partsw_partsmargin_parts	qid_partsll_partslu_partsr   packed_partsi	part_dictr   r   delayed_parts	fut_partspartkey_to_partitionr   r   r   r   r   r   r   r   r   s$    `                            @@@@@@rq   r   zDaskDMatrix._map_local_datad  s     	)	s)	(+	48I	KN			 	4 		 / 	 d7m 	  	x8 	Xd7m=T 	 T"u%w'#K0 %	 12 12+17*;	&$w-!8 	& 	& 	& 	GW%GX&L-0Iu%H12H12
 24s7|$A,.I#kkm
U!&q	# ,	*	 % (,Cl,K'L
 /5nn].K	y))) D;;*,9dkk9, 
  " +GAt-.D  * , 8AAytDHHdNyA4:4D4D4L4L'01yt$((y1 5M 5
 /
 ;Fd:K
#MMOLCtDM*+223CC3HI , %"#'D   *0)H)O)O)Q#QD = 	* B1/
 $RsV   F4L=L>LA	L L4LL
"L-L.BL6L7LLLworker_addrc           	          | j                   | j                  | j                  | j                  | j                  | j
                  j                  |d      | j                  dS )z\Create a dictionary of objects that can be pickled for function
        arguments.

        N)r   r   r   r   r   r   r   )r   r   r   r   r   r   getr   )r   r  s     rq   _create_fn_argszDaskDMatrix._create_fn_args  sV     "//!//#33||"&"9"9__((d;++
 	
rv   c                     | j                   S )zxGet the number of columns (features) in the DMatrix.

        Returns
        -------
        number of columns
        )r   r   s    rq   num_colzDaskDMatrix.num_col  s     ||rv   r   )NNNNNNN)r   r   r   r   r*   _DataTr   r   floatboolr   r   r   r   r   r   rb   r   r	   r  r   r  r   rv   rq   rM   rM     s    ,  
 ,0	:
 -115#'0404+/)-7;7;59#(#:
$:
 :
 (	:
 ):
 o.:
 %:
 :
  -:
  -:
 (:
 o&:
 $O4:
 $O4:
  "/2!:
" !#:
$ 
%:
  :
x&9 & ,0-115)-597;7;@$@ @ (	@
 /*@ o.@ o&@ "/2@ $O4@ $O4@ 
@D
3 
4S> 
 rv   rM   _MapRetTfunc.refsr   c                &  K   t        |       } g }|D ]z  }g }|D ]D  }t        |t              r!|j                  |j	                  |             4|j                  |       F  | j
                  fdg|d|gdd}|j                  |       | dt        t        t              dt        t           fd}	t        j                  |      }
|
j                  |	|	       d{   }| j                  |      j                          d{   }|S 7 -7 w)z.Map a function onto partitions of each worker.c                       | i |gS r   r   )r   kwargsr  s     rq   <lambda>z'map_worker_partitions.<locals>.<lambda>  s    T4%:6%:$;rv   F)purer   allow_other_workersresultsrX   c                     | D ]  }||c S  y r   r   )r  vs     rq   first_validz*map_worker_partitions.<locals>.first_valid  s    A}  rv   N)r   r`   rM   r   r  submitr   r   r  rC   from_delayed	reductionr   r   )r   r  r   r  futuresrn   r   reffutr   r?   r   s    `          rq   map_worker_partitionsr'    s
     V$FGC#{+C//56C   fmm;
 
 F %
 	s! $Xhx&89 hx>P  //'
"Ck;7
7C>>#&--//FM 8/s$   CDD &DDDDlist_of_partsc                      t         t              sJ i dt        dt        dd f fd}t	               D ]D  \  }} ||d        ||d        ||d        ||d        ||d	        ||d
        ||d       F S )Nr  r   rX   c                 j    ||    v r	|    |   }nd }||vrg |<   |   j                  |       y y r   )r   )r  r   r	  r(  r   s      rq   r   z!_get_worker_parts.<locals>.append3  sR    =## #D)DD6!!t4L% rv   r   r   r   r   r   r   r   )r`   r   r   rb   r   )r(  r   r  _r   s   `   @rq   _get_worker_partsr,  /  s    mT***#%F&# &S &T & -(1q&q'q(q- q%q%&q%& ) Mrv   c                       e Zd ZdZ	 	 	 	 	 	 	 	 	 ddee   deee      deee      deee      deee      deee      d	eee      d
ee   deeeee   f      dee   ddf fdZ	de
dee   fdZdefdZddZdedefdZ xZS )DaskPartitionIterz*A data iterator for `DaskQuantileDMatrix`.Nr   r   r   r   r   r   r   r   r   r   rX   c                 Z   || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        t        | j                   t        j                  j                        sJ t        j                  j                  t        d       f}t        | j                  |      sJ t        | j                  |      sJ t        | j                  |      sJ t        | j
                  |      sJ t        | j                  |      sJ d| _        t         | E  d       y )Nr   T)release_data)_data_label_weight_base_margin_qid_label_lower_bound_label_upper_bound_feature_names_feature_types_feature_weightsr`   collectionsabcr   r   _iterr   r   )r   r   r   r   r   r   r   r   r   r   r   typesr   s               rq   r   zDaskPartitionIter.__init__L  s    
'	"3"3++ /$**koo&>&>???))4:6$++u---$,,...$++U333$115999$115999
d+rv   attrc                 N    t        | |      t        | |      | j                     S y r   )getattrr=  )r   r?  s     rq   _getzDaskPartitionIter._getp  s(    4*4&tzz22rv   c                 4    | j                   | j                     S )z5Utility function for obtaining current batch of data.)r1  r=  r   s    rq   r   zDaskPartitionIter.datau  s    zz$**%%rv   c                     d| _         y)zReset the iteratorr   N)r=  r   s    rq   resetzDaskPartitionIter.resety  s	    
rv   
input_datac                    | j                   t        | j                        k(  ry || j                         | j	                  d      | j	                  d      d| j	                  d      | j	                  d      | j	                  d      | j	                  d      | j
                  | j                  | j                  	       | xj                   d
z  c_         y
)zYield next batch of datar   r2  r3  Nr5  r4  r6  r7  )r   r   r   r   r   r   r   r   r   r   r   r<   )r=  rh   r1  r   rB  r8  r9  r:  )r   rF  s     rq   r   zDaskPartitionIter.next}  s    ::TZZ())H%99Y'		&!		.1"ii(<="ii(<=---- 11	
 	

a
rv   )	NNNNNNNNNrX   N)r   r   r   r   r   r	   r   r   r   r   rb   rB  r   rE  r   r   r   r   r   s   @rq   r.  r.  I  s%   4
 &*&*+/#'1515049=)-",3i", S	"", c#	",
 d3i(", d3i ", $DI.", $DI.",  -",  c49n 56", "#", 
",H # 
&c &x C rv   r.  c            '           e Zd ZdZe	 dddddddddddddddddddedee   d	ee   d
ee   dee   de	dee
   deeeee   f      dee   dee   dee   dee   dee   dee   dee   de	ddf$ fd       Zdedeeef   f fdZ xZS )rN   z.A dask version of :py:class:`QuantileDMatrix`.NF)r   r   r   r   r   r   max_binr%  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ  r%  r   r   r   r   r   r   rX   c                    t         |   ||||||||||||||	|       |
| _        d| _        |t	        |      | _        y d | _        y )N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   T)r   r   rJ  r   r   _ref)r   r   r   r   r   r   r   r   r   r   rJ  r%  r   r   r   r   r   r   r   s                     rq   r   zDaskQuantileDMatrix.__init__  sj    , 	#//+''1 	 	
" .1o2c7	4	rv   r  c                 z    t         |   |      }| j                  |d<   | j                  | j                  |d<   |S )NrJ  r%  )r   r  rJ  rL  )r   r  r   r   s      rq   r  z#DaskQuantileDMatrix._create_fn_args  s;    w&{3,,Y99 ))DKrv   r   )r   r   r   r   r*   r  r   r   r  r  r   r   r	   r   r   r$   r   rb   r   r  r   r   s   @rq   rN   rN     s   8
 ,0	(H -115#'049=!%!%+/)-7;7;59#('(H$(H (H (	(H )(H o.(H %(H (H  -(H  c49n 56(H #(H g(H ((H o&(H  $O4!(H" $O4#(H$ "/2%(H& !'(H( 
)(H  (HT3 4S>  rv   rN   c                   0     e Zd ZdZdededdf fdZ xZS )DaskDeviceQuantileDMatrixz`Use `DaskQuantileDMatrix` instead.

    .. deprecated:: 1.7.0

    .. versionadded:: 1.2.0

    r   r  rX   Nc                 X    t        j                  dt               t        |   |i | y )Nz)Please use `DaskQuantileDMatrix` instead.)warningswarnFutureWarningr   r   )r   r   r  r   s      rq   r   z"DaskDeviceQuantileDMatrix.__init__  s$    A=Q$)&)rv   r   r   s   @rq   rO  rO    s'    *c *S *T * *rv   rO  r   r   r   r   nthreadr   rJ  r   r%  c	                 "   t        j                         }	|Kd|	j                   d}
t        j	                  |
       t        t        j                  d      | ||||      }|S t        |      }t        di ||| |d}t        ||||||      }|S )Nworker  has an empty DMatrix.r   r   )r   r   rJ  r%  r   )r   r   r   )r   rT  rJ  r%  r   r   )
rE   r   r   ri   rj   r'   r   emptyr,  r.  )r   r   r   r   rT  r   rJ  r   r%  r   r|   r   unzipped_dictitdmatrixs                  rq   _create_quantile_dmatrixr]    s     ##%F}''=>sKK''1
 %e,M	 


##'	
B 
-G Nrv   c                    t        j                         }|}|Id|j                   d}	t        j	                  |	       t        t        j                  d      | ||      }
|
S t        d      }dt        t        |      dt        |   fd}t        |      }i }|j                         D ]  \  }} ||      }|||<    t        d
i ||| ||||d	}|S )zdGet data that local to worker from DaskDMatrix.

    Returns
    -------
    A DMatrix object.

    rV  rW  rX  )r   r   r   Tr   rX   c                 >    t        d | D              ry t        |       S )Nc              3   $   K   | ]  }|d u  
 y wr   r   ).0r	  s     rq   	<genexpr>z:_create_dmatrix.<locals>.concat_or_none.<locals>.<genexpr>%  s     -tt|s   )anyr   )r   s    rq   concat_or_nonez'_create_dmatrix.<locals>.concat_or_none$  s    ---t}rv   )r   r   r   rT  r   r   r   )rE   r   r   ri   rj   r$   r   rY  r   r   r   r,  r   )r   r   r   r   rT  r   r   r   r(  r|   r   r_  re  rZ  concated_dictr   r   r  r\  s                      rq   _create_dmatrixrg    s      ##%FM''=>sKK''1	
 AXhqk2 x{ 
 &m4M$&M#))+
U5!c ,  
##-'G Nrv   r   r  c                 2    | rt        di |S t        di |S )Nr   )r]  rg  )r   r  s     rq   _dmatrix_from_list_of_partsri  ;  s!    '1&11$V$$rv   dconfigc                 2  K   dg}d}d}|y|D ]  }||vst        d|        |j                  dd      }|'|j                  d      r|j                  d      r|dd }|#	 t        j
                  j                  |      \  }}|||f}nd}	 t        j
                  j                  |j                  j                        }|j                  d	      }|j                  t        | ||       d{   }	|	S # t         $ r Y {w xY w# t        $ r d}Y >w xY w7 &w)
zBGet rabit context arguments from data distribution in DaskDMatrix.scheduler_addressNr   zUnknown configuration: []r<   z/:)r   r  
startswithendswithrE   commget_address_host_portget_address_hostr   r   strip	Exceptionrun_on_schedulerru   )
rV   rj  r   valid_configr[   r\   k	user_addr
sched_addrrl   s
             rq   _get_rabit_argsr|  A  sK     ((L!GDA$ #:1#!>??  ++1487#5#5c#:w?O?OPS?TamG + 0 0 F Fw O dO		 %%66v7G7G7O7OP
%%d+
 ''	:y C J'    
s`   DAD#"C5 	DAD D.D/D5	D>D DDDDDDc                  D    t         j                  j                  dd       S )Nxgboost)default)rD   r   r  r   rv   rq   _get_dask_configr  o  s    ;;??9d?33rv   dtrainevalsc                 ^   t        | j                  j                               }|r~|D ]y  }t        |      dk(  sJ t	        |d   t
              rt	        |d   t              sJ |d   | u rCt        |d   j                  j                               }|j                  |      }{ t        |      S )Nr_   r   r<   )	setr   r   rh   r`   rM   rb   unionr   )r  r  X_worker_maprp   r   s        rq   _get_workers_from_datar  z  s     !!2!2!7!7!9:LAq6Q;;adK0Z!c5JJJtv~QqT__1134J'--j9L  rv   c                    K   |j                   j                          d {   }|d   j                         }t        |       |z
  }|rt	        d|       y 7 6w)Nr   zMissing required workers: )r   identityr   r  RuntimeError)r   r   r   current_workersmissing_workerss        rq   _check_workers_are_aliver    s`      !!**,,D9o**,O'l_4O77HIJJ  -s   AA7A	train_reftrain_idevals_id
evals_name	n_threadsc                L   t        di | d|i}g }t        |      D ]  \  }}	||   |k(  r|j                  |||   f       %|	j                  dd       '|	d   |k7  rt	        d      |	d= t        di |	||d}
nt        di |	d|i}
|j                  |
||   f        ||fS )NrT  r%  zSThe training DMatrix should be used as a reference to evaluation `QuantileDMatrix`.)rT  r%  r   )ri  r   r   r  r   )r  r  r  r  r  r  Xyr  r  r%  eval_Xys              rq   _get_dmatricesr    s     
%	Dy	D)	DB')ED/3A;("LL"jm,-775$+5zX% *  E
1SCSPRSG1KCKKGgz!}-. " u9rv   global_configparamsnum_boost_roundobjfevalearly_stopping_roundsverbose_eval	xgb_model	callbackscustom_metricc                 6  	
K   t        ||      }t        ||        d {    t        t        |      ||        d {   }t	        |       dt
        dt
        t        t        t        t        f   f   dt        dt        t           dt        t           dt        dt        dt        t           f	
f	d	}t        j                  ||       4 d {    |A|D cg c]  \  }}|	 }}}|D cg c]  \  }}|	 }}}|D cg c]  }t        |       }}ng }g }g }t!        | |||t        |      ||g|g|z   d
|i d {   }|cd d d       d {    S 7 @7 %7 c c}}w c c}}w c c}w 7 07  # 1 d {  7  sw Y   y xY ww)N
parameters
rabit_argsr  r  r  r  r  rX   c                   	 t        j                         }| j                         }t        ||      }	|j	                  |	|	d       i }
t        di |5  t        j                  di 5  t        ||g||||	d\  }}t        |||
t        |      dk7  r|nd       }d d d        d d d        j                         dk7  r|
d}|S d }|S # 1 sw Y   /xY w# 1 sw Y   3xY w)N)rT  n_jobs)r  r  r  r   )r  r  r  evals_resultr  r  r  r  r  r  r  r  rI   r   )rE   r   copyr=   rf   rL   r   config_contextr  worker_trainrh   num_row)r  r  r  r  r  r  r  r   local_paramr  local_historyr  r  rJ   r   r  r  r  r  r  r  r  r  r  s                  rq   dispatched_trainz&_train_async.<locals>.dispatched_train  s    '') oo'!+v6	yIFG35 .:.0E0E0V0V&  "%#IB #" /*"5zQeD+&;)##G 1W.6 ::<1"(+C 
 C
E 1W0V..s$   C )=C&C C	C  C)r   )r  r  r|  rh   r)   r   rb   r   r   r   dictr   rH   rE   	MultiLockr   r'  )r   r  rj  r  r  r  r  r  r  r  r  r  r  r  r   _rabit_argsr  r   n
evals_datar  r  r   s    `   ` ```````         rq   _train_asyncr    s      %VU3G
"7F
333'GgvFFKf%22eCHo-.2 2 I	2
 s)2 2 2 
,	2 2h $$Wf55(-.1!J.(-.1!J.'12z!1zH2JJH,vJ
 h#
 
 
 / 655q 4Fn 6..2
 6555s   FE'FE*BFE-F F(E/4F<E5FE;!.FF FF!F"F*F-F/FFF
FFFT)r  r  r  r  r  r  r  r  c                    t                t        |       } t               } | j                  t        ft        j                         t               d|S )a8  Train XGBoost model.

    .. versionadded:: 1.0.0

    .. note::

        Other parameters are the same as :py:func:`xgboost.train` except for
        `evals_result`, which is returned as part of function return value instead of
        argument.

    Parameters
    ----------
    client :
        Specify the dask client used for training.  Use default client returned from
        dask if it's set to None.

    Returns
    -------
    results: dict
        A dictionary containing trained booster and evaluation history.  `history` field
        is the same as `eval_result` from `xgboost.train`.

        .. code-block:: python

            {'booster': xgboost.Booster,
             'history': {'train': {'logloss': ['0.48253', '0.35953']},
                         'eval': {'logloss': ['0.480385', '0.357756']}}}

    )r  rj  )r}   r   localsr   r  r   
get_configr  )r   r  r  r  r  r  r  r  r  r  r  r  r   s                rq   r;   r;     sS    Z V$F8D6;;'') " 	 rv   is_dfoutput_shapec                 &    | xr t        |      dk  S Nr_   r   )r  r  s     rq   _can_output_dfr  J  s    +S&!++rv   r   
predictioncolumnsc                    t        ||j                        rt        | dd      }t        | dd      rZddl}|j
                  dk(  r"|j                  i |t        j                        S |j                  ||t        j                  |      }|S |j
                  dk(  rt        i |t        j                  |      S t        ||t        j                  |      }|S )z0Return dataframe for prediction when applicable.indexNzcudf.core.dataframer   r   )r  dtype)r  r  r  )	r  r   rA  r!   cudfsizer   r   float32)r   r  r  r  r  r  s         rq   _maybe_dataframer  N  s     eZ--.
 gt,4!6D!#~~b'~OOG5== ( J  !# WEMMQVWW"G5==J rv   mapped_predictrJ   zdistributed.Futurer   r   c                 X  K   t        |j                               }t        |      dk\  r%t        |t        j
                        rt        d      t        t        |t        j
                        |      r|+t        |t        j                        r|j                         }n|}t	        j                  | ||d||t        j                  j                  |            }t        |      dk(  r|j                  d d df   }|S |;t        |t        j                  t        j
                  f      r|j!                         }	n|}	t        |      dk(  rdg}
g }ndg }
t        |t        j
                        r!t#        t%        t        |      dz
              }n't%        t        |      dz
        D cg c]  }|dz   	 }}t        |      dk(  r1t#        |j&                        }t        |t"              sJ |d   f|d<   nd }t        j(                  | ||d||	||
|t*        j,                  	
      }|S c c}w w)
N   zGUse `da.Array` or `DaskDMatrix` when output has more than 2 dimensions.T)r   r<   r   r_   F)chunks	drop_axisnew_axisr  )ra   r   rh   r`   rA   r   r   r  rB   r   to_dask_dataframemap_partitionsutils	make_metailocr   to_dask_arrayr   r   r  
map_blocksr   r  )r  rJ   r   r   r  r   r  base_margin_dfpredictionsbase_margin_arrayr  r  r  r  s                 rq   _direct_predict_implr  k  s     DIIK G
<A*T2<<"@ U
 	
 jr||4lC"z+rxx'H --/  )N''##D)
 |!%**1a40KX U "z"))R\\2(
 5@4M4M4O + |!01sI.0HI$-c,&7!&; <=+0\1BQ1F+GH+GaAE+GH|! -1,=Ffd+++%a*F1IFmm--
 3 Is   F%H*'H%3A7H*featuresinplacec                    t        |t              sJ t        j                  j	                  d      }|j                  d|      }|r)|j                         }|j                  d      dk(  rd|d<   t        |d      } | j                  |fdd	i|}t        |j                        dkD  r|j                  d   nd}	i }
t        ||j                        rt        |	      D ]  }d
|
|<   	 |j                  |
fS )z@Create a dummy test sample to infer output shape for prediction.i  r<   predict_typemarginToutput_margin)r   validate_featuresFf4)r`   r   r   randomRandomStaterandnr  popr$   rT   rh   r   r  r   )rJ   r  r  r  r  rngtest_samplem
test_predt	n_columnsr   r  s               rq   _infer_predict_outputr    s     h$$$
,,
"
"4
(C))Ax(K::n%1&*F?#5A FeFvFJ'*:+;+;'<q'@
  #aIDeZ--.y!ADG "T!!rv   modelc                   K   t        |t              r| j                  |d       d {   }|S t        |t              r | j                  |d   d       d {   }|S t        |t        j
                        r&|}|j                  }|t        urt        d|       |S t        t        t        t        t        j
                  gt        |                  7 7 w)NF)hashrJ   z9Underlying type of model future should be `Booster`, got )	r`   r"   scatterr  rE   Futurer   r   r+   )r   r  rJ   ts       rq   _get_model_futurer    s      %!u599 N 
E4	 uY'7eDD N 
E;--	.LLGKA3O 
 N $0B0B CT%[QRR :Ds"   'CC/CCA>CCr  	pred_leafpred_contribsapprox_contribspred_interactionsr  iteration_rangestrict_shapec                   	
()K   t        | |       d {   }t        |t        t        j                  t
        j                  f      sAt        t        t        t        j                  t
        j                  gt        |                  dt        dt        dt        dt        t           dt        dt        f	
f
d}t        |t        j                  t
        j                  f      rw| j                  | j!                  t"        ||j$                  d   t        |t
        j                        d		
             d {   \  }}t'        |||d ||       d {   S | j                  | j!                  t"        ||j)                         d	d		             d {   \  }}|j*                  }|j,                  (|j.                  )|j0                  dt        dt2        t4        t        f   dt6        j8                  f()	
fd}g }g }g }g }t;        |j<                  j?                               }|D ]l  }|j<                  |   }|jA                  |       |jA                  tC        |      |gz         |jA                  |D cg c]  }||jD                      c}       n tG        ||      D ],  \  }}| j!                  d ||g      }|jI                  |       . t;        tG        ||||            }tK        |d       }|D  !cg c]	  \  }} }!}| }}!} }}|D  !cg c]	  \  }} }!}|  }}!} }}|D  !cg c]	  \  }} }!}| }}!} }}g }"tG        ||      D ],  \  }}| j!                  ||||g      }#|"jI                  |#       . g }$| jM                  |       d {   }tO        |      D ]D  \  }%}&|$jI                  t        jP                  |"|%   |&f|dd  z   t6        jR                               F t        jT                  |$d      }'|'S 7 7 7 7 c c}w c c}}!} }w c c}}!} }w c c}}!} }w 7 w)NrJ   	partitionr  r  r+  rX   c                    
 t        j                  di 5  t        |
d      }| j                  |		      }t	        ||||      }|cd d d        S # 1 sw Y   y xY w)NT)r   r   r   )	r   r  r  r  r  r  r  r  r  r   )r   r  r$   rT   r  )rJ   r  r  r  r+  r  predtr  r  r  r   r  r  r  r  r  r  s          rq   r  z&_predict_async.<locals>.mapped_predict   sz     ""3]3#'A
 OO+#+ /"3"3 /) $ 
E %YwFE% 433s   8AA"r<   F)	r  r  r  r  r  r  r  r  r  )
rJ   r  r  r  r  r  r  r  r  r  r	  c                     |d   }|j                  dd       }t        j                  di 	5  t        ||d      }| j	                  |
	      }|cd d d        S # 1 sw Y   y xY w)Nr   r   T)r   r   r   r   r   )r  r  r  r  r  r  r  r  r   )r  r   r  r$   rT   )rJ   r	  r   r   r  r  r  r   r   r  r  r   r  r  r  r  r  r  s         rq   dispatched_predictz*_predict_async.<locals>.dispatched_predictA  s    F|hh}d3""3]3'++#'A OO+#+ /"3"3 /) $ 
E ) 433s   -A%%A.c                 &    | d   j                   d   S )Nr   r   )r   )r	  s    rq   r  z _predict_async.<locals>.<lambda>e  s    tF|'9'9!'<rv   )r   c                     | d   S r  r   )ps    rq   r  z _predict_async.<locals>.<lambda>i  s    adrv   )r   )r   r  r   r   )+r  r`   rM   rB   r   rA   r   r   r+   r   r"   r	   r  r   r   r   r!  r  r   r  r  r   r   r   r   r   rb   r   r   r   r   r   extendrh   r   zipr   sortedgatherr   r"  r  concatenate)*r   r  r  r   r  r   r  r  r  r  r  r  r  _boosterr  _output_shaper   r  r+  r   r  	all_parts
all_orders
all_shapesall_workersworkers_addressr  r(  r	  r   sparts_with_orderr   orderr$  farraysr  rowsr  r   r   s*    `  `````````                           @@rq   _predict_asyncr    s     'vu55Hd["((BLLABbhh EtDzRSS%(15@DS	NQ	 0 $2<<01$*NNMM%A r||4+#+ /"3)  %
 
t *HdD-
 
 	
 #NN!\\^''+/% 	 	
 OL!  **O&&M&&MllGG 4S> emm   2 IJJK4??//12O&4'3}-=>O?4884OP	 '
 {I.4MM<dQCMP! / C	:z;OP.NC3CD3C/$ua3CID5EF5E1D%%5EJF2BC2B.ueQ12BKCG{I.4MM,hqcMJq / F}}Z00JZ(4OO
4'L,<"<EMM	
 ) ..a0KE 6:

n P EFC 1s   QP-D/QP0Q)P3*AQ.P6/C.QP9
3A0Q#P>
1Q=Q
QQ
%AQ=Q>A0Q0Q3Q6Q9QFrX  c                     t                t        |       }  | j                  t        fdt	        j
                         it               S )a  Run prediction with a trained booster.

    .. note::

        Using ``inplace_predict`` might be faster when some features are not needed.
        See :py:meth:`xgboost.Booster.predict` for details on various parameters.  When
        output has more than 2 dimensions (shap value, leaf with strict_shape), input
        should be ``da.Array`` or ``DaskDMatrix``.

    .. versionadded:: 1.0.0

    Parameters
    ----------
    client:
        Specify the dask client used for training.  Use default client
        returned from dask if it's set to None.
    model:
        The trained model.  It can be a distributed.Future so user can
        pre-scatter it onto all workers.
    data:
        Input data used for prediction.  When input is a dataframe object,
        prediction output is a series.
    missing:
        Used when input data is not DaskDMatrix.  Specify the value
        considered as missing.

    Returns
    -------
    prediction: dask.array.Array/dask.dataframe.Series
        When input data is ``dask.array.Array`` or ``DaskDMatrix``, the return value is
        an array, when input data is ``dask.dataframe.DataFrame``, return value can be
        ``dask.dataframe.Series``, ``dask.dataframe.DataFrame``, depending on the output
        shape.

    r  )r}   r   r   r  r   r  r  )r   r  r   r  r   r  r  r  r  r  r  r  s               rq   rT   rT     s;    b V$F6;;~UV5F5F5HUFHUUrv   r  c
                   	K   t        |       } t        | |       d {   }
t        |t        j                  t
        j                  f      s<t        t        t        j                  t
        j                  gt        |                  |t        |t        j                  t
        j                  t
        j                  f      sKt        t        t        j                  t
        j                  t
        j                  gt        |                  dt        dt        dt        dt        t           dt        dt        f	fd}| j!                  | j#                  t$        |
|j&                  d   t        |t
        j                        d		
             d {   \  }}t)        ||
||||       d {   S 7 7 "7 	w)NrJ   r  r  r  r   rX   c           
          t        j                  di 5  | j                  |	|
      }d d d        t        |||      }|S # 1 sw Y   xY w)N)r  r  r   r   r  r  r   )r   r  rU   r  )rJ   r  r  r  r   r  r  r  r   r  r  r  s         rq   r  z._inplace_predict_async.<locals>.mapped_predict  sf     ""3]3 00 /)'"3) 1 J 4 &iWeL
 43s   AAr<   T)r  r  r  r  r  r  )r   r  r`   rB   r   rA   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  rJ   r  r   r   s    `  ```` `    rq   _inplace_predict_asyncr    s{     V$F%fe44GdRXXr||452<< 8$t*EFFzrxxryy1( 2<< CT+EVWXX  c	
  
 * !ZZ]T2<<0%+% 	 		
 KE4 &{E4  S 5:s4   GF>E:GGG9G:GGGc	                     t                t        |       }  | j                  t        fdt	        j
                         it               S )a  Inplace prediction. See doc in :py:meth:`xgboost.Booster.inplace_predict` for
    details.

    .. versionadded:: 1.1.0

    Parameters
    ----------
    client:
        Specify the dask client used for training.  Use default client
        returned from dask if it's set to None.
    model:
        See :py:func:`xgboost.dask.predict` for details.
    data :
        dask collection.
    iteration_range:
        See :py:meth:`xgboost.Booster.predict` for details.
    predict_type:
        See :py:meth:`xgboost.Booster.inplace_predict` for details.
    missing:
        Value in the input data which needs to be present as a missing
        value. If None, defaults to np.nan.
    base_margin:
        See :py:obj:`xgboost.DMatrix` for details.

        .. versionadded:: 1.4.0

    strict_shape:
        See :py:meth:`xgboost.Booster.predict` for details.

        .. versionadded:: 1.4.0

    Returns
    -------
    prediction :
        When input data is ``dask.array.Array``, the return value is an array, when
        input data is ``dask.dataframe.DataFrame``, return value can be
        ``dask.dataframe.Series``, ``dask.dataframe.DataFrame``, depending on the output
        shape.

    r  )r}   r   r   r  r   r  r  )	r   r  r   r  r  r   r  r   r  s	            rq   rU   rU     sH    f V$F 6;;.4.?.?.AEKX rv   tree_methodc                 (   K   dt         t           dt        dt        f fd}t        d	d|i|\  }}| d{   }|||fS g }|D ]<  }|d   |u r|j	                  |       |j	                  |d    d{   |d   f       > ||fS 7 Q7 w)
z(A switch function for async environment.r%  r  rX   c                 R    t              rt        d| d|S t        ddi|S )N)r   r%  rJ  r   r   )r4   rN   rM   )r%  r  r   rJ  r  s     rq   	_dispatchz2_async_wrap_evaluation_matrices.<locals>._dispatch7  sA    $& 3;A  3&3F33rv   create_dmatrixNr   r<   r   )r   rM   r	   r8   r   )	r   r  rJ  r  r  train_dmatrixr  awaitedrp   s	   ```      rq   _async_wrap_evaluation_matricesr  /  s     4x, 4 4 4 5XIXQWXM5''M}e##GQ4= NN1ad
AaD)*	 
 '!! ( #s!   7BB=B:B
;BBDaskScikitLearnBasec              #   J   K   	 || _         |  d| _         y# d| _         w xY ww)z-Temporarily set the client for sklearn model.N)r   )r  r   s     rq   _set_worker_clientr   K  s%     
ts   # #	 #c                      e Zd ZdZdZdedededee   dee	   de
fd	Z	 	 	 	 dd
edededee   dee	   de
fdZ	 dd
edee	   de
fdZ	 dd
edee	   de
fdZdee
   fdZdefdZedd       Zej*                  dd       Zdede
de
fdZy)r  z<Base class for implementing scikit-learn interface with DaskNr   r  r  r   r  rX   c           
        K   | j                  |      }| j                         rmt        | j                  | j	                         |||rdnd| j
                  ||       d {   }t        |t        j                        r|j                         }|S t        | j                  ||| j
                  | j                         d {   }t        | j                  | j	                         ||||       d {   }|S 7 7 97 
w)Nr  r   )r   r  r   r  r  r   r   r  )r   r   r   r   )r  r   r  r  r  )_get_iteration_range_can_use_inplace_predictrU   r   get_boosterr   r`   rA   r   r  rM   r   rT   )r   r   r  r  r   r  predtstest_dmatrixs           rq   r  z"DaskScikitLearnBase._predict_async\  s      33OD((**{{&&( /)6XG'"3	 	F &",,/--/"  "-'"00" L #&&(!+"3 / F 9	s7   AD  C:!A!D C<0D 3C>4D <D >D r   c                 l    t                | j                  j                  | j                  |||||      S )N)r  r  r   r  )r}   r   r   r  )r   r   r  r  r   r  s         rq   rT   zDaskScikitLearnBase.predict  s>     	{{'/#+   
 	
rv   c                   K   | j                  |      }t        | j                  || j                  | j                         d {   }t        | j                  | j                         |d|       d {   }|S 7 67 w)N)r   r   r   T)r  r   r  r  )r#  rM   r   r   r   rT   r%  )r   r   r  r'  r&  s        rq   _apply_asyncz DaskScikitLearnBase._apply_async  s     
 33OD(KKLL,,	
 
 KK""$+
 
 

s$   AA?A;/A?4A=5A?=A?c                 f    t                | j                  j                  | j                  ||      S )N)r  )r}   r   r   r*  )r   r   r  s      rq   applyzDaskScikitLearnBase.apply  s,    
 	{{ 1 11oVVrv   c                 h     dt         t           f fd} j                  |      j                         S )NrX   c                     K    S wr   r   r   s   rq   r+  z(DaskScikitLearnBase.__await__.<locals>._  s     Ks   )r
   r	   _client_syncr   )r   r+  s   ` rq   r   zDaskScikitLearnBase.__await__  s/    	3 	   #--//rv   c                 H    | j                   j                         }d|v r|d= |S )N_client)__dict__r  )r   thiss     rq   __getstate__z DaskScikitLearnBase.__getstate__  s(    }}!!#Yrv   c                 0    t        | j                        }|S )zThe dask client used in this model.  The `Client` object can not be serialized for
        transmission, so if task is launched from a worker instead of directly from the
        client process, this attribute needs to be set at that worker.

        )r   r1  )r   r   s     rq   r   zDaskScikitLearnBase.client  s     !.rv   c                 <    ||j                   nd| _        || _        y )NF)asynchronous_asynchronousr1  )r   clts     rq   r   zDaskScikitLearnBase.client  s     25S--erv   r  r  c                    | j                   }t        | dd      }	 t        j                          d}|rWt        j
                         5 }t        | |      5 } |j                  j                  |fi |d|i}|cddd       cddd       S  | j                  j                  |fi |d| j                  j                  iS # t        $ r d}Y w xY w# 1 sw Y   nxY wcddd       S # 1 sw Y   fxY w)zGet the correct client, when method is invoked inside a worker we
        should use `worker_client' instead of default client.

        Nr8  FTr7  )
r1  rA  rE   r   r   r   r   r   r   r7  )r   r  r  r7  	in_workerr   r3  r   s           rq   r/  z DaskScikitLearnBase._client_sync  s     <<"4%@L"&&( 	  ..0F+D&9T.dkk.. $*9E  #	 :9 10  t{{VVT[[=U=UVV  "!	" :9
  100s5   B? C'#C7	C'?CCC	C''C0)FTNNr   )rX   r   )r9  r   rX   N)r   r   r   r   r1  r  r  r   r   r   r	   r  rT   r*  r,  r
   r   r   r4  propertyr   setterr   r/  r   rv   rq   r  r  W  sk   FG&& &  	&
 o.& ".1& 
&V $"&1548

 
  	

 o.
 ".1
 

* 59 ".1 
	0 59WW ".1W 
	W09S> 0d    ]] W WS WS Wrv   z3Implementation of the Scikit-Learn API for XGBoost.
estimatorsc                   J   e Zd ZdZdededee   dee   deeeeef         deee      deee      d	e	e
ef   d
ee	eef      dee   defdZeddddddddddededee   dee   deeeeef         d	e	e
ef   d
ee	eef      deee      deee      dee   dd fd       Zy)rO   zAdummy doc string to workaround pylint, replaced by the decorator.r   ysample_weightr   eval_setsample_weight_eval_setbase_margin_eval_setverboser  r   rX   c                   K   | j                         }t        di d| j                  d| j                  d| j                  d|d|dd dd d|d	|d
|
d|d|d|dd dd d| j
                  d| j                  d| j                   d {   \  }}t        | j                        rt        | j                        }nd }| j                  |	|      \  }}}| j                  j                  t        d| j                  t        j                         t!               ||| j#                         ||d ||| j$                  | j&                  |       d {   }|d   | _        | j+                  |d          | S 7 7 &w)Nr   r  rJ  r   r@  r   r   rA  r   r   rB  rC  rD  
eval_groupeval_qidr   r   r   Tr7  r   r  rj  r  r  r  r  r  r  r  r  r  r  r  rJ   rK   r   )get_xgb_paramsr  r   r  rJ  r   r   r   callable	objectiver7   _configure_fitr   r  r   r  r  get_num_boosting_roundsr  r  _Booster_set_evaluation_resultr   r   r@  rA  r   rB  rC  rD  rE  r  r   r  r  r  r  r  metricr  s                     rq   
_fit_asynczDaskXGBRegressor._fit_async  s     $$&= 
;;
((
 LL
 	

 
 
 
 (
 $
 ,
 
 $:
 "6
 
 
  LL!
"  $66#
$ ,,%
 
* DNN#&:4>>&JCC $ 3 3Iv Fvv((;; ++-$& 88:  "&"<"<nn! ) 
 
$  	*##GI$67]
4
s%   BE=E9CE=E;%E=;E=NTrA  r   rB  rE  r  rC  rD  r   c                    t                t               j                         D ci c]  \  }}|dvs|| }}} | j                  | j                  fi |S c c}}w Nr   r   r}   r  r   r/  rS  r   r   r@  rA  r   rB  rE  r  rC  rD  r   ry  r  r   s                 rq   fitzDaskXGBRegressor.fit0  s[     	!'!1T!1AQ>S5S1!1T t  9D99 U
   AA)r   r   r   r   r  r   r   r   r   r   r   r  r"   r0   rS  r*   rZ  r   rv   rq   rO   rO     s    L<< <  0	<
 o.< 8E/?*J$KLM< !)/)B C< 'x'@A< sDy!< E'8"345< "/2< 
<~   4815PT$(8<FJDH59:: :
  0: o.: 8E/?*J$KLM: sDy!: E'8"345: !)/)B C: 'x'@A: "/2: 
:  :rv   rO   zBImplementation of the scikit-learn API for XGBoost classification.c                       e Zd Zdededee   dee   deeeeef         deee      deee      dee	e
f   d	eeeef      d
ee   dd fdZddddddddddededee   dee   deeeeef         dee	e
f   d	eeeef      deee      deee      d
ee   dd fdZdede
dee   dee   def
 fdZ	 	 	 ddede
dee   dee   def
dZej$                  j(                  e_        dede
de
dee   dee   def fdZ xZS )rP   r   r@  rA  r   rB  rC  rD  rE  r  r   rX   c                   K   | j                         }t        | j                  fi d| j                  d| j                  d|d|dd dd d|d|d	|
d
|d|d|dd dd d| j
                  d| j                  d| j                   d {   \  }}t        |t        j                        r<| j                  j                  t        j                  |             d {   | _        n6| j                  j                  |j                                d {   | _        t        | j                        r| j                  j!                         | _        t#        | j                        r| j                  j%                         | _        t'        j(                  | j                        | _        t+        | j                        | _        | j,                  dkD  rd|d<   | j,                  |d<   nd|d<   t/        | j0                        rt3        | j0                        }nd }| j5                  |	|      \  }}}| j                  j7                  t8        d| j                  t;        j<                         t?               ||| jA                         ||d ||| jB                  | jD                  |       d {   }|d   | _#        t/        | j0                        s
|d   | _        | jI                  |d          | S 7 b7 7 7 Lw)Nr  rJ  r   r@  r   r   rA  r   r   rB  rC  rD  rG  rH  r   r   r   r_   zmulti:softprobrL  	num_classzbinary:logisticTrI  rJ   rK   )%rJ  r  r   r  rJ  r   r   r   r`   rB   r   r   uniqueclasses_drop_duplicatesr,   to_cupyr-   r  r   r>   rh   
n_classes_rK  rL  r7   rM  r   r  r   r  r  rN  r  r  rO  rP  rQ  s                     rq   rS  zDaskXGBClassifier._fit_asyncJ  s     $$&=KK
((
 LL
 	

 
 
 
 (
 $
 ,
 
 $:
 "6
 
 
  LL!
"  $66#
$ ,,%
 
, a""&++"5"5biil"CCDM"&++"5"5a6G6G6I"JJDM& MM113DM$--( MM--/DMDMM2dmm,??Q"2F;"&//F;"3F;DNN#&:4>>&JCC $ 3 3Iv Fvv((;; ++-$& 88:  "&"<"<nn! ) 
 
$  	*'#K0DN##GI$67E
. DJ&
sK   BK<K1AK<"K4#6K<K7FK<-K:.AK<4K<7K<:K<NTrT  c                    t                t               j                         D ci c]  \  }}|dvs|| }}} | j                  | j                  fi |S c c}}w rV  rX  rY  s                 rq   rZ  zDaskXGBClassifier.fit  s[     	!'!1T!1AQ>S5S1!1T t  9D99 Ur[  r  r  c                   K   | j                   dk(  rt        d      t        |   |d|||       d {   }t	        t        t        j                  d      t        j                        }t        t        | dd      ||      S 7 Ow)	Nzmulti:softmaxzSmulti:softmax doesn't support `predict_proba`.  Switch to `multi:softproba` insteadF)r   r  r  r   r  T)allow_unknown_chunksizesrc  r   )
rL  r   r   r  r   r   rB   vstackr6   rA  )r   r   r  r   r  r&  rg  r   s          rq   _predict_proba_asyncz&DaskXGBClassifier._predict_proba_async  s      >>_,6  w-/#+ . 
 
  BII=ryy
 "'$a"@&&QQ
s   2BBABc                 V    t                | j                  | j                  ||||      S )N)r   r  r   r  )r}   r/  rh  )r   r   r  r   r  s        rq   predict_probazDaskXGBClassifier.predict_proba  s7     	  %%/#+ ! 
 	
rv   r   r  c                 r  K   t         	|   |||||       d {   }|r|S t        |j                        dk(  r|dkD  j	                  t
              }|S t        |j                        dk(  sJ t        |t        j                        sJ dt        dt        fd}t        j                  ||d      }|S 7 w)Nr<   g      ?r_   xrX   c                 &    | j                  d      S )Nr<   r   )argmax)rl  s    rq   _argmaxz1DaskXGBClassifier._predict_async.<locals>._argmax  s    xxQx''rv   )r  )r   r  rh   r   astyper   r`   rB   r   r	   r  )
r   r   r  r  r   r  
pred_probspredsro  r   s
            rq   r  z DaskXGBClassifier._predict_async  s      !71-!2K
 

 z A%#%--c2E  z''(A---j"((333(3 (3 ( MM':CE%
s   B7B5BB7)TNN)r   r   r   r  r   r   r   r   r   r   r  r"   r0   rS  rZ  r   rh  r	   rj  r.   r   r  r   r   s   @rq   rP   rP   D  s   PP P  0	P
 o.P 8E/?*J$KLMP !)/)B CP 'x'@AP sDy!P E'8"345P "/2P 
Pp 4815PT$(8<FJDH59:: :
  0: o.: 8E/?*J$KLM: sDy!: E'8"345: !)/)B C: 'x'@A: "/2: 
:$RR  R o.	R
 ".1R 
R8 #'1548

  
 o.	

 ".1
 

  *77??M   	
 o. ".1 
 rv   rP   zZImplementation of the Scikit-Learn API for XGBoost Ranking.

    .. versionadded:: 1.4.0

zb
        .. note::

            For dask implementation, group is not supported, use qid instead.
)end_notec                        e Zd Zedddedef fd       Zdedede	e   d	e	e   d
e	e   de	e   de	e
eeef         de	e
e      de	e
e      de	e
e      de	e
e      deeef   de	eeef      de	e   dd fdZeddddddddddddddedede	e   d	e	e   d
e	e   de	e   de	e
eeef         de	e
e      de	e
e      deeef   de	eeef      de	e
e      de	e
e      de	e   dd fd       Zej$                  j(                  e_         xZS )rQ   zrank:pairwise)rL  rL  r  c                T    t        |      rt        d      t        |   dd|i| y )Nz5Custom objective function not supported by XGBRanker.rL  r   )rK  r   r   r   )r   rL  r  r   s      rq   r   zDaskXGBRanker.__init__  s,    ITUU7977rv   r   r@  r   r   rA  r   rB  rC  rD  rG  rH  rE  r  r   rX   c                   K   d}||
t        |      |t        d      | j                         }t        | j                  fi d| j                  d| j
                  d|d|dd d|d	|d
|d|d|d|d|	dd d|d| j                  d| j                  d| j                   d {   \  }}| j                  ||      \  }}}| j                  j                  t        d| j                  t        j                         t               ||| j                         |d d ||| j                   | j"                  |       d {   }|d   | _        |d   | _        | S 7 7 w)Nz/Use `qid` instead of `group` on dask interface.z`qid` is required for ranking.r  rJ  r   r@  r   r   rA  r   r   rB  rC  rD  rG  rH  r   r   r   TrI  rJ   rK   )r   rJ  r  r   r  rJ  r   r   r   rM  r   r  r   r  r  rN  r  r  rO  evals_result_)r   r   r@  r   r   rA  r   rB  rC  rD  rG  rH  rE  r  r   r|   r  r  r  r  rR  r  s                         rq   rS  zDaskXGBRanker._fit_async  s    " @*"4S/!;=>>$$&=KK
((
 LL
 	

 
 
 
 (
 $
 ,
 
 $:
 "6
 
 
  LL!
"  $66#
$ ,,%
 
( !% 3 3Iv Fvv((;; ++-$& 88:  "&"<"<nn! ) 
 
$  	*$Y/S
*
s%   B+E"-E.BE"E E" E"NF)r   r   rA  r   rB  rG  rH  rE  r  rC  rD  r   c                    t                t               j                         D ci c]  \  }}|dvs|| }}} | j                  | j                  fi |S c c}}w rV  rX  )r   r   r@  r   r   rA  r   rB  rG  rH  rE  r  rC  rD  r   ry  r  r   s                     rq   rZ  zDaskXGBRanker.fitN  s[    & 	!'!1T!1AQ>S5S1!1T t  9D99 Ur[  )r   r   r   r*   rb   r	   r   r  r   r   r   r   r   r   r  r0   r"   rS  rZ  r1   r   r   r   s   @rq   rQ   rQ     s     +: 8S 8c 8  8
@@ @ (	@
 o&@  0@ o.@ 8E/?*J$KLM@ !)/)B C@ 'x'@A@ Xo67@ 8O45@ sDy!@ E(G"345@ "/2@  
!@F   ,0)-3715PT:>8<$)8<FJDH59!:: :
 (: o&:  0: o.: 8E/?*J$KLM: Xo67: 8O45: sDy!: E(G"345: !)/)B C: 'x'@A:  "/2!:" 
#:  :0 --''CKKrv   rQ   zjImplementation of the Scikit-Learn API for XGBoost Random Forest Regressor.

    .. versionadded:: 1.4.0

rL  zI
    n_estimators : int
        Number of trees in random forest to fit.
)extra_parametersc                   2    e Zd Zeddddddee   dee   dee   dee   d	ed
df fd       Zd
ee	ef   f fdZ
d
efdZddddddddddededee   dee   deeeeef         deeef   deeeef      deee      deee      dee   d
d f fdZ xZS )rR   r<   皙?h㈵>learning_rate	subsamplecolsample_bynode
reg_lambdar~  r  r  r  r  rX   Nc                .    t        |   d||||d| y Nr}  r   r   r   r   r~  r  r  r  r  r   s         rq   r   zDaskXGBRFRegressor.__init__w  -     	 	
'-!		

 	
rv   c                 B    t         |          }| j                  |d<   |S Nnum_parallel_treer   rJ  n_estimatorsr   r  r   s     rq   rJ  z!DaskXGBRFRegressor.get_xgb_params  &    ')&*&7&7"#rv   c                      yNr<   r   r   s    rq   rN  z*DaskXGBRFRegressor.get_num_boosting_rounds      rv   TrT  r   r@  rA  r   rB  rE  r  rC  rD  r   c                    t                t               j                         D ci c]  \  }}|dvs|| }}}t        | j                  | j
                         t        |   di | | S c c}}w NrW  r   r}   r  r   r5   r  r  r   rZ  r   r   r@  rA  r   rB  rE  r  rC  rD  r   ry  r  r   r   s                 rq   rZ  zDaskXGBRFRegressor.fit  h     	!'!1T!1AQ>S5S1!1T455t~~Fd U
   A-A-r   r   r   r*   r   r  r	   r   r   rb   rJ  r   rN  r  r   r   r   r   r  r"   r0   rZ  r   r   s   @rq   rR   rR   j  sp      *+%(,/&*
  
 E?	

 #5/
 UO
 
 

  
"S#X 
  4815PT$(8<FJDH59 
  0 o. 8E/?*J$KLM sDy! E'8"345 !)/)B C 'x'@A "/2 
 rv   rR   zkImplementation of the Scikit-Learn API for XGBoost Random Forest Classifier.

    .. versionadded:: 1.4.0

c                   2    e Zd Zeddddddee   dee   dee   dee   d	ed
df fd       Zd
ee	ef   f fdZ
d
efdZddddddddddededee   dee   deeeeef         deeef   deeeef      deee      deee      dee   d
d f fdZ xZS )rS   r<   r{  r|  r}  r~  r  r  r  r  rX   Nc                .    t        |   d||||d| y r  r  r  s         rq   r   zDaskXGBRFClassifier.__init__  r  rv   c                 B    t         |          }| j                  |d<   |S r  r  r  s     rq   rJ  z"DaskXGBRFClassifier.get_xgb_params  r  rv   c                      yr  r   r   s    rq   rN  z+DaskXGBRFClassifier.get_num_boosting_rounds  r  rv   TrT  r   r@  rA  r   rB  rE  r  rC  rD  r   c                    t                t               j                         D ci c]  \  }}|dvs|| }}}t        | j                  | j
                         t        |   di | | S c c}}w r  r  r  s                 rq   rZ  zDaskXGBRFClassifier.fit  r  r  r  r   s   @rq   rS   rS     sp      *+%(,/&*
  
 E?	

 #5/
 UO
 
 

  
"S#X 
  4815PT$(8<FJDH59 
  0 o. 8E/?*J$KLM sDy! E'8"345 !)/)B C 'x'@A "/2 
 rv   rS   rH  r   )
   )r   r;  loggingrz   socketrQ  r   
contextlibr   	functoolsr   r   	threadingr   typingr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r~  r   r   xgboost._typingr   r   r   r   xgboost.callbackr   xgboost.compatr   r   r    r!   xgboost.corer"   r#   r$   r%   r&   r'   r(   r)   r*   r+   xgboost.datar,   r-   xgboost.sklearnr.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   xgboost.trackerr:   xgboost.trainingr;   r  r  r=   rD   rE   r>   rB   r?   rC   r@   rA   globalsr   r  rH   __all__	getLoggerri   r   rb   rk   ru   r}   rL   r   r   rM   r  r'  
_DataPartsr,  r.  rN   rO  r  r  r]  rg  ri  r|  r  r  r  r  r  r  r  r  r  r  r  r  r   rT   r  rU   r  r   r  rO   rP   rQ   rR   rS   r   rv   rq   <module>r     s  8      # % -     $  & J J - I I   6    ) 2   $	D')%5	6B	D')\	2B	D')Z	0Bfgi0D]GI7IJK?@	)	*F 
		+	,''hsmXeCHo%>>?@' 
#uS#X
'TSM U38_- 
#uS#X
	S*88 S"48B< 4B 4H%9: ?S "p pf :')*'
3=
!' ' c]	'
 'T $sCx.!
Z Dd3i4H 4H HV3+ 3l* 3 *. "*L)*E#tCy.12* c]* 	*
 * J* * * 
'	* *Z3L)3E#tCy.123 c]3 	3
 3 3 J3 3l%T %S %W %++%d38n5+?S+	#uS#X
+\4(4S>2 4 (%S8H2I)J K	#YK#YK 4K	K  sm	
   7Dw|,--.8` `S>` d38n%` cN	`
 ` ` HU;#3456` 
)	` F` $C=` T	"`  ` !123` F#` l`F 
 	4 :>#"+/#'%)6:&*4 4cN4 4 	4 HU;#34564 
)	4 F4 $C=4  4 T	"4 !1234 F#4 	4 4n,$ ,e , ,
)-c;?:QQ!Q Q /*	Q
 S/Q sCx.Q Qh"" #",0";?"KN"
5c?DcN*+", ).w>R/R)S0Q QS>Q $ 445Q 	Q
 Q Q Q Q Q Q Q $Q Q Qp  YY!#"&,3V)*3Vw(<<=3V V#
$3V 	3V
 3V 3V 3V 3V 3V 3V $3V 3V 	3Vl8 8S>8 $ 4458 	8
 $8 8 8 8 /*8 8 8~ '-YY"-1:)*:w(<<=: : $	:
 : : : /*: : 	:z")*"#" c]" 	"
 ;eK,<&=!>??@"8  *> QW( QWh =g?VS:*,< S:S:l H7l+-> l	l^ 
 7c(' c(c(L 
 k.) ..b 
 k.+ ..rv   