def run_VanilaGANGenerator(train, test, epochs, latent_size, hidden_neurons,
                           n_samples, learning_rate, random_neg_sample,
                           real_pos, name):
    gan_obj = VanilaGANGenerator(train, test, epochs, latent_size, name)
    gan_obj.define_models_GAN(learning_rate, hidden_neurons, type=None)
    gan_obj.train_model()
    gan_sample = gan_obj.generate_samples(n_samples)
    #tsne_plot(gan_sample, name)
    ks_result1, ks_result2 = compare_attributes_distribution(
        real_pos, gan_sample, name)
    fid = calculate_fid(real_pos, gan_sample)
    print("Frechet Inception Distance:", fid)
    tsne_data_comparision(real_pos, random_neg_sample, gan_sample, name, None,
                          'VGAN')
    get_combined_generated = get_combined_generated_real(
        gan_sample, train, name)
    # print("Count of Failure and non failure",get_combined_generated.failure.value_counts())
    (train_X, train_y) = split_XY(get_combined_generated)
    (test_X, test_y) = split_XY(test)
    # classify_baseline_model(test_y)
    #multiple_classifier(train_X, train_y.values.ravel(), test_X, test_y.values.ravel(), name, ks_result1, ks_result2,
    #                    fid)
    # xgb_classifier(train_X, train_y.values.ravel(), test_X, test_y.values.ravel(),name)
    # rf_classifier(train_X, train_y.values.ravel(), test_X, test_y.values.ravel(),name)
    return gan_sample, ks_result1, ks_result2, fid
def vae_gan_model():
    epochs, latent_size = 1500, 50
    name = "best_test-2_vae_gan_gantrain_200-128_64_50_0005"
    n_layer = 3
    hidden_neurons = 128
    learning_rate = 0.0002

    cgan_sample, vae_sample, ks_result1, ks_result2, fid = run_VAECGAN_Generator(
        train_main, test_main, epochs, latent_size, n_samples, n_layer,
        learning_rate, hidden_neurons, name, random_neg, random_pos)
    print("VAE sample shape", vae_sample.shape)
    tsne_data_comparision(random_pos,
                          random_neg,
                          cgan_sample,
                          name,
                          vae_sample,
                          method='VAE_CGAN')

    get_combined_generated = get_combined_generated_real(
        cgan_sample, train_main, name)

    (train_X, train_y) = split_XY(get_combined_generated)
    (test_X, test_y) = split_XY(test_main)
    multiple_classifier(train_X, train_y.values.ravel(), test_X,
                        test_y.values.ravel(), name, ks_result1, ks_result2,
                        fid)
    print(
        "======================Both GAN and VAE=============================")
    name = name + "VAE_GAN-both"
    get_combined_generated = get_combined_generated_real(
        vae_sample, get_combined_generated, name)
    (train_X, train_y) = split_XY(get_combined_generated)
    (test_X, test_y) = split_XY(test_main)
def cgan_vae_model():
    epochs, latent_size = 200, 50
    name = "best_test_cgan-vae_100-128_64_50_0005"
    n_layer = 2
    hidden_neurons = 64
    learning_rate = 0.0005

    vae_sample, cgan_sample, ks_result1, ks_result2, fid = run_CGAN_VAE_Generator(
        train_main, test_main, epochs, latent_size, n_samples, n_layer,
        learning_rate, hidden_neurons, name, random_neg, random_pos)

    tsne_data_comparision(random_pos, random_neg, vae_sample, name,
                          cgan_sample, 'CGAN_VAE')

    get_combined_generated = get_combined_generated_real(
        vae_sample, train_main, name)

    (train_X, train_y) = split_XY(get_combined_generated)
    (test_X, test_y) = split_XY(test_main)
    multiple_classifier(train_X, train_y.values.ravel(), test_X,
                        test_y.values.ravel(), name, ks_result1, ks_result2,
                        fid)
    print(
        "======================Both GAN and VAE=============================")
    name = name + "CGAN-VAE-both"
    get_combined_generated = get_combined_generated_real(
        vae_sample, get_combined_generated, name)
    (train_X, train_y) = split_XY(get_combined_generated)
    (test_X, test_y) = split_XY(test_main)
