Python: máquina de estado de procesamiento de texto
Una máquina de estado consiste en diseñar un programa para controlar el flujo en una aplicación. es un gráfico dirigido, que consta de un conjunto de nodos y un conjunto de funciones de transición. El procesamiento de un archivo de texto a menudo consiste en la lectura secuencial de cada fragmento de un archivo de texto y hacer algo en respuesta a cada fragmento leído. El significado de un fragmento depende de qué tipos de fragmentos estaban presentes antes y qué fragmentos vienen después. La máquina se trata de diseñar un programa para controlar el flujo en una aplicación. es un gráfico dirigido, que consta de un conjunto de nodos y un conjunto de funciones de transición. El procesamiento de un archivo de texto a menudo consiste en la lectura secuencial de cada fragmento de un archivo de texto y hacer algo en respuesta a cada fragmento leído. El significado de un fragmento depende de qué tipos de fragmentos estaban presentes antes y qué fragmentos vienen después.
Considere un escenario donde el texto puesto tiene que ser una cadena continua de repetición de la secuencia de AGC (usada en el análisis de proteínas). Si esta secuencia específica se mantiene en la cadena de entrada, el estado de la máquina permanece VERDADERO, pero tan pronto como la secuencia se desvía, el estado de la máquina se vuelve FALSO y permanece FALSO después de las salas. Esto asegura que el procesamiento adicional se detenga aunque haya más fragmentos de secuencias correctas disponibles más adelante.
El siguiente programa define una máquina de estado que tiene funciones para iniciar la máquina, tomar entradas para procesar el texto y recorrer el proceso.
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
Cuando ejecutamos el programa anterior, obtenemos el siguiente resultado:
[True, False, False]
[True, True, True, True, False, False, False]
En el resultado de x, el patrón de AGC falla para la segunda entrada después de la primera 'A'. El estado del resultado permanece Falso para siempre después de esto. En el resultado de Y, el patrón de AGC continúa hasta la cuarta entrada. Por tanto, el estado del resultado permanece Verdadero hasta ese momento. Pero a partir de la quinta entrada, el resultado cambia a Falso como se esperaba G, pero se encuentra C.