#
# based on a version coded ANN of FIMO's group
#
# modified by Mr. Nam @ 05-Mar-2022
# just for test ANN model
#

import os.path
import os, sys, itertools
import numpy as np
import pandas as pd
import joblib

from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error

# Phan tram dung luong mau dung de test doc lap mo hinh:
test_size          = 0.22

#
# just for testing network
#
data = pd.read_csv('../data/HANOI_month=7_lead=3.txt', delimiter='\s+')
X    = data[['nino34','ao']]
y    = data['rainfall']
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=None, shuffle=False) # shuffle=False disable random

# Trong so cua mo hinh nhan duoc tu tap luyen:
filename = 'finalized_model.sav'

#Node_1 = 100
#Node_2 = 200
#Node_3 = 300
#L_rate = 0.1
#Mx_iter= 200
#Alfa   = 0.0001

f = open("ANN_Para.txt", "r")
lines = f.readlines()

if not os.path.isfile(filename):
	#
	# fit the model on training set
	#
	print('training MLPRegressor model')
	# hidden_layer_sizes: 100, 200, 300: So nodes ung voi moi lop an (trong truong hop nay la 3)
	# activation: Ham kich hoat
	# solver: The solver for weight optimization 
	# model = MLPRegressor(hidden_layer_sizes=(100, 200, 300),activation='relu',solver='lbfgs',alpha=0.0001,batch_size='auto',learning_rate_init=0.001,max_iter=200000,shuffle=False)
	model = MLPRegressor(hidden_layer_sizes=(Node_1, Node_2, Node_3),activation='relu',solver='lbfgs',alpha=Alfa,batch_size='auto',learning_rate_init=L_rate,max_iter=Mx_iter,shuffle=False)

	model.fit(x_train, y_train)
	#
	# save the model to disk
	#
	joblib.dump(model, filename)

#
# load the model from disk
#
# Doc trong so:
loaded_model = joblib.load(filename)
# Uoc luong cho tap luyen:
y_train_pred = loaded_model.predict(x_train)
# Uoc luong cho tap test doc lap:
y_test_pred = loaded_model.predict(x_test)

#
# print_out:
#
for i in range(len(y_train_pred)):
	print(y_train.to_numpy()[i],round(y_train_pred[i],2))

# Print to file:
sys.stdout=open('results.txt','w')
for i in range(len(y_train_pred)):
        print(y_train.to_numpy()[i],round(y_train_pred[i],2))
sys.stdout.close()
