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']