Fix/remove the lower limit of interval when set due date (#4063)

* Fix/remove the lower limit of interval when set due date

* don't affect SM-2

* Apply patch from user1823

* Fix build

* More suggestions from user1823
This commit is contained in:
Jarrett Ye 2025-06-08 16:36:32 +08:00 committed by GitHub
parent e5d34fbb18
commit ce6497cd2b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 10 additions and 9 deletions

View file

@ -34,11 +34,12 @@ impl Card {
let new_due = (today + days_from_today) as i32; let new_due = (today + days_from_today) as i32;
let fsrs_enabled = self.memory_state.is_some(); let fsrs_enabled = self.memory_state.is_some();
let new_interval = if fsrs_enabled { let new_interval = if fsrs_enabled {
self.interval.saturating_add_signed(new_due - self.due)
} else if force_reset || !matches!(self.ctype, CardType::Review | CardType::Relearn) {
days_from_today
} else {
self.interval self.interval
.saturating_add_signed(new_due - self.original_or_current_due())
} else if force_reset || !matches!(self.ctype, CardType::Review | CardType::Relearn) {
days_from_today.max(1)
} else {
self.interval.max(1)
}; };
let ease_factor = (ease_factor * 1000.0).round() as u16; let ease_factor = (ease_factor * 1000.0).round() as u16;
@ -48,7 +49,7 @@ impl Card {
fn schedule_as_review(&mut self, interval: u32, due: i32, ease_factor: u16) { fn schedule_as_review(&mut self, interval: u32, due: i32, ease_factor: u16) {
self.original_position = self.last_position(); self.original_position = self.last_position();
self.remove_from_filtered_deck_before_reschedule(); self.remove_from_filtered_deck_before_reschedule();
self.interval = interval.max(1); self.interval = interval;
self.due = due; self.due = due;
self.ctype = CardType::Review; self.ctype = CardType::Review;
self.queue = CardQueue::Review; self.queue = CardQueue::Review;

View file

@ -83,7 +83,7 @@ impl ReviewState {
} else { } else {
let (minimum, maximum) = ctx.min_and_max_review_intervals(ctx.minimum_lapse_interval); let (minimum, maximum) = ctx.min_and_max_review_intervals(ctx.minimum_lapse_interval);
let interval = ctx.with_review_fuzz( let interval = ctx.with_review_fuzz(
(self.scheduled_days as f32) * ctx.lapse_multiplier, (self.scheduled_days as f32).max(1.0) * ctx.lapse_multiplier,
minimum, minimum,
maximum, maximum,
); );
@ -211,7 +211,7 @@ impl ReviewState {
} }
fn passing_nonearly_review_intervals(self, ctx: &StateContext) -> (u32, u32, u32) { fn passing_nonearly_review_intervals(self, ctx: &StateContext) -> (u32, u32, u32) {
let current_interval = self.scheduled_days as f32; let current_interval = (self.scheduled_days as f32).max(1.0);
let days_late = self.days_late().max(0) as f32; let days_late = self.days_late().max(0) as f32;
// hard // hard
@ -251,8 +251,8 @@ impl ReviewState {
/// FIXME: this needs reworking in the future; it overly penalizes reviews /// FIXME: this needs reworking in the future; it overly penalizes reviews
/// done shortly before the due date. /// done shortly before the due date.
fn passing_early_review_intervals(self, ctx: &StateContext) -> (u32, u32, u32) { fn passing_early_review_intervals(self, ctx: &StateContext) -> (u32, u32, u32) {
let scheduled = self.scheduled_days as f32; let scheduled = (self.scheduled_days as f32).max(1.0);
let elapsed = (self.scheduled_days as f32) + (self.days_late() as f32); let elapsed = self.elapsed_days as f32;
let hard_interval = { let hard_interval = {
let factor = ctx.hard_multiplier; let factor = ctx.hard_multiplier;