Python - Macchina a stati per l'elaborazione del testo

Una macchina a stati riguarda la progettazione di un programma per controllare il flusso in un'applicazione. è un grafo diretto, costituito da un insieme di nodi e un insieme di funzioni di transizione. L'elaborazione di un file di testo molto spesso consiste nella lettura sequenziale di ogni blocco di un file di testo e l'esecuzione di qualcosa in risposta a ogni blocco letto. Il significato di un blocco dipende da quali tipi di blocchi erano presenti prima di esso e da quali blocchi vengono dopo. La macchina sta progettando un programma per controllare il flusso in un'applicazione. è un grafo diretto, costituito da un insieme di nodi e un insieme di funzioni di transizione. L'elaborazione di un file di testo molto spesso consiste nella lettura sequenziale di ogni blocco di un file di testo e l'esecuzione di qualcosa in risposta a ogni blocco letto. Il significato di un blocco dipende da quali tipi di blocchi erano presenti prima di esso e da quali blocchi vengono dopo.

Considera uno scenario in cui il testo inserito deve essere una sequenza continua di ripetizione di sequenza di AGC (utilizzata nell'analisi delle proteine). Se questa specifica sequenza viene mantenuta nella stringa di input lo stato della macchina rimane TRUE ma non appena la sequenza devia, lo stato della macchina diventa FALSE e rimane FALSE dopo. Ciò garantisce che l'ulteriore elaborazione venga interrotta anche se in seguito potrebbero essere disponibili più blocchi di sequenze corrette.

The below program defines a state machine which has functions to start the machine, take inputs for processing the text and step through the processing.

class StateMachine:
# Initialize 
    def start(self):
        self.state = self.startState
# Step through the input
    def step(self, inp):
        (s, o) = self.getNextValues(self.state, inp)
        self.state = s
        return o
# Loop through the input		
    def feeder(self, inputs):
        self.start()
        return [self.step(inp) for inp in inputs]
# Determine the TRUE or FALSE state
class TextSeq(StateMachine):
    startState = 0
    def getNextValues(self, state, inp):
        if state == 0 and inp == 'A':
            return (1, True)
        elif state == 1 and inp == 'G':
            return (2, True)
        elif state == 2 and inp == 'C':
            return (0, True)
        else:
            return (3, False)
InSeq = TextSeq()
x = InSeq.feeder(['A','A','A'])
print x
y = InSeq.feeder(['A', 'G', 'C', 'A', 'C', 'A', 'G'])
print y

When we run the above program, we get the following output −

[True, False, False]
[True, True, True, True, False, False, False]

In the result of x, the pattern of AGC fails for the second input after the first 'A'. The state of the result remains False forever after this. In the result of Y, the pattern of AGC continues till the 4th input. Hence the state of the result remains True till that point. But from 5th input the result changes to False as G is expected, but C is found.