81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
import timer
|
|
from typing import TypedDict
|
|
|
|
class SM2Algorithm():
|
|
algo_name = "SM-2"
|
|
|
|
class AlgodataDict(TypedDict):
|
|
efactor: float
|
|
real_rept: int
|
|
rept: int
|
|
interval: int
|
|
last_date: int
|
|
next_date: int
|
|
is_activated: int
|
|
last_modify: float
|
|
|
|
defaults = {
|
|
'efactor': 2.5,
|
|
'real_rept': 0,
|
|
'rept': 0,
|
|
'interval': 0,
|
|
'last_date': 0,
|
|
'next_date': 0,
|
|
'is_activated': 0,
|
|
'last_modify': timer.get_timestamp()
|
|
}
|
|
|
|
@classmethod
|
|
def revisor(cls, algodata: dict, feedback: int = 5, is_new_activation: bool = False):
|
|
"""SM-2 算法迭代决策机制实现
|
|
根据 quality(0 ~ 5) 进行参数迭代最佳间隔
|
|
quality 由主程序评估
|
|
|
|
Args:
|
|
quality (int): 记忆保留率量化参数
|
|
"""
|
|
if feedback == -1:
|
|
return
|
|
|
|
algodata[cls.algo_name]['efactor'] = algodata[cls.algo_name]['efactor'] + (
|
|
0.1 - (5 - feedback) * (0.08 + (5 - feedback) * 0.02)
|
|
)
|
|
algodata[cls.algo_name]['efactor'] = max(1.3, algodata[cls.algo_name]['efactor'])
|
|
|
|
if feedback < 3:
|
|
algodata[cls.algo_name]['rept'] = 0
|
|
algodata[cls.algo_name]['interval'] = 0
|
|
else:
|
|
algodata[cls.algo_name]['rept'] += 1
|
|
|
|
algodata[cls.algo_name]['real_rept'] += 1
|
|
|
|
if is_new_activation:
|
|
algodata[cls.algo_name]['rept'] = 0
|
|
algodata[cls.algo_name]['efactor'] = 2.5
|
|
|
|
if algodata[cls.algo_name]['rept'] == 0:
|
|
algodata[cls.algo_name]['interval'] = 1
|
|
elif algodata[cls.algo_name]['rept'] == 1:
|
|
algodata[cls.algo_name]['interval'] = 6
|
|
else:
|
|
algodata[cls.algo_name]['interval'] = round(
|
|
algodata[cls.algo_name]['interval'] * algodata[cls.algo_name]['efactor']
|
|
)
|
|
|
|
algodata[cls.algo_name]['last_date'] = timer.get_daystamp()
|
|
algodata[cls.algo_name]['next_date'] = timer.get_daystamp() + algodata[cls.algo_name]['interval']
|
|
algodata[cls.algo_name]['last_modify'] = timer.get_timestamp()
|
|
|
|
@classmethod
|
|
def is_due(cls, algodata):
|
|
return (algodata[cls.algo_name]['next_date'] <= timer.get_daystamp())
|
|
|
|
@classmethod
|
|
def rate(cls, algodata):
|
|
return str(algodata[cls.algo_name]['efactor'])
|
|
|
|
@classmethod
|
|
def nextdate(cls, algodata):
|
|
return algodata[cls.algo_name]['next_date']
|