o
    Ú­ji  ã                   @   sÎ  d 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mZmZ ddlZddlZddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZ ddl m!Z! ddl"m#Z#m$Z$m%Z% ede#deeef fdd„ƒZ&de#de
dej'fdd„Z(de#dede)ddfdd„Z*de#ddfdd„Z+de#ddfdd„Z,de#ddfdd„Z-de#dee
e
ej'ej'f fd d!„Z.d"ede#d#e#ddfd$d%„Z/de#ddfd&d'„Z0de#ddfd(d)„Z1de#ddfd*d+„Z2ed,eeƒZ3d"ee3 d-ed.e
d/e
de3f
d0d1„Z4de#d"ed2e5d3e5d4e5ddfd5d6„Z6de#ddfd7d8„Z7de#ddfd9d:„Z8ejd;d<œde#d=e9defd>d?„ƒZ:de#ddfd@dA„Z;de#ddfdBdC„Z<de#ddfdDdE„Z=de#ddfdFdG„Z>de#ddfdHdI„Z?de#ddfdJdK„Z@dS )LzTests for the ordinal re-coder.é    N)ÚThreadPoolExecutor)Úcache)ÚAnyÚTupleÚTypeÚTypeVaré   )ÚEvalsLog)ÚDMatrixÚExtMemQuantileDMatrixÚQuantileDMatrix)Ú_lazy_load_cudf_is_cat)Útrainé   )ÚIteratorForTestÚis_pd_cat_dtypeÚmake_batchesÚmake_categoricalÚmemory)Úget_basescore)ÚDeviceÚassert_allcloseÚpredictor_equalÚdeviceÚreturnc                 C   s@   | dkrddl }|j}|j}||fS ddl}|j}|j}||fS )z3Get data frame implementation based on the ]device.Úcpur   N)ÚpandasÚ	DataFrameÚSeriesÚcudf)r   ÚpdÚDfÚSerr   © r#   úT/var/www/html/CropPilot/venv/lib/python3.10/site-packages/xgboost/testing/ordinal.pyÚget_df_impl   s   ür%   Údatac                 C   s$   | dkr	t  |¡S ddl}| |¡S )zWrapper to get an array.r   r   N)ÚnpÚasarrayÚcupy)r   r&   Úcpr#   r#   r$   r(   ,   s   

r(   ÚXyÚboosterc                 C   s|   |j dd� ¡ }|dusJ ‚tj d¡}| |j| ¡ d�¡ t|| dœ|dƒ}|j dd� ¡ }|dus6J ‚||ks<J ‚dS )z-Compare the results from DMatrix and Booster.T©Úexport_to_arrowNéé  ©Úsize)r,   r   r   )	Úget_categoriesÚto_arrowr'   ÚrandomÚdefault_rngÚ	set_labelÚnormalÚnum_rowr   )r   r+   r,   Úcats_dmÚrngÚbstÚcats_bstr#   r#   r$   Úcomp_booster5   s   r=   c                 C   s2   dt dtddfdd„}ttfD ]}|| |ƒ qdS )z8Basic tests for the container class used by the DMatrix.r   ÚDMatrixTr   Nc                 S   sT  t | ƒ\}}|dddgidd�}|jjj}||dd�}|jdgks#J ‚|jdgks+J ‚|jdd� ¡ }|d us9J ‚t|ƒ}t	|d ƒt	|ƒksIJ ‚t
t	|d ƒƒD ]}	t|d |	 ƒt||	 ƒksmJ |d |	 ||	 fƒ‚qQ|dg d	¢idd�}||dd�}|jdd� ¡ }
|
d usŒJ ‚t|
ƒ}|d  ¡ }|jd
 dksŸJ ‚|jd dks¨J ‚|jdks¯J ‚| ¡ }|jjdks»J ‚t| |jt g d¢¡ƒ t| |jt g d¢¡ƒ t| |jt g d¢¡ƒ t| |dƒ t| |dƒ |dg d¢idd�}||dd�}t| |dƒ t| |dƒ tjtdd�� |jdd� ¡  W d   ƒ d S 1 �s#w   Y  d S )NÚcÚcdefÚabcÚcategory©ÚdtypeT©Úenable_categoricalr-   )r@   NrA   rA   r   r   r   é   )g      ð?ç        rH   )r   r   r   r   rG   )r   r   r   ÚgbtreeÚdart)r@   NrA   zabc r.   ©ÚmatchF)r%   r?   ÚcatÚ
