mirror of
https://github.com/ankitects/anki.git
synced 2026-01-13 22:13:58 -05:00
35 lines
1.2 KiB
Rust
35 lines
1.2 KiB
Rust
// Copyright: Ankitects Pty Ltd and contributors
|
|
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|
|
|
use anki_proto::stats::graphs_response::Retrievability;
|
|
use fsrs::FSRS;
|
|
|
|
use crate::scheduler::timing::SchedTimingToday;
|
|
use crate::stats::graphs::eases::round_to_nearest_five;
|
|
use crate::stats::graphs::GraphsContext;
|
|
|
|
impl GraphsContext {
|
|
/// (SM-2, FSRS)
|
|
pub(super) fn retrievability(&self) -> Retrievability {
|
|
let mut retrievability = Retrievability::default();
|
|
let timing = SchedTimingToday {
|
|
days_elapsed: self.days_elapsed,
|
|
now: Default::default(),
|
|
next_day_at: Default::default(),
|
|
};
|
|
let fsrs = FSRS::new(None).unwrap();
|
|
for card in &self.cards {
|
|
if let Some(state) = card.memory_state {
|
|
let r = fsrs.current_retrievability(
|
|
state.into(),
|
|
card.days_since_last_review(&timing).unwrap_or_default(),
|
|
);
|
|
*retrievability
|
|
.retrievability
|
|
.entry(round_to_nearest_five(r * 100.0))
|
|
.or_insert_with(Default::default) += 1;
|
|
}
|
|
}
|
|
retrievability
|
|
}
|
|
}
|