# totNumSamples = 67553
numTrainBatches = data[0].get_value(borrow=True).shape[0] / batchSize
numEpochs = int(patience / numTrainBatches) * 15


hyperparameters["optAlg"] = optAlgs[1]
errorDict = {}
AUCDict = {}
mlp = initalizeModel(**hyperparameters)
score = trainWithEarlyStopping(
    mlp,
    numEpochs,
    patience,
    validationFrequency,
    data,
    variables,
    batchSize,
    errorDict,
    AUCDict,
    name=modelName,
    visualize=True,
)

print "Score:", score
print "Max valAUC:", max(AUCDict["valAUC"])

plt.ioff()

fig1 = plt.figure(1)
fig1.canvas.set_window_title("Error/Epochs")
plt.title("Error/Epochs " + hyperparameters["optAlg"])
if 'lambda1' in hyperparameters: modelName += "%.2fL1" % hyperparameters['lambda1']
if 'lambda2' in hyperparameters: modelName += "%.2fL2" % hyperparameters['lambda2']
if 'rho' in hyperparameters: modelName += "%.2fRHO" % hyperparameters['rho']
if 'epsilon' in hyperparameters: modelName += "%gEPS" % hyperparameters['epsilon']
print "Model name: " + modelName
rng = np.random.RandomState(123)
hyperparameters["rng"] = rng
variables = ['FlightDistance','FlightDistanceError', 'LifeTime', 'VertexChi2','pt','dira','DOCAone',
             'DOCAtwo','DOCAthree','IP_p0p2','IP_p1p2', 'isolationa', 'isolationb', 'isolationd',
             'isolatione', 'isolationf', 'iso', 'CDF1', 'CDF2', 'CDF3', 'ISO_SumBDT', 'p0_IsoBDT', 'p1_IsoBDT', 
             'p2_IsoBDT', 'p0_track_Chi2Dof','p1_track_Chi2Dof', 'p2_track_Chi2Dof','p0_pt','p0_p','p0_eta',
             'p0_IP','p0_IPSig','p1_pt','p1_p', 'p1_eta','p1_IP','p1_IPSig','p2_pt','p2_p','p2_eta','p2_IP',
             'p2_IPSig']
if np.round(hyperparameters.pop('SPDhits')): variables += ['SPDhits']
if np.round(hyperparameters.pop('isolationc')): variables += ['isolationc']
if np.round(hyperparameters.pop('IPSig')): variables += ['IPSig']
if np.round(hyperparameters.pop('IP')): variables += ['IP']
hyperparameters["numFeatures"] = len(variables)
optAlgs = ["RMSProp", "adaDelta", "vSGDfd"]
hyperparameters["optAlg"] = optAlgs[1]
mlp = initalizeModel(**hyperparameters)
mlp.loadModel("", folder, verbose = True)
data = loadTrainingData(variables, rng, valPart = 0.3, verbose = True)
optAlgs = ["RMSProp", "adaDelta", "vSGDfd"]
patience = 12000
validationFrequency = 1
batchSize = int(data[0].get_value(borrow=True).shape[0] / 6.) #5000 #300
numTrainBatches = data[0].get_value(borrow=True).shape[0] / batchSize
numEpochs = int(patience / numTrainBatches) * 15
trainWithEarlyStopping(mlp, numEpochs, patience, validationFrequency, data, variables, batchSize, name = modelName)