def train(self):
     if self.net.data_set == None:
         print("Please set data sets")
     else:
         self.trainer = LMSTrainer(self.net, self.learning_rate, self.max_error, self.max_epoch)
         # self.trainer.setDefaultLearningRate()
         self.trainer.LMSTrain()
         [
             self.net.layer_to_layer_weight,
             self.net.bias_to_layer,
         ] = self.trainer.returnTrainedLayerToLayerWeightAndBias()
         self.net.updateNeuronToNeuronWeightByLayerToLayerWeight()
         self.net.updateBiasToNeuronByBiasToLayer()
class TwoLayersNeuralNetwork(object):
    def __init__(
        self,
        input_num,
        output_num,
        function_name="hardlim",
        weight=None,
        bias=None,
        data_set=None,
        learning_rate=0.2,
        max_error=0,
        max_epoch=-1,
    ):
        self.function_name = function_name
        self.input_num = input_num
        self.output_num = output_num
        self.learning_rate = learning_rate
        self.max_error = max_error
        self.max_epoch = max_epoch

        self.net = NeuronBuilder([self.input_num], [0], [self.output_num])
        self.net.connectTwoLayers("in", "out")
        self.net.setLayerFunction("out", self.function_name)

        if data_set != None:
            self.net.setDataSet(data_set)
        self.net.connectTwoLayers("in", "out")
        if weight != None:
            self.net.setLayerToLayerWeight("in", "out", weight)
        if bias != None:
            self.net.setBiasToLayer("out", bias)

    def activate(self, input_list):
        self.net.setInputToInputLayer(input_list)
        output = self.net.getOutputFromLayer("out")
        return output

    def setDataSet(self, data_set):
        self.net.input_data = None
        self.net.output_data = None
        self.net.setDataSet(data_set)

    def train(self):
        if self.net.data_set == None:
            print("Please set data sets")
        else:
            self.trainer = LMSTrainer(self.net, self.learning_rate, self.max_error, self.max_epoch)
            # self.trainer.setDefaultLearningRate()
            self.trainer.LMSTrain()
            [
                self.net.layer_to_layer_weight,
                self.net.bias_to_layer,
            ] = self.trainer.returnTrainedLayerToLayerWeightAndBias()
            self.net.updateNeuronToNeuronWeightByLayerToLayerWeight()
            self.net.updateBiasToNeuronByBiasToLayer()

    def plotFigure(self):
        self.trainer.plotFigure()

    def setLearningRate(self, learning_rate):
        self.learning_rate = learning_rate

    def setMaxError(self, max_error):
        self.max_error = max_error

    def setMaxEpoch(self, max_epoch):
        self.max_epoch = max_epoch

    def returnNeuronBuilder(self):
        return self.net

    def setNeuronBuilder(self, net):
        self.net = net

    def showNetworkSimulation(self):
        self.net.showNetworkSimulation()