categoriesÚfeature_namesÚfeature_typesr2   r3   ÚdictÚlenÚrangeÚstrÚ	to_pandasÚilocr1   Úget_datar&   r   r'   ÚarrayÚindptrÚindicesr=   ÚpytestÚraisesÚ
ValueError)r   r>   r!   Ú_ÚdfrN   r+   ÚresultsÚ
results_diÚiÚcatsÚcats_idÚserÚcsrr#   r#   r$   Úrun_dispatchE   sL   

þ$ÿz'run_cat_container.<locals>.run_dispatch)r   r   r
   r   )r   rg   Údmr#   r#   r$   Úrun_cat_containerB   s   2ÿri   c              	      sJ  ddl }ztƒ ‰W n ty   dtdtfdd„‰Y nw tdƒ‰dtd	|jddf‡‡fd
d„‰ dtddf‡ ‡‡fdd„}tt	fD ]}||ƒ q@t
dddˆdkd�}tdd„ |ƒ\}}}tt	fD ]C}||||d�}	|	jdd� ¡ }
|
dusvJ ‚|
D ]
\}}|du s‚J ‚qxtjtdd�� |	jdd� ¡  W d  ƒ n1 s�w   Y  q_dS )zRun checks with mixed types.r   Nr^   r   c                 S   s   dS )NFr#   )r^   r#   r#   r$   Úis_cudf_cat„   s   z,run_cat_container_mixed.<locals>.is_cudf_caté   r+   ÚXc                    sÞ  | j dd� ¡ }|d usJ ‚t|ƒ}|jD ]a}t|| jƒs%ˆ|| jƒrn|| }|d us/J ‚t| ¡ ƒ}ˆ|| jƒrG||  ¡  ¡  ¡ }n||  ¡  	¡ }t
j|v rZ| t
j¡ d |v rc| d ¡ t|ƒ}||ksmJ ‚q|| d u svJ ‚qt| dƒsát| tƒrƒJ ‚t ¡ �R}tj |d¡}|  |¡ t|ƒ}	|	j dd� ¡ }
|
d us¦J ‚t|
ƒ}| ¡ D ]#\}}|| }|d u rÁ|d u sÀJ ‚q®|d usÇJ ‚| ¡ | ¡ ksÑJ ‚q®W d   ƒ n1 sÜw   Y  tˆ | dƒ tˆ | dƒ d S )NTr-   ÚrefzDMatrix.binaryrI   rJ   )r2   r3   rQ   Úcolumnsr   rD   ÚsortedÚ	to_pylistÚuniqueÚtolistr'   ÚnanÚremoveÚhasattrÚ
isinstancer   ÚtempfileÚTemporaryDirectoryÚosÚpathÚjoinÚsave_binaryr
   Úitemsr=   )r+   rl   rc   Úcats_diÚfnameÚvfÚaw_listÚpd_listÚtmpdirÚXy_1Úcats_1Ú	cats_1_diÚkÚv_0Úv_1)r   rj   r#   r$   Úcheck‰   sJ   





ú÷z&run_cat_container_mixed.<locals>.checkr>   c              
      s<  t ˆdddtjˆd�\}}| ||dd�}ˆ ||ƒ t ˆddddtjˆd�\}}| ||dd�}ˆ ||ƒ t ˆdddddtjˆd	�\}}| ||dd�}ˆ ||ƒ t ˆdddtjˆd�\}}| ||dd�}ˆ ||ƒ t ˆddddtjˆd�\}}| ||dd�}ˆ ||ƒ t ˆdddddtjˆd	�\}}| ||dd�}ˆ ||ƒ d S )
Né   é   F)ÚonehotÚ	cat_dtyper   TrE   ç      à?)r�   Ú	cat_ratiorŽ   r   )r�   r�   ÚsparsityrŽ   r   )r   r'   Ústr_Úint64)r>   rl   Úyr+   )rŠ   r   Ú	n_samplesr#   r$   rg   ¶   sp   
ÿ

ù	

ø


ÿ

ù	

