feat(kernel): 状态机改进

This commit is contained in:
2026-01-03 05:05:41 +08:00
parent eced6130f1
commit aacf4fdbdf
19 changed files with 428 additions and 140 deletions

View File

@@ -1,24 +1,117 @@
from enum import Enum
from typing import Any, Sequence, Type
from transitions import Machine, State, Event, EventData
import heurams.kernel.particles as pt
from heurams.services.logger import get_logger
from transitions import Machine
from .procession import Procession
from .states import PhaserState, ProcessionState
logger = get_logger(__name__)
class Phaser(Machine):
def __init__(self, schedule: list):
state_words = ["init"] + schedule.copy()
state_objects = list()
for name in state_words:
state_objects.append(State(
name=name,
on_enter=["on_enter"]
))
Machine.__init__(self, states=state_objects, initial="init", send_event=True)
self.add_ordered_transitions(loop=False)
"""全局调度阶段管理器"""
def on_enter(self, event_data: EventData):
print(event_data.transition.source, "->", event_data.transition.dest) # type: ignore
def __init__(self, atoms: list[pt.Atom]) -> None:
logger.debug("Phaser.__init__: 原子数量=%d", len(atoms))
new_atoms = list()
old_atoms = list()
for i in atoms:
if not i.registry["electron"].is_activated():
new_atoms.append(i)
else:
old_atoms.append(i)
logger.debug("新原子数量=%d, 旧原子数量=%d", len(new_atoms), len(old_atoms))
self.processions = list()
#TODO: 改进为基于配置文件的可变复习阶段管理
if len(old_atoms):
self.processions.append(
Procession(old_atoms, PhaserState.QUICK_REVIEW, "初始复习")
)
logger.debug("创建初始复习 Procession")
if __name__ == "__main__":
p = Phaser(["a", "b"])
p.next_state()
p.next_state()
print(p.state)
if len(new_atoms):
self.processions.append(
Procession(new_atoms, PhaserState.RECOGNITION, "新记忆")
)
logger.debug("创建新记忆 Procession")
self.processions.append(Procession(atoms, PhaserState.FINAL_REVIEW, "总体复习"))
logger.debug("创建总体复习 Procession")
logger.debug("Phaser 初始化完成, processions 数量=%d", len(self.processions))
# 设置transitions状态机
states = [
{'name': PhaserState.UNSURE.value, 'on_enter': 'on_unsure'},
{'name': PhaserState.QUICK_REVIEW.value, 'on_enter': 'on_quick_review'},
{'name': PhaserState.RECOGNITION.value, 'on_enter': 'on_recognition'},
{'name': PhaserState.FINAL_REVIEW.value, 'on_enter': 'on_final_review'},
{'name': PhaserState.FINISHED.value, 'on_enter': 'on_finished'}
]
transitions = [
{'trigger': 'to_unsure', 'source': '*', 'dest': PhaserState.UNSURE.value},
{'trigger': 'to_quick_review', 'source': '*', 'dest': PhaserState.QUICK_REVIEW.value},
{'trigger': 'to_recognition', 'source': '*', 'dest': PhaserState.RECOGNITION.value},
{'trigger': 'to_final_review', 'source': '*', 'dest': PhaserState.FINAL_REVIEW.value},
{'trigger': 'to_finished', 'source': '*', 'dest': PhaserState.FINISHED.value}
]
Machine.__init__(self, states=states, transitions=transitions,
initial=PhaserState.UNSURE.value)
self.to_unsure()
def on_unsure(self):
"""进入UNSURE状态时的回调"""
logger.debug("Phaser 进入 UNSURE 状态")
def on_quick_review(self):
"""进入QUICK_REVIEW状态时的回调"""
logger.debug("Phaser 进入 QUICK_REVIEW 状态")
def on_recognition(self):
"""进入RECOGNITION状态时的回调"""
logger.debug("Phaser 进入 RECOGNITION 状态")
def on_final_review(self):
"""进入FINAL_REVIEW状态时的回调"""
logger.debug("Phaser 进入 FINAL_REVIEW 状态")
def on_finished(self):
"""进入FINISHED状态时的回调"""
logger.debug("Phaser 进入 FINISHED 状态")
def current_procession(self):
logger.debug("Phaser.current_procession 被调用")
for i in self.processions:
i: Procession
if i.state != ProcessionState.FINISHED.value:
# 根据当前procession的phase更新Phaser状态
if i.phase == PhaserState.QUICK_REVIEW:
self.to_quick_review()
elif i.phase == PhaserState.RECOGNITION:
self.to_recognition()
elif i.phase == PhaserState.FINAL_REVIEW:
self.to_final_review()
logger.debug("找到未完成的 Procession: phase=%s", i.phase)
return i
# 所有Procession都已完成
self.to_finished()
logger.debug("所有 Procession 已完成, 状态设置为 FINISHED")
return None
@property
def state(self):
"""获取当前状态值"""
current_state = self.get_model_state(self)
# 将字符串状态转换为PhaserState枚举
for phase in PhaserState:
if phase.value == current_state:
return phase
return PhaserState.UNSURE