def __init__(self, grammarController, currentTransition): self.grammarController = grammarController self.currentTransition = currentTransition if self.currentTransition is None: self.idTransition = str(uuid.uuid4()) else: self.idTransition = self.currentTransition.getID() self._view = CreateSemiStochasticTransitionView(self, self.idTransition) self.log = logging.getLogger(__name__) if self.currentTransition is not None: self.view.idSemiStochasticTransitionEntry.set_text(self.idTransition) self.view.nameSemiStochasticTransitionEntry.set_text(self.currentTransition.getName()) # Retrieves the list of states and of input symbols states = [] inputSymbols = [EmptySymbol(), UnknownSymbol()] currentProject = self.grammarController.getCurrentProject() if currentProject is not None: automata = currentProject.getGrammar().getAutomata() if automata is not None: states.extend(automata.getStates()) vocabulary = currentProject.getVocabulary() if vocabulary is not None: inputSymbols.extend(vocabulary.getSymbols()) # Set the start state i = 0 for state in states: if str(state.getID()) == self.currentTransition.getInputState().getID(): self.view.startStateSemiStochasticTransitionComboBox.set_active(i) break i += 1 # Set the end state i = 0 for state in states: if str(state.getID()) == self.currentTransition.getOutputState().getID(): self.view.endStateSemiStochasticTransitionComboBox.set_active(i) break i += 1 # Set the input symbol i = 0 for symbol in inputSymbols: if str(symbol.getID()) == self.currentTransition.getInputSymbol().getID(): self.view.inputSymbolSemiStochasticTransitionComboBox.set_active(i) break i += 1 # Set the output symbols outputSymbols = self.currentTransition.getOutputSymbols() for outputSymbolTupple in outputSymbols: (outputSymbol, probabilityOutput, timeOutput) = outputSymbolTupple i = self.view.outputSymbolsListStore.append() self.view.outputSymbolsListStore.set(i, 0, str(outputSymbol.getID())) self.view.outputSymbolsListStore.set(i, 1, outputSymbol.getName()) self.view.outputSymbolsListStore.set(i, 2, probabilityOutput) self.view.outputSymbolsListStore.set(i, 3, timeOutput)
def __init__(self, grammarController, currentTransition): self.grammarController = grammarController self.currentTransition = currentTransition if self.currentTransition is None: self.idTransition = str(uuid.uuid4()) else: self.idTransition = self.currentTransition.getID() self._view = CreateSemiStochasticTransitionView( self, self.idTransition) self.log = logging.getLogger(__name__) if self.currentTransition is not None: self.view.idSemiStochasticTransitionEntry.set_text( self.idTransition) self.view.nameSemiStochasticTransitionEntry.set_text( self.currentTransition.getName()) # Retrieves the list of states and of input symbols states = [] inputSymbols = [EmptySymbol(), UnknownSymbol()] currentProject = self.grammarController.getCurrentProject() if currentProject is not None: automata = currentProject.getGrammar().getAutomata() if automata is not None: states.extend(automata.getStates()) vocabulary = currentProject.getVocabulary() if vocabulary is not None: inputSymbols.extend(vocabulary.getSymbols()) # Set the start state i = 0 for state in states: if str(state.getID()) == self.currentTransition.getInputState( ).getID(): self.view.startStateSemiStochasticTransitionComboBox.set_active( i) break i += 1 # Set the end state i = 0 for state in states: if str(state.getID()) == self.currentTransition.getOutputState( ).getID(): self.view.endStateSemiStochasticTransitionComboBox.set_active( i) break i += 1 # Set the input symbol i = 0 for symbol in inputSymbols: if str(symbol.getID() ) == self.currentTransition.getInputSymbol().getID(): self.view.inputSymbolSemiStochasticTransitionComboBox.set_active( i) break i += 1 # Set the output symbols outputSymbols = self.currentTransition.getOutputSymbols() for outputSymbolTupple in outputSymbols: (outputSymbol, probabilityOutput, timeOutput) = outputSymbolTupple i = self.view.outputSymbolsListStore.append() self.view.outputSymbolsListStore.set(i, 0, str(outputSymbol.getID())) self.view.outputSymbolsListStore.set(i, 1, outputSymbol.getName()) self.view.outputSymbolsListStore.set(i, 2, probabilityOutput) self.view.outputSymbolsListStore.set(i, 3, timeOutput)
class CreateSemiStochasticTransitionController(object): """Manages the creation of a new SemiStochasticTransition""" def __init__(self, grammarController, currentTransition): self.grammarController = grammarController self.currentTransition = currentTransition if self.currentTransition is None: self.idTransition = str(uuid.uuid4()) else: self.idTransition = self.currentTransition.getID() self._view = CreateSemiStochasticTransitionView( self, self.idTransition) self.log = logging.getLogger(__name__) if self.currentTransition is not None: self.view.idSemiStochasticTransitionEntry.set_text( self.idTransition) self.view.nameSemiStochasticTransitionEntry.set_text( self.currentTransition.getName()) # Retrieves the list of states and of input symbols states = [] inputSymbols = [EmptySymbol(), UnknownSymbol()] currentProject = self.grammarController.getCurrentProject() if currentProject is not None: automata = currentProject.getGrammar().getAutomata() if automata is not None: states.extend(automata.getStates()) vocabulary = currentProject.getVocabulary() if vocabulary is not None: inputSymbols.extend(vocabulary.getSymbols()) # Set the start state i = 0 for state in states: if str(state.getID()) == self.currentTransition.getInputState( ).getID(): self.view.startStateSemiStochasticTransitionComboBox.set_active( i) break i += 1 # Set the end state i = 0 for state in states: if str(state.getID()) == self.currentTransition.getOutputState( ).getID(): self.view.endStateSemiStochasticTransitionComboBox.set_active( i) break i += 1 # Set the input symbol i = 0 for symbol in inputSymbols: if str(symbol.getID() ) == self.currentTransition.getInputSymbol().getID(): self.view.inputSymbolSemiStochasticTransitionComboBox.set_active( i) break i += 1 # Set the output symbols outputSymbols = self.currentTransition.getOutputSymbols() for outputSymbolTupple in outputSymbols: (outputSymbol, probabilityOutput, timeOutput) = outputSymbolTupple i = self.view.outputSymbolsListStore.append() self.view.outputSymbolsListStore.set(i, 0, str(outputSymbol.getID())) self.view.outputSymbolsListStore.set(i, 1, outputSymbol.getName()) self.view.outputSymbolsListStore.set(i, 2, probabilityOutput) self.view.outputSymbolsListStore.set(i, 3, timeOutput) @property def view(self): return self._view def displayErrorMessage(self, errorMessage): if errorMessage is None: self._view.errorSemiStochasticTransitionImage.hide() self._view.errorSemiStochasticTransitionLabel.set_label("") self._view.errorSemiStochasticTransitionLabel.hide() else: self._view.errorSemiStochasticTransitionLabel.set_label( errorMessage) self._view.errorSemiStochasticTransitionLabel.show() self._view.errorSemiStochasticTransitionImage.show() def cancelSemiStochasticTransitionButton_clicked_cb(self, event): """Callback executed when the user clicks on the cancel button""" self._view.destroy() def createSemiStochasticTransitionButton_clicked_cb(self, event): """callback executed when the user requests the creation of the transition""" currentProject = self.grammarController.getCurrentProject() # Remove old transition if currentProject is not None: automata = currentProject.getGrammar().getAutomata() if self.currentTransition is not None: automata.removeTransition(self.currentTransition) # Retrieve the states and symbols of the current project states = [] symbols = [EmptySymbol(), UnknownSymbol()] if currentProject is not None: automata = currentProject.getGrammar().getAutomata() if automata is not None: states.extend(automata.getStates()) vocabulary = currentProject.getVocabulary() if vocabulary is not None: symbols.extend(vocabulary.getSymbols()) # Name of the transition nameTransition = self._view.nameSemiStochasticTransitionEntry.get_text( ) if nameTransition is None or len(nameTransition) == 0: errorMessage = _("Give a name to the transition.") self.displayErrorMessage(errorMessage) return # Start and End state of the transition startState_iter = self._view.startStateSemiStochasticTransitionComboBox.get_active_iter( ) endState_iter = self._view.endStateSemiStochasticTransitionComboBox.get_active_iter( ) if startState_iter is None: errorMessage = _("Select a start state.") self.displayErrorMessage(errorMessage) return if endState_iter is None: errorMessage = _("Select an end state") self.displayErrorMessage(errorMessage) return idStartState = self._view.startStateSemiStochasticTransitionComboBox.get_model( )[startState_iter][0] idEndState = self._view.endStateSemiStochasticTransitionComboBox.get_model( )[endState_iter][0] startState = None endState = None for state in states: if str(state.getID()) == str(idStartState): startState = state if str(state.getID()) == str(idEndState): endState = state if startState is not None and endState is not None: break if startState is None: errorMessage = _( "An error occurred and prevented to retrieve the provided start state." ) self.displayErrorMessage(errorMessage) return if endState is None: errorMesssage = _( "An error occurred and prevented to retrieve the provided end state." ) self.displayErrorMessage(errorMessage) return # Input Symbol inputSymbolIter = self._view.inputSymbolSemiStochasticTransitionComboBox.get_active_iter( ) if inputSymbolIter is None: errorMessage = _("Select an input Symbol.") self.displayErrorMessage(errorMessage) return idInputSymbol = self._view.inputSymbolSemiStochasticTransitionComboBox.get_model( )[inputSymbolIter][0] inputSymbol = None for symbol in symbols: if str(symbol.getID()) == str(idInputSymbol): inputSymbol = symbol break if inputSymbol is None: errorMessage = _( "An error occurred and prevented to retrieve the provided input symbol" ) self.displayErrorMessage(errorMessage) return # Verify the start state doesn't have a transition which has the same input symbol found = False for startStateTransition in startState.getTransitions(): if startStateTransition.getType() == SemiStochasticTransition.TYPE: if str(startStateTransition.getInputSymbol().getID()) == str( inputSymbol.getID()): found = True break if found: errorMessage = _( "The specified start state already has a transition with the same input symbol." ) self.displayErrorMessage(errorMessage) return if len(self._view.outputSymbolsListStore) == 0: errorMessage = _( "Provide at least 1 output symbol (even an EmptySymbol).") self.displayErrorMessage(errorMessage) return # Create the transition transition = SemiStochasticTransition(self.idTransition, nameTransition, startState, endState, inputSymbol) # Now we add all the output symbols for row in self._view.outputSymbolsListStore: idOutputSymbol = row[0] probaOutputSymbol = row[2] timeOutputSymbol = row[3] outputSymbol = None for symbol in symbols: if str(symbol.getID()) == str(idOutputSymbol): outputSymbol = symbol break if outputSymbol is None: errorMessage = _( "An error occurred and prevented to retrieve the output symbols" ) self.displayErrorMessage(errorMessage) return transition.addOutputSymbol(outputSymbol, probaOutputSymbol, timeOutputSymbol) # Add the transition startState.registerTransition(transition) # attach the transition to the grammar self.grammarController.getCurrentProject().getGrammar().getAutomata( ).addTransition(transition) self._view.destroy() self.grammarController.restart() def addOutputSymbolSemiStochasticTransitionButton_clicked_cb(self, event): symbols = [EmptySymbol(), UnknownSymbol()] currentProject = self.grammarController.getCurrentProject() if currentProject is not None: vocabulary = currentProject.getVocabulary() if vocabulary is not None: symbols.extend(vocabulary.getSymbols()) # Retrieve the output symbol active_iter = self._view.outputSymbolSemiStochasticTransitionComboBox.get_active_iter( ) if active_iter is None: errorMessage = _("Select an output Symbol before adding it.") self.displayErrorMessage(errorMessage) return idSymbol = self._view.outputSymbolSemiStochasticTransitionComboBox.get_model( )[active_iter][0] outputSymbol = None for symbol in symbols: if str(symbol.getID()) == str(idSymbol): outputSymbol = symbol break if outputSymbol is None: errorMessage = _( "An error occured and prevented to retrieved the output symbol." ) self.displayErrorMessage(errorMessage) return # Retrieve the probability of the symbol probabilityOutputSymbol = float(0.0) try: probabilityOutputSymbol = float( self._view.outputSymbolProbabilitySemiStochasticTransitionEntry .get_text()) except: errorMessage = _( "Specify a valid probability defined over 100 (float)") self.displayErrorMessage(errorMessage) return if probabilityOutputSymbol < 0 or probabilityOutputSymbol > 100: errorMessage = _( "Specify a valid probability (0.0<=probability<=100.0)") self.displayErrorMessage(errorMessage) return # Retrieve the time of the output symbol timeOutputSymbol = 0 try: timeOutputSymbol = int( self._view.outputSymbolTimeSemiStochasticTransitionEntry. get_text()) except: errorMessage = _( "Specify a valid time defined in millisecond (int)") self.displayErrorMessage(errorMessage) return if timeOutputSymbol < 0: errorMessage = _("Specify a valid time (0<=time)") self.displayErrorMessage(errorMessage) return # Now we verify its the first time this symbol is considered as an output symbol found = False sumProba = probabilityOutputSymbol for row in self._view.outputSymbolsListStore: if str(row[0]) == str(outputSymbol.getID()): found = True break sumProba += row[2] if found: errorMessage = _( "You cannot add multiple time the same output symbol.") self.displayErrorMessage(errorMessage) return # We verify the sum of probabilities is under 100 if sumProba > 100: errorMessage = _( "The sum of probabilities is above 100, please adapt the provided value." ) self.displayErrorMessage(errorMessage) return i = self._view.outputSymbolsListStore.append() self._view.outputSymbolsListStore.set(i, 0, str(outputSymbol.getID())) self._view.outputSymbolsListStore.set(i, 1, outputSymbol.getName()) self._view.outputSymbolsListStore.set(i, 2, probabilityOutputSymbol) self._view.outputSymbolsListStore.set(i, 3, timeOutputSymbol) self.displayErrorMessage(None) def removeOutputSymbolSemiStochasticTransitionButton_clicked_cb( self, event): """Callback executed when the user requests to remove a selected output symbol including its probability and its time from the current list""" # Retrieve the selection selection = self._view.outputSymbolsSemiStochasticTransitionTreeview.get_selection( ) if selection is None: errorMessage = _("Select an output Symbol before removing it.") self.displayErrorMessage(errorMessage) return (model, path) = selection.get_selected() if model is None or path is None: errorMessage = _("Select an output Symbol before removing it.") self.displayErrorMessage(errorMessage) return model.remove(path) def run(self): self._view.run()
class CreateSemiStochasticTransitionController(object): """Manages the creation of a new SemiStochasticTransition""" def __init__(self, grammarController, currentTransition): self.grammarController = grammarController self.currentTransition = currentTransition if self.currentTransition is None: self.idTransition = str(uuid.uuid4()) else: self.idTransition = self.currentTransition.getID() self._view = CreateSemiStochasticTransitionView(self, self.idTransition) self.log = logging.getLogger(__name__) if self.currentTransition is not None: self.view.idSemiStochasticTransitionEntry.set_text(self.idTransition) self.view.nameSemiStochasticTransitionEntry.set_text(self.currentTransition.getName()) # Retrieves the list of states and of input symbols states = [] inputSymbols = [EmptySymbol(), UnknownSymbol()] currentProject = self.grammarController.getCurrentProject() if currentProject is not None: automata = currentProject.getGrammar().getAutomata() if automata is not None: states.extend(automata.getStates()) vocabulary = currentProject.getVocabulary() if vocabulary is not None: inputSymbols.extend(vocabulary.getSymbols()) # Set the start state i = 0 for state in states: if str(state.getID()) == self.currentTransition.getInputState().getID(): self.view.startStateSemiStochasticTransitionComboBox.set_active(i) break i += 1 # Set the end state i = 0 for state in states: if str(state.getID()) == self.currentTransition.getOutputState().getID(): self.view.endStateSemiStochasticTransitionComboBox.set_active(i) break i += 1 # Set the input symbol i = 0 for symbol in inputSymbols: if str(symbol.getID()) == self.currentTransition.getInputSymbol().getID(): self.view.inputSymbolSemiStochasticTransitionComboBox.set_active(i) break i += 1 # Set the output symbols outputSymbols = self.currentTransition.getOutputSymbols() for outputSymbolTupple in outputSymbols: (outputSymbol, probabilityOutput, timeOutput) = outputSymbolTupple i = self.view.outputSymbolsListStore.append() self.view.outputSymbolsListStore.set(i, 0, str(outputSymbol.getID())) self.view.outputSymbolsListStore.set(i, 1, outputSymbol.getName()) self.view.outputSymbolsListStore.set(i, 2, probabilityOutput) self.view.outputSymbolsListStore.set(i, 3, timeOutput) @property def view(self): return self._view def displayErrorMessage(self, errorMessage): if errorMessage is None: self._view.errorSemiStochasticTransitionImage.hide() self._view.errorSemiStochasticTransitionLabel.set_label("") self._view.errorSemiStochasticTransitionLabel.hide() else: self._view.errorSemiStochasticTransitionLabel.set_label(errorMessage) self._view.errorSemiStochasticTransitionLabel.show() self._view.errorSemiStochasticTransitionImage.show() def cancelSemiStochasticTransitionButton_clicked_cb(self, event): """Callback executed when the user clicks on the cancel button""" self._view.destroy() def createSemiStochasticTransitionButton_clicked_cb(self, event): """callback executed when the user requests the creation of the transition""" currentProject = self.grammarController.getCurrentProject() # Remove old transition if currentProject is not None: automata = currentProject.getGrammar().getAutomata() if self.currentTransition is not None: automata.removeTransition(self.currentTransition) # Retrieve the states and symbols of the current project states = [] symbols = [EmptySymbol(), UnknownSymbol()] if currentProject is not None: automata = currentProject.getGrammar().getAutomata() if automata is not None: states.extend(automata.getStates()) vocabulary = currentProject.getVocabulary() if vocabulary is not None: symbols.extend(vocabulary.getSymbols()) # Name of the transition nameTransition = self._view.nameSemiStochasticTransitionEntry.get_text() if nameTransition is None or len(nameTransition) == 0: errorMessage = _("Give a name to the transition.") self.displayErrorMessage(errorMessage) return # Start and End state of the transition startState_iter = self._view.startStateSemiStochasticTransitionComboBox.get_active_iter() endState_iter = self._view.endStateSemiStochasticTransitionComboBox.get_active_iter() if startState_iter is None: errorMessage = _("Select a start state.") self.displayErrorMessage(errorMessage) return if endState_iter is None: errorMessage = _("Select an end state") self.displayErrorMessage(errorMessage) return idStartState = self._view.startStateSemiStochasticTransitionComboBox.get_model()[startState_iter][0] idEndState = self._view.endStateSemiStochasticTransitionComboBox.get_model()[endState_iter][0] startState = None endState = None for state in states: if str(state.getID()) == str(idStartState): startState = state if str(state.getID()) == str(idEndState): endState = state if startState is not None and endState is not None: break if startState is None: errorMessage = _("An error occurred and prevented to retrieve the provided start state.") self.displayErrorMessage(errorMessage) return if endState is None: errorMesssage = _("An error occurred and prevented to retrieve the provided end state.") self.displayErrorMessage(errorMessage) return # Input Symbol inputSymbolIter = self._view.inputSymbolSemiStochasticTransitionComboBox.get_active_iter() if inputSymbolIter is None: errorMessage = _("Select an input Symbol.") self.displayErrorMessage(errorMessage) return idInputSymbol = self._view.inputSymbolSemiStochasticTransitionComboBox.get_model()[inputSymbolIter][0] inputSymbol = None for symbol in symbols: if str(symbol.getID()) == str(idInputSymbol): inputSymbol = symbol break if inputSymbol is None: errorMessage = _("An error occurred and prevented to retrieve the provided input symbol") self.displayErrorMessage(errorMessage) return # Verify the start state doesn't have a transition which has the same input symbol found = False for startStateTransition in startState.getTransitions(): if startStateTransition.getType() == SemiStochasticTransition.TYPE: if str(startStateTransition.getInputSymbol().getID()) == str(inputSymbol.getID()): found = True break if found: errorMessage = _("The specified start state already has a transition with the same input symbol.") self.displayErrorMessage(errorMessage) return if len(self._view.outputSymbolsListStore) == 0: errorMessage = _("Provide at least 1 output symbol (even an EmptySymbol).") self.displayErrorMessage(errorMessage) return # Create the transition transition = SemiStochasticTransition(self.idTransition, nameTransition, startState, endState, inputSymbol) # Now we add all the output symbols for row in self._view.outputSymbolsListStore: idOutputSymbol = row[0] probaOutputSymbol = row[2] timeOutputSymbol = row[3] outputSymbol = None for symbol in symbols: if str(symbol.getID()) == str(idOutputSymbol): outputSymbol = symbol break if outputSymbol is None: errorMessage = _("An error occurred and prevented to retrieve the output symbols") self.displayErrorMessage(errorMessage) return transition.addOutputSymbol(outputSymbol, probaOutputSymbol, timeOutputSymbol) # Add the transition startState.registerTransition(transition) # attach the transition to the grammar self.grammarController.getCurrentProject().getGrammar().getAutomata().addTransition(transition) self._view.destroy() self.grammarController.restart() def addOutputSymbolSemiStochasticTransitionButton_clicked_cb(self, event): symbols = [EmptySymbol(), UnknownSymbol()] currentProject = self.grammarController.getCurrentProject() if currentProject is not None: vocabulary = currentProject.getVocabulary() if vocabulary is not None: symbols.extend(vocabulary.getSymbols()) # Retrieve the output symbol active_iter = self._view.outputSymbolSemiStochasticTransitionComboBox.get_active_iter() if active_iter is None: errorMessage = _("Select an output Symbol before adding it.") self.displayErrorMessage(errorMessage) return idSymbol = self._view.outputSymbolSemiStochasticTransitionComboBox.get_model()[active_iter][0] outputSymbol = None for symbol in symbols: if str(symbol.getID()) == str(idSymbol): outputSymbol = symbol break if outputSymbol is None: errorMessage = _("An error occured and prevented to retrieved the output symbol.") self.displayErrorMessage(errorMessage) return # Retrieve the probability of the symbol probabilityOutputSymbol = float(0.0) try: probabilityOutputSymbol = float(self._view.outputSymbolProbabilitySemiStochasticTransitionEntry.get_text()) except: errorMessage = _("Specify a valid probability defined over 100 (float)") self.displayErrorMessage(errorMessage) return if probabilityOutputSymbol < 0 or probabilityOutputSymbol > 100: errorMessage = _("Specify a valid probability (0.0<=probability<=100.0)") self.displayErrorMessage(errorMessage) return # Retrieve the time of the output symbol timeOutputSymbol = 0 try: timeOutputSymbol = int(self._view.outputSymbolTimeSemiStochasticTransitionEntry.get_text()) except: errorMessage = _("Specify a valid time defined in millisecond (int)") self.displayErrorMessage(errorMessage) return if timeOutputSymbol < 0: errorMessage = _("Specify a valid time (0<=time)") self.displayErrorMessage(errorMessage) return # Now we verify its the first time this symbol is considered as an output symbol found = False sumProba = probabilityOutputSymbol for row in self._view.outputSymbolsListStore: if str(row[0]) == str(outputSymbol.getID()): found = True break sumProba += row[2] if found: errorMessage = _("You cannot add multiple time the same output symbol.") self.displayErrorMessage(errorMessage) return # We verify the sum of probabilities is under 100 if sumProba > 100: errorMessage = _("The sum of probabilities is above 100, please adapt the provided value.") self.displayErrorMessage(errorMessage) return i = self._view.outputSymbolsListStore.append() self._view.outputSymbolsListStore.set(i, 0, str(outputSymbol.getID())) self._view.outputSymbolsListStore.set(i, 1, outputSymbol.getName()) self._view.outputSymbolsListStore.set(i, 2, probabilityOutputSymbol) self._view.outputSymbolsListStore.set(i, 3, timeOutputSymbol) self.displayErrorMessage(None) def removeOutputSymbolSemiStochasticTransitionButton_clicked_cb(self, event): """Callback executed when the user requests to remove a selected output symbol including its probability and its time from the current list""" # Retrieve the selection selection = self._view.outputSymbolsSemiStochasticTransitionTreeview.get_selection() if selection is None: errorMessage = _("Select an output Symbol before removing it.") self.displayErrorMessage(errorMessage) return (model, path) = selection.get_selected() if model is None or path is None: errorMessage = _("Select an output Symbol before removing it.") self.displayErrorMessage(errorMessage) return model.remove(path) def run(self): self._view.run()