feat: 改进状态机
This commit is contained in:
@@ -9,4 +9,4 @@ logger = get_logger(__name__)
|
||||
|
||||
__all__ = ["PhaserState", "ProcessionState", "Procession", "Fission", "Phaser"]
|
||||
|
||||
logger.debug("反应堆模块已加载")
|
||||
logger.debug("反应堆模块已加载")
|
||||
|
||||
@@ -8,24 +8,26 @@ from .states import PhaserState
|
||||
|
||||
|
||||
class Fission:
|
||||
"""裂变器: 单原子调度展开器"""
|
||||
"""单原子调度展开器"""
|
||||
|
||||
def __init__(self, atom: pt.Atom, phase_state=PhaserState.RECOGNITION):
|
||||
self.logger = get_logger(__name__)
|
||||
self.atom = atom
|
||||
|
||||
#NOTE: phase 为 PhaserState 枚举实例,需要获取其value
|
||||
phase_value = phase_state.value if isinstance(phase_state, PhaserState) else phase_state
|
||||
|
||||
self.orbital_schedule = atom.registry["orbital"]["schedule"][phase_value] # type: ignore
|
||||
self.orbital_puzzles = atom.registry["orbital"]["puzzles"]
|
||||
|
||||
|
||||
# NOTE: phase 为 PhaserState 枚举实例,需要获取其value
|
||||
phase_value = (
|
||||
phase_state.value if isinstance(phase_state, PhaserState) else phase_state
|
||||
)
|
||||
|
||||
self.orbital_schedule = atom.registry["phases"][phase_value] # type: ignore
|
||||
self.orbital_puzzles = atom.registry["nucleon"]["puzzles"]
|
||||
|
||||
self.puzzles = list()
|
||||
for item, possibility in self.orbital_schedule: # type: ignore
|
||||
self.logger.debug(f"开始处理 orbital 项: {item}")
|
||||
self.logger.debug(f"开始处理: {item}")
|
||||
if not isinstance(possibility, float):
|
||||
possibility = float(possibility)
|
||||
|
||||
|
||||
while possibility > 1:
|
||||
self.puzzles.append(
|
||||
{
|
||||
@@ -34,7 +36,7 @@ class Fission:
|
||||
}
|
||||
)
|
||||
possibility -= 1
|
||||
|
||||
|
||||
if random.random() <= possibility:
|
||||
self.puzzles.append(
|
||||
{
|
||||
@@ -42,8 +44,8 @@ class Fission:
|
||||
"alia": item,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
self.logger.debug(f"orbital 项处理完成: {item}")
|
||||
|
||||
def generate(self):
|
||||
yield from self.puzzles
|
||||
def get_puzzles_list(self):
|
||||
yield from self.puzzles
|
||||
|
||||
@@ -13,20 +13,20 @@ class Phaser(Machine):
|
||||
|
||||
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: 改进为基于配置文件的可变复习阶段管理
|
||||
# TODO: 改进为基于配置文件的可变复习阶段管理
|
||||
if len(old_atoms):
|
||||
self.processions.append(
|
||||
Procession(old_atoms, PhaserState.QUICK_REVIEW, "初始复习")
|
||||
@@ -42,27 +42,47 @@ class Phaser(Machine):
|
||||
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'}
|
||||
{"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}
|
||||
{"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)
|
||||
|
||||
|
||||
Machine.__init__(
|
||||
self,
|
||||
states=states,
|
||||
transitions=transitions,
|
||||
initial=PhaserState.UNSURE.value,
|
||||
)
|
||||
|
||||
self.to_unsure()
|
||||
|
||||
def on_unsure(self):
|
||||
@@ -97,15 +117,15 @@ class Phaser(Machine):
|
||||
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):
|
||||
"""获取当前状态值"""
|
||||
@@ -114,4 +134,4 @@ class Phaser(Machine):
|
||||
for phase in PhaserState:
|
||||
if phase.value == current_state:
|
||||
return phase
|
||||
return PhaserState.UNSURE
|
||||
return PhaserState.UNSURE
|
||||
|
||||
@@ -17,27 +17,39 @@ class Procession(Machine):
|
||||
phase_state.value,
|
||||
name,
|
||||
)
|
||||
|
||||
# 初始化原子队列
|
||||
|
||||
self.atoms = atoms
|
||||
self.queue = atoms.copy()
|
||||
self.current_atom = atoms[0] if atoms else None
|
||||
self.cursor = 0
|
||||
self.name = name
|
||||
self.phase = phase_state
|
||||
|
||||
# 设置transitions状态机
|
||||
states = [{'name': ProcessionState.RUNNING.value, 'on_enter': 'on_running'},
|
||||
{'name': ProcessionState.FINISHED.value, 'on_enter': 'on_finished'}]
|
||||
|
||||
transitions = [
|
||||
{'trigger': 'finish', 'source': ProcessionState.RUNNING.value, 'dest': ProcessionState.FINISHED.value},
|
||||
{'trigger': 'restart', 'source': ProcessionState.FINISHED.value, 'dest': ProcessionState.RUNNING.value}
|
||||
|
||||
states = [
|
||||
{"name": ProcessionState.RUNNING.value, "on_enter": "on_running"},
|
||||
{"name": ProcessionState.FINISHED.value, "on_enter": "on_finished"},
|
||||
]
|
||||
|
||||
Machine.__init__(self, states=states, transitions=transitions,
|
||||
initial=ProcessionState.RUNNING.value)
|
||||
|
||||
|
||||
transitions = [
|
||||
{
|
||||
"trigger": "finish",
|
||||
"source": ProcessionState.RUNNING.value,
|
||||
"dest": ProcessionState.FINISHED.value,
|
||||
},
|
||||
{
|
||||
"trigger": "restart",
|
||||
"source": ProcessionState.FINISHED.value,
|
||||
"dest": ProcessionState.RUNNING.value,
|
||||
},
|
||||
]
|
||||
|
||||
Machine.__init__(
|
||||
self,
|
||||
states=states,
|
||||
transitions=transitions,
|
||||
initial=ProcessionState.RUNNING.value,
|
||||
)
|
||||
|
||||
logger.debug("Procession 初始化完成, 队列长度=%d", len(self.queue))
|
||||
|
||||
def on_running(self):
|
||||
@@ -51,7 +63,7 @@ class Procession(Machine):
|
||||
def forward(self, step=1):
|
||||
logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor)
|
||||
self.cursor += step
|
||||
|
||||
|
||||
if self.cursor >= len(self.queue):
|
||||
if self.state != ProcessionState.FINISHED.value:
|
||||
self.finish() # 触发状态转换
|
||||
@@ -61,16 +73,19 @@ class Procession(Machine):
|
||||
self.restart() # 确保在RUNNING状态
|
||||
self.current_atom = self.queue[self.cursor]
|
||||
logger.debug("cursor 更新为: %d", self.cursor)
|
||||
logger.debug("当前原子更新为: %s", self.current_atom.ident if self.current_atom else "None")
|
||||
logger.debug(
|
||||
"当前原子更新为: %s",
|
||||
self.current_atom.ident if self.current_atom else "None",
|
||||
)
|
||||
return 1 # 成功
|
||||
|
||||
|
||||
return 0
|
||||
|
||||
def append(self, atom=None):
|
||||
if atom is None:
|
||||
atom = self.current_atom
|
||||
logger.debug("Procession.append: atom=%s", atom.ident if atom else "None")
|
||||
|
||||
|
||||
if not self.queue or self.queue[-1] != atom or len(self) <= 1:
|
||||
self.queue.append(atom)
|
||||
logger.debug("原子已追加到队列, 新队列长度=%d", len(self.queue))
|
||||
@@ -97,16 +112,16 @@ class Procession(Machine):
|
||||
empty = len(self.queue) == 0
|
||||
logger.debug("Procession.is_empty: %s", empty)
|
||||
return empty
|
||||
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
"""获取当前状态值"""
|
||||
return self.get_model_state(self)
|
||||
|
||||
|
||||
@state.setter
|
||||
def state(self, value):
|
||||
"""设置状态值"""
|
||||
if value == ProcessionState.RUNNING.value:
|
||||
self.restart()
|
||||
elif value == ProcessionState.FINISHED.value:
|
||||
self.finish()
|
||||
self.finish()
|
||||
|
||||
@@ -18,4 +18,4 @@ class ProcessionState(Enum):
|
||||
FINISHED = "finished"
|
||||
|
||||
|
||||
logger.debug("状态枚举定义已加载")
|
||||
logger.debug("状态枚举定义已加载")
|
||||
|
||||
Reference in New Issue
Block a user