feat: FAST-0 特殊算法
This commit is contained in:
@@ -1,2 +1,3 @@
|
||||
# Interface - 用户界面
|
||||
|
||||
与界面系统**强绑定**的相关代码文件, "界面系统" 在此处是基本界面实现相关的 Textual 框架
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# Kernel - HeurAMS 核心
|
||||
|
||||
记忆规划相关算法与数据结构, 可脱离业务层
|
||||
记忆规划相关算法与数据结构, 可脱离业务层
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
from .base import BaseAlgorithm
|
||||
from .sm2 import SM2Algorithm
|
||||
from .sm15m import SM15MAlgorithm
|
||||
from .fast0 import FAST0Algorithm
|
||||
|
||||
__all__ = [
|
||||
"SM2Algorithm",
|
||||
"BaseAlgorithm",
|
||||
"SM15MAlgorithm",
|
||||
"FAST0Algorithm",
|
||||
]
|
||||
|
||||
algorithms = {
|
||||
"SM-2": SM2Algorithm,
|
||||
"FAST-0": FAST0Algorithm,
|
||||
"SM-15M": SM15MAlgorithm,
|
||||
"Base": BaseAlgorithm,
|
||||
}
|
||||
|
||||
91
src/heurams/kernel/algorithms/fast0.py
Normal file
91
src/heurams/kernel/algorithms/fast0.py
Normal file
@@ -0,0 +1,91 @@
|
||||
from typing import TypedDict
|
||||
|
||||
import heurams.services.timer as timer
|
||||
from heurams.services.logger import get_logger
|
||||
|
||||
from .base import BaseAlgorithm
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
class FAST0Algorithm(BaseAlgorithm):
|
||||
algo_name = "FAST-0"
|
||||
|
||||
class AlgodataDict(TypedDict):
|
||||
real_rept: int
|
||||
rept: int
|
||||
interval: int
|
||||
important: int
|
||||
last_date: int
|
||||
next_date: int
|
||||
is_activated: int
|
||||
last_modify: float
|
||||
|
||||
defaults = {
|
||||
"real_rept": 0,
|
||||
'important': 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
|
||||
):
|
||||
"""FAST-0 算法迭代决策机制实现
|
||||
根据 quality(0 ~ 5) 进行参数迭代最佳间隔
|
||||
quality 由主程序评估
|
||||
|
||||
Args:
|
||||
quality (int): 记忆保留率量化参数
|
||||
"""
|
||||
logger.debug(
|
||||
"FAST0.revisor 开始, feedback: %d, is_new_activation: %s",
|
||||
feedback,
|
||||
is_new_activation,
|
||||
)
|
||||
|
||||
if feedback == -1:
|
||||
logger.debug("feedback 为 -1, 跳过更新")
|
||||
return
|
||||
algodata[cls.algo_name]["interval"] = (1 if feedback <= 3 else float('inf'))
|
||||
algodata[cls.algo_name]["important"] = (1 if feedback <= 3 else algodata[cls.algo_name]["important"])
|
||||
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()
|
||||
|
||||
logger.debug(
|
||||
"更新日期: last_date=%d, next_date=%d, last_modify=%f",
|
||||
algodata[cls.algo_name]["last_date"],
|
||||
algodata[cls.algo_name]["next_date"],
|
||||
algodata[cls.algo_name]["last_modify"],
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def is_due(cls, algodata):
|
||||
result = algodata[cls.algo_name]["next_date"] <= timer.get_daystamp()
|
||||
logger.debug(
|
||||
"FAST0.is_due: next_date=%d, current_daystamp=%d, result=%s",
|
||||
algodata[cls.algo_name]["next_date"],
|
||||
timer.get_daystamp(),
|
||||
result,
|
||||
)
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def get_rating(cls, algodata):
|
||||
efactor = algodata[cls.algo_name]["efactor"]
|
||||
logger.debug("FAST0.rate: efactor=%f", efactor)
|
||||
return str(efactor)
|
||||
|
||||
@classmethod
|
||||
def nextdate(cls, algodata) -> int:
|
||||
next_date = algodata[cls.algo_name]["next_date"]
|
||||
logger.debug("FAST0.nextdate: %d", next_date)
|
||||
return next_date
|
||||
@@ -1,11 +1,11 @@
|
||||
# Reactor - 记忆流程状态机模块
|
||||
|
||||
Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实现是解耦的, 以便后期与其他框架的适配.
|
||||
得益于 Pickle, 状态机模块支持快照!
|
||||
Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实现是解耦的, 以便后期与其他框架的适配.\
|
||||
得益于 Pickle, 状态机模块支持快照!
|
||||
|
||||
## Phaser - 全局阶段控制器
|
||||
|
||||
在一次队列记忆流程中, Phaser 代表记忆流程本身.
|
||||
在一次队列记忆流程中, Phaser 代表记忆流程本身.
|
||||
|
||||
### 属性
|
||||
|
||||
@@ -14,35 +14,35 @@ Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实
|
||||
其有状态属性:
|
||||
|
||||
- unsure - 用于初始化
|
||||
- *quick_review - 复习逾期的单元
|
||||
- *recognition - 辨识新单元
|
||||
- *final_review - 复习所有逾期的和新辨认的单元
|
||||
- finished - 表示完成
|
||||
- \*quick_review - 复习逾期的单元
|
||||
- \*recognition - 辨识新单元
|
||||
- \*final_review - 复习所有逾期的和新辨认的单元
|
||||
- finished - 表示完成
|
||||
|
||||
> 逾期的: 指 SM-2 算法间隔显示应该复习的单元
|
||||
|
||||
带 * 的属性表示实际的记忆阶段, 由 repo 中 schedule.toml 中 schedule 列表显式声明, 运行过程中可以选择性执行, "空的" Procession 会被直接跳过.
|
||||
|
||||
在初始化 Procession 时, 每个 Procession 被赋予一个不重复的状态属性 作为"阶段状态"属性, 以此标识 Procession 的阶段属性, 因为每个 Procession 管理一个阶段下的复习进程.
|
||||
在初始化 Procession 时, 每个 Procession 被赋予一个不重复的状态属性 作为"阶段状态"属性, 以此标识 Procession 的阶段属性, 因为每个 Procession 管理一个阶段下的复习进程.
|
||||
|
||||
你可以用 state 属性获取 Phaser 的当前状态.
|
||||
|
||||
#### Procession 属性
|
||||
|
||||
储存一个顺序列表, 保存所有构造的 Procession.
|
||||
储存一个顺序列表, 保存所有构造的 Procession.\
|
||||
顺序与 repo 中 schedule.toml 中 schedule 列表中的顺序完全相同
|
||||
|
||||
### 初始化
|
||||
|
||||
Phaser 接受一个存储 Atom 对象的列表, 作为组织记忆流程的材料
|
||||
在内部, 根据是否激活将其分为 new_atoms 与 old_atoms.
|
||||
Phaser 接受一个存储 Atom 对象的列表, 作为组织记忆流程的材料\
|
||||
在内部, 根据是否激活将其分为 new_atoms 与 old_atoms.\
|
||||
因此, 如果你传入的列表中有算法上"无所事事"的 Atom, 流程会对其进行"加强复习"
|
||||
由此创建 Procession.
|
||||
由此创建 Procession.
|
||||
|
||||
### 直接输出呈现形式
|
||||
|
||||
Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.
|
||||
其以 ascii 表格形式输出, 格式也符合 markdown 表格规范, 你可以直接复制到 markdown.
|
||||
Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\
|
||||
其以 ascii 表格形式输出, 格式也符合 markdown 表格规范, 你可以直接复制到 markdown.\
|
||||
示例:
|
||||
|
||||
```text
|
||||
@@ -51,20 +51,20 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.
|
||||
| Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 |
|
||||
```
|
||||
|
||||
| Type | State | Processions | Current Procession |
|
||||
| Type | State | Processions | Current Procession |
|
||||
|:-------|:--------|:-----------------------|:---------------------|
|
||||
| Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 |
|
||||
| Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 |
|
||||
|
||||
### 方法
|
||||
|
||||
作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法.
|
||||
除此之外, 它也拥有一些其他方法.
|
||||
作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法.\
|
||||
除此之外, 它也拥有一些其他方法.
|
||||
|
||||
#### current_procession(self)
|
||||
|
||||
用于查询当前的 Procession, 并且根据当前 Procession 更新自身状态.
|
||||
返回一个 Procession 对象, 是当前阶段的 Procession.
|
||||
内部运作是返回第一个状态不为 finished 的 Procession, 并将自身状态变更为 Procession 的"阶段状态"属性
|
||||
用于查询当前的 Procession, 并且根据当前 Procession 更新自身状态.\
|
||||
返回一个 Procession 对象, 是当前阶段的 Procession.\
|
||||
内部运作是返回第一个状态不为 finished 的 Procession, 并将自身状态变更为 Procession 的"阶段状态"属性\
|
||||
若所有 Procession 都已完成, 将返回一个"阶段状态"为 finished 的 Procession 占位符对象(它不在 procession 属性中), 并更新自身状态为 finished.
|
||||
|
||||
## Procession - 阶段管理器
|
||||
@@ -87,7 +87,7 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.
|
||||
|
||||
> 注意区分 "Phaser" 和 "Phase", 其中 "Phase" 表示 "Phaser State".
|
||||
|
||||
- name_: 阶段的命名
|
||||
- name\_: 阶段的命名
|
||||
- state: 当前状态属性
|
||||
|
||||
### 初始化
|
||||
@@ -96,7 +96,7 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.
|
||||
|
||||
### 直接输出呈现形式
|
||||
|
||||
同 Phaser, 但显示数据有所不同
|
||||
同 Phaser, 但显示数据有所不同\
|
||||
与 Phaser 不同, Procession 显示队列会对过长的 atom.ident 进行缩略(末尾 `>` 符号)
|
||||
|
||||
```text
|
||||
@@ -105,23 +105,23 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.
|
||||
| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, |
|
||||
```
|
||||
|
||||
| Type | Name | State | Progress | Queue | Current Atom |
|
||||
| Type | Name | State | Progress | Queue | Current Atom |
|
||||
|:-----------|:-------|:--------|:-----------|:-----------------------|:------------------------------|
|
||||
| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, |
|
||||
| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, |
|
||||
|
||||
### 方法
|
||||
|
||||
作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法.
|
||||
除此之外, 它也拥有一些其他方法.
|
||||
作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法.\
|
||||
除此之外, 它也拥有一些其他方法.
|
||||
|
||||
#### forward(self, step=1)
|
||||
|
||||
移动 cursor 并依情况更新 current_atom 和状态属性
|
||||
无论 Procession 是否处于完成状态, forward 操作都是可逆的, 你可以传入负数, 此时已完成的 Procession 会自动"重启".
|
||||
移动 cursor 并依情况更新 current_atom 和状态属性\
|
||||
无论 Procession 是否处于完成状态, forward 操作都是可逆的, 你可以传入负数, 此时已完成的 Procession 会自动"重启".
|
||||
|
||||
#### append(self, atom=None)
|
||||
|
||||
追加(回忆失败的)原子(默认为当前原子, 传入 None 会自动转化为当前原子)到队列末端
|
||||
追加(回忆失败的)原子(默认为当前原子, 传入 None 会自动转化为当前原子)到队列末端\
|
||||
如果这个原子已经处于队列末端, 不会重复追加, 除非队列只剩下这个原子还没完成(此时最多重复两个)
|
||||
|
||||
#### process(self)
|
||||
@@ -130,7 +130,7 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.
|
||||
|
||||
#### __len__(self)
|
||||
|
||||
返回剩余原子量(而不是原子总量)
|
||||
返回剩余原子量(而不是原子总量)\
|
||||
可以使用 len 函数调用
|
||||
获取原子总量请用 len(obj.atoms), 或者 total_length(self) 方法
|
||||
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
# Provider - 提供者
|
||||
底层相关与第三方 API 接口包装
|
||||
|
||||
底层相关与第三方 API 接口包装
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
# Services - 服务
|
||||
基础服务相关代码
|
||||
|
||||
基础服务相关代码
|
||||
|
||||
Reference in New Issue
Block a user