def __init__(self, network_model=None):
        QDialog.__init__(self)

        self.ui = Ui_NetworkCreator()
        self.ui.setupUi(self)

        self.model_ready = False
        self.network_model = network_model or NetworkModel(self.ui.minWeights.value(), self.ui.maxWeights.value())

        self._setup_default_functions_comboboxes()
        self._setup_table()
        self._setup_network_parameters()
        self.ui.neuronsTable.setModel(self.network_model.default_layer())
        self.model_ready = True
class NetworkCreatorDialog(QDialog):
    def __init__(self, network_model=None):
        QDialog.__init__(self)

        self.ui = Ui_NetworkCreator()
        self.ui.setupUi(self)

        self.model_ready = False
        self.network_model = network_model or NetworkModel(self.ui.minWeights.value(), self.ui.maxWeights.value())

        self._setup_default_functions_comboboxes()
        self._setup_table()
        self._setup_network_parameters()
        self.ui.neuronsTable.setModel(self.network_model.default_layer())
        self.model_ready = True

    def create_network(self):
        basic_network = NetworkCreator().create_network(self.network_model)
        return basic_network

    @pyqtSlot(int)
    def on_layersEdit_valueChanged(self, value):
        if self.model_ready:
            items_count = self.ui.layerComboBox.count()
            if value > items_count:
                for i in range(items_count + 1, value + 1):
                    layer = self.network_model.add_layer()
                    self.ui.layerComboBox.addItem(layer.layer_name())
            elif value < items_count:
                for i in range(value, items_count):
                    self.ui.layerComboBox.removeItem(i)
                    self.network_model.remove_layer()

    @pyqtSlot(int)
    def on_neuronsEdit_valueChanged(self, neurons_number):
        if self.model_ready:
            layer_index = self.ui.layerComboBox.currentIndex()
            self.network_model.set_neurons_for_layer(layer_index, neurons_number)

    @pyqtSlot(int)
    def on_inputNeuronsEdit_valueChanged(self, value):
        if self.model_ready:
            self.network_model.set_network_input_neurons(value)

    @pyqtSlot(int)
    def on_layerComboBox_currentIndexChanged(self, layer_number):
        if self.model_ready:
            model = self.network_model.layer_model(layer_number)
            self.ui.neuronsTable.setModel(model)
            self.ui.neuronsEdit.setValue(model.rowCount())
            self.ui.layerTypeSelector.setCurrentIndex(self.ui.layerTypeSelector.findText(model.layer_type()))

    @pyqtSlot(str)
    def on_defaultPSPComboBox_currentIndexChanged(self, value):
        if self.model_ready:
            self.ui.neuronsTable.model().set_default_psp(value)

    @pyqtSlot(str)
    def on_defaultActivationComboBox_currentIndexChanged(self, value):
        if self.model_ready:
            self.ui.neuronsTable.model().set_default_activation(value)

    def _setup_table(self):
        self.ui.neuronsTable.setItemDelegateForColumn(0, self._create_psp_combobox())
        self.ui.neuronsTable.setItemDelegateForColumn(1, self._create_activator_combobox())
        self.ui.neuronsTable.horizontalHeader().setResizeMode(QHeaderView.Stretch)

    def _setup_default_functions_comboboxes(self):
        self.ui.defaultPSPComboBox.addItems(PSPUtil.registered_psps())
        self.ui.defaultActivationComboBox.addItems(ActivatorUtil.registered_activators())
        self.ui.defaultActivationComboBox.setCurrentIndex(
            self.ui.defaultActivationComboBox.findText(ActivatorUtil.default_activator())
        )

    def _setup_network_parameters(self):
        self.ui.layerTypeSelector.addItems(Layers.layers_types())
        self.ui.layerTypeSelector.setCurrentIndex(
            self.ui.layerTypeSelector.findText(Layers.default_layer())
        )
        self.ui.layersEdit.setValue(len(self.network_model.layers()))
        for layer in self.network_model.layers():
            self.ui.layerComboBox.addItem(layer.layer_name())
        self.ui.inputNeuronsEdit.setValue(self.network_model.network_inputs())
        self.ui.neuronsEdit.setValue(self.network_model.default_layer().rowCount())

    def _create_activator_combobox(self):
        return ComboBoxSelector(self.ui.neuronsTable, ActivatorUtil.registered_activators())

    def _create_psp_combobox(self):
        return ComboBoxSelector(self.ui.neuronsTable, PSPUtil.registered_psps())

    @pyqtSlot()
    def on_randomizeWeightsButton_clicked(self):
        self.ui.neuronsTable.model().randomize_weights(self.ui.minWeights.value(), self.ui.maxWeights.value())

    @pyqtSlot(float)
    def on_minWeights_valueChanged(self, value):
        self.network_model.set_min_random_weights(value)

    @pyqtSlot(float)
    def on_maxWeights_valueChanged(self, value):
        self.network_model.set_max_random_weights(value)

    @pyqtSlot(str)
    def on_layerTypeSelector_currentIndexChanged(self, value):
        if self.model_ready:
            self.ui.neuronsTable.model().set_layer_type(value)