
    bcg5                         d dl m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
m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mZ  G d de      Z G d de      Zy)    )print_functionN)copy)Enum   )CatBoostErrorCatBoost   )EvaluationResultsMetricEvaluationResult)FoldModelsHandler)_SimpleStreamingFileReader)	_Splitter)ExecutionCase)	LabelModeFactorUtilsc                        e Zd ZdZdZdZdZdZy)EvalTypez
        Type of feature evaluation:
            All: All factors presented
            SeqRem:  Each factor while other presented
            SeqAdd:  Each factor while other removed
            SeqAddAndAll:  SeqAdd + All
    AllSeqRemSeqAddSeqAddAndAllN)__name__
__module____qualname____doc__r   r   r   r        \/var/www/html/bid-api/venv/lib/python3.12/site-packages/catboost/eval/catboost_evaluation.pyr   r      s     CFF!Lr   r   c                       e Zd Z	 	 	 	 	 	 	 	 ddZd Zed        Zed        Zd ZddZ	de
j                  dddej                  fd	Z	 	 dd
Zy)CatboostEvaluationNc                    ddl } |j                         | _        |j                  j	                  | j                  |      | _        |&|j                  j	                  | j                  |      nd| _        || _        || _        || _	        |	| _
        |
| _        || _        t        |      | _        || _        |t        |      | _        n|| _        |ddl}|j%                         | _        y|| _        y)ai  
        Args:
            :param path_to_dataset: (str) Path to the dataset to be used for evaluation.
            :param fold_size: (int) Size of the folds in cross-validation.
            :param fold_count: (int) Number of times we get a new fold, learn a model and check results as if
            there wouldn't be any offset. If there'are some offset it means that the real count of folds will
            be smaller.
            :param column_description: (str) Path to the file where column description is placed.
            :param fold_offset: (int) Number of folds we skip before begin to make cross-validation.
            :param group_column: (int) GroupId column index in the dataset file.
            'None' value means absence of grouping information in the dataset (it's the default).
            :param working_dir: Working dir for temporary files
            :param remove_models: (bool) Set true if you want models to be removed after applying them.
            :param delimiter: (str) Field delimiter used in dataset files.
            :param has_header: (bool) Set true if you want to skip first line in dataset files.
            :param partition_random_seed: (int) The seed for random value generator used for getting permutations for
             cross-validation.
            :param min_fold_count: (int) Minimun amount of folds dataset can be cut to.
        r   N)os.pathgetcwd_current_dirpathjoin_path_to_dataset_column_description_fold_offset_fold_count
_fold_size
_delimiter_has_header_seedint_min_fold_count_remove_models_group_feature_numtempfilemkdtemp_working_dir)selfpath_to_dataset	fold_size
fold_countcolumn_descriptionfold_offsetgroup_columnworking_dirremove_models	delimiter
has_headerpartition_random_seedmin_fold_countosr3   s                  r   __init__zCatboostEvaluation.__init__    s    @ 	%BIIK "T->-> PGYGe $&77<<0A0A0B$Dko 	 '%##%*
">2+#&),&7D#&2D# ( 0 0 2D +Dr   c                 l    t        j                         }t        j                  | j                         |S N)rC   r#   chdirr5   )r6   currents     r   __go_to_working_dirz&CatboostEvaluation.__go_to_working_dirZ   s$    ))+
""#r   c                    t        |      dk(  rt        d      t               }t        | t        |      t	        j
                  |||            }|t        j                  k(  s!|t        j                  k(  st        |      dk(  r7|j                  t        | g t	        j
                  |g |                   ||fS |t        j                  k(  r@|D ]7  }|j                  t        | |gt	        j
                  ||g|                   9 ||fS |t        j                  k(  s|t        j                  k(  rc|D ]Z  }t        |      }|j                  |       |j                  t        | t	        j
                  |||      t        |                   \ ||fS |t        j                  k7  rt        d|j                        ||fS )Nr   z*Provide at least one feature to evaluation)
