diff --git a/CONTRIBUTORS b/CONTRIBUTORS index b165b318a..2bf9fbecd 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -138,7 +138,7 @@ Monty Evans Nil Admirari Michael Winkworth Mateusz Wojewoda -Jarrett Ye +Jarrett Ye Sam Waechter Michael Eliachevitch diff --git a/rslib/src/scheduler/fsrs/retention.rs b/rslib/src/scheduler/fsrs/retention.rs index 64dfd5987..d8dd43ab0 100644 --- a/rslib/src/scheduler/fsrs/retention.rs +++ b/rslib/src/scheduler/fsrs/retention.rs @@ -76,12 +76,15 @@ impl Collection { let first_rating_count = revlogs .iter() - .filter(|r| { - r.review_kind == RevlogReviewKind::Learning - && r.last_interval == 0 - && r.button_chosen >= 1 + .group_by(|r| r.cid) + .into_iter() + .map(|(_cid, group)| { + group + .into_iter() + .find(|r| r.review_kind == RevlogReviewKind::Learning && r.button_chosen >= 1) }) - .counts_by(|r| r.button_chosen); + .filter(|r| r.is_some()) + .counts_by(|r| r.unwrap().button_chosen); let total_first = first_rating_count.values().sum::() as f64; let first_rating_prob = if total_first > 0.0 { let mut arr = [0.0; 4]; @@ -136,11 +139,10 @@ impl Collection { let learn_cost = { let revlogs_filter = revlogs .iter() - .filter(|r| r.review_kind == RevlogReviewKind::Learning && r.last_interval == 0) + .filter(|r| r.review_kind == RevlogReviewKind::Learning && r.button_chosen >= 1) .map(|r| r.taken_millis); - let count = revlogs_filter.clone().count() as f64; - if count > 0.0 { - revlogs_filter.sum::() as f64 / count / 1000.0 + if total_first > 0.0 { + revlogs_filter.sum::() as f64 / total_first / 1000.0 } else { return Err(AnkiError::FsrsInsufficientData); }