From f4384772bb9482410ce22ca32db1a57de9eb46db Mon Sep 17 00:00:00 2001 From: Jarrett Ye Date: Wed, 15 May 2024 19:45:49 +0800 Subject: [PATCH] Fix/memory_state_from_sm2-FSRS-4.5 (#191) --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/inference.rs | 29 ++++++++++++++--------------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da0e92b..7e87b79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1077,7 +1077,7 @@ dependencies = [ [[package]] name = "fsrs" -version = "0.6.2" +version = "0.6.3" dependencies = [ "burn", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 17400ae..8c2c0e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fsrs" -version = "0.6.2" +version = "0.6.3" authors = ["Open Spaced Repetition"] categories = ["algorithms", "science"] edition = "2021" diff --git a/src/inference.rs b/src/inference.rs index db87b9c..a2dfd2e 100644 --- a/src/inference.rs +++ b/src/inference.rs @@ -117,7 +117,8 @@ impl FSRS { interval: f32, sm2_retention: f32, ) -> Result { - let stability = interval.max(S_MIN) / (9.0 * (1.0 / sm2_retention - 1.0)); + let stability = + interval.max(S_MIN) * FACTOR as f32 / (sm2_retention.powf(1.0 / DECAY as f32) - 1.0); let w = &self.model().w; let w8: f32 = w.get(8).into_scalar().elem(); let w9: f32 = w.get(9).into_scalar().elem(); @@ -573,20 +574,18 @@ mod tests { #[test] fn memory_from_sm2() -> Result<()> { let fsrs = FSRS::new(Some(&[]))?; - assert_eq!( - fsrs.memory_state_from_sm2(2.5, 10.0, 0.9).unwrap(), - MemoryState { - stability: 9.999995, - difficulty: 7.4120417 - } - ); - assert_eq!( - fsrs.memory_state_from_sm2(1.3, 20.0, 0.9).unwrap(), - MemoryState { - stability: 19.99999, - difficulty: 10.0 - } - ); + let memory_state = fsrs.memory_state_from_sm2(2.5, 10.0, 0.9).unwrap(); + Data::from([memory_state.stability, memory_state.difficulty]) + .assert_approx_eq(&Data::from([9.999996, 7.4120417]), 5); + let memory_state = fsrs.memory_state_from_sm2(2.5, 10.0, 0.8).unwrap(); + Data::from([memory_state.stability, memory_state.difficulty]) + .assert_approx_eq(&Data::from([4.170096, 9.491373]), 5); + let memory_state = fsrs.memory_state_from_sm2(2.5, 10.0, 0.95).unwrap(); + Data::from([memory_state.stability, memory_state.difficulty]) + .assert_approx_eq(&Data::from([21.712555, 2.80758]), 5); + let memory_state = fsrs.memory_state_from_sm2(1.3, 20.0, 0.9).unwrap(); + Data::from([memory_state.stability, memory_state.difficulty]) + .assert_approx_eq(&Data::from([19.999992, 10.0]), 5); let interval = 15; let ease_factor = 2.0; let fsrs_factor = fsrs