
    bcgm%                     r    d dl mZ d dlZd dlZddlmZ ddlmZ ddlm	Z	 ddl
mZ dd	lmZ  G d
 de      Zy)    )print_functionN   )CatBoostError)get_eval_logger)make_dirs_if_not_exists)CaseEvaluationResult   )	FoldModelc                       e Zd ZdZ	 dZed        Zd Zd Zd Z	ed        Z
d Zd	 Zd
 Zed        Zed        Zedd       Zy)FoldModelsHandlerzS
    Class that is responsible for learning models and computing their metrics
    modelsc                     	 t         j                  j                  t        j                        r$t        j
                  t        j                         y y # t        $ r,} t               j                  t        |              Y d } ~ y d } ~ ww xY wN)
ospathexistsr   _FoldModelsHandler__MODEL_DIRrmdirOSErrorr   warningstr)errs    ]/var/www/html/bid-api/venv/lib/python3.12/site-packages/catboost/eval/_fold_models_handler.py_remove_model_dirz#FoldModelsHandler._remove_model_dir   s^    	0ww~~/;;<*667 = 	0%%c#h//	0s   AA 	B	"BB	c                     || _         || _        t               | _        | j                   D ]  }t               | j                  |<    || _        || _        || _        d| _        y)zy
        Args:
            :param remove_models: Set true if you want models to be removed after applying them.

        N)_cases_metricsdict_case_results_thread_count
_eval_step_flag_remove_models_metric_descriptions)selfmetricscasesthread_count	eval_stepremove_modelscases          r   __init__zFoldModelsHandler.__init__   s]     !VKKD'+vDt$   *##0 $(!    c                     || _         | j                  D ]=  }| j                  |   }| j                   D ]  }t        ||| j                        ||<    ? y )N)r(   )r#   r   r   r   r!   )r$   metric_descriptionsr*   case_resultmetric_descriptions        r   _init_case_resultsz$FoldModelsHandler._init_case_results0   sY    $7!KKD,,T2K&*&?&?"2FtGYQUQ`Q`3b./ '@  r,   c           	         i }|j                         D ]  \  }}t               ||<   |D ]  }	|	j                  || j                  | j                        }
||   j                  |
       | j                   | j                  |
j                                k| j                  |
j                         k7  st        d        t        ||z   |z         D ]o  \  }}t        j                  || j                        }|j                         D ]7  \  }}||   }t        |      D ]  \  }}||k7  s||   j                  |       ! 9 q |j                         D ]r  \  }}||   }| j                  |   }t        ||      D ]J  \  }}|j!                         }| j                  D ]&  }||   j#                  ||j%                  |             ( L t y )N)r(   r'   z(Error: metric names should be consistent)itemslistcreate_metrics_calcerr!   r    appendr#   r1   r.   r   	enumerater   _create_pooladdr   zipeval_metrics_add
get_result)r$   r%   grouped_by_case_modelslearn_foldsskipped_folds
rest_foldsmetric_calcersr*   case_models
case_modelmetric_calcerfile_num	fold_filepoolcalcers	model_nummodelcase_resultscalcerscoresmetrics                        r   _compute_metricsz"FoldModelsHandler._compute_metrics9   s   !7!=!=!?D+#'6N4 )
 * @ @KO??NRN`N` !A !b t$++M:,,4++M,M,M,OP..-2S2S2UU'(RSS * "@ $-[=-H:-U#VHi$11)T=O=OPD%;%A%A%C!k(.(1+(>$Iu9,	*..t4 )? &D $W "8!=!=!?D+$T*G--d3L!$Wk!:,,."77F (--eV5F5Fv5NO 8 "; "@r,   c                    ddl m} t        t        j                         | j                         }d|j                         v rF|j                         d   }t        |      r(t        |      |k\  rt        dj                  |            t               j                  dj                  t        |      |             t        j                         } ||j                               }|j                  |        |j!                  |       t               j                  dj                  t        j                         |z
               t#        |||      S )	Nr   )CatBoostignored_featureszError: input parameter contains feature indices wich are not available in pool: {}
 Check eval_feature set and ignored features optionszLearn model {} on fold #{})params)fnamez Operation was done in {} seconds) rR   r   r   r   num_col
get_paramslenmaxr   formatr   debugr   timefit
save_modelr
   )	rH   r*   fold_id
