Files
HeurAMS/reactor_k.py
2025-09-08 13:44:14 +08:00

76 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 的调度器实现"