From e77210efc678a85bfbf4efd5174fd41d8fb896d4 Mon Sep 17 00:00:00 2001 From: david-ajax Date: Sat, 18 Oct 2025 00:01:56 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=AE=9E=E7=8E=B0=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/README.md | 2 +- src/heurams/kernel/particles/atom.py | 57 +++++------- src/heurams/kernel/particles/electron.py | 112 +++++++++++++---------- src/heurams/kernel/particles/nucleon.py | 22 +++-- src/heurams/kernel/reactor/apparatus.py | 1 + src/heurams/kernel/reactor/rtk.py | 11 +++ 6 files changed, 115 insertions(+), 90 deletions(-) create mode 100644 src/heurams/kernel/reactor/rtk.py diff --git a/src/heurams/interface/README.md b/src/heurams/interface/README.md index 0c164bf..7f39292 100644 --- a/src/heurams/interface/README.md +++ b/src/heurams/interface/README.md @@ -1,2 +1,2 @@ # Interface - 用户界面 -与界面强绑定的相关代码文件, "界面系统" 在此处是基本界面实现相关的 Textual 框架 \ No newline at end of file +与界面系统**强绑定**的相关代码文件, "界面系统" 在此处是基本界面实现相关的 Textual 框架 diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index 445e25e..ee42277 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -1,39 +1,30 @@ from electron import Electron from nucleon import Nucleon -class Atom: +class Atom(): + """ + 一个静态类, 包含一个原子对象的所有信息: + 关联电子 (算法数据) + 关联核子 (内容数据) + 关联轨道 (策略数据) + 关联路径 () + """ + + def __init__(self, ident = ""): + self.ident = ident + self.register = { + "nucleon": None, + "nucleon_path": None, + "electron": None, + "electron_path": None, + "orbital": None, + } + + def link(self, key, value): + self.register[key] = value + + + @staticmethod def placeholder(): return (Electron.placeholder(), Nucleon.placeholder(), {}) - - @staticmethod - def advanced_placeholder(): - return ( - Electron("两只黄鹤鸣翠柳", {}), - Nucleon( - "两只黄鹤鸣翠柳", - { - "note": [], - "translation": "臣子李密陈言:我因命运不好,小时候遭遇到了不幸", - "keyword_note": { - "险衅": "凶险祸患(这里指命运不好)", - "夙": "早时,这里指年幼的时候", - "闵": "通'悯',指可忧患的事", - "凶": "不幸,指丧父" - } - } - ), - { - "keydata": { - "note": "笔记", - "keyword_note": "关键词翻译", - "translation": "语句翻译" - }, - "testdata": { - "additional_inf": ["translation", "note", "keyword_note"], - "fill_blank_test": ["translation"], - "draw_card_test": ["keyword_note"] - }, - "is_new_activation": 0 - } - ) \ No newline at end of file diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index 4fdc439..a4f238c 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -3,16 +3,25 @@ from heurams.context import config_var class Electron: """电子: 记忆分析元数据及算法""" - algorithm = "SM-2" # 暂时使用 SM-2 算法进行记忆拟合, 考虑 SM-15 替代 + algo = "SM-2" - def __init__(self, content: str, metadata: dict): - self.content = content - self.metadata = metadata - if metadata == {}: - # print("NULL") + def __init__(self, ident: str, algodata: dict = {}): + """初始化电子对象 (记忆数据) + + Args: + ident: 算法的唯一标识符, 用于区分不同的算法实例, 使用 algodata[ident] 获取 + algodata: 算法数据字典, 包含算法的各项参数和设置 + """ + self.algodata = algodata + self.ident = ident + if self.algo not in self.algodata.keys(): + self.algodata[self.algo] = {} + if algodata[self.algo] == {}: self._default_init() def _default_init(self): + """默认初始化包装 + """ defaults = { 'efactor': 2.5, # 易度系数, 越大越简单, 最大为5 'real_rept': 0, # (实际)重复次数 @@ -24,16 +33,20 @@ class Electron: # *NOTE: 此处"时间戳"是以天为单位的整数, 即 UNIX 时间戳除以一天的秒数取整 'last_modify': timer.get_timestamp() # 最后修改时间戳(此处是UNIX时间戳) } - self.metadata = defaults + self.algodata[self.algo] = defaults def activate(self): - self.metadata['is_activated'] = 1 - self.metadata['last_modify'] = timer.get_timestamp() + """激活此电子 + """ + self.algodata[self.algo]['is_activated'] = 1 + self.algodata[self.algo]['last_modify'] = timer.get_timestamp() def modify(self, var: str, value): - if var in self.metadata: - self.metadata[var] = value - self.metadata['last_modify'] = timer.get_timestamp() + """修改 algodata[algo] 中子字典数据 + """ + if var in self.algodata[self.algo]: + self.algodata[self.algo][var] = value + self.algodata[self.algo]['last_modify'] = timer.get_timestamp() else: print(f"警告: '{var}' 非已知元数据字段") @@ -49,75 +62,76 @@ class Electron: if quality == -1: return -1 - self.metadata['efactor'] = self.metadata['efactor'] + ( + self.algodata[self.algo]['efactor'] = self.algodata[self.algo]['efactor'] + ( 0.1 - (5 - quality) * (0.08 + (5 - quality) * 0.02) ) - self.metadata['efactor'] = max(1.3, self.metadata['efactor']) + self.algodata[self.algo]['efactor'] = max(1.3, self.algodata[self.algo]['efactor']) if quality < 3: # 若保留率低于 3,重置重复次数 - self.metadata['rept'] = 0 - self.metadata['interval'] = 0 # 设为0,以便下面重新计算 I(1) + self.algodata[self.algo]['rept'] = 0 + self.algodata[self.algo]['interval'] = 0 # 设为0,以便下面重新计算 I(1) else: - self.metadata['rept'] += 1 + self.algodata[self.algo]['rept'] += 1 - self.metadata['real_rept'] += 1 + self.algodata[self.algo]['real_rept'] += 1 if is_new_activation: # 初次激活 - self.metadata['rept'] = 0 - self.metadata['efactor'] = 2.5 + self.algodata[self.algo]['rept'] = 0 + self.algodata[self.algo]['efactor'] = 2.5 - if self.metadata['rept'] == 0: # 刚被重置或初次激活后复习 - self.metadata['interval'] = 1 # I(1) - elif self.metadata['rept'] == 1: - self.metadata['interval'] = 6 # I(2) 经验公式 + if self.algodata[self.algo]['rept'] == 0: # 刚被重置或初次激活后复习 + self.algodata[self.algo]['interval'] = 1 # I(1) + elif self.algodata[self.algo]['rept'] == 1: + self.algodata[self.algo]['interval'] = 6 # I(2) 经验公式 else: - self.metadata['interval'] = round( - self.metadata['interval'] * self.metadata['efactor'] + self.algodata[self.algo]['interval'] = round( + self.algodata[self.algo]['interval'] * self.algodata[self.algo]['efactor'] ) - self.metadata['last_date'] = timer.get_daystamp() - self.metadata['next_date'] = timer.get_daystamp() + self.metadata['interval'] - self.metadata['last_modify'] = timer.get_timestamp() + self.algodata[self.algo]['last_date'] = timer.get_daystamp() + self.algodata[self.algo]['next_date'] = timer.get_daystamp() + self.algodata[self.algo]['interval'] + self.algodata[self.algo]['last_modify'] = timer.get_timestamp() def __str__(self): return ( f"记忆单元预览 \n" - f"内容: '{self.content}' \n" - f"易度系数: {self.metadata['efactor']:.2f} \n" - f"已经重复的次数: {self.metadata['rept']} \n" - f"下次间隔: {self.metadata['interval']} 天 \n" - f"下次复习日期时间戳: {self.metadata['next_date']}" + f"标识符: '{self.ident}' \n" + f"易度系数: {self.algodata[self.algo]['efactor']:.2f} \n" + f"已经重复的次数: {self.algodata[self.algo]['rept']} \n" + f"下次间隔: {self.algodata[self.algo]['interval']} 天 \n" + f"下次复习日期时间戳: {self.algodata[self.algo]['next_date']}" ) def __eq__(self, other): - if self.content == other.content: + if self.ident == other.ident: return True return False def __hash__(self): - return hash(self.content) + return hash(self.ident) def __getitem__(self, key): - if key == "content": - return self.content - if key in self.metadata: - return self.metadata[key] + if key == "ident": + return self.ident + if key in self.algodata[self.algo]: + return self.algodata[self.algo][key] else: - raise KeyError(f"Key '{key}' not found in metadata.") + raise KeyError(f"Key '{key}' not found in algodata[self.algo].") def __setitem__(self, key, value): - if key == "content": - raise AttributeError("content 应为只读") - self.metadata[key] = value - self.metadata['last_modify'] = timer.get_timestamp() - - def __iter__(self): - yield from self.metadata.keys() + if key == "ident": + raise AttributeError("ident should be readonly") + self.algodata[self.algo][key] = value + self.algodata[self.algo]['last_modify'] = timer.get_timestamp() def __len__(self): - return len(self.metadata) + """仅返回当前算法的配置数量 + """ + return len(self.algodata[self.algo]) @staticmethod def placeholder(): + """生成一个电子占位符 + """ return Electron("电子对象样例内容", {}) diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 9952e93..61db94c 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -1,13 +1,20 @@ class Nucleon: - """核子: 材料元数据""" + """原子核: 材料元数据""" - def __init__(self, content: str, data: dict): - self.metadata = data - self.content = content + def __init__(self, ident: str, metadata: dict): + """初始化原子核 (记忆内容) + + Args: + ident: 唯一标识符 + metadata: 记忆内容信息 + orbital: 记忆策略信息 (电子轨道) + """ + self.metadata = metadata + self.ident = ident def __getitem__(self, key): - if key == "content": - return self.content + if key == "ident": + return self.ident if key in self.metadata: return self.metadata[key] else: @@ -20,8 +27,9 @@ class Nucleon: return len(self.metadata) def __hash__(self): - return hash(self.content) + return hash(self.ident) @staticmethod def placeholder(): + """生成一个占位原子核""" return Nucleon("核子对象样例内容", {}) diff --git a/src/heurams/kernel/reactor/apparatus.py b/src/heurams/kernel/reactor/apparatus.py index 3871d20..a1a3c8a 100644 --- a/src/heurams/kernel/reactor/apparatus.py +++ b/src/heurams/kernel/reactor/apparatus.py @@ -1,6 +1,7 @@ # 单个原子处理器 import heurams.kernel.particles as pt +import typing class Apparatus(): """反应器对象, 决策一个原子的不同记忆方式, 并反馈到布局""" diff --git a/src/heurams/kernel/reactor/rtk.py b/src/heurams/kernel/reactor/rtk.py new file mode 100644 index 0000000..8d5d270 --- /dev/null +++ b/src/heurams/kernel/reactor/rtk.py @@ -0,0 +1,11 @@ +# 核心流程状态机 + +import heurams.kernel.particles as pt +import heurams.services.timer as timer +from typing import Tuple +from .apparatus import Apparatus + +class Reactor(): + def __init__(self, atoms): + # atoms 是原子列表 + \ No newline at end of file