diff options
| author | Jakob L. Kreuze <zerodaysfordays@sdf.org> | 2025-07-19 17:11:19 -0400 |
|---|---|---|
| committer | Jakob L. Kreuze <zerodaysfordays@sdf.org> | 2025-07-19 17:11:19 -0400 |
| commit | d79ef14711c0c9c03c2373b823ecd55b4f7f5345 (patch) | |
| tree | aba0fb4b12e52b57ad1da852ecad3469f4514a2b /script.js.bak | |
| parent | 9af0c928eac7971c3e4e3a3485ee2d4f20a2f790 (diff) | |
Scheduling
Diffstat (limited to 'script.js.bak')
| -rw-r--r-- | script.js.bak | 108 |
1 files changed, 0 insertions, 108 deletions
diff --git a/script.js.bak b/script.js.bak index c81f2e5..e9b9378 100644 --- a/script.js.bak +++ b/script.js.bak @@ -90,111 +90,3 @@ function main() { // All functions } -const W = [ - 0.40255, 1.18385, 3.173, 15.69105, 7.1949, 0.5345, 1.4604, 0.0046, 1.54575, 0.1192, 1.01925, - 1.9395, 0.11, 0.29605, 2.2698, 0.2315, 2.9898, 0.51655, 0.6621, -]; - -const F = 19.0 / 81.0; -const C = -0.5; - -const Grade = { - Forgot: 1.0, - Hard: 2.0, - Good: 3.0, - Easy: 4.0 -}; - -function retrievability(t, s) { - return Math.pow(1.0 + F * (t / s), C); -} - -function interval(r_d, s) { - return (s / F) * (Math.pow(r_d, 1.0 / C) - 1.0); -} - -function s_0(g) { - switch (g) { - case Grade.Forgot: return W[0]; - case Grade.Hard: return W[1]; - case Grade.Good: return W[2]; - case Grade.Easy: return W[3]; - } -} - -function s_success(d, s, r, g) { - const t_d = 11.0 - d; - const t_s = Math.pow(s, -W[9]); - const t_r = Math.exp(W[10] * (1.0 - r)) - 1.0; - const h = g === Grade.Hard ? W[15] : 1.0; - const b = g === Grade.Easy ? W[16] : 1.0; - const c = Math.exp(W[8]); - const alpha = 1.0 + t_d * t_s * t_r * h * b * c; - return s * alpha; -} - -function s_fail(d, s, r) { - const d_f = Math.pow(d, -W[12]); - const s_f = Math.pow(s + 1.0, W[13]) - 1.0; - const r_f = Math.exp(W[14] * (1.0 - r)); - const c_f = W[11]; - const result = d_f * s_f * r_f * c_f; - return Math.min(result, s); -} - -function stability(d, s, r, g) { - return g === Grade.Forgot ? s_fail(d, s, r) : s_success(d, s, r, g); -} - -function clamp_d(d) { - return Math.min(10.0, Math.max(1.0, d)); -} - -function d_0(g) { - const g_value = Grade[g]; - return clamp_d(W[4] - Math.exp(W[5] * (g_value - 1.0)) + 1.0); -} - -function difficulty(d, g) { - return clamp_d(W[7] * d_0('Easy') + (1.0 - W[7]) * dp(d, g)); -} - -function dp(d, g) { - return d + delta_d(g) * ((10.0 - d) / 9.0); -} - -function delta_d(g) { - const g_value = Grade[g]; - return -W[6] * (g_value - 3.0); -} - -function sim(grades) { - let t = 0.0; - const r_d = 0.9; - const steps = []; - - // Initial review - if (grades.length === 0) { - throw new Error("Grades cannot be empty"); - } - - let gradesCopy = [...grades]; - let g = gradesCopy.shift(); // Remove the first grade - let s = s_0(g); - let d = d_0(g); - let i = Math.max(Math.round(interval(r_d, s)), 1.0); - - steps.push({ t, s, d, i }); - - // n-th review - for (let g of gradesCopy) { - t += i; - const r = retrievability(i, s); - s = stability(d, s, r, g); - d = difficulty(d, g); - i = Math.max(Math.round(interval(r_d, s)), 1.0); - steps.push({ t, s, d, i }); - } - - return steps; -} |