class NeuralNetworkClassifier:

	def __init__(self, mimetype, inputUnits, outputUnits, logging = True):
		"""
		constructor for the neural network classifier
		"""
		self.outputHeader = "#nn"
		self.inputUnits = inputUnits
		self.outputUnits = outputUnits
		self.mimetype = mimetype
		self.numberOfHiddenUnits = None
		self.nn = None
		self.testError = None

		if logging:
			self.setLoggingLevel()

	def setLoggingLevel(self):
		"""
		This function sets the logging level of the neural network
		"""
		logging.basicConfig(
            format="%(message)s",
            level=logging.INFO,
            stream=sys.stdout)

	def buildModel(self,numberOfLayers, listOfLayerSpecification, learningRate, numIters):
		"""
		This function builds the neural network layers. The input 
		is the number of layers and the second parameter contains thre
		type of layers to be used
		"""
		self.numberOfHiddenUnits = numberOfLayers
		layers = []
		for i in range(0,numberOfLayers):
			layers.append(Layer(listOfLayerSpecification[i], units = 1))
		layers.append(Layer("Softmax"))
		self.initializeNeuralNetwork(layers,learningRate,numIters)

	def initializeNeuralNetwork(self,layers,learningRate,numIters):
		"""
		This will build the Neural Network and make it ready for training
		"""
		self.nn = Classifier(
    		layers= layers,
    		learning_rate=learningRate,
    		n_iter=numIters
    	)

	def trainNetwork(self,X, Y):
		"""
		Training the neural network
		"""
		self.nn.fit(X, Y)

	def validateNetwork(self,X, Y):
		"""
		Validate the neural network
		"""
		YPred = self.nn.predict(X)
		print accuracy_score(Y, YPred)

	def testNetwork(self,X, Y):
		"""
		Test the neural network
		"""
		YPred = self.nn.predict(X)
		self.testError = 1 - accuracy_score(Y, YPred)
		print accuracy_score(Y, YPred)

	def dumpNeuralNetParameters(self, filename):
		"""
		Dump Neural Network dumpNeuralNetParameters
		"""
		nn_parameters = self.nn.get_parameters()

		with open(filename+".nnmodel", "wb") as myfile:
			myfile.write(self.outputHeader + " " + self.mimetype + " "+
				str(self.inputUnits)+" "+ str(self.numberOfHiddenUnits) + " "+
				str(self.outputUnits)+" "+str(self.testError)+"\n")

		for i in nn_parameters:
			if "hidden" in i[2]:
				for j in i[0]:
					with open(filename+".nnmodel", "a") as myfile:
						myfile.write(str(j[0]) + "\t")
X_train = X[:train_set_size]
X_test = X[train_set_size:]
y_train = y[:train_set_size]
y_test = y[train_set_size:]
nn = Classifier(
    layers = [
    Layer("Rectifier", units=100),
    Layer("Softmax")],    
    n_iter=1,
    learning_rule = 'rmsprop')
#w_train = np.array((X_train.shape[0],))
#w_train = []
#w_train[y_train == 0] = 1.2
#w_train[y_train == 1] = 0.8

#nn.fit(X_train, y_train, w_train)
nn.fit(X_train, y_train)

#y_valid = nn.predict(X_valid)
nn.get_parameters()
nn.predict(X_train)
#score = nn.score(X_test, y_test)
#plt.scatter(X_train, y_train,  color='black')
#plt.scatter(X_test, y_test)
#plt.show()
#plt.scatter()
#logging.basicConfig(
 #           format="%(message)s",
  #          level=logging.DEBUG,
   #         stream=sys.stdout)