Python - Máquina de estado de processamento de texto

Uma máquina de estado é sobre o projeto de um programa para controlar o fluxo em um aplicativo. é um grafo direcionado, consistindo em um conjunto de nós e um conjunto de funções de transição. O processamento de um arquivo de texto frequentemente consiste na leitura sequencial de cada pedaço de um arquivo de texto e em fazer algo em resposta a cada pedaço lido. O significado de um chunk depende de quais tipos de chunks estavam presentes antes dele e quais chunks vêm depois dele. O objetivo da máquina é projetar um programa para controlar o fluxo em um aplicativo. é um grafo direcionado, consistindo em um conjunto de nós e um conjunto de funções de transição. O processamento de um arquivo de texto frequentemente consiste na leitura sequencial de cada pedaço de um arquivo de texto e em fazer algo em resposta a cada pedaço lido. O significado de um chunk depende de quais tipos de chunks estavam presentes antes dele e quais chunks vêm depois dele.

Considere um cenário onde o texto colocado tem que ser uma sequência contínua de repetição da sequência do AGC (usado na análise de proteínas). Se esta sequência específica for mantida na string de entrada, o estado da máquina permanece TRUE, mas assim que a sequência se desvia, o estado da máquina torna-se FALSE e permanece FALSE após wards. Isso garante que o processamento posterior seja interrompido, embora possa haver mais blocos de sequências corretas disponíveis posteriormente.

O programa abaixo define uma máquina de estado que tem funções para iniciar a máquina, obter entradas para processar o texto e percorrer o processamento.

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

Quando executamos o programa acima, obtemos a seguinte saída -

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

No resultado de x, o padrão de AGC falha para a segunda entrada após o primeiro 'A'. O estado do resultado permanece False para sempre depois disso. No resultado de Y, o padrão de AGC continua até a 4ª entrada. Portanto, o estado do resultado permanece True até esse ponto. Mas a partir da 5ª entrada, o resultado muda para False, pois G é esperado, mas C é encontrado.