实现 Reactor
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
print("Hello from HeurAMS Program :)")
|
||||||
@@ -25,9 +25,21 @@ class BaseAlgorithm:
|
|||||||
}
|
}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def revisor(cls, algodata: dict, feedback: int = 5, is_new_activation: bool = False):
|
def revisor(cls, algodata: dict, feedback: int = 5, is_new_activation: bool = False) -> None:
|
||||||
|
"""迭代记忆数据"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_due(cls, algodata):
|
def is_due(cls, algodata) -> int:
|
||||||
|
"""是否应该复习"""
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def rate(cls, algodata) -> str:
|
||||||
|
"""获取评分信息"""
|
||||||
|
return ""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def nextdate(cls, algodata) -> int:
|
||||||
|
"""获取下一次记忆时间戳"""
|
||||||
|
return -1
|
||||||
@@ -71,3 +71,11 @@ class SM2Algorithm(BaseAlgorithm):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def is_due(cls, algodata):
|
def is_due(cls, algodata):
|
||||||
return (algodata[cls.algo_name]['next_date'] <= timer.get_daystamp())
|
return (algodata[cls.algo_name]['next_date'] <= timer.get_daystamp())
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def rate(cls, algodata):
|
||||||
|
return str(algodata[cls.algo_name]['efactor'])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def nextdate(cls, algodata):
|
||||||
|
return algodata[cls.algo_name]['next_date']
|
||||||
@@ -40,10 +40,19 @@ class Electron:
|
|||||||
print(f"警告: '{var}' 非已知元数据字段")
|
print(f"警告: '{var}' 非已知元数据字段")
|
||||||
|
|
||||||
def is_due(self):
|
def is_due(self):
|
||||||
"""是否应该复习
|
"""是否应该复习"""
|
||||||
"""
|
|
||||||
return self.algo.is_due(self.algodata)
|
return self.algo.is_due(self.algodata)
|
||||||
|
|
||||||
|
def is_activated(self):
|
||||||
|
return self.algodata[self.algo]['is_activated']
|
||||||
|
|
||||||
|
def rate(self):
|
||||||
|
"评价"
|
||||||
|
return self.algo.rate(self.algodata)
|
||||||
|
|
||||||
|
def nextdate(self):
|
||||||
|
return self.algo.nextdate(self.algodata)
|
||||||
|
|
||||||
def revisor(self, quality: int = 5, is_new_activation: bool = False):
|
def revisor(self, quality: int = 5, is_new_activation: bool = False):
|
||||||
"""算法迭代决策机制实现
|
"""算法迭代决策机制实现
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
from .states import PhaserState, ProcessionState
|
||||||
|
from .procession import Procession
|
||||||
|
from .fission import Fission
|
||||||
|
from .phaser import Phaser
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"PhaserState",
|
||||||
|
"ProcessionState",
|
||||||
|
"Procession",
|
||||||
|
"Fission",
|
||||||
|
"Phaser"
|
||||||
|
]
|
||||||
@@ -1 +0,0 @@
|
|||||||
# 原子的生命周期管理器
|
|
||||||
@@ -1,173 +0,0 @@
|
|||||||
# 核心流程状态机
|
|
||||||
|
|
||||||
import heurams.kernel.particles as pt
|
|
||||||
import heurams.services.timer as timer
|
|
||||||
from typing import Tuple
|
|
||||||
|
|
||||||
class Procession():
|
|
||||||
"""队列: 记忆流程核心状态机"""
|
|
||||||
def __init__(self, atoms: list, phase: str = ""):
|
|
||||||
self.atoms = atoms
|
|
||||||
self.queue = atoms.copy()
|
|
||||||
self.current_atom = atoms[0]
|
|
||||||
self.cursor = 0
|
|
||||||
self.phase = phase
|
|
||||||
|
|
||||||
def forward(self, step = 1):
|
|
||||||
self.cursor += step
|
|
||||||
try:
|
|
||||||
self.current_atom = self.queue[self.cursor]
|
|
||||||
return 1 # 成功
|
|
||||||
except IndexError:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def append(self, atom = None):
|
|
||||||
if atom == None:
|
|
||||||
self.queue.append(self.current_atom)
|
|
||||||
else:
|
|
||||||
self.queue.append(atom)
|
|
||||||
|
|
||||||
def __len__(self):
|
|
||||||
return (len(self.queue) - self.cursor)
|
|
||||||
|
|
||||||
def is_empty(self):
|
|
||||||
return len(self.queue)
|
|
||||||
|
|
||||||
class Fission():
|
|
||||||
"""裂变器: 单原子调度展开器"""
|
|
||||||
def __init__(self, atom: pt.Atom, stage = ""):
|
|
||||||
self.atom = atom
|
|
||||||
atom.register["orbital"]["puzzle_config"]
|
|
||||||
|
|
||||||
class Phaser():
|
|
||||||
"""移相器: 全局调度阶段管理器"""
|
|
||||||
|
|
||||||
|
|
||||||
class Reactork():
|
|
||||||
"""反应堆对象, 处理和分配一次文件记忆流程的资源与策略"""
|
|
||||||
def __init__(self, nucleon_file: pt.NucleonUnion, electron_file: pt.ElectronUnion, screen, tasked_num):
|
|
||||||
# 导入原子对象
|
|
||||||
self.stage = 0
|
|
||||||
self.nucleon_file = nucleon_file
|
|
||||||
self.electron_file = electron_file
|
|
||||||
self.tasked_num = tasked_num
|
|
||||||
self.atoms_new = list()
|
|
||||||
self.atoms_review = list()
|
|
||||||
counter = self.tasked_num
|
|
||||||
self.screen = screen
|
|
||||||
self.electron_dict = electron_file.electrons_dict
|
|
||||||
self.quality_dict = {}
|
|
||||||
|
|
||||||
def electron_dict_get_fallback(key) -> pt.Electron:
|
|
||||||
value = self.electron_dict.get(key)
|
|
||||||
# 如果值不存在,则设置默认值
|
|
||||||
if value is None:
|
|
||||||
value = pt.Electron(key, {}) # 获取默认值
|
|
||||||
self.electron_dict[key] = value # 将默认值存入字典
|
|
||||||
electron_file.sync()
|
|
||||||
return value # 返回获取的值(可能是默认值)
|
|
||||||
|
|
||||||
for nucleon in nucleon_file.nucleons:
|
|
||||||
# atom = (Electron, Nucleon, Positron) 即 (记忆元数据, 内容元数据, 运行时数据)
|
|
||||||
atom = (electron_dict_get_fallback(nucleon.content), nucleon, {}) # 使用 "Positron" 代称 atom[2]
|
|
||||||
atom[2]["testdata"] = nucleon_file.testdata
|
|
||||||
atom[2]["keydata"] = nucleon_file.keydata
|
|
||||||
if atom[0]["is_activated"] == 0:
|
|
||||||
if counter > 0:
|
|
||||||
atom[2]["is_new_activation"] = 1
|
|
||||||
atom[0]["is_activated"] = 1
|
|
||||||
self.atoms_new.append(atom)
|
|
||||||
counter -= 1
|
|
||||||
else:
|
|
||||||
atom[2]["is_new_activation"] = 0
|
|
||||||
if int(atom[0]["next_date"]) <= timer.get_daystamp():
|
|
||||||
atom[0]["last_date"] = timer.get_daystamp()
|
|
||||||
self.atoms_review.append(atom)
|
|
||||||
# 设置运行时
|
|
||||||
self.index: int
|
|
||||||
self.procession: list
|
|
||||||
self.failed: list
|
|
||||||
self.round_title: str
|
|
||||||
self.current_atom: Tuple[pt.Electron, pt.Nucleon, dict]
|
|
||||||
self.round_set = 0
|
|
||||||
self.current_atom = pt.Atom.placeholder()
|
|
||||||
#print(self.atoms_new)
|
|
||||||
|
|
||||||
def set_round(self, title, procession):
|
|
||||||
self.round_set = 1
|
|
||||||
self.round_title = title
|
|
||||||
self.procession = procession
|
|
||||||
self.failed = list()
|
|
||||||
self.index = -1
|
|
||||||
|
|
||||||
def set_round_templated(self, stage):
|
|
||||||
titles = {
|
|
||||||
1: "复习模式",
|
|
||||||
2: "新记忆模式",
|
|
||||||
3: "总复习模式"
|
|
||||||
}
|
|
||||||
processions = {
|
|
||||||
1: self.atoms_review,
|
|
||||||
2: self.atoms_new,
|
|
||||||
3: (self.atoms_new + self.atoms_review)
|
|
||||||
}
|
|
||||||
self.stage = stage
|
|
||||||
ret = 1
|
|
||||||
if stage == 1 and len(processions[1]) == 0:
|
|
||||||
stage = 2
|
|
||||||
ret = 2
|
|
||||||
if stage == 1 and len(processions[2]) == 0:
|
|
||||||
stage = 3
|
|
||||||
ret = 3
|
|
||||||
self.set_round(title=titles[stage], procession=processions[stage])
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def forward(self, step = 1):
|
|
||||||
"""
|
|
||||||
返回值规则:
|
|
||||||
1: 重定向至 failed
|
|
||||||
-1: 此轮已完成
|
|
||||||
0: 下一个记忆单元
|
|
||||||
"""
|
|
||||||
if self.index + step >= len(self.procession):
|
|
||||||
if len(self.failed) > 0:
|
|
||||||
self.procession = self.failed
|
|
||||||
self.index = -1
|
|
||||||
self.forward(step)
|
|
||||||
if "- 额外复习" not in self.round_title:
|
|
||||||
self.round_title += " - 额外复习"
|
|
||||||
self.failed = list()
|
|
||||||
return 1 # 自动重定向到 failed
|
|
||||||
else:
|
|
||||||
self.round_set = 0
|
|
||||||
return -1 # 此轮已完成
|
|
||||||
self.index += step
|
|
||||||
self.current_atom = self.procession[self.index]
|
|
||||||
self.current_appar = Apparatus(self.screen, self, self.current_atom, (self.stage == 1)).iterator()
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def save(self):
|
|
||||||
self._deploy_report()
|
|
||||||
print("Progress saved")
|
|
||||||
# self.nucleon_file.save()
|
|
||||||
if self.electron_file.total["last_date"] < timer.get_daystamp():
|
|
||||||
self.electron_file.save()
|
|
||||||
|
|
||||||
def _deploy_report(self):
|
|
||||||
"部署所有 _report"
|
|
||||||
for e, q in self.quality_dict.items():
|
|
||||||
if q == -1:
|
|
||||||
e.revisor(5, True)
|
|
||||||
continue
|
|
||||||
e.revisor(q)
|
|
||||||
|
|
||||||
def report(self, atom, quality):
|
|
||||||
"向反应器和最低质量记录汇报"
|
|
||||||
if atom in self.atoms_new:
|
|
||||||
self.quality_dict[atom[0]] = -1
|
|
||||||
print(self.quality_dict)
|
|
||||||
return
|
|
||||||
self.quality_dict[atom[0]] = min(quality, self.quality_dict.get(atom[0], 5))
|
|
||||||
if quality <= 3:
|
|
||||||
self.failed.append(atom)
|
|
||||||
print(self.quality_dict)
|
|
||||||
20
src/heurams/kernel/reactor/fission.py
Normal file
20
src/heurams/kernel/reactor/fission.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import heurams.kernel.particles as pt
|
||||||
|
import heurams.kernel.puzzles as puz
|
||||||
|
import random
|
||||||
|
from .states import PhaserState
|
||||||
|
|
||||||
|
class Fission():
|
||||||
|
"""裂变器: 单原子调度展开器"""
|
||||||
|
def __init__(self, atom: pt.Atom, phase = PhaserState.RECOGNITION):
|
||||||
|
self.atom = atom
|
||||||
|
self.orbital = atom.register["orbital"]["puzzle_config"][phase]
|
||||||
|
self.puzzles = list()
|
||||||
|
for item, possibility in self.orbital:
|
||||||
|
while possibility > 1:
|
||||||
|
self.puzzles.append(puz.puzzles[item])
|
||||||
|
possibility -= 1
|
||||||
|
if random.random() <= possibility:
|
||||||
|
self.puzzles.append(puz.puzzles[item])
|
||||||
|
|
||||||
|
def iterator(self):
|
||||||
|
yield from self.puzzles
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# 轻量状态查看器
|
|
||||||
|
|
||||||
import heurams.kernel.particles as pt
|
|
||||||
|
|
||||||
class Glimpse():
|
|
||||||
"""轻量级只读, 用于状态指示"""
|
|
||||||
def __init__(self, nucleon_union: pt.NucleonUnion):
|
|
||||||
self.name = nucleon_union.name
|
|
||||||
self.nuc_u = nucleon_union
|
|
||||||
self.elt_u = self.nuc_u.linked_electron_union()
|
|
||||||
self.lastest_date = -1
|
|
||||||
self.next_date = 0x3f3f3f3f
|
|
||||||
self.avg_efactor = 0
|
|
||||||
self.total_num = 0
|
|
||||||
self.activated_num = 0
|
|
||||||
self.is_initialized = 0
|
|
||||||
if self.elt_u != 0:
|
|
||||||
self.is_initialized = 1
|
|
||||||
self.total_num = len(self.elt_u.electrons)
|
|
||||||
for i in self.elt_u.electrons:
|
|
||||||
if i['next_date'] > 0:
|
|
||||||
self.next_date = min(self.next_date, i['next_date'])
|
|
||||||
self.lastest_date = max(self.lastest_date, i['last_date'])
|
|
||||||
if i['is_activated']:
|
|
||||||
self.avg_efactor += i['efactor']
|
|
||||||
self.activated_num += 1
|
|
||||||
if self.next_date == 0x3f3f3f3f:
|
|
||||||
self.next_date = -1
|
|
||||||
self.is_initialized = 0
|
|
||||||
if self.activated_num == 0:
|
|
||||||
return
|
|
||||||
self.avg_efactor = round(self.avg_efactor / self.activated_num, 2)
|
|
||||||
if self.next_date == 0x3f3f3f3f:
|
|
||||||
self.next_date = -1
|
|
||||||
return
|
|
||||||
31
src/heurams/kernel/reactor/phaser.py
Normal file
31
src/heurams/kernel/reactor/phaser.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# 移相器类定义
|
||||||
|
|
||||||
|
import heurams.kernel.particles as pt
|
||||||
|
from .states import PhaserState, ProcessionState
|
||||||
|
from .procession import Procession
|
||||||
|
|
||||||
|
class Phaser():
|
||||||
|
"""移相器: 全局调度阶段管理器"""
|
||||||
|
def __init__(self, atoms: list[pt.Atom]) -> None:
|
||||||
|
new_atoms = list()
|
||||||
|
old_atoms = list()
|
||||||
|
self.state = PhaserState.UNSURE
|
||||||
|
for i in atoms:
|
||||||
|
if not i.register["electron"].is_activated():
|
||||||
|
new_atoms.append(i)
|
||||||
|
else:
|
||||||
|
old_atoms.append(i)
|
||||||
|
self.processions = list()
|
||||||
|
if len(old_atoms):
|
||||||
|
self.processions.append(Procession(old_atoms, PhaserState.QUICK_REVIEW, "初始复习"))
|
||||||
|
if len(new_atoms):
|
||||||
|
self.processions.append(Procession(new_atoms,PhaserState.RECOGNITION, "新记忆"))
|
||||||
|
self.processions.append(Procession(atoms,PhaserState.FINAL_REVIEW, "总体复习"))
|
||||||
|
|
||||||
|
def current_procession(self):
|
||||||
|
for i in self.processions:
|
||||||
|
if not i.state == ProcessionState.FINISHED:
|
||||||
|
self.state = i.phase
|
||||||
|
return i
|
||||||
|
self.state = PhaserState.FINISHED
|
||||||
|
return 0
|
||||||
37
src/heurams/kernel/reactor/procession.py
Normal file
37
src/heurams/kernel/reactor/procession.py
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import heurams.kernel.particles as pt
|
||||||
|
from .states import PhaserState, ProcessionState
|
||||||
|
|
||||||
|
class Procession():
|
||||||
|
"""队列: 标识单次记忆流程"""
|
||||||
|
def __init__(self, atoms: list, phase: PhaserState, name: str = ""):
|
||||||
|
self.atoms = atoms
|
||||||
|
self.queue = atoms.copy()
|
||||||
|
self.current_atom = atoms[0]
|
||||||
|
self.cursor = 0
|
||||||
|
self.name = name
|
||||||
|
self.phase = phase
|
||||||
|
self.state: ProcessionState = ProcessionState.RUNNING
|
||||||
|
|
||||||
|
def forward(self, step = 1):
|
||||||
|
self.cursor += step
|
||||||
|
if self.cursor == len(self.queue):
|
||||||
|
self.state: ProcessionState = ProcessionState.FINISHED
|
||||||
|
else:
|
||||||
|
self.state: ProcessionState = ProcessionState.RUNNING
|
||||||
|
try:
|
||||||
|
self.current_atom = self.queue[self.cursor]
|
||||||
|
return 1 # 成功
|
||||||
|
except IndexError:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def append(self, atom = None):
|
||||||
|
if atom == None:
|
||||||
|
self.queue.append(self.current_atom)
|
||||||
|
else:
|
||||||
|
self.queue.append(atom)
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return (len(self.queue) - self.cursor)
|
||||||
|
|
||||||
|
def is_empty(self):
|
||||||
|
return len(self.queue)
|
||||||
12
src/heurams/kernel/reactor/states.py
Normal file
12
src/heurams/kernel/reactor/states.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
from enum import Enum, auto
|
||||||
|
|
||||||
|
class PhaserState(Enum):
|
||||||
|
UNSURE = "unsure"
|
||||||
|
QUICK_REVIEW = "quick_review"
|
||||||
|
RECOGNITION = "recognition"
|
||||||
|
FINAL_REVIEW = "final_review"
|
||||||
|
FINISHED = "finished"
|
||||||
|
|
||||||
|
class ProcessionState(Enum):
|
||||||
|
RUNNING = auto()
|
||||||
|
FINISHED = auto()
|
||||||
Reference in New Issue
Block a user