mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 06:22:22 -04:00
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:
parent
00ba69b5fe
commit
10d567f937
7 changed files with 8 additions and 28 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -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",
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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| {
|
||||||
|
|
|
@ -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 })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue