Update to FSRS-rs v0.6.1 (#3106)

* update to FSRS-rs 0.6.0

* update to crates.io version

* format

* update to FSRS-rs v0.6.01

* ./ninja fix:minilints

* update python backend code
This commit is contained in:
Jarrett Ye 2024-04-05 20:04:50 +08:00 committed by GitHub
parent 00ba69b5fe
commit 10d567f937
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 8 additions and 28 deletions

4
Cargo.lock generated
View file

@ -1793,9 +1793,9 @@ dependencies = [
[[package]] [[package]]
name = "fsrs" name = "fsrs"
version = "0.5.5" version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84a04c31041078628c5ce7310be96c987bf7f33a3f8815fa0fcdb084eb31feba" checksum = "008fbd5019345f9066a4b5b73373151a1faf61372b469c9db14fce0abd78468f"
dependencies = [ dependencies = [
"burn", "burn",
"itertools 0.12.1", "itertools 0.12.1",

View file

@ -35,7 +35,7 @@ git = "https://github.com/ankitects/linkcheck.git"
rev = "184b2ca50ed39ca43da13f0b830a463861adb9ca" rev = "184b2ca50ed39ca43da13f0b830a463861adb9ca"
[workspace.dependencies.fsrs] [workspace.dependencies.fsrs]
version = "0.5.5" version = "0.6.1"
# git = "https://github.com/open-spaced-repetition/fsrs-rs.git" # git = "https://github.com/open-spaced-repetition/fsrs-rs.git"
# rev = "58ca25ed2bc4bb1dc376208bbcaed7f5a501b941" # rev = "58ca25ed2bc4bb1dc376208bbcaed7f5a501b941"
# path = "../open-spaced-repetition/fsrs-rs" # path = "../open-spaced-repetition/fsrs-rs"

View file

@ -1198,7 +1198,7 @@
}, },
{ {
"name": "fsrs", "name": "fsrs",
"version": "0.5.5", "version": "0.6.1",
"authors": "Open Spaced Repetition", "authors": "Open Spaced Repetition",
"repository": "https://github.com/open-spaced-repetition/fsrs-rs", "repository": "https://github.com/open-spaced-repetition/fsrs-rs",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",

View file

@ -357,7 +357,6 @@ message ComputeFsrsWeightsFromItemsRequest {
message FsrsBenchmarkRequest { message FsrsBenchmarkRequest {
repeated FsrsItem train_set = 1; repeated FsrsItem train_set = 1;
repeated FsrsItem test_set = 2;
} }
message FsrsBenchmarkResponse { message FsrsBenchmarkResponse {

View file

@ -151,10 +151,8 @@ class RustBackend(RustBackendGenerated):
def compute_weights_from_items(self, items: Iterable[FsrsItem]) -> Sequence[float]: def compute_weights_from_items(self, items: Iterable[FsrsItem]) -> Sequence[float]:
return self.compute_fsrs_weights_from_items(items).weights return self.compute_fsrs_weights_from_items(items).weights
def benchmark( def benchmark(self, train_set: Iterable[FsrsItem]) -> Sequence[float]:
self, train_set: Iterable[FsrsItem], test_set: Iterable[FsrsItem] return self.fsrs_benchmark(train_set=train_set)
) -> Sequence[float]:
return self.fsrs_benchmark(train_set=train_set, test_set=test_set)
def _run_command(self, service: int, method: int, input: bytes) -> bytes: def _run_command(self, service: int, method: int, input: bytes) -> bytes:
start = time.time() start = time.time()

View file

@ -64,11 +64,6 @@ impl Collection {
let (items, review_count) = let (items, review_count) =
fsrs_items_for_training(revlogs.clone(), timing.next_day_at, ignore_revlogs_before); fsrs_items_for_training(revlogs.clone(), timing.next_day_at, ignore_revlogs_before);
if review_count < 400 {
return Err(AnkiError::FsrsInsufficientReviews {
count: review_count,
});
}
let fsrs_items = items.len() as u32; let fsrs_items = items.len() as u32;
anki_progress.update(false, |p| { anki_progress.update(false, |p| {
p.current_preset = current_preset; p.current_preset = current_preset;
@ -95,8 +90,7 @@ impl Collection {
}); });
let fsrs = FSRS::new(Some(current_weights))?; let fsrs = FSRS::new(Some(current_weights))?;
let current_rmse = fsrs.evaluate(items.clone(), |_| true)?.rmse_bins; let current_rmse = fsrs.evaluate(items.clone(), |_| true)?.rmse_bins;
let mut weights = let mut weights = fsrs.compute_parameters(items.clone(), Some(progress2))?;
fsrs.compute_parameters(items.clone(), fsrs_items < 1000, Some(progress2))?;
let optimized_fsrs = FSRS::new(Some(&weights))?; let optimized_fsrs = FSRS::new(Some(&weights))?;
let optimized_rmse = optimized_fsrs.evaluate(items.clone(), |_| true)?.rmse_bins; let optimized_rmse = optimized_fsrs.evaluate(items.clone(), |_| true)?.rmse_bins;
if current_rmse <= optimized_rmse { if current_rmse <= optimized_rmse {
@ -162,11 +156,6 @@ impl Collection {
.get_revlog_entries_for_searched_cards_in_card_order()?; .get_revlog_entries_for_searched_cards_in_card_order()?;
let (items, review_count) = let (items, review_count) =
fsrs_items_for_training(revlogs, timing.next_day_at, ignore_revlogs_before); fsrs_items_for_training(revlogs, timing.next_day_at, ignore_revlogs_before);
if review_count < 400 {
return Err(AnkiError::FsrsInsufficientReviews {
count: review_count,
});
}
anki_progress.state.reviews = review_count as u32; anki_progress.state.reviews = review_count as u32;
let fsrs = FSRS::new(Some(weights))?; let fsrs = FSRS::new(Some(weights))?;
Ok(fsrs.evaluate(items, |ip| { Ok(fsrs.evaluate(items, |ip| {

View file

@ -333,7 +333,6 @@ impl crate::services::BackendSchedulerService for Backend {
let fsrs_items = req.items.len() as u32; let fsrs_items = req.items.len() as u32;
let weights = fsrs.compute_parameters( let weights = fsrs.compute_parameters(
req.items.into_iter().map(fsrs_item_proto_to_fsrs).collect(), req.items.into_iter().map(fsrs_item_proto_to_fsrs).collect(),
false,
None, None,
)?; )?;
Ok(ComputeFsrsWeightsResponse { Ok(ComputeFsrsWeightsResponse {
@ -352,12 +351,7 @@ impl crate::services::BackendSchedulerService for Backend {
.into_iter() .into_iter()
.map(fsrs_item_proto_to_fsrs) .map(fsrs_item_proto_to_fsrs)
.collect(); .collect();
let test_set = req let weights = fsrs.benchmark(train_set);
.test_set
.into_iter()
.map(fsrs_item_proto_to_fsrs)
.collect();
let weights = fsrs.benchmark(train_set, test_set);
Ok(FsrsBenchmarkResponse { weights }) Ok(FsrsBenchmarkResponse { weights })
} }
} }