ø
z-run_cat_container_mixed.<locals>.run_dispatché€   é   r   Úcuda)Ún_samples_per_batchÚ
n_featuresÚ	n_batchesÚuse_cupyc                 S   s   | d S )Nr   r#   )Úxr#   r#   r$   Ú<lambda>  s    z)run_cat_container_mixed.<locals>.<lambda>)ÚweightTr-   r.   rK   F)r   r   ÚImportErrorr   ÚboolÚintr
   r   r   r   r   Úmapr2   r3   r[   r\   r]   )r   r    rg   rh   Úbatchesrl   r”   Úwr>   r+   Úall_numr^   Úvr#   )rŠ   r   rj   r•   r$   Úrun_cat_container_mixed|   s4   
þ-E
ÿÿ€ùr¨   c              
   C   sê   d}d}d}d}g g }}t |ƒD ]}t|||ddtj| d�\}}	| |¡ | |	¡ qt||dd	| d
kd�}
t|
dd�}|jdd� ¡ }|durOt	|ƒ|ksQJ ‚t
|ƒ}| ¡ D ]\}}|duscJ ‚|jdksjJ ‚t	|ƒ|ksrJ ‚qYdS )z8Test the categories container for iterator-based inputs.r—   é   é@   é   Fr�   )r�   r‘   rŽ   r   Nr   r˜   )r   Úon_hostTrE   r-   r   )rS   r   r'   r“   Úappendr   r   r2   r3   rR   rQ   r}   Ú
null_count)r   r›   rš   r™   Ún_catsrl   r”   r^   ÚX_iÚy_iÚitr+   rc   r~   r§   r#   r#   r$   Úrun_cat_container_iter  s6   

ù
	ýr³   c                 C   sÀ   t | ƒ\}}|dg d¢idd�}|jjj}t| t| |ƒt g d¢¡ƒ t |jd |jd g¡}tj	 |ddg¡ |dd	d
gidd�}|jjj}t| |t ddg¡ƒ t g d¢¡}||||fS )Nr?   ©r@   rA   ÚdefrB   rC   ©r   r   r   r   r   r   rµ   rA   ©r   r   r   )
r%   r?   rM   Úcodesr   r(   r'   rX   rV   Útesting)r   r!   r^   Úencr¸   ÚencodedÚreencr”   r#   r#   r$   Ú_basic_example0  s   

r½   r>   Útdevicec                 C   sv   t |ƒ\}}}}| ||dd�}td|i|dd�}| |¡}	| |¡}
t||	|
ƒ | |dd�}| |¡}t||	|ƒ dS )z Enable tests with mixed devices.TrE   r   r—   ©Únum_boost_roundN)r½   r   Úinplace_predictr   Úpredict)r>   r   r¾   rº   r¼   r»   r”   r+   r,   Úpredt0Úpredt1ÚfmatÚpredt2r#   r#   r$   Úrun_basic_predictB  s   


rÇ   c                    sX   t ˆƒ\‰ }ttfD ]}t|ˆˆƒ q
dtddf‡ ‡fdd„}ttfD ]}||ƒ q#dS )z,Basic tests for re-coding during prediction.r>   r   Nc                    s:  ˆ g d¢g d¢dœdd�}t  g d¢¡}|jjj}tˆtˆ|ƒt  g d¢¡ƒ t  |jd |jd	 g¡}|jjj}tˆtˆ|ƒt  g d¢¡ƒ t  |jd |jd	 g¡}t j	||gd	d
�}| ||dd�}t
dˆi|dd�}	ˆ dd	gddgdœdd�}|	 |¡}
|	 |¡}tˆ|
|ƒ | |dd�}|	 |¡}tˆ|
|ƒ d S )N©r   r   rG   r´   ©Úbr?   rB   rC   r·   r¶   r   r   )ÚaxisTrE   r   r—   r¿   rG   rµ   rA   )r'   rX   rÊ   rM   r¸   r   r(   rV   r?   Ústackr   rÁ   rÂ   )r>   r_   r”   Úb_codesÚ	b_encodedÚc_codesÚ	c_encodedr»   r+   r,   rÃ   rÄ   rÅ   rÆ   ©r!   r   r#   r$   Ú	run_mixedY  s$   




z"run_cat_predict.<locals>.run_mixed)r%   r
   r   rÇ   r   )r   r^   rh   rÒ   r#   rÑ   r$   Úrun_cat_predictR  s   
