Python - Máy trạng thái xử lý văn bản

Máy trạng thái là thiết kế một chương trình để điều khiển luồng trong một ứng dụng. nó là một đồ thị có hướng, bao gồm một tập hợp các nút và một tập hợp các hàm chuyển tiếp. Xử lý một tệp văn bản rất thường bao gồm việc đọc tuần tự từng đoạn của tệp văn bản và thực hiện điều gì đó để phản hồi lại từng đoạn được đọc. Ý nghĩa của một đoạn phụ thuộc vào những loại khối nào đã có trước nó và những khối nào xuất hiện sau nó. Máy là thiết kế một chương trình để kiểm soát luồng trong một ứng dụng. nó là một đồ thị có hướng, bao gồm một tập hợp các nút và một tập hợp các hàm chuyển tiếp. Xử lý một tệp văn bản rất thường bao gồm việc đọc tuần tự từng đoạn của tệp văn bản và thực hiện điều gì đó để phản hồi lại từng đoạn được đọc. Ý nghĩa của một đoạn phụ thuộc vào những loại khối nào đã có trước nó và những khối nào xuất hiện sau nó.

Hãy xem xét một tình huống trong đó văn bản đưa vào phải là một chuỗi lặp lại liên tục của trình tự AGC (được sử dụng trong phân tích protein). Nếu trình tự cụ thể này được duy trì trong chuỗi đầu vào, trạng thái của máy vẫn là TRUE nhưng ngay sau khi chuỗi lệch, trạng thái của máy sẽ trở thành FALSE và vẫn là FALSE sau khi phường. Điều này đảm bảo quá trình xử lý tiếp theo sẽ bị dừng lại mặc dù sau này có thể có nhiều phần trình tự chính xác hơn.

Chương trình dưới đây xác định một máy trạng thái có các chức năng khởi động máy, lấy đầu vào để xử lý văn bản và từng bước xử lý.

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

Khi chúng tôi chạy chương trình trên, chúng tôi nhận được kết quả sau:

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

Trong kết quả của x, mẫu AGC không thành công cho đầu vào thứ hai sau chữ 'A' đầu tiên. Trạng thái của kết quả vẫn là Sai mãi mãi sau này. Trong kết quả của Y, mô hình AGC tiếp tục cho đến đầu vào thứ 4. Do đó trạng thái của kết quả vẫn Đúng cho đến thời điểm đó. Nhưng từ đầu vào thứ 5, kết quả thay đổi thành Sai như mong đợi của G, nhưng C được tìm thấy.