Python - maszyna stanu przetwarzania tekstu
Maszyna stanów polega na zaprojektowaniu programu do sterowania przepływem w aplikacji. jest to graf skierowany, składający się z zestawu węzłów i zestawu funkcji przejścia. Przetwarzanie pliku tekstowego bardzo często polega na sekwencyjnym odczytywaniu każdego fragmentu pliku tekstowego i robieniu czegoś w odpowiedzi na każdy odczytany fragment. Znaczenie fragmentu zależy od tego, jakie rodzaje fragmentów znajdowały się przed nim i jakie są po nim. Maszyna polega na zaprojektowaniu programu do sterowania przepływem w aplikacji. jest to graf skierowany, składający się z zestawu węzłów i zestawu funkcji przejścia. Przetwarzanie pliku tekstowego bardzo często polega na sekwencyjnym odczytywaniu każdego fragmentu pliku tekstowego i robieniu czegoś w odpowiedzi na każdy odczytany fragment. Znaczenie fragmentu zależy od tego, jakie rodzaje fragmentów znajdowały się przed nim i jakie są po nim.
Rozważmy scenariusz, w którym wstawiany tekst musi być ciągłym ciągiem powtórzeń sekwencji AGC (używanym w analizie białek). Jeśli ta określona sekwencja jest zachowana w ciągu wejściowym, stan maszyny pozostaje PRAWDA, ale gdy tylko sekwencja się odchyli, stan maszyny staje się FAŁSZEM i pozostaje FAŁSZEM po działaniach. Zapewnia to zatrzymanie dalszego przetwarzania, nawet jeśli później może być dostępnych więcej fragmentów poprawnych sekwencji.
Poniższy program definiuje maszynę stanową, która ma funkcje do uruchamiania maszyny, pobierania danych wejściowych do przetwarzania tekstu i przechodzenia przez przetwarzanie.
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
Po uruchomieniu powyższego programu otrzymujemy następujące dane wyjściowe -
[True, False, False]
[True, True, True, True, False, False, False]
W wyniku x wzorzec AGC zawodzi dla drugiego wejścia po pierwszym „A”. Po tym stan wyniku pozostaje fałszywy na zawsze. W wyniku Y wzór AGC trwa do 4. wejścia. Stąd stan wyniku pozostaje True do tego momentu. Ale od 5. wejścia wynik zmienia się na Fałsz, zgodnie z oczekiwaniami G, ale znaleziono C.