# Save the model
###############################################################################

cnn.save_model_json(model_export_path, 'model_json')
cnn.save_model_weights(model_export_path, 'model_weights')
cnn.save_model_single_file(model_export_path, 'model_single')

#%%############################################################################
# Load the model
###############################################################################

if load_model == True:
    import_path = os.path.join(os.getcwd(), 'model_export',
                               '2019-06-12_21-46-36')
    #cnn.load_model_single_file(import_path, 'model_single')
    cnn.load_model_json(import_path, 'model_json', 'model_weights')

#%%############################################################################
# Predict some data
###############################################################################
rand_int = np.random.randint(low=0, high=np.size(X_test_data, axis=0))
X_test = X_test_data[rand_int, ]
y_test = y_test_data[rand_int, ]

y_pred = cnn.predict_sample(X_test)

plt_slice = 8
if border == None:
    plt.imshow(X_test[8, :, :])
else:
    X_inner = impro.get_inner_slice(X_test, border)
#path_to_spheroid = os.path.join('..', '..', '..', 'Datensaetze', 'Aufnahmen_und_Segmentierungen', 'Datensatz2', category, spheroid_name)

category = 'none'
spheroid_name = 'X_scaled.nrrd'
path_to_spheroid = os.path.join('..', '..', '..', 'Datensaetze',
                                'OpenSegSPIM_Beispieldaten', 'Neurosphere',
                                spheroid_name)

#path_to_spheroid = os.path.join('Skalierung', 'NPC1', 'C3-2-1_1-3_upper.nrrd')

#%%############################################################################
# Initialize the CNN
###############################################################################
cnn = CNN(linear_output_scaling_factor=linear_output_scaling_factor,
          standardization_mode=standardization_mode)
cnn.load_model_json(model_import_path, 'model_json', 'best_weights')

#%%############################################################################
# Predict the density-map
###############################################################################
spheroid_new, density_map, num_of_cells = cnn.predict_density_map(
    path_to_spheroid=path_to_spheroid,
    patch_sizes=patch_sizes,
    strides=strides,
    border=cut_border,
    padding=padding)
plt.figure()
plt.imshow(spheroid_new[int(spheroid_new.shape[0] / 2), ])
plt.figure()
plt.imshow(density_map[int(density_map.shape[0] / 2), ])
print('Number of cells = ', num_of_cells)
    train_spheroids=test_spheroids,
    val_spheroids=test_spheroids,
    test_spheroids=test_spheroids)

# Load unstandardized test data
X_test_data, y_test_data = datatools.load_data(path_to_dataset=path_to_dataset,
                                               data_list=test_files,
                                               input_shape=data_shape,
                                               standardization_mode=None,
                                               border=border)

###############################################################################
# Load the model
###############################################################################
#cnn.load_model_single_file(import_path, 'model_single')
cnn = CNN(linear_output_scaling_factor=linear_output_scaling_factor,
          standardization_mode=standardization_mode)
cnn.load_model_json(model_import_path, 'model_json', weights)

# Evaluate the model on the test data
summary = cnn.compile_model(loss=loss, optimizer=optimizer, metrics=metrics)
test_loss_best_weights = cnn.evaluate_model(X_test=X_test_data,
                                            y_test=y_test_data,
                                            batch_size=batch_size)
print(test_loss_best_weights)

# Export the value of the test-loss
test_loss_export_path = os.path.join('test_loss_best_weights.txt')
with open(test_loss_export_path, 'w') as file:
    for l in range(len(test_loss_best_weights)):
        file.write(str(test_loss_best_weights[l]) + '\n')