update FSRS-rs to 0.5.0 & export benchmark API (#3056)

* update fsrs to 0.4.5

* update to fsrs 0.4.6

* add benchmark API

* update fsrs to 0.5.0

* cargo fmt

* ./ninja fix:minilints

* ./ninja format

* Add a brief comment about the new method (dae)
This commit is contained in:
Jarrett Ye 2024-03-08 20:37:06 +08:00 committed by GitHub
parent 9228c87b3a
commit 055b6e30f8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 41 additions and 5 deletions

4
Cargo.lock generated
View file

@ -1792,9 +1792,9 @@ dependencies = [
[[package]]
name = "fsrs"
version = "0.4.4"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e5210280b424b4b47187c7af3935fcd13aca73afec897675b860b0c6e133bab"
checksum = "7c7e6a1986cc2b7a64445d84e2c453ecd8d95dcf90b797205c54573697e10b17"
dependencies = [
"burn",
"itertools 0.12.1",

View file

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

View file

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

View file

@ -63,6 +63,8 @@ service SchedulerService {
service BackendSchedulerService {
rpc ComputeFsrsWeightsFromItems(ComputeFsrsWeightsFromItemsRequest)
returns (ComputeFsrsWeightsResponse);
// Generates parameters used for FSRS's scheduler benchmarks.
rpc FsrsBenchmark(FsrsBenchmarkRequest) returns (FsrsBenchmarkResponse);
}
message SchedulingState {
@ -351,6 +353,15 @@ message ComputeFsrsWeightsFromItemsRequest {
repeated FsrsItem items = 1;
}
message FsrsBenchmarkRequest {
repeated FsrsItem train_set = 1;
repeated FsrsItem test_set = 2;
}
message FsrsBenchmarkResponse {
repeated float weights = 1;
}
message FsrsItem {
repeated FsrsReview reviews = 1;
}

View file

@ -151,6 +151,11 @@ class RustBackend(RustBackendGenerated):
def compute_weights_from_items(self, items: Iterable[FsrsItem]) -> Sequence[float]:
return self.compute_fsrs_weights_from_items(items).weights
def benchmark(
self, train_set: Iterable[FsrsItem], test_set: Iterable[FsrsItem]
) -> 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:
start = time.time()
try:

View file

@ -11,6 +11,7 @@ use anki_proto::scheduler::ComputeFsrsWeightsResponse;
use anki_proto::scheduler::ComputeMemoryStateResponse;
use anki_proto::scheduler::ComputeOptimalRetentionRequest;
use anki_proto::scheduler::ComputeOptimalRetentionResponse;
use anki_proto::scheduler::FsrsBenchmarkResponse;
use anki_proto::scheduler::FuzzDeltaRequest;
use anki_proto::scheduler::FuzzDeltaResponse;
use anki_proto::scheduler::GetOptimalRetentionParametersResponse;
@ -325,6 +326,25 @@ impl crate::services::BackendSchedulerService for Backend {
fsrs_items,
})
}
fn fsrs_benchmark(
&self,
req: scheduler::FsrsBenchmarkRequest,
) -> Result<scheduler::FsrsBenchmarkResponse> {
let fsrs = FSRS::new(None)?;
let train_set = req
.train_set
.into_iter()
.map(fsrs_item_proto_to_fsrs)
.collect();
let test_set = req
.test_set
.into_iter()
.map(fsrs_item_proto_to_fsrs)
.collect();
let weights = fsrs.benchmark(train_set, test_set);
Ok(FsrsBenchmarkResponse { weights })
}
}
fn fsrs_item_proto_to_fsrs(item: anki_proto::scheduler::FsrsItem) -> FSRSItem {