def teach(version = 2, verbose = False):

    completed = 1

    if version == 1:
        NN1 = NN()

        inputFilePath = generateFilename(description='minmaxinputDataset')
        outputFilePath = generateFilename(description='minmaxoutputDataset')

        loadData = NN1.loadData(inputFilePath,outputFilePath)

        train = NN1.teachPyBrain(verbose=False)

        saveResults = NN1.saveResults()

        fileIn = generateFilename(description="networkResults")

        fileOut_x_t = generateFilename(description="NNoutput_x_t")
        fileOut_y_t = generateFilename(description="NNoutput_y_t")
        fileOut_z_t = generateFilename(description="NNoutput_z_t")

        dataset = Dataset()

        sepX = dataset.separate(filepathOut=fileOut_x_t,filepathIn=fileIn,columns=[0,3])
        sepY = dataset.separate(filepathOut=fileOut_y_t,filepathIn=fileIn,columns=[1,3])
        sepZ = dataset.separate(filepathOut=fileOut_z_t,filepathIn=fileIn,columns=[2,3])

        errorFilepath = generateFilename(description="networkError")

        saveErrors = NN1.saveError(errorFilepath)

        #plotData(fileOut_x_t)
        #plotData(fileOut_y_t)
        #plotData(fileOut_z_t)

        completed = 0

    if version == 2:

        NN1 = NN()

        #Load Dataset in Neural Network
        inputFilePath = generateFilename(description='normInputDataset')
        outputFilePath = generateFilename(description='normOutputDataset')
        loadData = NN1.loadData(inputFilePath,outputFilePath)

        #Teach using Pybrain
        epochs=5
        hiddenLayers=4
        teachNN = NN1.teachPyBrain(epochs=epochs,hiddenLayers=hiddenLayers,verbose=False)

        #Save Results (Save outputs for given inputs)
        saveResultsPath = generateFilename(description='resultsNN')
        saveResults = NN1.saveResults(saveResultsPath)

        #Separate Results
        sepResultsFilepathX = generateFilename(description='resultsNN_x_t')
        sepResultsFilepathY = generateFilename(description='resultsNN_y_t')
        sepResultsFilepathZ = generateFilename(description='resultsNN_z_t')
        columnsX_T = [0,3]
        columnsY_T = [1,3]
        columnsZ_T = [2,3]

        sepResultsX = Dataset().separate(sepResultsFilepathX,saveResultsPath,columnsX_T)
        sepResultsY = Dataset().separate(sepResultsFilepathY,saveResultsPath,columnsY_T)
        sepResultsZ = Dataset().separate(sepResultsFilepathZ,saveResultsPath,columnsZ_T)

        #Denormalize Results
        outputFilePath = generateFilename(description='outputDataset')
        minmaxValues = (-1.,1.)
        resultsData = Dataset()
        resultsData.dataset = NN1.results
        outputDataset = np.load(outputFilePath)
        resultsData.min_dataset = outputDataset.min(axis=0)
        resultsData.max_dataset = outputDataset.max(axis=0)
        resultsData.min = minmaxValues[0]
        resultsData.max = minmaxValues[1]
        denormResults = resultsData.denormalize()

        #Save Denormalized Results
        denormResultsPath = generateFilename(description='denormResultsNN')
        resultsData.saveToFile(denormResultsPath)

        #Separate Denormalized Results
        sepDenormResultsFilepathX = generateFilename(description='denormResultsNN_x_t')
        sepDenormResultsFilepathY = generateFilename(description='denormResultsNN_y_t')
        sepDenormResultsFilepathZ = generateFilename(description='denormResultsNN_z_t')
        columnsX_T = [0,3]
        columnsY_T = [1,3]
        columnsZ_T = [2,3]

        sepDenormResultsX = Dataset().separate(sepDenormResultsFilepathX,denormResultsPath,columnsX_T)
        sepDenormResultsY = Dataset().separate(sepDenormResultsFilepathY,denormResultsPath,columnsY_T)
        sepDenormResultsZ = Dataset().separate(sepDenormResultsFilepathZ,denormResultsPath,columnsZ_T)

        #Save Errors
        saveErrorsPath = generateFilename(description='errorsNN')
        saveErrors = NN1.saveError(saveErrorsPath)

        #Save Weights
        savedWeightsfilepath = generateFilename(description='weightsNN')
        savedWeights = NN1.getWeights()
        saveWeights = NN1.saveWeights()

        print savedWeights

        print

        for item in savedWeights:
            print item

        if loadData + \
                teachNN + \
                saveResults + \
                sepResultsX + \
                sepResultsY + \
                sepResultsZ + \
                denormResults + \
                sepDenormResultsX + \
                sepDenormResultsY + \
                sepDenormResultsZ + \
                saveErrors == 0:

            completed = 0

    if version == 3:

        inputDataFilepath = generateFilename(description = "stations", extension = ".txt", dateToday = False)

        fp = open(inputDataFilepath)

        listOfSatellites = []

        for i, line in enumerate(fp):
            if i%3 == 0:
                listOfSatellites.append(line.strip())

        for satellites in listOfSatellites:

            print satellites

            NN1 = NN()

            #Load Dataset in Neural Network
            inputFilePath = generateFilename(description='normInputDataset%s'%satellites)
            outputFilePath = generateFilename(description='normOutputDataset%s'%satellites)
            loadData = NN1.loadData(inputFilePath,outputFilePath)

            #Teach using Pybrain
            epochs=5
            hiddenLayers=4
            teachNN = NN1.teachPyBrain(epochs=epochs,hiddenLayers=hiddenLayers,verbose=False)

            #Save Results (Save outputs for given inputs)
            saveResultsPath = generateFilename(description='resultsNN%s'%satellites)
            saveResults = NN1.saveResults(saveResultsPath)

            #Separate Results
            sepResultsFilepathX = generateFilename(description='resultsNN_x_t%s'%satellites)
            sepResultsFilepathY = generateFilename(description='resultsNN_y_t%s'%satellites)
            sepResultsFilepathZ = generateFilename(description='resultsNN_z_t%s'%satellites)
            columnsX_T = [0,3]
            columnsY_T = [1,3]
            columnsZ_T = [2,3]

            sepResultsX = Dataset().separate(sepResultsFilepathX,saveResultsPath,columnsX_T)
            sepResultsY = Dataset().separate(sepResultsFilepathY,saveResultsPath,columnsY_T)
            sepResultsZ = Dataset().separate(sepResultsFilepathZ,saveResultsPath,columnsZ_T)

            #Denormalize Results
            outputFilePath = generateFilename(description='outputDataset%s'%satellites)
            minmaxValues = (-1.,1.)
            resultsData = Dataset()
            resultsData.dataset = NN1.results
            outputDataset = np.load(outputFilePath)
            resultsData.min_dataset = outputDataset.min(axis=0)
            resultsData.max_dataset = outputDataset.max(axis=0)
            resultsData.min = minmaxValues[0]
            resultsData.max = minmaxValues[1]
            denormResults = resultsData.denormalize()

            #Save Denormalized Results
            denormResultsPath = generateFilename(description='denormResultsNN%s'%satellites)
            resultsData.saveToFile(denormResultsPath)

            #Separate Denormalized Results
            sepDenormResultsFilepathX = generateFilename(description='denormResultsNN_x_t%s'%satellites)
            sepDenormResultsFilepathY = generateFilename(description='denormResultsNN_y_t%s'%satellites)
            sepDenormResultsFilepathZ = generateFilename(description='denormResultsNN_z_t%s'%satellites)
            columnsX_T = [0,3]
            columnsY_T = [1,3]
            columnsZ_T = [2,3]

            sepDenormResultsX = Dataset().separate(sepDenormResultsFilepathX,denormResultsPath,columnsX_T)
            sepDenormResultsY = Dataset().separate(sepDenormResultsFilepathY,denormResultsPath,columnsY_T)
            sepDenormResultsZ = Dataset().separate(sepDenormResultsFilepathZ,denormResultsPath,columnsZ_T)

            #Save Errors
            saveErrorsPath = generateFilename(description='errorsNN%s'%satellites)
            saveErrors = NN1.saveError(saveErrorsPath)

            #Save Weights
            savedWeightsfilepath = generateFilename(description='weightsNN%s'%satellites)
            savedWeights = NN1.getWeights()
            saveWeights = NN1.saveWeights()

            if loadData + \
                    teachNN + \
                    saveResults + \
                    sepResultsX + \
                    sepResultsY + \
                    sepResultsZ + \
                    denormResults + \
                    sepDenormResultsX + \
                    sepDenormResultsY + \
                    sepDenormResultsZ + \
                    saveErrors == 0:

                completed = 0

                pass

    if version == 4:

        listNumberHiddenLayers =[2,3,4,5]
        listNumberEpochs = [5,10,30,60]

        for hiddenLayers in listNumberHiddenLayers:
            for epochs in listNumberEpochs:
                print "layers %d , epochs %d" % (hiddenLayers,epochs)
                NN1 = NN()

                #Load Dataset in Neural Network
                inputFilePath = generateFilename(description='normInputDataset')
                outputFilePath = generateFilename(description='normOutputDataset')
                loadData = NN1.loadData(inputFilePath,outputFilePath)

                #Teach using Pybrain
                teachNN = NN1.teachPyBrain(epochs=epochs,hiddenLayers=hiddenLayers,verbose=False)

                #Save Results (Save outputs for given inputs)
                saveResultsPath = generateFilename(description='resultsNN_%d_h_%d_e_'%(hiddenLayers,epochs))
                saveResults = NN1.saveResults(saveResultsPath)

                #Separate Results
                sepResultsFilepathX = generateFilename(description='resultsNN_x_t_%d_h_%d_e_'%(hiddenLayers,epochs))
                sepResultsFilepathY = generateFilename(description='resultsNN_y_t_%d_h_%d_e_'%(hiddenLayers,epochs))
                sepResultsFilepathZ = generateFilename(description='resultsNN_z_t_%d_h_%d_e_'%(hiddenLayers,epochs))
                columnsX_T = [0,3]
                columnsY_T = [1,3]
                columnsZ_T = [2,3]

                sepResultsX = Dataset().separate(sepResultsFilepathX,saveResultsPath,columnsX_T)
                sepResultsY = Dataset().separate(sepResultsFilepathY,saveResultsPath,columnsY_T)
                sepResultsZ = Dataset().separate(sepResultsFilepathZ,saveResultsPath,columnsZ_T)

                #Denormalize Results
                outputFilePath = generateFilename(description='outputDataset')
                minmaxValues = (-1.,1.)
                resultsData = Dataset()
                resultsData.dataset = NN1.results
                outputDataset = np.load(outputFilePath)
                resultsData.min_dataset = outputDataset.min(axis=0)
                resultsData.max_dataset = outputDataset.max(axis=0)
                resultsData.min = minmaxValues[0]
                resultsData.max = minmaxValues[1]
                denormResults = resultsData.denormalize()

                #Save Denormalized Results
                denormResultsPath = generateFilename(description='denormResultsNN_%d_h_%d_e_'%(hiddenLayers,epochs))
                resultsData.saveToFile(denormResultsPath)

                #Separate Denormalized Results
                sepDenormResultsFilepathX = generateFilename(description='denormResultsNN_x_t_%d_h_%d_e_'%(hiddenLayers,epochs))
                sepDenormResultsFilepathY = generateFilename(description='denormResultsNN_y_t_%d_h_%d_e_'%(hiddenLayers,epochs))
                sepDenormResultsFilepathZ = generateFilename(description='denormResultsNN_z_t_%d_h_%d_e_'%(hiddenLayers,epochs))
                columnsX_T = [0,3]
                columnsY_T = [1,3]
                columnsZ_T = [2,3]

                sepDenormResultsX = Dataset().separate(sepDenormResultsFilepathX,denormResultsPath,columnsX_T)
                sepDenormResultsY = Dataset().separate(sepDenormResultsFilepathY,denormResultsPath,columnsY_T)
                sepDenormResultsZ = Dataset().separate(sepDenormResultsFilepathZ,denormResultsPath,columnsZ_T)

                #Save Errors
                saveErrorsPath = generateFilename(description='errorsNN_%d_h_%d_e_'%(hiddenLayers,epochs))
                saveErrors = NN1.saveError(saveErrorsPath)

                #Save Weights
                savedWeightsfilepath = generateFilename(description='weightsNN_%d_h_%d_e_'%(hiddenLayers,epochs))
                savedWeights = NN1.getWeights()
                saveWeights = NN1.saveWeights()

    return completed