ÿrÓ   c                    s`  t ˆƒ\‰ }t g d¢¡‰dtddf‡ ‡‡fdd„}ttfD ]}||ƒ qˆ g d¢g d¢d	œd
d�}t|ˆdd�}tdˆi|dd�}|tˆg d¢ƒd
d�|d< d}tj	t
|d�� | |¡ W d  ƒ n1 shw   Y  tj	t
|d�� t|d| ¡ d� W d  ƒ n1 sˆw   Y  tj	t
|d�� t|d| ¡ d� W d  ƒ dS 1 s©w   Y  dS )zBasic tests for invalid inputs.r·   r>   r   Nc                    s$  ˆ g d¢g d¢dœdd�}| |ˆdd�}t dˆi|d	d
�}|d  tj¡|d< tjtdd�� | |¡ W d   ƒ n1 s>w   Y  | |ˆdd�}tjtdd�� | |¡ W d   ƒ n1 saw   Y  ˆ g d¢g d¢dœdd�}tjtdd�� | |¡ W d   ƒ d S 1 s‹w   Y  d S )NrÈ   r´   rÉ   rB   rC   TrE   r   r—   r¿   rÊ   zThe data type doesn't matchrK   )r   r   rG   r—   )r@   rA   rµ   Úbbcz$Found a category not in the training)	r   Úastyper'   r“   r[   r\   r]   rÁ   rÂ   )r>   r_   r+   r,   ©r!   r   r”   r#   r$   Úrun_invalid~  s"   ÿÿÿ"ÿz$run_cat_invalid.<locals>.run_invalidrÈ   r´   rÉ   rB   rC   TrE   r   r—   r¿   )r   r   r   r?   z7index type must match between the training and test setrK   ©rF   rP   )r%   r'   rX   r   r
   r   r   r(   r[   r\   r]   rÁ   r2   )r   r"   r×   rh   r_   r+   r,   Úmsgr#   rÖ   r$   Úrun_cat_invalidy  s*   
ÿÿ
ÿ"ÿrÚ   c              	      sæ   t dddddˆd�\‰ }tˆ |dd�}td	ˆi|d
d�‰dtdtf‡ ‡‡fdd„}g }t ¡ }|dus5J ‚ttfD ],}tt	|d
ƒd��}t
dƒD ]}| ||¡}	| |	¡ qHW d  ƒ n1 s`w   Y  q9|D ]}
|
 ¡ spJ ‚qhdS )zBasic tests for thread safety.i   r‹   ép   Fr�   )r�   r�   r   TrE   r   é
   r¿   r>   r   c                    s0   | ˆ dd�}ˆ  |¡}ˆ ˆ ¡}tˆ||ƒ dS )NTrE   )rÂ   rÁ   r   )r>   r+   rÃ   rÄ   ©rl   r,   r   r#   r$   Úrun_thread_safety­  s
   

z0run_cat_thread_safety.<locals>.run_thread_safetyN)Úmax_workersé    )r   r   r   r   r¡   ry   Ú	cpu_countr
   r   ÚmaxrS   Úsubmitr­   Úresult)r   r”   r+   rÞ   ÚfuturesÚn_cpusrh   Úer^   ÚfutÚfr#   rÝ   r$   Úrun_cat_thread_safety§  s$   þÿ€ÿrê   ÚUrm   ÚargsÚkwargsc                 O   s.   | t u r| ||ddœ|¤ŽS | |ddi|¤ŽS )NT)rm   rF   rF   )r   )r>   rm   rì   rí   r#   r#   r$   Ú_make_dmÄ  s   rî   Úpred_contribsÚpred_interactionsÚ	pred_leafc                 C   s„   t | ƒ\}}}}|||dd�}	td| i|	dd�}
|
jt||	|d�|||d�}|
jt||	| dd	¡d
gd�|||d�}t| ||ƒ d S )NTrE   r   r—   r¿   )rm   r&   ©rï   rð   rñ   r   r   r?   )rm   r&   rO   )r½   r   rÂ   rî   Úreshaper   )r   r>   rï   rð   rñ   rº   r¼   r»   r”   r+   r,   Úpredt_0Úpredt_1r#   r#   r$   Ú
_run_predtÊ  s    üürö   c                 C   sD   t tfD ]}t| |dddd� qt tfD ]}t| |dddd� qdS )zBasic tests for SHAP values.TFrò   N)r
   r   rö   )r   rh   r#   r#   r$   Úrun_cat_shapå  s   
ÿ
ÿÿr÷   c                 C   s   t | tdddd� dS )z Basic tests for leaf prediction.FTrò   N)rö   r
   )r   r#   r#   r$   Úrun_cat_leafó  s   

