77 lines
2.9 KiB
Python
77 lines
2.9 KiB
Python
# reactor.py 设计改进型 尚未完成功能重构
|
||
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 的调度器实现" |