model_pathrR   feature_countrS   cur_timeinstances	            r   
_fit_modelzFoldModelsHandler._fit_model\   s    1 = =>!22#01CD#$-=)>-)O# %ZZ`Z`aqZrt t 	 < C CCIw WX99;4??#45T*- B I I$))+X`J` abz733r,   c           	         t        t        j                         i }| j                  D ]  }t	               ||<    t        |      D ]  \  }}t        j                  || j                        }||z   }| j                  D ]  }t        j                  j                  t        j                  t        j                  ||            }	t               j                  dj                  t        |      ||	             | j!                  ||||	      }
t               j#                  dj                  t        |      |             ||   j%                  |
         |S )a   
        Train models for each algorithm and learn dataset(folds). Than return them.

        Args:
            :param learn_files: Entities of FoldStorage for learning models.
            :return: Dictionary of models where the key is case and the value is models on learn folds
        z#For model {} on fold #{} path is {}zModel {} on fold #{} was fitted)r   r   r   r   r4   r7   r8   r    r   r   join_create_model_namer   r\   r[   r   re   infor6   )r$   learn_filesfold_id_biasr   r*   rF   
learn_filerH   r`   ra   
fold_models              r   _fit_modelszFoldModelsHandler._fit_modelsr   s"    	  1 = =>KKD6F4L   %.k$: Hj$11*d>P>PQD"X-GWW\\*;*G*G*;*N*NtU\*]_
!''(M(T(TUXY]U^`gis(tu!__T4*M
!&&'H'O'OPSTXPY[b'cdt##J/ $	 %; r,   c                    	 |j                  ||      }|j                  ||      }|}|D ]  \  }}	}
t        |      dk(  rg }	 | j                  ||      }|j	                         D ]
  \  }}||z  } t        |      }t               j                  dj                  |||z                | j                  | j                  |||	|
       t               j                  dj                  |||z                ||z  }|j                          | j                  |        	 | j                  |       | j                  S # |j                          | j                  |       w xY w# | j                  |       w xY w)a9  
        Run all processes to gain stats. It applies algorithms to fold files that gains from learning. It keeps
        stats inside models and models are stored in DataFrame. Columns are matched to the different algos and rows to
        the folds.

        Args:
            :param splitter: Splitter entity.
            :param fold_size: The size of fold.
            :param folds_count: Count of golds.
            :param fold_offset: The offset (count of folds that we want to skip).
            :return: return dict: keys metric to CaseEvaluationResult

        r   z+Start metric computation for folds [{}, {})z7Computation of metrics for  folds [{}, {}) is completed)create_fold_setsfold_groups_files_generatorrY   rn   r3   r   ri   r[   rP   r   clean_folds_remove_models_cleanr   )r$   splitter	fold_sizefolds_countfold_offset
folds_setsfold_groups_filesrk   r?   r@   rA   list_modelspermutation_modelsr*   rC   learn_folds_counts                   r   proceedzFoldModelsHandler.proceed   s   	"!229kJJ ( D DZEP!R&L:K6]J{#q( 5)-)9)9+|)T&-?-E-E-G)k#{2 .H ),K(8%#%**+X,2F<PaAa,bd))$--*<*5}jR $%**+d,2F<PaAa,bd $55L ((*''4+ ;L2 KK!!!! ((*''4 KK!s%   A E  B6D:9#E  :#EE   E3c                 \    | j                   r| j                          |j                          y r   )r"   r   clean)r$   ru   s     r   rt   zFoldModelsHandler._clean   s!    ##""$r,   c                     t               j                  dj                  t        |                    | D ]  }|j	                           y )NzRemove models {})r   r\   r[   r   delete)r{   rK   s     r   rs   z FoldModelsHandler._remove_models   s7     2 9 9#k:J KL ELLN !r,   c                     dd l }t        |j                               j                  dd      }dj	                  | j                         ||      }|S )Nr   -_z&model_{_name}_fold_{_fold}_{_uuid}.bin)_name_fold_uuid)uuidr   uuid1replacer[   	get_label)
model_casefoldr   id_str
model_names        r   rh   z$FoldModelsHandler._create_model_name   sR    TZZ\"**34=DD:K_K_KaKOKQ E S
 r,   c                 ~    ddl m}  || j                         | j                         | j	                         |      }|S )Nr   )Pool)column_description	delimiterr'   )rV   r   r   r   get_separator)rG   r'   r   	data_pools       r   r8   zFoldModelsHandler._create_pool   s;    ),5,H,H,J#,#:#:#<&24	 r,   N))__name__
__module____qualname____doc__r   staticmethodr   r+   r1   rP   re   rn   r~   rt   rs   rh   r8    r,   r   r   r      s     K0 0)$b!PF 4 4*8/"b
  
    r,   r   )
__future__r   r   r]   rV   r   eval.log_configr   
eval.utilsr   eval.evaluation_resultr   _fold_modelr
   objectr   r   r,   r   <module>r      s+    % 	   - 0 9 "M Mr,   