fsrs_ex (Fsrs)

在 Elixir 中使用 FSRS(Free Spaced Repetition Scheduler)构建间隔重复系统。

fsrs_ex 是一个面向 Elixir 的 FSRS 调度器实现,模块名为 Fsrs

本项目定位非常明确:直接对齐并移植 open-spaced-repetition/py-fsrs 的调度器行为,当前基线为 py-fsrs v6.3.0(FSRS-6)

项目状态

这个库做了什么

直接移植(Port)范围说明

本项目明确是从 Python 版本移植,重点对齐如下:

安装

mix.exs 中加入依赖:

def deps do
  [
    {:fsrs_ex, "~> 0.1.0"}
  ]
end

然后执行:

mix deps.get

快速开始

alias Fsrs

# 1) 创建调度器
scheduler = Fsrs.new_scheduler(enable_fuzzing: false)

# 2) 创建卡片
card = Fsrs.new_card()

# 3) 评分复习(:again | :hard | :good | :easy)
{updated_card, review_log} = Fsrs.review_card(scheduler, card, :good)

updated_card.due
review_log.rating

常用用法

自定义调度器

scheduler = Fsrs.new_scheduler(
  desired_retention: 0.9,
  learning_steps: [{:minutes, 1}, {:seconds, 95}, 300],
  relearning_steps: [{:seconds, 90}, {:minutes, 15}],
  maximum_interval: 36500,
  enable_fuzzing: true
)

说明:

计算可回忆性

retrievability = Fsrs.get_card_retrievability(scheduler, updated_card)

使用历史日志重排卡片状态

rescheduled = Fsrs.reschedule_card(scheduler, card, review_logs)

序列化(跨语言互通)

json = Fsrs.Card.to_json(updated_card)
card2 = Fsrs.Card.from_json(json)

map = Fsrs.Scheduler.to_dict(scheduler)
scheduler2 = Fsrs.Scheduler.from_dict(map)

Port 对拍验证(Python vs Elixir)

本仓库包含完整对拍资产,均已纳入版本管理:

你可以本地复现:

python3 -m venv .venv
.venv/bin/pip install fsrs==6.3.0
.venv/bin/python test/fixtures/generate_py_fixture.py test/fixtures/py_fsrs_v6_3_0_fixture.json
mix test test/fsrs_py_parity_test.exs

致谢与参考

核心来源(Port 基线)

算法文档与官方生态

算法作者与社区贡献者

感谢 open-spaced-repetition 社区及所有贡献者。本项目是面向 Elixir 生态的工程化移植实现,不是官方仓库。

许可证

MIT,详见 LICENSE