mirror of
https://github.com/ankitects/anki.git
synced 2025-09-25 17:26:36 -04:00
backend part
This commit is contained in:
parent
3b18097550
commit
dc8a687b33
3 changed files with 40 additions and 0 deletions
|
@ -55,6 +55,8 @@ service SchedulerService {
|
|||
returns (ComputeOptimalRetentionResponse);
|
||||
rpc SimulateFsrsReview(SimulateFsrsReviewRequest)
|
||||
returns (SimulateFsrsReviewResponse);
|
||||
rpc SimulateFsrsWorkload(SimulateFsrsReviewRequest)
|
||||
returns (SimulateFsrsWorkloadResponse);
|
||||
rpc EvaluateParams(EvaluateParamsRequest) returns (EvaluateParamsResponse);
|
||||
rpc EvaluateParamsLegacy(EvaluateParamsLegacyRequest)
|
||||
returns (EvaluateParamsResponse);
|
||||
|
@ -414,6 +416,10 @@ message SimulateFsrsReviewResponse {
|
|||
repeated float daily_time_cost = 4;
|
||||
}
|
||||
|
||||
message SimulateFsrsWorkloadResponse {
|
||||
map<uint32, float> dr_workload = 1;
|
||||
}
|
||||
|
||||
message ComputeOptimalRetentionResponse {
|
||||
float optimal_retention = 1;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
use std::collections::HashMap;
|
||||
// Copyright: Ankitects Pty Ltd and contributors
|
||||
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||
use std::sync::Arc;
|
||||
|
@ -6,6 +7,7 @@ use anki_proto::deck_config::deck_config::config::ReviewCardOrder;
|
|||
use anki_proto::deck_config::deck_config::config::ReviewCardOrder::*;
|
||||
use anki_proto::scheduler::SimulateFsrsReviewRequest;
|
||||
use anki_proto::scheduler::SimulateFsrsReviewResponse;
|
||||
use anki_proto::scheduler::SimulateFsrsWorkloadResponse;
|
||||
use fsrs::simulate;
|
||||
use fsrs::PostSchedulingFn;
|
||||
use fsrs::ReviewPriorityFn;
|
||||
|
@ -267,6 +269,30 @@ impl Collection {
|
|||
daily_time_cost: result.cost_per_day,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn simulate_workload(
|
||||
&mut self,
|
||||
req: SimulateFsrsReviewRequest,
|
||||
) -> Result<SimulateFsrsWorkloadResponse> {
|
||||
let (config, cards) = self.simulate_request_to_config(&req)?;
|
||||
let dr_workload = (70u32..=99u32)
|
||||
.map(|dr| {
|
||||
let result = simulate(
|
||||
&config,
|
||||
&req.params,
|
||||
dr as f32 / 100.,
|
||||
None,
|
||||
Some(cards.clone()),
|
||||
)?;
|
||||
Ok((
|
||||
dr,
|
||||
result.memorized_cnt_per_day.last().unwrap_or(&0.)
|
||||
/ result.cost_per_day.iter().sum::<f32>(),
|
||||
))
|
||||
})
|
||||
.collect::<Result<HashMap<_, _>>>()?;
|
||||
Ok(SimulateFsrsWorkloadResponse { dr_workload })
|
||||
}
|
||||
}
|
||||
|
||||
impl Card {
|
||||
|
|
|
@ -16,6 +16,7 @@ use anki_proto::scheduler::FuzzDeltaResponse;
|
|||
use anki_proto::scheduler::GetOptimalRetentionParametersResponse;
|
||||
use anki_proto::scheduler::SimulateFsrsReviewRequest;
|
||||
use anki_proto::scheduler::SimulateFsrsReviewResponse;
|
||||
use anki_proto::scheduler::SimulateFsrsWorkloadResponse;
|
||||
use fsrs::ComputeParametersInput;
|
||||
use fsrs::FSRSItem;
|
||||
use fsrs::FSRSReview;
|
||||
|
@ -283,6 +284,13 @@ impl crate::services::SchedulerService for Collection {
|
|||
self.simulate_review(input)
|
||||
}
|
||||
|
||||
fn simulate_fsrs_workload(
|
||||
&mut self,
|
||||
input: SimulateFsrsReviewRequest,
|
||||
) -> Result<SimulateFsrsWorkloadResponse> {
|
||||
self.simulate_workload(input)
|
||||
}
|
||||
|
||||
fn compute_optimal_retention(
|
||||
&mut self,
|
||||
input: SimulateFsrsReviewRequest,
|
||||
|
|
Loading…
Reference in a new issue