diff --git a/.gitignore b/.gitignore index c2d2a42..51a0c37 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ electron/test.toml *.egg-info/ build/ dist/ +old/ # Project specific directories # config/ @@ -70,6 +71,7 @@ coverage.xml .hypothesis/ .pytest_cache/ cover/ +.claude/ # Translations *.mo diff --git a/src/heurams/kernel/algorithms/__init__.py b/src/heurams/kernel/algorithms/__init__.py index 86c6f3e..9dcfccc 100644 --- a/src/heurams/kernel/algorithms/__init__.py +++ b/src/heurams/kernel/algorithms/__init__.py @@ -23,11 +23,11 @@ def list_algorithms() -> list[str]: return list(_algorithms.keys()) # 导入注册 -from . import supermemo2 +from . import sm2 register_algorithm( - algo_name=supermemo2.algo_name, - defaults=supermemo2.defaults, - revisor=supermemo2.revisor + algo_name=sm2.algo_name, + defaults=sm2.defaults, + revisor=sm2.revisor ) __all__ = ['get_algorithm', 'list_algorithms', 'register_algorithm', 'AlgorithmConfig'] \ No newline at end of file diff --git a/src/heurams/kernel/algorithms/fsrs.devel.py b/src/heurams/kernel/algorithms/fsrs.devel.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/heurams/kernel/algorithms/fsrs.py b/src/heurams/kernel/algorithms/fsrs.py new file mode 100644 index 0000000..2c00adc --- /dev/null +++ b/src/heurams/kernel/algorithms/fsrs.py @@ -0,0 +1 @@ +# FSRS 算法模块, 尚未就绪 \ No newline at end of file diff --git a/src/heurams/kernel/algorithms/supermemo2.py b/src/heurams/kernel/algorithms/sm2.py similarity index 98% rename from src/heurams/kernel/algorithms/supermemo2.py rename to src/heurams/kernel/algorithms/sm2.py index 3bf5093..4553638 100644 --- a/src/heurams/kernel/algorithms/supermemo2.py +++ b/src/heurams/kernel/algorithms/sm2.py @@ -1,7 +1,7 @@ import heurams.services.timer as timer from typing import TypedDict -algo_name = "supermemo2" +algo_name = "SM-2" class AlgodataDict(TypedDict): efactor: float diff --git a/src/heurams/kernel/particles/__init__.py b/src/heurams/kernel/particles/__init__.py index 1a734ee..e474781 100644 --- a/src/heurams/kernel/particles/__init__.py +++ b/src/heurams/kernel/particles/__init__.py @@ -1,4 +1,5 @@ from .electron import Electron from .nucleon import Nucleon +from .orbital import Orbital from .atom import Atom from .probe import probe_all, probe_by_filename \ No newline at end of file diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index 4eedf0a..6215990 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -1,5 +1,6 @@ from .electron import Electron from .nucleon import Nucleon +from .orbital import Orbital from typing import TypedDict import pathlib import typing @@ -13,7 +14,7 @@ class AtomRegister(TypedDict): electron: Electron electron_path: pathlib.Path electron_fmt: str - orbital: dict + orbital: Orbital orbital_path: pathlib.Path orbital_fmt: str @@ -26,8 +27,6 @@ class Atom(): 以及关联路径 """ - - def __init__(self, ident = ""): self.ident = ident self.register: AtomRegister = { # type: ignore diff --git a/src/heurams/kernel/particles/orbital.py b/src/heurams/kernel/particles/orbital.py new file mode 100644 index 0000000..8ebd934 --- /dev/null +++ b/src/heurams/kernel/particles/orbital.py @@ -0,0 +1,18 @@ +from typing import TypedDict + +class Orbital(TypedDict): + quick_view: list + recognition: list + final_review: list + puzzle_config: dict + +"""一份示例 +["__metadata__.orbital"] # 内置的推荐学习方案 +quick_review = [["cloze", 1], ["mcq", 0.5], ["recognition", 1]] +recognition = [["recognition", 1]] +final_review = [["cloze", 0.7], ["mcq", 0.7], ["recognition", 1]] + +["__metadata__.orbital.puzzle_config"] +cloze = { from = "content"} +mcq = { from = "keyword_note" } +""" \ No newline at end of file diff --git a/src/heurams/kernel/puzzles/base.py b/src/heurams/kernel/puzzles/base.py index 52ff895..f5b8a38 100644 --- a/src/heurams/kernel/puzzles/base.py +++ b/src/heurams/kernel/puzzles/base.py @@ -1,2 +1,18 @@ +# base.py class BasePuzzle: - pass \ No newline at end of file + """谜题基类""" + + def refresh(self): + """刷新谜题, 子类必须实现""" + raise NotImplementedError("谜题对象没有实现 refresh 方法") + + def __str__(self): + """字符串表示, 子类应该实现""" + return f"谜题: {type(self).__name__}" + + @classmethod + def register(cls, name: str = None): # type: ignore + """谜题注册装饰器""" + from registry import registry + puzzle_name = name or cls.__name__ + return registry.register(puzzle_name, cls) \ No newline at end of file diff --git a/src/heurams/kernel/puzzles/mcq.py b/src/heurams/kernel/puzzles/mcq.py index 35d4511..90bb0c6 100644 --- a/src/heurams/kernel/puzzles/mcq.py +++ b/src/heurams/kernel/puzzles/mcq.py @@ -1,16 +1,11 @@ +# mcq.py from base import BasePuzzle import random +@BasePuzzle.register("multiple_choice") class MCQPuzzle(BasePuzzle): - """选择题谜题生成器 + """选择题谜题生成器""" - Args: - mapping: 正确选项映射 {问题: 答案} - jammer: 干扰项列表 - max_riddles_num: 最大生成谜题数 (默认2个) - prefix: 问题前缀 - """ - def __init__( self, mapping: dict, diff --git a/src/heurams/kernel/puzzles/registry.py b/src/heurams/kernel/puzzles/registry.py new file mode 100644 index 0000000..08b7620 --- /dev/null +++ b/src/heurams/kernel/puzzles/registry.py @@ -0,0 +1,31 @@ +# registry.py +from typing import Dict, Type, Any +from base import BasePuzzle + +class PuzzleRegistry: + """谜题注册表""" + + def __init__(self): + self._puzzles: Dict[str, Type[BasePuzzle]] = {} + + def register(self, name: str, puzzle_class: Type[BasePuzzle]): + """注册谜题类""" + self._puzzles[name] = puzzle_class + return puzzle_class + + def create(self, name: str, **kwargs) -> BasePuzzle: + """创建谜题实例""" + if name not in self._puzzles: + raise ValueError(f"未知的谜题类型: {name}") + return self._puzzles[name](**kwargs) + + def list_available(self) -> list: + """获取可用的谜题类型列表""" + return list(self._puzzles.keys()) + + def get_class(self, name: str) -> Type[BasePuzzle]: + """获取谜题类""" + return self._puzzles.get(name) # type: ignore + +# 全局注册表实例 +registry = PuzzleRegistry() \ No newline at end of file diff --git a/src/heurams/kernel/reactor/apparatus.py b/src/heurams/kernel/reactor/apparatus.py deleted file mode 100644 index a1a3c8a..0000000 --- a/src/heurams/kernel/reactor/apparatus.py +++ /dev/null @@ -1,32 +0,0 @@ -# 单个原子处理器 - -import heurams.kernel.particles as pt -import typing - -class Apparatus(): - """反应器对象, 决策一个原子的不同记忆方式, 并反馈到布局""" - def __init__(self, screen, reactor, atom, is_review = 0): - self.electron: pt.Electron = atom[0] - self.nucleon: pt.Nucleon = atom[1] - self.positron: dict = atom[2] - self.testdata = self.positron["testdata"] - self.procession: typing.List[comps.Composition] = list() - if self.positron["is_new_activation"] == 1: - self.positron["is_new_activation"] = 0 - self.procession.append(comps.registry["recognition"](screen, reactor, atom)) - return - for i in self.positron["testdata"].keys(): - if i == "additional_inf": - continue - if i == "fill_blank_test": # 加深 - self.procession.append(comps.registry[i](screen, reactor, atom)) - # self.procession.append(comps.registry[i](screen, reactor, atom)) - self.procession.append(comps.registry[i](screen, reactor, atom)) - # self.procession.reverse() - random.shuffle(self.procession) - if self.positron["is_new_activation"] == 0: - self.procession.append(comps.registry['recognition'](screen, reactor, atom)) - if is_review == 1: - self.procession = [self.procession[-2], self.procession[-1]] - def iterator(self): - yield from self.procession diff --git a/src/heurams/kernel/reactor/core.py b/src/heurams/kernel/reactor/core.py index ac5b409..73cc7ab 100644 --- a/src/heurams/kernel/reactor/core.py +++ b/src/heurams/kernel/reactor/core.py @@ -3,15 +3,15 @@ import heurams.kernel.particles as pt import heurams.services.timer as timer from typing import Tuple -from .apparatus import Apparatus -class Core(): - """堆芯: 记忆流程核心状态机""" - def __init__(self, atoms: list, stage = ""): +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 @@ -21,8 +21,11 @@ class Core(): except IndexError: return 0 - def append(self, atom): - self.queue.append(self.current_atom) + 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) @@ -32,9 +35,13 @@ class Core(): class Fission(): """裂变器: 单原子调度展开器""" - def __init__(self, atom: pt.Atom): + def __init__(self, atom: pt.Atom, stage = ""): self.atom = atom - atom.register["orbital"] + atom.register["orbital"]["puzzle_config"] + +class Phaser(): + """移相器: 全局调度阶段管理器""" + class Reactork(): """反应堆对象, 处理和分配一次文件记忆流程的资源与策略"""