重新实现对象系统
This commit is contained in:
@@ -1,2 +1,2 @@
|
|||||||
# Interface - 用户界面
|
# Interface - 用户界面
|
||||||
与界面强绑定的相关代码文件, "界面系统" 在此处是基本界面实现相关的 Textual 框架
|
与界面系统**强绑定**的相关代码文件, "界面系统" 在此处是基本界面实现相关的 Textual 框架
|
||||||
|
@@ -1,39 +1,30 @@
|
|||||||
from electron import Electron
|
from electron import Electron
|
||||||
from nucleon import Nucleon
|
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
|
@staticmethod
|
||||||
def placeholder():
|
def placeholder():
|
||||||
return (Electron.placeholder(), Nucleon.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
|
|
||||||
}
|
|
||||||
)
|
|
@@ -3,16 +3,25 @@ from heurams.context import config_var
|
|||||||
|
|
||||||
class Electron:
|
class Electron:
|
||||||
"""电子: 记忆分析元数据及算法"""
|
"""电子: 记忆分析元数据及算法"""
|
||||||
algorithm = "SM-2" # 暂时使用 SM-2 算法进行记忆拟合, 考虑 SM-15 替代
|
algo = "SM-2"
|
||||||
|
|
||||||
def __init__(self, content: str, metadata: dict):
|
def __init__(self, ident: str, algodata: dict = {}):
|
||||||
self.content = content
|
"""初始化电子对象 (记忆数据)
|
||||||
self.metadata = metadata
|
|
||||||
if metadata == {}:
|
Args:
|
||||||
# print("NULL")
|
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()
|
self._default_init()
|
||||||
|
|
||||||
def _default_init(self):
|
def _default_init(self):
|
||||||
|
"""默认初始化包装
|
||||||
|
"""
|
||||||
defaults = {
|
defaults = {
|
||||||
'efactor': 2.5, # 易度系数, 越大越简单, 最大为5
|
'efactor': 2.5, # 易度系数, 越大越简单, 最大为5
|
||||||
'real_rept': 0, # (实际)重复次数
|
'real_rept': 0, # (实际)重复次数
|
||||||
@@ -24,16 +33,20 @@ class Electron:
|
|||||||
# *NOTE: 此处"时间戳"是以天为单位的整数, 即 UNIX 时间戳除以一天的秒数取整
|
# *NOTE: 此处"时间戳"是以天为单位的整数, 即 UNIX 时间戳除以一天的秒数取整
|
||||||
'last_modify': timer.get_timestamp() # 最后修改时间戳(此处是UNIX时间戳)
|
'last_modify': timer.get_timestamp() # 最后修改时间戳(此处是UNIX时间戳)
|
||||||
}
|
}
|
||||||
self.metadata = defaults
|
self.algodata[self.algo] = defaults
|
||||||
|
|
||||||
def activate(self):
|
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):
|
def modify(self, var: str, value):
|
||||||
if var in self.metadata:
|
"""修改 algodata[algo] 中子字典数据
|
||||||
self.metadata[var] = value
|
"""
|
||||||
self.metadata['last_modify'] = timer.get_timestamp()
|
if var in self.algodata[self.algo]:
|
||||||
|
self.algodata[self.algo][var] = value
|
||||||
|
self.algodata[self.algo]['last_modify'] = timer.get_timestamp()
|
||||||
else:
|
else:
|
||||||
print(f"警告: '{var}' 非已知元数据字段")
|
print(f"警告: '{var}' 非已知元数据字段")
|
||||||
|
|
||||||
@@ -49,75 +62,76 @@ class Electron:
|
|||||||
if quality == -1:
|
if quality == -1:
|
||||||
return -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)
|
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:
|
if quality < 3:
|
||||||
# 若保留率低于 3,重置重复次数
|
# 若保留率低于 3,重置重复次数
|
||||||
self.metadata['rept'] = 0
|
self.algodata[self.algo]['rept'] = 0
|
||||||
self.metadata['interval'] = 0 # 设为0,以便下面重新计算 I(1)
|
self.algodata[self.algo]['interval'] = 0 # 设为0,以便下面重新计算 I(1)
|
||||||
else:
|
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: # 初次激活
|
if is_new_activation: # 初次激活
|
||||||
self.metadata['rept'] = 0
|
self.algodata[self.algo]['rept'] = 0
|
||||||
self.metadata['efactor'] = 2.5
|
self.algodata[self.algo]['efactor'] = 2.5
|
||||||
|
|
||||||
if self.metadata['rept'] == 0: # 刚被重置或初次激活后复习
|
if self.algodata[self.algo]['rept'] == 0: # 刚被重置或初次激活后复习
|
||||||
self.metadata['interval'] = 1 # I(1)
|
self.algodata[self.algo]['interval'] = 1 # I(1)
|
||||||
elif self.metadata['rept'] == 1:
|
elif self.algodata[self.algo]['rept'] == 1:
|
||||||
self.metadata['interval'] = 6 # I(2) 经验公式
|
self.algodata[self.algo]['interval'] = 6 # I(2) 经验公式
|
||||||
else:
|
else:
|
||||||
self.metadata['interval'] = round(
|
self.algodata[self.algo]['interval'] = round(
|
||||||
self.metadata['interval'] * self.metadata['efactor']
|
self.algodata[self.algo]['interval'] * self.algodata[self.algo]['efactor']
|
||||||
)
|
)
|
||||||
|
|
||||||
self.metadata['last_date'] = timer.get_daystamp()
|
self.algodata[self.algo]['last_date'] = timer.get_daystamp()
|
||||||
self.metadata['next_date'] = timer.get_daystamp() + self.metadata['interval']
|
self.algodata[self.algo]['next_date'] = timer.get_daystamp() + self.algodata[self.algo]['interval']
|
||||||
self.metadata['last_modify'] = timer.get_timestamp()
|
self.algodata[self.algo]['last_modify'] = timer.get_timestamp()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return (
|
return (
|
||||||
f"记忆单元预览 \n"
|
f"记忆单元预览 \n"
|
||||||
f"内容: '{self.content}' \n"
|
f"标识符: '{self.ident}' \n"
|
||||||
f"易度系数: {self.metadata['efactor']:.2f} \n"
|
f"易度系数: {self.algodata[self.algo]['efactor']:.2f} \n"
|
||||||
f"已经重复的次数: {self.metadata['rept']} \n"
|
f"已经重复的次数: {self.algodata[self.algo]['rept']} \n"
|
||||||
f"下次间隔: {self.metadata['interval']} 天 \n"
|
f"下次间隔: {self.algodata[self.algo]['interval']} 天 \n"
|
||||||
f"下次复习日期时间戳: {self.metadata['next_date']}"
|
f"下次复习日期时间戳: {self.algodata[self.algo]['next_date']}"
|
||||||
)
|
)
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
if self.content == other.content:
|
if self.ident == other.ident:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash(self.content)
|
return hash(self.ident)
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
if key == "content":
|
if key == "ident":
|
||||||
return self.content
|
return self.ident
|
||||||
if key in self.metadata:
|
if key in self.algodata[self.algo]:
|
||||||
return self.metadata[key]
|
return self.algodata[self.algo][key]
|
||||||
else:
|
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):
|
def __setitem__(self, key, value):
|
||||||
if key == "content":
|
if key == "ident":
|
||||||
raise AttributeError("content 应为只读")
|
raise AttributeError("ident should be readonly")
|
||||||
self.metadata[key] = value
|
self.algodata[self.algo][key] = value
|
||||||
self.metadata['last_modify'] = timer.get_timestamp()
|
self.algodata[self.algo]['last_modify'] = timer.get_timestamp()
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
yield from self.metadata.keys()
|
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
return len(self.metadata)
|
"""仅返回当前算法的配置数量
|
||||||
|
"""
|
||||||
|
return len(self.algodata[self.algo])
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def placeholder():
|
def placeholder():
|
||||||
|
"""生成一个电子占位符
|
||||||
|
"""
|
||||||
return Electron("电子对象样例内容", {})
|
return Electron("电子对象样例内容", {})
|
||||||
|
@@ -1,13 +1,20 @@
|
|||||||
class Nucleon:
|
class Nucleon:
|
||||||
"""核子: 材料元数据"""
|
"""原子核: 材料元数据"""
|
||||||
|
|
||||||
def __init__(self, content: str, data: dict):
|
def __init__(self, ident: str, metadata: dict):
|
||||||
self.metadata = data
|
"""初始化原子核 (记忆内容)
|
||||||
self.content = content
|
|
||||||
|
Args:
|
||||||
|
ident: 唯一标识符
|
||||||
|
metadata: 记忆内容信息
|
||||||
|
orbital: 记忆策略信息 (电子轨道)
|
||||||
|
"""
|
||||||
|
self.metadata = metadata
|
||||||
|
self.ident = ident
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
if key == "content":
|
if key == "ident":
|
||||||
return self.content
|
return self.ident
|
||||||
if key in self.metadata:
|
if key in self.metadata:
|
||||||
return self.metadata[key]
|
return self.metadata[key]
|
||||||
else:
|
else:
|
||||||
@@ -20,8 +27,9 @@ class Nucleon:
|
|||||||
return len(self.metadata)
|
return len(self.metadata)
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash(self.content)
|
return hash(self.ident)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def placeholder():
|
def placeholder():
|
||||||
|
"""生成一个占位原子核"""
|
||||||
return Nucleon("核子对象样例内容", {})
|
return Nucleon("核子对象样例内容", {})
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
# 单个原子处理器
|
# 单个原子处理器
|
||||||
|
|
||||||
import heurams.kernel.particles as pt
|
import heurams.kernel.particles as pt
|
||||||
|
import typing
|
||||||
|
|
||||||
class Apparatus():
|
class Apparatus():
|
||||||
"""反应器对象, 决策一个原子的不同记忆方式, 并反馈到布局"""
|
"""反应器对象, 决策一个原子的不同记忆方式, 并反馈到布局"""
|
||||||
|
11
src/heurams/kernel/reactor/rtk.py
Normal file
11
src/heurams/kernel/reactor/rtk.py
Normal file
@@ -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 是原子列表
|
||||||
|
|
Reference in New Issue
Block a user