def parse_graec(s):
    # do GRAEC SCORE
    enumeration_encoder = Human_Functions.load_dict_from_csv(Name_functions.S_GRAEC_enumeration_dictionary(s))

    best_acc_train = -1
    best_acc_test = -1
    best_acc_enum = -1
    best_f1_train = -1
    best_f1_test = -1
    best_f1_enum = -1

    with open(Name_functions.full_GRAEC_table(), 'a+') as wf:

        for e in enumeration_encoder:
            df_train = DataFrameOperations.import_df(fn=Name_functions.S_GRAEC_train_predictions(s, e))
            acc_train = Metrics.accuracy(df_train['True_label'], df_train['Predicted_label'])
            f1_train = Metrics.f1(df_train['True_label'], df_train['Predicted_label'])

            df_test = DataFrameOperations.import_df(fn=Name_functions.S_GRAEC_test_predictions(s, e))
            acc_test = Metrics.accuracy(df_test['True_label'], df_test['Predicted_label'])
            f1_test = Metrics.f1(df_test['True_label'], df_test['Predicted_label'])

            wf.write(enumeration_encoder[e] + ';{};ACC;{}\n'.format(s, acc_test))
            wf.write(enumeration_encoder[e] + ';{};F1;{}\n'.format(s, f1_test))

            if acc_train > best_acc_train:
                best_acc_train = acc_train
                best_acc_test = acc_test
                best_acc_enum = e

            if f1_train > best_f1_train:
                best_f1_train = f1_train
                best_f1_test = f1_test
                best_f1_enum = e

    with open(Name_functions.S_GRAEC_score(s, 'accuracy'), 'w+') as wf:
        wf.write(enumeration_encoder[best_acc_enum] + '\n')
        wf.write('{}\n'.format(best_acc_test))

    with open(Name_functions.S_GRAEC_score(s, 'f1'), 'w+') as wf:
        wf.write(enumeration_encoder[best_f1_enum] + '\n')
        wf.write('{}\n'.format(best_f1_test))
def parse_ms(s):
    print('\tGRAEC ... ', end='', flush=True)
    if Filefunctions.exists(Name_functions.S_GRAEC_enumeration_dictionary(s)):
        print('Already done')
        return

    enumeration_encoder = dict()

    fn_data = Name_functions.DS_file(s)
    fn_train_ids = Name_functions.DS_train_ids(s)
    fn_test_ids = Name_functions.DS_test_ids(s)
    x_train, labels_train, times_train, ids_train = DI(fn_data).get_data(
        fn_subset_ids=fn_train_ids,
        return_split_values=True,
        return_identifiers=True)
    x_test, labels_test, times_test, ids_test = DI(fn_data).get_data(
        fn_subset_ids=fn_test_ids,
        return_split_values=True,
        return_identifiers=True)

    enumeration = 0
    predictor = Classifiers.BPTSClassifier(s=s, score_function=None)

    for B in Parameters.GRAEC_beta:
        for T in Parameters.GRAEC_tau:
            for P in Parameters.GRAEC_p if not T == 0 else [
                    0
            ]:  # P has no use for T == 0
                enumeration_encoder[enumeration] = '{};{};{}'.format(B, T, P)
                predictor.set_scoring_function(
                    score_function=PeriodScoring(beta=B, p=P, tau=T, s=s))

                with open(
                        Name_functions.S_GRAEC_train_predictions(
                            s, enumeration), 'w+') as wf:
                    wf.write('SOID;time;True_label;Predicted_label\n')
                    for case_id, t, true_label in zip(ids_train, times_train,
                                                      labels_train):
                        predicted_label = predictor.predict(case_id=case_id,
                                                            time=t)
                        wf.write('{};{};{};{}\n'.format(
                            case_id, t, true_label[0], predicted_label))

                with open(
                        Name_functions.S_GRAEC_test_predictions(
                            s, enumeration), 'w+') as wf:
                    wf.write('Case_id;time;True_label;Predicted_label\n')
                    for case_id, t, true_label in zip(ids_test, times_test,
                                                      labels_test):
                        predicted_label = predictor.predict(case_id=case_id,
                                                            time=t)
                        wf.write('{};{};{};{}\n'.format(
                            case_id, t, true_label[0], predicted_label))

                enumeration += 1

    Human_Functions.save_dict_to_csv(
        enumeration_encoder, Name_functions.S_GRAEC_enumeration_dictionary(s))

    fn_data = Name_functions.DS_file(s)
    fn_ids = Name_functions.DS_test_ids(s)
    x, labels, times, ids = DI(fn_data).get_data(fn_subset_ids=fn_ids,
                                                 return_split_values=True,
                                                 return_identifiers=True)

    print('Done')
    print('\tNaive and Previous ... ', end='', flush=True)

    naive_predictor = Classifiers.NaiveClassifier(s)
    previous_predictor = Classifiers.PreviousClassifier(s)
    with open(Name_functions.S_naive_test_predictions(s), 'w+') as wf_naive:
        with open(Name_functions.S_recent_test_predictions(s),
                  'w+') as wf_previous:
            wf_naive.write('{};{};{};{}\n'.format('Case_id', 'time',
                                                  'True_label',
                                                  'Predicted_label'))
            wf_previous.write('{};{};{};{}\n'.format('Case_id', 'time',
                                                     'True_label',
                                                     'Predicted_label'))
            for case_id, t, true_label in zip(ids, times, labels):
                predicted_label_naive = naive_predictor.predict(
                    case_id=case_id, time=t)
                if predicted_label_naive is not None:
                    wf_naive.write('{};{};{};{}\n'.format(
                        case_id, t, true_label[0], predicted_label_naive))
                predicted_label_previous = previous_predictor.predict(
                    case_id=case_id, time=t)
                if predicted_label_previous is not None:
                    wf_previous.write('{};{};{};{}\n'.format(
                        case_id, t, true_label[0], predicted_label_previous))
    print('Done')