From b28ac4e6460a13dd234bc4a17e2c4b10b17fb97f Mon Sep 17 00:00:00 2001 From: Luc Mcgrady Date: Sun, 23 Feb 2025 15:02:25 +0000 Subject: [PATCH 01/16] Added: Leech suspend to simulator --- proto/anki/scheduler.proto | 2 ++ rslib/src/scheduler/fsrs/retention.rs | 1 + rslib/src/scheduler/fsrs/simulator.rs | 4 ++++ ts/routes/deck-options/SimulatorModal.svelte | 9 +++++++++ 4 files changed, 16 insertions(+) diff --git a/proto/anki/scheduler.proto b/proto/anki/scheduler.proto index b657ff3fa24..42befe816dc 100644 --- a/proto/anki/scheduler.proto +++ b/proto/anki/scheduler.proto @@ -393,6 +393,7 @@ message SimulateFsrsReviewRequest { bool new_cards_ignore_review_limit = 9; repeated float easy_days_percentages = 10; deck_config.DeckConfig.Config.ReviewCardOrder review_order = 11; + optional uint32 suspend_after_lapse_count = 12; } message SimulateFsrsReviewResponse { @@ -409,6 +410,7 @@ message ComputeOptimalRetentionRequest { string search = 4; double loss_aversion = 5; repeated float easy_days_percentages = 6; + optional uint32 suspend_after_lapse_count = 7; } message ComputeOptimalRetentionResponse { diff --git a/rslib/src/scheduler/fsrs/retention.rs b/rslib/src/scheduler/fsrs/retention.rs index c89c08aab52..45980e266eb 100644 --- a/rslib/src/scheduler/fsrs/retention.rs +++ b/rslib/src/scheduler/fsrs/retention.rs @@ -78,6 +78,7 @@ impl Collection { learn_limit, review_limit: usize::MAX, new_cards_ignore_review_limit: true, + suspend_after_lapses: None, post_scheduling_fn, review_priority_fn: None, }, diff --git a/rslib/src/scheduler/fsrs/simulator.rs b/rslib/src/scheduler/fsrs/simulator.rs index 1cfc2e959bc..2da5097b95c 100644 --- a/rslib/src/scheduler/fsrs/simulator.rs +++ b/rslib/src/scheduler/fsrs/simulator.rs @@ -147,6 +147,7 @@ impl Collection { last_date: f32::NEG_INFINITY, // Treated as a new card in simulation due: ((introduced_today_count + i) / req.new_limit as usize) as f32, interval: f32::NEG_INFINITY, + lapses: 0 }); converted_cards.extend(new_cards); } @@ -198,6 +199,7 @@ impl Collection { learn_limit: req.new_limit as usize, review_limit: req.review_limit as usize, new_cards_ignore_review_limit: req.new_cards_ignore_review_limit, + suspend_after_lapses: req.suspend_after_lapse_count, post_scheduling_fn, review_priority_fn, }; @@ -239,6 +241,7 @@ impl Card { last_date, due: relative_due as f32, interval: card.interval as f32, + lapses: card.lapses }) } CardQueue::New => None, @@ -249,6 +252,7 @@ impl Card { last_date: 0.0, due: 0.0, interval: card.interval as f32, + lapses: card.lapses }) } CardQueue::PreviewRepeat => None, diff --git a/ts/routes/deck-options/SimulatorModal.svelte b/ts/routes/deck-options/SimulatorModal.svelte index 6bb30620c53..84b314e906c 100644 --- a/ts/routes/deck-options/SimulatorModal.svelte +++ b/ts/routes/deck-options/SimulatorModal.svelte @@ -28,6 +28,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import SpinBoxFloatRow from "./SpinBoxFloatRow.svelte"; import { reviewOrderChoices } from "./choices"; import EnumSelectorRow from "$lib/components/EnumSelectorRow.svelte"; + import { DeckConfig_Config_LeechAction } from "@generated/anki/deck_config_pb"; export let shown = false; export let state: DeckOptionsState; @@ -48,6 +49,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html let points: Point[] = []; const newCardsIgnoreReviewLimit = state.newCardsIgnoreReviewLimit; let smooth = true; + let suspendLeeches = $config.leechAction == DeckConfig_Config_LeechAction.SUSPEND; $: daysToSimulate = 365; $: deckSize = 0; @@ -75,6 +77,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html let resp: SimulateFsrsReviewResponse | undefined; simulateFsrsRequest.daysToSimulate = daysToSimulate; simulateFsrsRequest.deckSize = deckSize; + simulateFsrsRequest.suspendAfterLapseCount = suspendLeeches ? $config.leechThreshold : undefined try { await runWithBackendProgress( async () => { @@ -271,6 +274,12 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html + + openHelpModal("simulateFsrsReview")}> + {"Suspend Leeches"} + + +