[wip] try FSRS algorithm

enhance/try-fsrs
rcmerci 2023-05-12 12:58:19 +08:00
parent b2776bbb18
commit 3bbfb33713
1 changed files with 71 additions and 0 deletions

View File

@ -0,0 +1,71 @@
(ns frontend.extensions.fsrs
(:require))
(def ratings
{:again 1
:hard 2
:good 3
:easy 4})
(def w [1, 1, 5, -0.5, -0.5, 0.2, 1.4, -0.12, 0.8, 2, -0.2, 0.2, 1])
(def enable-fuzz false)
(def requestRetention 0.9)
(def maximumInterval 36500)
;; const intervalModifier = Math.log(requestRetention) / Math.log(0.9);
(def interval-modifier (/ (js/Math.log requestRetention) (js/Math.log 0.9)))
(defn- constrain-difficulty
[difficulty]
{:pre [(number? difficulty)]}
(js/Math.min (js/Math.max (.toFixed difficulty 2) 1) 10))
(defn- init-difficulty
[rating]
(parse-double (.toFixed (constrain-difficulty (+ (nth w 2) (* (nth w 3) (- (get ratings rating) 3)))) 2)))
(defn- init-stability
[rating]
(parse-double (.toFixed (js/Math.max (+ (nth w 0) (* (nth w 1) (- (get ratings rating) 1))) 0.1) 2)))
(defn- apply-fuzz
[ivl]
ivl)
(defn- next-interval
[stability]
(let [new-interval (apply-fuzz (* stability interval-modifier))]
(js/Math.min maximumInterval (js/Math.max 1 (js/Math.round new-interval)))))
(defn- mean-reversion
[init current]
(+ (* (nth w 5) init) (* (- 1 (nth w 5)) current)))
(defn- next-difficulty
[d rating]
(let [next-d (+ d (* (nth w 4) (- (get ratings rating) 3)))]
(constrain-difficulty (mean-reversion (nth w 2) next-d))))
(defn- next-recall-stability
[d s r]
(-> (* s (+ 1 (* (js/Math.exp (nth w 6)) (- 11 d) (js/Math.pow s (nth w 7)) (- (js/Math.exp (* (- 1 r) (nth w 8))) 1))))
(.toFixed 2)
parse-double))
(defn- next-forget-stability
[d s r]
(-> (* (nth w 9) (js/Math.pow d (nth w 10)) (js/Math.pow s (nth w 11)) (js/Math.exp (* (- 1 r) (nth w 12))))
(.toFixed 2)
parse-double))
(defn- init-states
[]
{:again {:d (init-difficulty :again)
:s (init-stability :again)}
:hard {:d (init-difficulty :hard)
:s (init-stability :hard)}
:good {:d (init-difficulty :good)
:s (init-stability :good)}
:easy {:d (init-difficulty :easy)
:s (init-stability :easy)}})