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()
},
)?
.clamp(0.75, 0.95))
.clamp(0.7, 0.95))
}
pub fn get_optimal_retention_parameters(

View file

@ -49,7 +49,10 @@ impl LearnState {
} else {
let (minimum, maximum) = ctx.min_and_max_review_intervals(1);
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 {
(ctx.graduating_interval_good as f32, false)
};
@ -91,7 +94,10 @@ impl LearnState {
} else {
let (minimum, maximum) = ctx.min_and_max_review_intervals(1);
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 {
(ctx.graduating_interval_good as f32, false)
};
@ -133,7 +139,10 @@ impl LearnState {
} else {
let (minimum, maximum) = ctx.min_and_max_review_intervals(1);
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 {
(ctx.graduating_interval_good as f32, false)
};

View file

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

View file

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

View file

@ -83,6 +83,10 @@ impl<'a> LearningSteps<'a> {
pub(crate) fn remaining_for_failed(self) -> 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