Create fsrs upadte method

This commit is contained in:
micialware committed 2026-08-28 18:52:38 +03:00
1 parent 663fa377b1
commit e7019903b0
5 files changed
+73 -10

No files matched your search

+29 -1
View File
@@ -1,8 +1,10 @@
use crate::app::AppState;
use crate::core::srs::{FADE_PER_DAY, MAX_SCORE, OrderMode, WordOpenMode};
use crate::data::{INVALID_ID, Id};
use chrono::{DateTime, Utc};
use chrono::{DateTime, Local, NaiveDate, Utc};
use fsrs::{FSRS, MemoryState};
use log::info;
use rand::{RngExt, random, rng};
use rayon::prelude::*;
use rhai::{Engine, Scope};
use std::collections::HashMap;
@@ -137,6 +139,9 @@ pub struct CardStatistics {
pub set_id: Id,
pub last_open: DateTime<Utc>,
pub score: u8,
pub fsrs_opened: NaiveDate,
pub fsrs_memory: Option<MemoryState>,
pub fsrs_open_day: NaiveDate,
}
impl CardStatistics {
pub fn update(&mut self, status: WordOpenMode) {
@@ -157,6 +162,29 @@ impl CardStatistics {
self.last_open = Utc::now();
}
pub fn update_fsrs(&mut self, status: WordOpenMode, by_fsrs: bool, fsrs: FSRS)
{
let today = Local::now().to_utc().date_naive().to_epoch_days();
let written = self.fsrs_opened.to_epoch_days();
let memory = fsrs
.next_states(self.fsrs_memory, 0.9, (today - written) as u32)
.expect("Wrong next stage calculation");
let next = match status {
WordOpenMode::Easy => memory.easy,
WordOpenMode::Ok => memory.good,
WordOpenMode::Hard => memory.hard,
WordOpenMode::None => memory.again,
};
let mut next_day = today + next.interval.round() as i32;
if next_day - today >= 5 {
let offset = ((rng().random::<f32>() - 0.5) * 3.0).round() as i32;
next_day += offset;
}
self.fsrs_memory = Some(next.memory);
self.fsrs_open_day = NaiveDate::from_epoch_days(next_day).unwrap();
self.fsrs_opened = self.last_open.date_naive();
}
pub fn calculated_score(&self) -> f32 {
let time = Utc::now() - self.last_open;
let days = time.num_days();