From d7b933fc359cae234699a1274fbc03716497602a Mon Sep 17 00:00:00 2001 From: Luc Mcgrady Date: Wed, 23 Apr 2025 10:53:35 +0100 Subject: [PATCH 1/5] Fix: Recalculate memory states on simulate --- rslib/src/scheduler/fsrs/simulator.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rslib/src/scheduler/fsrs/simulator.rs b/rslib/src/scheduler/fsrs/simulator.rs index 34bec1317f9..e24ee76ad38 100644 --- a/rslib/src/scheduler/fsrs/simulator.rs +++ b/rslib/src/scheduler/fsrs/simulator.rs @@ -123,8 +123,14 @@ impl Collection { .col .storage .get_revlog_entries_for_searched_cards_in_card_order()?; - let cards = guard.col.storage.all_searched_cards()?; + let mut cards = guard.col.storage.all_searched_cards()?; drop(guard); + for card in &mut cards { + if card.memory_state.is_none() { + let new_state = self.compute_memory_state(card.id)?.state; + card.memory_state = new_state.map(Into::into); + } + } let days_elapsed = self.timing_today().unwrap().days_elapsed as i32; let new_cards = cards .iter() From c41a8a7a26a9af0e0dc7b36174db74dda76f8b81 Mon Sep 17 00:00:00 2001 From: Luc Mcgrady Date: Wed, 23 Apr 2025 10:57:03 +0100 Subject: [PATCH 2/5] Fix: Wrong cards included --- rslib/src/scheduler/fsrs/simulator.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/rslib/src/scheduler/fsrs/simulator.rs b/rslib/src/scheduler/fsrs/simulator.rs index e24ee76ad38..a620e172013 100644 --- a/rslib/src/scheduler/fsrs/simulator.rs +++ b/rslib/src/scheduler/fsrs/simulator.rs @@ -125,10 +125,13 @@ impl Collection { .get_revlog_entries_for_searched_cards_in_card_order()?; let mut cards = guard.col.storage.all_searched_cards()?; drop(guard); - for card in &mut cards { - if card.memory_state.is_none() { - let new_state = self.compute_memory_state(card.id)?.state; - card.memory_state = new_state.map(Into::into); + fn is_included_card(c: &Card) -> bool { + c.queue != CardQueue::Suspended && c.queue != CardQueue::PreviewRepeat && c.queue != CardQueue::New + } + for c in &mut cards { + if is_included_card(c) && c.memory_state.is_none() { + let new_state = self.compute_memory_state(c.id)?.state; + c.memory_state = new_state.map(Into::into); } } let days_elapsed = self.timing_today().unwrap().days_elapsed as i32; @@ -139,7 +142,7 @@ impl Collection { + req.deck_size as usize; let mut converted_cards = cards .into_iter() - .filter(|c| c.queue != CardQueue::Suspended && c.queue != CardQueue::PreviewRepeat) + .filter(is_included_card) .filter_map(|c| Card::convert(c, days_elapsed)) .collect_vec(); let introduced_today_count = self From c796930251e660722b351a606edca701434fc2c4 Mon Sep 17 00:00:00 2001 From: Luc Mcgrady Date: Wed, 23 Apr 2025 11:15:02 +0100 Subject: [PATCH 3/5] Save states to cards --- rslib/src/scheduler/fsrs/simulator.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rslib/src/scheduler/fsrs/simulator.rs b/rslib/src/scheduler/fsrs/simulator.rs index a620e172013..b37b1cbfab2 100644 --- a/rslib/src/scheduler/fsrs/simulator.rs +++ b/rslib/src/scheduler/fsrs/simulator.rs @@ -130,8 +130,10 @@ impl Collection { } for c in &mut cards { if is_included_card(c) && c.memory_state.is_none() { + let original = c.clone(); let new_state = self.compute_memory_state(c.id)?.state; c.memory_state = new_state.map(Into::into); + self.update_card_inner(c, original, self.usn()?)?; } } let days_elapsed = self.timing_today().unwrap().days_elapsed as i32; From 17fa28e554facfaa519d73ab8f11a0e215d8310f Mon Sep 17 00:00:00 2001 From: Luc Mcgrady Date: Wed, 23 Apr 2025 11:20:10 +0100 Subject: [PATCH 4/5] ./check --- rslib/src/scheduler/fsrs/simulator.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rslib/src/scheduler/fsrs/simulator.rs b/rslib/src/scheduler/fsrs/simulator.rs index b37b1cbfab2..e830dffb5cf 100644 --- a/rslib/src/scheduler/fsrs/simulator.rs +++ b/rslib/src/scheduler/fsrs/simulator.rs @@ -126,8 +126,10 @@ impl Collection { let mut cards = guard.col.storage.all_searched_cards()?; drop(guard); fn is_included_card(c: &Card) -> bool { - c.queue != CardQueue::Suspended && c.queue != CardQueue::PreviewRepeat && c.queue != CardQueue::New - } + c.queue != CardQueue::Suspended + && c.queue != CardQueue::PreviewRepeat + && c.queue != CardQueue::New + } for c in &mut cards { if is_included_card(c) && c.memory_state.is_none() { let original = c.clone(); From 52dd8eee18bc931498d0aa9c92e9f0c0e4e59b83 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Thu, 24 Apr 2025 19:27:58 +1000 Subject: [PATCH 5/5] Update rslib/src/scheduler/fsrs/simulator.rs --- rslib/src/scheduler/fsrs/simulator.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rslib/src/scheduler/fsrs/simulator.rs b/rslib/src/scheduler/fsrs/simulator.rs index e830dffb5cf..eee62577030 100644 --- a/rslib/src/scheduler/fsrs/simulator.rs +++ b/rslib/src/scheduler/fsrs/simulator.rs @@ -130,6 +130,7 @@ impl Collection { && c.queue != CardQueue::PreviewRepeat && c.queue != CardQueue::New } + // calculate any missing memory state for c in &mut cards { if is_included_card(c) && c.memory_state.is_none() { let original = c.clone();