ÿrø   i   )rš   rš   c                C   s   t | ƒ\}}ddl}d}g d¢}g d¢}dddœ}tj d¡}	|	jdd||d	 fd
�}
|	jdd||d	 ftjd�}i }t|ƒD ],}|d	 dkrR|
dd…|d	 f }n|dd…|d	 f }|j	j
||d�}||d|› �< q?||ƒ}|	j|d
�}| ¡ }t|ƒD ],}|d	 dkr‡q~d|› �}|| jj}t|dƒr›| ¡ }| |¡}|j	j
||d�||< q~||ƒ}|jdd…df jj|jdd…df jjk ¡ sÉJ ‚||||
|fS )z0Synthesize a test dataset with changed encoding.r   Nrk   ©ÚarÊ   r?   Úd©rÊ   rú   r?   rû   r   )r   r   r/   r   r0   r—   )ÚlowÚhighr1   rD   ©rN   r¸   ré   rU   )r%   r   r'   r4   r5   ÚuniformÚintegersÚint32rS   ÚCategoricalÚ
from_codesr7   ÚcopyrM   r¸   ru   rU   ÚreplacerV   Úany)r   rš   r!   r^   r    r•   Úold_catsÚnew_catsÚmappingr:   Úcol_numericÚcol_categoricalr_   r?   Úcolr¸   rº   r”   r¼   ÚnameÚ	codes_serÚ	new_codesr#   r#   r$   Úmake_recodedü  sH   
ÿþ


4r  c                 C   sê  ddl }g d¢}g d¢}t dd¡}|jj|g d¢d�}| ||dœ¡}t| ƒ\}}||ƒ}tj d	¡}	|	j	|j
d d
�}
ttfD ]<}|||
dd�}td| i|ƒ}| |¡}| |¡}t| ||ƒ |jj|g d¢d�}|||dœƒ}| |¡}t| ||ƒ qAt| ƒ\}}}
}}t||
dd�}td| i|ƒ}| |¡}| |¡}t| ||ƒ t||
dd�}| |¡}t| ||ƒ tj|j
d |j
d fd�}||dd…|jdkf< ||dd…|jdkf< | dkrèddl}| |¡}| |¡}t| ||ƒ dS )z.Run with manually specified category encoding.r   Nrù   rü   é	   ©	r   r   r   rG   r   r   r   rG   r   rÿ   ©Úf0Úf1r/   r0   TrE   r   ©	r   r   r   rG   r   r   r   rG   r   r   )ÚshaperB   r˜   )r   r'   Úaranger  r  r   r%   r4   r5   r   r  r
   r   r   rÂ   rÁ   r   r  ÚemptyÚdtypesr)   rX   )r   r    r  r	  Úcol0Úcol1r_   r!   r^   r:   r”   rh   r+   r,   rÃ   rÄ   Údf1rÆ   rº   r¼   r  r  rX   r*   Úpredt3r#   r#   r$   Úrun_specified_cat2  sV   ý

ý





r   c                 C   sr   t | ƒ\}}}}}t||dd�}t||dd�}i }td| i||df|dfg|d� t| |d d |d d ƒ dS )	z;Check the validation dataset is using the correct encoding.TrE   r   ÚTrainÚValid)ÚevalsÚevals_resultÚrmseN)r  r
   r   r   )r   rº   r¼   r”   r^   r+   ÚXy_validr$  r#   r#   r$   Úrun_validations  s   üÿr'  c                 C   s$  ddl }t| ƒ\}}g d¢}g d¢}t dd¡}|jj|g d¢d�}|||dœƒ}t|d	d
�}	|	jd	d�}
|	jddgks>J ‚|jj|g d¢d�}|||dœƒ}t|d	|
d�}	|	j	ddgks_J ‚|	jddgkshJ ‚|	jd	d�}|
 
¡ | 
¡ ksxJ ‚|jjg d¢g d¢d�}t| ƒ\}}|d|iƒ}ttfD ]1}||d	d
�}	|	jd	d�}
|
dus¨J ‚||d	|
d�}	|	jd	d�}|dus»J ‚|
 
¡ | 
¡ ksÅJ ‚q”ttfD ]E}t| ƒ\}}}}}|||d	d
�}|jd	d�}
|
dusèJ ‚||||
d	d�}|jd	d�}|dusüJ ‚|
 
