Fix/only let FSRS take over short-term schedule when steps are empty (#3496)

This commit is contained in:
Jarrett Ye 2024-10-15 23:16:47 +08:00 committed by GitHub
parent a537d349b8
commit f804abf758
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 27 additions and 14 deletions

View file

@ -63,7 +63,7 @@ impl Collection {
.is_ok() .is_ok()
}, },
)? )?
.clamp(0.75, 0.95)) .clamp(0.7, 0.95))
} }
pub fn get_optimal_retention_parameters( pub fn get_optimal_retention_parameters(

View file

@ -49,7 +49,10 @@ impl LearnState {
} else { } else {
let (minimum, maximum) = ctx.min_and_max_review_intervals(1); let (minimum, maximum) = ctx.min_and_max_review_intervals(1);
let (interval, short_term) = if let Some(states) = &ctx.fsrs_next_states { let (interval, short_term) = if let Some(states) = &ctx.fsrs_next_states {
(states.again.interval, states.again.interval < 0.5) (
states.again.interval,
ctx.steps.is_empty() && states.again.interval < 0.5,
)
} else { } else {
(ctx.graduating_interval_good as f32, false) (ctx.graduating_interval_good as f32, false)
}; };
@ -91,7 +94,10 @@ impl LearnState {
} else { } else {
let (minimum, maximum) = ctx.min_and_max_review_intervals(1); let (minimum, maximum) = ctx.min_and_max_review_intervals(1);
let (interval, short_term) = if let Some(states) = &ctx.fsrs_next_states { let (interval, short_term) = if let Some(states) = &ctx.fsrs_next_states {
(states.hard.interval, states.hard.interval < 0.5) (
states.hard.interval,
ctx.steps.is_empty() && states.hard.interval < 0.5,
)
} else { } else {
(ctx.graduating_interval_good as f32, false) (ctx.graduating_interval_good as f32, false)
}; };
@ -133,7 +139,10 @@ impl LearnState {
} else { } else {
let (minimum, maximum) = ctx.min_and_max_review_intervals(1); let (minimum, maximum) = ctx.min_and_max_review_intervals(1);
let (interval, short_term) = if let Some(states) = &ctx.fsrs_next_states { let (interval, short_term) = if let Some(states) = &ctx.fsrs_next_states {
(states.good.interval, states.good.interval < 0.5) (
states.good.interval,
ctx.steps.is_empty() && states.good.interval < 0.5,
)
} else { } else {
(ctx.graduating_interval_good as f32, false) (ctx.graduating_interval_good as f32, false)
}; };

View file

@ -68,10 +68,10 @@ impl RelearnState {
}, },
review: again_review, review: again_review,
}; };
if interval > 0.5 { if ctx.relearn_steps.is_empty() && interval < 0.5 {
again_review.into()
} else {
again_relearn.into() again_relearn.into()
} else {
again_review.into()
} }
} else { } else {
self.review.into() self.review.into()
@ -112,10 +112,10 @@ impl RelearnState {
}, },
review: hard_review, review: hard_review,
}; };
if interval > 0.5 { if ctx.relearn_steps.is_empty() && interval < 0.5 {
hard_review.into()
} else {
hard_relearn.into() hard_relearn.into()
} else {
hard_review.into()
} }
} else { } else {
self.review.into() self.review.into()
@ -162,10 +162,10 @@ impl RelearnState {
}, },
review: good_review, review: good_review,
}; };
if interval > 0.5 { if ctx.relearn_steps.is_empty() && interval < 0.5 {
good_review.into()
} else {
good_relearn.into() good_relearn.into()
} else {
good_review.into()
} }
} else { } else {
self.review.into() self.review.into()

View file

@ -124,7 +124,7 @@ impl ReviewState {
review: again_review, review: again_review,
} }
.into() .into()
} else if scheduled_days < 0.5 { } else if ctx.relearn_steps.is_empty() && scheduled_days < 0.5 {
again_relearn.into() again_relearn.into()
} else { } else {
again_review.into() again_review.into()

View file

@ -83,6 +83,10 @@ impl<'a> LearningSteps<'a> {
pub(crate) fn remaining_for_failed(self) -> u32 { pub(crate) fn remaining_for_failed(self) -> u32 {
self.steps.len() as u32 self.steps.len() as u32
} }
pub(crate) fn is_empty(&self) -> bool {
self.steps.is_empty()
}
} }
/// If the given interval in seconds surpasses 1 day, rounds it to a whole /// If the given interval in seconds surpasses 1 day, rounds it to a whole