def train_individual_cased_joy():
    train, dev, _ = get_bert_data_loader('joy', uncased=False)
    final_training_stats = []

    for d in [0.1, 0.2, 0.3]:
        for w in [0.8, 0.85, 0.9, 0.95]:
            for e in [1e-06, 1e-07, 1e-08]:
                for lr in [2e-5, 3e-5, 5e-5]:
                    cased_model = BertForCasedClassification(dropout=d)
                    cased_trained, _, _, _ = train_model(
                        cased_model,
                        'joy_cased',
                        train,
                        dev,
                        filepath='./models/joy_cased/',
                        lr=lr,
                        eps=e,
                        weight_decay=w)
                    final_training_stats.extend(cased_trained)
    pd.DataFrame(final_training_stats).to_csv(
        './data/models/cased-bert/results/joy/results.csv')
def train_individual_uncased_sadness():
    train, dev, _ = get_bert_data_loader('sadness')
    final_training_stats = []

    for d in [0.1, 0.2, 0.3]:
        for w in [0.8, 0.85, 0.9, 0.95]:
            for e in [1e-06, 1e-07, 1e-08]:
                for lr in [2e-5, 3e-5, 5e-5]:
                    uncased_model = BertForUncasedClassification(dropout=d)
                    uncased_trained, _, _, _ = train_model(
                        uncased_model,
                        'sadness_uncased',
                        train,
                        dev,
                        filepath='./models/sadness_uncased/',
                        lr=lr,
                        eps=e,
                        weight_decay=w)

                    final_training_stats.extend(uncased_trained)

    pd.DataFrame(final_training_stats).to_csv(
        './data/models/uncased-bert/results/sadness/results.csv')
def train_ordinal_fear():
    fear_train_dataloader_uncased, fear_val_dataloader_uncased, fear_test_dataloader_uncased = get_bert_data_loader(
        'fear')
    fear_uncased_model_1 = BertForUncasedClassification_1()
    #fear_cased_model_1 = BertForCasedClassification_1()

    fear_uncased_model_2 = BertForUncasedClassification_2()
    #fear_cased_model_2 = BertForCasedClassification_2()

    fear_uncased_model_3 = BertForUncasedClassification_3()
    #fear_cased_model_3 = BertForCasedClassification_3()

    ### has to be based on the data distribution for each emotion
    class_weights1 = torch.tensor([1, 2], dtype=torch.float)
    class_weights2 = torch.tensor([1, 4], dtype=torch.float)
    class_weights3 = torch.tensor([1, 10], dtype=torch.float)

    final_training_stats_au_1 = []
    for lr in [2e-5, 3e-5, 5e-5]:
        fear_uncased_model_1 = BertForUncasedClassification_1()

        uncased_fear_train_1, model1_fearUncased = train(
            class_weights1,
            1,
            fear_uncased_model_1,
            fear_train_dataloader_uncased,
            fear_test_dataloader_uncased,
            filepath='fear_uncased_ordinal',
            lr=lr)

        final_training_stats_au_1.append(uncased_fear_train_1)
    pd.DataFrame(final_training_stats_au_1[0]).to_csv(
        './data/models/ordinal/fear/lr_2e-5_model1.csv')
    pd.DataFrame(final_training_stats_au_1[1]).to_csv(
        './data/models/ordinal/fear/lr_3e-5_model1.csv')
    pd.DataFrame(final_training_stats_au_1[2]).to_csv(
        './data/models/ordinal/fear/lr_5e-5_model1.csv')

    final_training_stats_au_2 = []
    for lr in [2e-5, 3e-5, 5e-5]:
        fear_uncased_model_2 = BertForUncasedClassification_2()

        uncased_fear_train_2, fear_uncased_model2 = train(
            class_weights2,
            2,
            fear_uncased_model_2,
            fear_train_dataloader_uncased,
            fear_test_dataloader_uncased,
            filepath='fear_uncased_ordinal',
            lr=lr)

        final_training_stats_au_2.append(uncased_fear_train_2)

    pd.DataFrame(final_training_stats_au_2[0]).to_csv(
        './data/models/ordinal/fear/lr_2e-5_model2.csv')
    pd.DataFrame(final_training_stats_au_2[1]).to_csv(
        './data/models/ordinal/fear/lr_3e-5_model2.csv')
    pd.DataFrame(final_training_stats_au_2[2]).to_csv(
        './data/models/ordinal/fear/lr_5e-5_model2.csv')

    final_training_stats_au_3 = []
    for lr in [2e-5, 3e-5, 5e-5]:
        fear_uncased_model_3 = BertForUncasedClassification_3()

        uncased_fear_train_3, fear_uncased_model3 = train(
            class_weights3,
            3,
            fear_uncased_model_3,
            fear_train_dataloader_uncased,
            fear_test_dataloader_uncased,
            filepath='fear_uncased_ordinal',
            lr=lr)

        final_training_stats_au_3.append(uncased_fear_train_3)

    pd.DataFrame(final_training_stats_au_3[0]).to_csv(
        './data/models/ordinal/fear/lr_2e-5_model3.csv')
    pd.DataFrame(final_training_stats_au_3[1]).to_csv(
        './data/models/ordinal/fear/lr_3e-5_model3.csv')
    pd.DataFrame(final_training_stats_au_3[2]).to_csv(
        './data/models/ordinal/fear/lr_5e-5_model3.csv')