¡ | 
¡ k�sJ ‚t||ƒ�sJ ‚qÊdS )z"Test re-coding inpput for DMatrix.r   Nrù   rü   r  r  rÿ   r  TrE   r-   r¢   r?   r  rØ   r  r  )r«   é   rŒ   r©   rM   ©rP   rF   )r   r%   r'   r  r  r  r
   r2   rP   rO   r3   r   r  r   )r   r    r!   r^   r  r	  r  r  r_   r+   Úcats_0r…   r>   rº   r¼   r”   ÚXy_0r„   r#   r#   r$   Úrun_recode_dmatrixˆ  s`   ýýþôr,  c                    sž   t ˆ ƒ\‰‰}}}dtdtddf‡ ‡‡fdd„}t ttgttg¡D ]*\}}|ˆ|dd�}|tu r=|ˆ|d| ¡ |d	�}n
|ˆ|d| ¡ d
�}|||ƒ q"dS )z)Test re-coding for training continuation.r+  r„   r   Nc                    s4  dˆ i}d}i }t || |dfg||d�}i }t |||dfg|||d�}t|ƒt|ƒks-J ‚i }t || |dfg|d |d�}	|d d |d d  }
|d d }tj ||
¡ t ˆˆgˆˆg¡D ]\}}| |¡}|	 |¡}tˆ ||dd� q`t | |g| |g¡D ]\}}| |¡}|	 |¡}tˆ ||dd� q�d S )	Nr   r   r"  )r#  rÀ   r$  )r#  Ú	xgb_modelrÀ   r$  r%  gñhãˆµøä>)Úrtol)	r   r   r'   r¹   r   Ú	itertoolsÚproductrÁ   rÂ   )r+  r„   ÚparamsÚrÚevals_result_0Ú	booster_0Úevals_result_1Ú	booster_1Úevals_result_2Ú	booster_2Úeval_concatÚ	eval_fullrú   rÊ   rô   rõ   ©r   rº   r¼   r#   r$   rŠ   Ñ  sP   ûúû



ýz(run_training_continuation.<locals>.checkTrE   )rF   rP   rm   rØ   )r  r
   r/  r0  r   r2   )r   r”   r^   rŠ   r!  r"  r+  r„   r#   r;  r$   Úrun_training_continuationÍ  s&   0ÿûÿðr<  c                 C   s‚   t | ƒ\}}}}}t||dd�}td| i|dd�}| ¡ }| ¡ }t|||dd�}	t| ddd	œ|	d|d
�}
|
 ¡ }||ks?J ‚dS )zTest with individual updaters.TrE   r   r—   r¿   r)  ÚpruneÚupdate)r   ÚupdaterÚprocess_type)rÀ   r-  N)r  r
   r   Úsave_rawr2   )r   rº   r¼   r”   r^   r+   r4  Úmodel_0r*  r„   r6  Úmodel_1r#   r#   r$   Ú
run_update  s"   ýø
rD  c                 C   s°   t | ƒ\}}}}}ttfD ]H}t||dd�}td| i|dd�}| ¡ }t|||||d�}	t||||ƒ}
| |¡}| |	¡}| |
¡}| |¡}|||fD ]}t| ||ƒ qLqdS )z%Run prediction with re-coded DMatrix.TrE   r   r—   r¿   )rP   N)	r  r
   r   r   r2   rî   rÂ   rÁ   r   )r   rº   r¼   r”   r^   r>   r+   r,   r*  r„   ÚXy_2rô   rõ   Úpredt_2Úpredt_3Úpredtr#   r#   r$   Úrun_recode_dmatrix_predict-  s   



ÿórI  )AÚ__doc__r/  ry   rw   Úconcurrent.futuresr   Ú	functoolsr   ÚfcacheÚtypingr   r   r   r   Únumpyr'   r[   Ú_typingr	   Úcorer
   r   r   r&   r   Útrainingr   r   r   r   r   r   r?  r   Úutilsr   r   r   r%   Úndarrayr(   rT   r=   ri   r¨   r³   r½   rÇ   rÓ   rÚ   rê   rë   rî   r¡   rö   r÷   rø   r¢   r  r   r'  r,  r<  rD  rI  r#   r#   r#   r$   Ú<module>   st    	: "!'."ÿþýüû
ú	5ÿ
þAEG