label_mode)ignored_featureslabelr	   )rM   rL   zDon't support {} mode.)lenr   listr   r   create_labelr   r   r   appendr   r   r   removeAttributeErrorvalue)paramsfeatures_to_eval	eval_typerK   
test_casesbaseline_casefeature_numcur_featuress           r   _create_eval_feature_casesz-CatboostEvaluation._create_eval_feature_cases_   s    A% LMM V
%f7;<L7M,7,D,DEUEUPZ-\( $	X5J5J(JcRbNcghNhmF=?2=2J2JK[KMV`3b. /2 j((' (//)/!!-BM6A6N6NO_P[}Zd7f#2 3  0$ j(( (//)Y(:O:O-O/#$45##K0!!-6A6N6NO_O[Zd7f BFlAS	#U V  0 j(( (,,& !99??KKj((r   c                 N   t               }| j                         D ]B  \  }}|j                         D ]*  \  }}||vrt               ||<   ||   j                  |       , D t               }|j                         D ]  \  }}|j                  t	        |             ! t        |      S rF   )dictitemsrO   rQ   r   r
   )by_case_resultsgroup_by_metriccasecase_resultmetricevaluation_resultresultsmetric_resultss           r   _create_evaluation_resultsz-CatboostEvaluation._create_evaluation_results   s    &#2#8#8#:T;/:/@/@/B+*0.2fOF+'../@A 0C $; &(7(=(=(?$V^NN1.AB )@ ))r   c                     | j                   S rF   )r5   )r6   s    r   get_working_dirz"CatboostEvaluation.get_working_dir   s       r   c                    t        |      }t        |      t        |      k7  rt        d|z         | j                         }	 | j                  | j
                  k  r1d}t        |j                  | j
                  | j                              t        ||||| j                        }t        | j                  | j                  | j                  | j                        }	t        |	| j                   | j"                  | j$                        }
|j'                  |
| j(                  | j                  | j
                        }| j+                  |      t-        j.                  |       S # t-        j.                  |       w xY w)a  
        This method calculate metrics and return them.

        Args:
            :param cases: List of the ExecutionCases you want to evaluate
            :param metrics: List of the metrics to be computed
            :param thread_count: Count of threads to use.
            :param: evaluation_step: Step to evaluate metrics
            :return: instance of EvaluationResult
        zFound duplicate cases in zXCount of folds(folds_count - offset) need to be at least one: offset {}, folds_count {}.)casesmetrics	eval_stepthread_countr>   )sepr@   group_feature_num)seedmin_folds_count)splitterr8   folds_countr;   )setrN   r   &_CatboostEvaluation__go_to_working_dirr*   r)   rS   formatr   r1   r   r'   r,   r-   r2   r   r(   r.   r0   proceedr+   rh   rC   rG   )r6   rm   rn   rp   evaluation_step	cases_set
current_wd	error_msghandlerreaderru   results               r   _calculate_result_metricsz,CatboostEvaluation._calculate_result_metrics   sY    J	y>SZ' ;e CDD--/
	!4#4#44v	$Y%5%5d6G6G6:6F6F&H I I (e072A5A6:6I6I	KG 00E0E48OO;?;K;KBFBYBY[F !!%!9!9&*jj151E1EGH
 __h/3151A1A151B1B % DF
 226:HHZ BHHZ s   DE# #E:c	                    t        |      }|g }t        |t              r|n|g}t        |t              r|j	                         }	nt        |      }	|*d|	v r5|	d   |k7  r-t        dj                  |	d   |            d|	vrt        d      |
|dk7  r||	d<   |d}|||	d<   n|	d   }|	d   dk(  rt        d      | j                  |	|||	      \  }
}||vr|j                  |       | j                  |
||||
      S )a   Evaluate features.
            Args:
            learn_config: dict with params or instance of CatBoost. In second case instance params will be used
            features_to_eval: list of indices of features to evaluate
            loss_function: one of CatBoost loss functions, get it from learn_config if not specified
            eval_type: Type of feature evaluate (All, SeqAdd, SeqRem)
            eval_metrics: Additional metrics to calculate
            thread_count: thread_count to use. If not none will override learn_config values
            Returns
            -------
            result : Instance of EvaluationResult class
        loss_functionzVLoss function in params {} should be equal to feature evaluation objective function {}zDProvide loss function in params or as option to eval_features methodrk   rp   r	   	PairLogitz$Pair classification is not supported)rW   rK   )rY   compare_caseseval_metricsrp   ro   )rw   
isinstancerO   r   
get_paramsr^   r   ry   r\   rQ   
eval_cases)r6   learn_configrV   r   rW   r   rp   ro   rK   rU   rY   rX   s               r   eval_featuresz CatboostEvaluation.eval_features   s]   * /0L'1,'E|L>lH-!,,.F,'F$&(VO-D-U# %228&9PR_2`b b f,#$jkk#(:%1F>"I$&3F?#"?3M/"k1 FGG$($C$CFDTNWOY %D %[!z ,.]-7,8,8)2	  4 	4r   c                     t        |t              s|g}|g}||z  }|D ]  }|j                  |        | j                  ||||      }|j	                  |       |S )a  More flexible evaluation of any cases.
            Args:
            baseline_case: Execution case used for baseline
            compare_cases: List of cases to compare
            eval_metrics: Metrics to calculate
            thread_count: thread_count to use.  Will override one in cases
            Returns
            -------
            result : Instance of EvaluationResult class
        )rp   r{   )r   rO   _set_thread_countr   set_baseline_case)	r6   rY   r   r   rp   ro   rm   rb   metric_results	            r   r   zCatboostEvaluation.eval_cases	  sw      -.*OMD""<0  66u7CDPGP 7 R 	''6r   )r   NNT	Fr   r	   )rk   r	   )r   r   r   rD   rx   staticmethodr\   rh   rj   r   r   r   r   
AddFeaturer   r   r   r   r   r    r       s     "!#!'( !8,t
 ') ')R * *!+!` %) (#'#% $!*!5!5?4J !#r   r    )
__future__r   rC   r   enumr    r   r   re   r
   r   _fold_models_handlerr   _readersr   	_splitterr   execution_caser   factor_utilsr   r   r   objectr    r   r   r   <module>r      s@    % 	   & H 3 0   ) 0"t "I Ir   