def train_ordinal_sadness():
  sadness_train_dataloader_uncased, sadness_val_dataloader_uncased, sadness_test_dataloader_uncased = get_bert_data_loader('sadness')
  sadness_uncased_model_1 = BertForUncasedClassification_1()
  #sadness_cased_model_1 = BertForCasedClassification_1()

  sadness_uncased_model_2 = BertForUncasedClassification_2()
  #sadness_cased_model_2 = BertForCasedClassification_2()

  sadness_uncased_model_3 = BertForUncasedClassification_3()
  #sadness_cased_model_3 = BertForCasedClassification_3()

  ### has to be based on the data distribution for each emotion
  class_weights1 = torch.tensor([1.56,1], dtype = torch.float)
  class_weights2 = torch.tensor([1,1.29], dtype = torch.float)
  class_weights3 = torch.tensor([1,3.96], dtype = torch.float)

  final_training_stats_au_1 = []
  for lr in [2e-5, 3e-5, 5e-5]:
    sadness_uncased_model_1 = BertForUncasedClassification_1()

    uncased_sadness_train_1, model1_sadnessUncased = train(
      class_weights1,  
      1,
      sadness_uncased_model_1,
      sadness_train_dataloader_uncased,
      sadness_test_dataloader_uncased,
      filepath='sadness_uncased_ordinal',
      lr=lr
    )

    final_training_stats_au_1.append(uncased_sadness_train_1)
  pd.DataFrame(final_training_stats_au_1[0]).to_csv('./data/models/ordinal/sadness/lr_2e-5_model1.csv')
  pd.DataFrame(final_training_stats_au_1[1]).to_csv('./data/models/ordinal/sadness/lr_3e-5_model1.csv')
  pd.DataFrame(final_training_stats_au_1[2]).to_csv('./data/models/ordinal/sadness/lr_5e-5_model1.csv')
 
  final_training_stats_au_2 = []
  for lr in [2e-5, 3e-5, 5e-5]:
    sadness_uncased_model_2 = BertForUncasedClassification_2()

    uncased_sadness_train_2, sadness_uncased_model2 = train(
      class_weights2,  
      2,
      sadness_uncased_model_2,
      sadness_train_dataloader_uncased,
      sadness_test_dataloader_uncased,
      filepath='sadness_uncased_ordinal',
      lr=lr
    )

    final_training_stats_au_2.append(uncased_sadness_train_2)

  pd.DataFrame(final_training_stats_au_2[0]).to_csv('./data/models/ordinal/sadness/lr_2e-5_model2.csv')
  pd.DataFrame(final_training_stats_au_2[1]).to_csv('./data/models/ordinal/sadness/lr_3e-5_model2.csv')
  pd.DataFrame(final_training_stats_au_2[2]).to_csv('./data/models/ordinal/sadness/lr_5e-5_model2.csv')


  final_training_stats_au_3 = []
  for lr in [2e-5, 3e-5, 5e-5]:
    sadness_uncased_model_3 = BertForUncasedClassification_3()

    uncased_sadness_train_3, sadness_uncased_model3 = train(
      class_weights3,  
      3,
      sadness_uncased_model_3,
      sadness_train_dataloader_uncased,
      sadness_test_dataloader_uncased,
      filepath='sadness_uncased_ordinal',
      lr=lr
    )

    final_training_stats_au_3.append(uncased_sadness_train_3)

  pd.DataFrame(final_training_stats_au_3[0]).to_csv('./data/models/ordinal/sadness/lr_2e-5_model3.csv')
  pd.DataFrame(final_training_stats_au_3[1]).to_csv('./data/models/ordinal/sadness/lr_3e-5_model3.csv')
  pd.DataFrame(final_training_stats_au_3[2]).to_csv('./data/models/ordinal/sadness/lr_5e-5_model3.csv')