import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense, Dropout, Conv1D, Flatten, LSTM
from keras.optimizers import Adam
from keras.utils import plot_model
from scipy.io import arff
from sklearn.metrics import accuracy_score  # new line

# Load the training data
data_train, meta_train = arff.loadarff('traindata.arff')
data_train = np.array(data_train.tolist(), dtype=float) 

# Load the validation data
data_validation, meta_validation = arff.loadarff('validationdata.arff')
data_validation = np.array(data_validation.tolist(), dtype=float)

# Split the input and output
X_train = data_train[:, :-1]
Y_train = data_train[:, -1]
X_validation = data_validation[:, :-1]
Y_validation = data_validation[:, -1]

# Create the model
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(X_train.shape[1], 1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Conv1D(filters=128, kernel_size=3, activation='relu'))  # New Conv1D layer
model.add(LSTM(100))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

# Compile the model
optimizer = Adam()
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])

# Reshape input to be 3D [samples, timesteps, features]
X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], 1))
X_validation = X_validation.reshape((X_validation.shape[0], X_validation.shape[1], 1))

# Fit the model
model.fit(X_train, Y_train, validation_data=(X_validation, Y_validation), epochs=10, batch_size=64)

# Make prediction
Y_validation_prediction = (model.predict(X_validation) > 0.5).astype("int32")

# Calculate accuracy
accuracy = accuracy_score(Y_validation, Y_validation_prediction)  # new line
print(f'Validation accuracy: {accuracy*100:.2f}%')  # new line

# Concatenate the labels and the predictions
combined_data = np.column_stack((Y_validation, Y_validation_prediction))

# Create a pandas DataFrame
df = pd.DataFrame(combined_data, columns=['Actual', 'Predicted'])

# Write the DataFrame to CSV
df.to_csv('prediction.csv', index=False)

# Print the model architecture
print(model.summary())
# Plot the model architecture
plot_model(model, to_file='model.png', show_shapes=True, show_layer_names=True)
