Re-expose legacy RMSE calculations

Closes #4143
This commit is contained in:
Damien Elmes 2025-07-01 18:22:44 +07:00
parent 9e1690774c
commit da90705346
3 changed files with 50 additions and 0 deletions

View file

@ -56,6 +56,8 @@ service SchedulerService {
rpc SimulateFsrsReview(SimulateFsrsReviewRequest)
returns (SimulateFsrsReviewResponse);
rpc EvaluateParams(EvaluateParamsRequest) returns (EvaluateParamsResponse);
rpc EvaluateParamsLegacy(EvaluateParamsLegacyRequest)
returns (EvaluateParamsResponse);
rpc ComputeMemoryState(cards.CardId) returns (ComputeMemoryStateResponse);
// The number of days the calculated interval was fuzzed by on the previous
// review (if any). Utilized by the FSRS add-on.
@ -442,6 +444,12 @@ message EvaluateParamsRequest {
uint32 num_of_relearning_steps = 3;
}
message EvaluateParamsLegacyRequest {
repeated float params = 1;
string search = 2;
int64 ignore_revlogs_before_ms = 3;
}
message EvaluateParamsResponse {
float log_loss = 1;
float rmse_bins = 2;

View file

@ -299,6 +299,33 @@ impl Collection {
.is_ok()
})?)
}
pub fn evaluate_params_legacy(
&mut self,
params: &Params,
search: &str,
ignore_revlogs_before: TimestampMillis,
) -> Result<ModelEvaluation> {
let timing = self.timing_today()?;
let mut anki_progress = self.new_progress_handler::<ComputeParamsProgress>();
let guard = self.search_cards_into_table(search, SortMode::NoOrder)?;
let revlogs: Vec<RevlogEntry> = guard
.col
.storage
.get_revlog_entries_for_searched_cards_in_card_order()?;
let (items, review_count) =
fsrs_items_for_training(revlogs, timing.next_day_at, ignore_revlogs_before);
anki_progress.state.reviews = review_count as u32;
let fsrs = FSRS::new(Some(params))?;
Ok(fsrs.evaluate(items, |ip| {
anki_progress
.update(false, |p| {
p.total_iterations = ip.total as u32;
p.current_iteration = ip.current as u32;
})
.is_ok()
})?)
}
}
#[derive(Default, Clone, Copy, Debug)]

View file

@ -307,6 +307,21 @@ impl crate::services::SchedulerService for Collection {
})
}
fn evaluate_params_legacy(
&mut self,
input: scheduler::EvaluateParamsLegacyRequest,
) -> Result<scheduler::EvaluateParamsResponse> {
let ret = self.evaluate_params_legacy(
&input.params,
&input.search,
input.ignore_revlogs_before_ms.into(),
)?;
Ok(scheduler::EvaluateParamsResponse {
log_loss: ret.log_loss,
rmse_bins: ret.rmse_bins,
})
}
fn get_optimal_retention_parameters(
&mut self,
input: scheduler::GetOptimalRetentionParametersRequest,