# Error function
errorFun = metrics.MeanSquareError()

# Number of iterations
iterations = 1
reservoirSize = 256

# Run Classic ESN
classicESNError = 0
print("\n Running Classic ESN Tuner..")
for i in range(iterations):
    predictedOutputData, error = util.tuneTrainPredict(trainingInputData=trainingInputData,
                                            trainingOutputData=trainingOutputData,
                                            validationOutputData=validationData,
                                            initialInputSeedForValidation=initialSeedForValidation,
                                            reservoirTopology=topology.ClassicReservoirTopology(size=reservoirSize),
                                            testingData=testingData
                                            )
    classicESNPredicted = minMax.inverse_transform(predictedOutputData)
    classicESNError += error
classicESNError = classicESNError/iterations

# Run random ESN Tuner
randomESNError = 0
connectivityOptimum = 0.72999999999999998
print("\n Running Random ESN Tuner..")
for i in range(iterations):
    predictedOutputData, error = util.tuneTrainPredict(trainingInputData=trainingInputData,
                                            trainingOutputData=trainingOutputData,
                                            validationOutputData=validationData,
# Split the data into training, validation and testing
trainingData, validationData, testingData = util.splitData(data, 0.5, 0.25, 0.25)
nValidation = validationData.shape[0]
nTesting = testingData.shape[0]

# Form feature vectors for training data
trainingInputData, trainingOutputData = util.formFeatureVectors(trainingData)
#actualOutputData = minMax.inverse_transform(np.vstack((validationData[:nValidation],testingData[:nTesting])))[:,0]
actualOutputData = minMax.inverse_transform(testingData)[:,0]

# Initial seed
initialSeedForValidation = trainingData[-1]

predictedOutputData = util.tuneTrainPredict(trainingInputData=trainingInputData,
                                            trainingOutputData=trainingOutputData,
                                            validationOutputData=validationData,
                                            initialInputSeedForValidation=initialSeedForValidation,
                                            horizon=nTesting
                                            )


predictedOutputData = minMax.inverse_transform(predictedOutputData)

#Plotting of the prediction output and error
outputFolderName = "Outputs/Outputs" + datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
os.mkdir(outputFolderName)
outplot = outputPlot.OutputPlot(outputFolderName + "/Prediction.html", "Mackey-Glass Time Series - Differential Evolution Optimization", "Predicted vs Actual", "Time", "Output")
outplot.setXSeries(np.arange(1, nTesting + 1))
outplot.setYSeries('Actual Output', actualOutputData)
outplot.setYSeries('Predicted Output', predictedOutputData)
outplot.createOutput()
trainingData, validationData, testingData = util.splitData(data, 0.5, 0.25, 0.25)
nValidation = validationData.shape[0]
nTesting = testingData.shape[0]

# Form feature vectors for training data
trainingInputData, trainingOutputData = util.formFeatureVectors(trainingData)
#actualOutputData = minMax.inverse_transform(np.vstack((validationData[:nValidation],testingData[:nTesting])))[:,0]
actualOutputData = minMax.inverse_transform(testingData)[:,0]

# Initial seed
initialSeedForValidation = trainingData[-1]

predictedOutputData, error = util.tuneTrainPredict(trainingInputData=trainingInputData,
                                            trainingOutputData=trainingOutputData,
                                            validationOutputData=validationData,
                                            initialInputSeedForValidation=initialSeedForValidation,
                                            testingData=actualOutputData,
                                            size=500
                                            )


predictedOutputData = minMax.inverse_transform(predictedOutputData)

#Plotting of the prediction output and error
outputFolderName = "Outputs/Outputs" + datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
os.mkdir(outputFolderName)
outplot = outputPlot.OutputPlot(outputFolderName + "/Prediction.html", "Mackey-Glass Time Series - Differential Evolution Optimization", "Predicted vs Actual", "Time", "Output")
outplot.setXSeries(np.arange(1, nTesting + 1))
outplot.setYSeries('Actual Output', actualOutputData)
outplot.setYSeries('Predicted Output', predictedOutputData)
outplot.createOutput()
# Error function
errorFun = metrics.MeanSquareError()

# Number of iterations
iterations = 1
reservoirSize = 256

# Run Classic ESN
classicESNError = 0
print("\n Running Classic ESN Tuner..")
for i in range(iterations):
    predictedOutputData, error = util.tuneTrainPredict(
        trainingInputData=trainingInputData,
        trainingOutputData=trainingOutputData,
        validationOutputData=validationData,
        initialInputSeedForValidation=initialSeedForValidation,
        reservoirTopology=topology.ClassicReservoirTopology(
            size=reservoirSize),
        testingData=testingData)
    classicESNPredicted = minMax.inverse_transform(predictedOutputData)
    classicESNError += error
classicESNError = classicESNError / iterations

# Run random ESN Tuner
randomESNError = 0
connectivityOptimum = 0.72999999999999998
print("\n Running Random ESN Tuner..")
for i in range(iterations):
    predictedOutputData, error = util.tuneTrainPredict(
        trainingInputData=trainingInputData,
        trainingOutputData=trainingOutputData,