From afb7252f7110ee15021e21e3a31a123385fb0e6e Mon Sep 17 00:00:00 2001 From: david-ajax Date: Mon, 8 Sep 2025 13:44:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=A5=E5=B9=B2=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- particles.py | 4 +-- puzzles.py | 6 ++--- reactor_k.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 reactor_k.py diff --git a/particles.py b/particles.py index 7afc84c..35d47b0 100644 --- a/particles.py +++ b/particles.py @@ -2,7 +2,7 @@ import pathlib import toml import time import auxiliary as aux - +from typing import List class Electron: """电子: 记忆分析元数据及算法""" @@ -183,7 +183,7 @@ class NucleonUnion: lst.append(Nucleon(i, all[i])) self.keydata = all["keydata"] self.testdata = all["testdata"] - self.nucleons = lst + self.nucleons: List[Nucleon] = lst self.nucleons_dict = {i.content: i for i in lst} def __len__(self): diff --git a/puzzles.py b/puzzles.py index 3dd5c71..c8e27b3 100644 --- a/puzzles.py +++ b/puzzles.py @@ -1,11 +1,11 @@ import random -class Puzzle: +class BasePuzzle: pass -class BlankPuzzle(Puzzle): +class BlankPuzzle(BasePuzzle): """填空题谜题生成器 Args: @@ -41,7 +41,7 @@ class BlankPuzzle(Puzzle): return f"{self.wording}\n{str(self.answer)}" -class SelectionPuzzle(Puzzle): +class SelectionPuzzle(BasePuzzle): """选择题谜题生成器 Args: diff --git a/reactor_k.py b/reactor_k.py new file mode 100644 index 0000000..2f3d792 --- /dev/null +++ b/reactor_k.py @@ -0,0 +1,76 @@ +import particles as pt +import auxiliary as aux +import time +from typing import List + +class BaseScheduler(): + "调度器接口" + + def revisor(self, electron: pt.Electron, quality: int): + """由 quality 更新电子的记忆参数""" + pass + + def get_atoms_for_review(self, electron_file: pt.ElectronUnion): + """从电子文件中筛选出当前需要复习的所有原子""" + pass + + def get_atoms_for_learning(self, nucleon_file: pt.NucleonUnion, limit: int): + """从核子文件中获取待学习的新原子""" + pass + +class SM2Scheduler(BaseScheduler): + "基于 SM-2 的调度器实现" + def revisor(self, electron: pt.Electron, quality: int, is_new_activation): + print(f"REVISOR: {quality}, {is_new_activation}") + if quality == -1: + return -1 + + electron.metadata['efactor'] = electron.metadata['efactor'] + ( + 0.1 - (5 - quality) * (0.08 + (5 - quality) * 0.02) + ) + electron.metadata['efactor'] = max(1.3, electron.metadata['efactor']) + + if quality < 3: + # 若保留率低于 3,重置重复次数 + electron.metadata['rept'] = 0 + electron.metadata['interval'] = 0 # 设为0,以便下面重新计算 I(1) + else: + electron.metadata['rept'] += 1 + + electron.metadata['real_rept'] += 1 + + if is_new_activation: # 初次激活 + electron.metadata['rept'] = 0 + electron.metadata['efactor'] = 2.5 + + if electron.metadata['rept'] == 0: # 刚被重置或初次激活后复习 + electron.metadata['interval'] = 1 # I(1) + elif electron.metadata['rept'] == 1: + electron.metadata['interval'] = 6 # I(2) 经验公式 + else: + electron.metadata['interval'] = round( + electron.metadata['interval'] * electron.metadata['efactor'] + ) + + electron.metadata['last_date'] = aux.get_daystamp() + electron.metadata['next_date'] = aux.get_daystamp() + electron.metadata['interval'] + electron.metadata['last_modify'] = time.time() + + def get_atoms_for_learning(self, nucleon_file: pt.NucleonUnion, limit: int): + 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 i in nucleon_file.nucleons: + if i.metadata + + def get_atoms_for_review(self, electron_file: pt.ElectronUnion): + return super().get_atoms_for_review(electron_file) + +class FSRSScheduler(): + "基于 FSRS 的调度器实现" \ No newline at end of file