def run_VAECGAN_Generator(train, test, epochs, latent_size, n_samples, n_layer,
                          learning_rate, hidden_neurons, name,
                          random_neg_sample, random_pos):

    vae_sample = pd.read_csv(r'generated_data/VAE_no_mmd.csv').sample(
        n=1000, random_state=123)

    # vae_sample, ks_result1, ks_result2, fid = run_VAEGenerator(train, test, epochs, latent_size,
    #                                                            n_samples, n_layer,
    #                                                            hidden_neurons,
    #                                                            learning_rate, name,
    #                                                            random_neg)
    # # vae_sample, noise = vae_obj.generate_samples(n_samples)
    # get_vae_combine = get_combined_generated_real(vae_sample, train, "vae_gan")

    vae_combine = get_combined_generated_real(vae_sample, train, name)

    cgan_sample, ks_result3, ks_result4, fid2 = run_CGANGenerator(
        vae_combine,
        test,
        epochs,
        latent_size,
        n_samples,
        n_layer,
        learning_rate,
        hidden_neurons,
        name,
        random_neg_sample,
        random_pos,
        model_type='VAE_CGAN')
    tsne_data_comparision(random_pos, random_neg_sample, cgan_sample[:, :-1],
                          name, vae_sample, 'VAE_CGAN')

    #get_combined_generated = get_combined_generated_real(cgan_sample, train, name)
    return cgan_sample, vae_sample, ks_result3, ks_result4, fid2
    print("Count of Failure and non failure", get_combined_generated.shape,
          get_combined_generated.failure.value_counts())
    (train_X, train_y) = split_XY(get_combined_generated)
    (test_X, test_y) = split_XY(test)
    #multiple_classifier(train_X, train_y.values.ravel(), test_X, test_y.values.ravel(),
    #                    name, ks_result3, ks_result4, fid2)

    print(
        "======================Both GAN and VAE=============================")
    name = name + "VAE_GAN-both"
    get_combined_generated = get_combined_generated_real(
        vae_sample, get_combined_generated, name)
    (train_X, train_y) = split_XY(get_combined_generated)
    (test_X, test_y) = split_XY(test)
def run_VAEGenerator(train, test, epochs, latent, n_samples, n_layer,
                     hidden_neurons, learning_rate, name, random_neg_sample):
    vae_obj = VAEGenerator(train, test, epochs, latent, name)
    vae_obj.build_model(n_layer, hidden_neurons, learning_rate)
    name = vae_obj.train_model()
    vae_sample, noise = vae_obj.generate_samples(n_samples)
    print(vae_sample.shape, train.shape)
    real_pos = train[train.failure == 1][train.columns.drop('failure')].sample(
        frac=1, random_state=123)
    ks_result1, ks_result2 = compare_distribution(real_pos, vae_sample, name)

    fid = calculate_fid(real_pos, vae_sample)
    print("Frechet Inception Distance:", fid)
    tsne_data_comparision(real_pos, random_neg_sample, vae_sample, name, 'VAE')
    return vae_sample, ks_result1, ks_result2, fid
def run_CGANGenerator(train,
                      test,
                      epochs,
                      latent_size,
                      n_samples,
                      n_layer,
                      learning_rate,
                      hidden_neurons,
                      name,
                      random_neg_sample,
                      real_pos,
                      model_type='CGAN'):

    gan_obj = CGANGenerator(train, test, epochs, latent_size, name)
    gan_obj.define_models_CGAN(n_layer,
                               n_layer,
                               learning_rate,
                               learning_rate,
                               latent_size,
                               hidden_neurons,
                               type=None)
    gan_obj.train_model(model_type)
    gan_sample = gan_obj.generate_samples(n_samples)
    ks_result1, ks_result2 = compare_distribution(real_pos, gan_sample[:, :-1],
                                                  name)
    fid = calculate_fid(real_pos, gan_sample[:, :-1])
    print("Frechet Inception Distance:", fid)
    if model_type == 'CGAN':
        tsne_data_comparision(real_pos, random_neg_sample, gan_sample[:, :-1],
                              name, None, model_type)

    #get_combined_generated = get_combined_generated_real(gan_sample[:,:-1],train,name)
    # print("Count of Failure and non failure",get_combined_generated.failure.value_counts())
    #(train_X, train_y) = split_XY(get_combined_generated)
    #(test_X, test_y) = split_XY(test)
    #multiple_classifier(train_X, train_y.values.ravel(), test_X, test_y.values.ravel(),name,ks_result1,ks_result2,fid)
    #xgb_classifier(train_X, train_y.values.ravel(), test_X, test_y.values.ravel(),name)
    #rf_classifier(train_X, train_y.values.ravel(), test_X, test_y.values.ravel(),name)
    return gan_sample[:, :-1], ks_result1, ks_result2, fid