mirror of
https://github.com/ankitects/anki.git
synced 2025-12-16 08:10:59 -05:00
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:
parent
9228c87b3a
commit
055b6e30f8
6 changed files with 41 additions and 5 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue