Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Prev Previous commit
Next Next commit
Update FSRS decay defaults to use constants for better maintainabilit…
…y and clarity
  • Loading branch information
L-M-Sherlock committed Apr 25, 2025
commit 4b00a757e0302efef2438d58a569f181ae1e51ac
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ rev = "184b2ca50ed39ca43da13f0b830a463861adb9ca"
[workspace.dependencies.fsrs]
# version = "=2.0.3"
git = "https://github.com/open-spaced-repetition/fsrs-rs.git"
rev = "fcbd45a6d49b27a8d1764af528560bfe10c2ff9c"
rev = "c7717682997a8a6d53d97c7196281e745c5b3c8e"
# path = "../open-spaced-repetition/fsrs-rs"

[workspace.dependencies]
Expand Down
3 changes: 2 additions & 1 deletion rslib/src/browser_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
use std::sync::Arc;

use fsrs::FSRS;
use fsrs::FSRS5_DEFAULT_DECAY;
use itertools::Itertools;
use strum::Display;
use strum::EnumIter;
Expand Down Expand Up @@ -541,7 +542,7 @@ impl RowContext {
.memory_state
.as_ref()
.zip(self.cards[0].days_since_last_review(&self.timing))
.zip(Some(self.cards[0].decay.unwrap_or(0.5)))
.zip(Some(self.cards[0].decay.unwrap_or(FSRS5_DEFAULT_DECAY)))
.map(|((state, days_elapsed), decay)| {
let r = FSRS::new(None).unwrap().current_retrievability(
(*state).into(),
Expand Down
6 changes: 4 additions & 2 deletions rslib/src/scheduler/fsrs/memory_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ use anki_proto::scheduler::ComputeMemoryStateResponse;
use fsrs::FSRSItem;
use fsrs::MemoryState;
use fsrs::FSRS;
use fsrs::FSRS5_DEFAULT_DECAY;
use fsrs::FSRS6_DEFAULT_DECAY;
use itertools::Itertools;

use super::params::ignore_revlogs_before_ms_from_config;
Expand Down Expand Up @@ -78,9 +80,9 @@ impl Collection {
let fsrs = FSRS::new(req.as_ref().map(|w| &w.params[..]).or(Some([].as_slice())))?;
let decay = req.as_ref().map(|w| {
if w.params.is_empty() {
0.2 // default decay for FSRS-6
FSRS6_DEFAULT_DECAY // default decay for FSRS-6
} else if w.params.len() < 21 {
0.5 // default decay for FSRS-4.5 and FSRS-5
FSRS5_DEFAULT_DECAY // default decay for FSRS-4.5 and FSRS-5
} else {
w.params[20]
}
Expand Down
7 changes: 4 additions & 3 deletions rslib/src/stats/card.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html

use fsrs::FSRS;
use fsrs::FSRS5_DEFAULT_DECAY;

use crate::card::CardType;
use crate::card::FsrsMemoryState;
Expand Down Expand Up @@ -37,7 +38,7 @@ impl Collection {
let fsrs_retrievability = card
.memory_state
.zip(Some(days_elapsed))
.zip(Some(card.decay.unwrap_or(0.5)))
.zip(Some(card.decay.unwrap_or(FSRS5_DEFAULT_DECAY)))
.map(|((state, days), decay)| {
FSRS::new(None)
.unwrap()
Expand Down Expand Up @@ -76,14 +77,14 @@ impl Collection {
memory_state: card.memory_state.map(Into::into),
fsrs_retrievability,
custom_data: card.custom_data,
preset: preset.name.clone(),
fsrs_params: preset.fsrs_params().to_vec(),
preset: preset.name,
original_deck: if original_deck != deck {
Some(original_deck.human_name())
} else {
None
},
desired_retention: card.desired_retention,
fsrs_params: preset.fsrs_params().to_vec(),
})
}

Expand Down
3 changes: 2 additions & 1 deletion rslib/src/stats/graphs/retrievability.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

use anki_proto::stats::graphs_response::Retrievability;
use fsrs::FSRS;
use fsrs::FSRS5_DEFAULT_DECAY;

use crate::prelude::TimestampSecs;
use crate::scheduler::timing::SchedTimingToday;
Expand Down Expand Up @@ -33,7 +34,7 @@ impl GraphsContext {
let r = fsrs.current_retrievability(
state.into(),
elapsed_days,
card.decay.unwrap_or(0.5),
card.decay.unwrap_or(FSRS5_DEFAULT_DECAY),
);

*retrievability
Expand Down
5 changes: 3 additions & 2 deletions rslib/src/storage/sqlite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use std::sync::Arc;

use fnv::FnvHasher;
use fsrs::FSRS;
use fsrs::FSRS5_DEFAULT_DECAY;
use regex::Regex;
use rusqlite::functions::FunctionFlags;
use rusqlite::params;
Expand Down Expand Up @@ -325,7 +326,7 @@ fn add_extract_fsrs_retrievability(db: &Connection) -> rusqlite::Result<()> {
let review_day = due.saturating_sub(ivl);
days_elapsed.saturating_sub(review_day) as u32
};
let decay = card_data.decay.unwrap_or(0.5);
let decay = card_data.decay.unwrap_or_default();
Ok(card_data.memory_state().map(|state| {
FSRS::new(None)
.unwrap()
Expand Down Expand Up @@ -375,7 +376,7 @@ fn add_extract_fsrs_relative_retrievability(db: &Connection) -> rusqlite::Result
{
// avoid div by zero
desired_retrievability = desired_retrievability.max(0.0001);
let decay = card_data.decay.unwrap_or(0.5);
let decay = card_data.decay.unwrap_or(FSRS5_DEFAULT_DECAY);

let current_retrievability = FSRS::new(None)
.unwrap()
Expand Down
4 changes: 2 additions & 2 deletions ts/routes/card-info/CardInfo.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
$: decay = (() => {
const paramsLength = stats?.fsrsParams?.length ?? 0;
if (paramsLength === 0) {
return 0.2;
return 0.2; // default decay for FSRS-6
}
if (paramsLength < 21) {
return 0.5;
return 0.5; // default decay for FSRS-4.5 and FSRS-5
}
return stats?.fsrsParams?.[20] ?? 0.2;
})();
Expand Down
2 changes: 1 addition & 1 deletion ts/routes/deck-options/FsrsOptions.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
});

function getRetentionWarning(retention: number, params: number[]): string {
const decay = params.length > 20 ? -params[20] : -0.5;
const decay = params.length > 20 ? -params[20] : -0.5; // default decay for FSRS-4.5 and FSRS-5
const factor = 0.9 ** (1 / decay) - 1;
const stability = 100;
const days = Math.round(
Expand Down