Python-テキスト処理ステートマシン

ステートマシンとは、アプリケーションのフローを制御するプログラムを設計することです。これは、ノードのセットと遷移関数のセットで構成される有向グラフです。テキストファイルの処理は、多くの場合、テキストファイルの各チャンクを順次読み取り、読み取られた各チャンクに応答して何かを実行することで構成されます。チャンクの意味は、その前に存在していたチャンクのタイプと、その後に存在するチャンクによって異なります。このマシンは、アプリケーションのフローを制御するプログラムを設計することを目的としています。これは、ノードのセットと遷移関数のセットで構成される有向グラフです。テキストファイルの処理は、多くの場合、テキストファイルの各チャンクを順次読み取り、読み取られた各チャンクに応答して何かを実行することで構成されます。チャンクの意味は、その前に存在していたチャンクのタイプと、その後に存在するチャンクによって異なります。

入れられたテキストがAGCのシーケンスの繰り返しの連続した文字列でなければならないシナリオを考えてみてください(タンパク質分析で使用されます)。この特定のシーケンスが入力文字列で維持されている場合、マシンの状態はTRUEのままですが、シーケンスが逸脱するとすぐに、マシンの状態はFALSEになり、その後はFALSEのままになります。これにより、後で使用できる正しいシーケンスのチャンクが増えても、それ以上の処理が確実に停止します。

以下のプログラムは、マシンを起動し、テキストを処理するための入力を受け取り、処理をステップスルーする機能を備えたステートマシンを定義します。

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

上記のプログラムを実行すると、次の出力が得られます-

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

xの結果では、AGCのパターンは、最初の「A」の後の2番目の入力で失敗します。この後、結果の状態は永久にFalseのままになります。Yの結果では、AGCのパターンは4番目の入力まで続きます。したがって、結果の状態はその時点までTrueのままです。しかし、5番目の入力から、Gが期待されるように結果はFalseに変わりますが、Cが見つかります。