Fix graph averages (#3406)

* Fix graph averages

* Fix formatting
This commit is contained in:
Abdo 2024-09-10 22:18:53 +03:00 committed by GitHub
parent f496411da8
commit 880c7d366c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 31 additions and 5 deletions

View file

@ -74,9 +74,11 @@ message GraphsResponse {
} }
message Eases { message Eases {
map<uint32, uint32> eases = 1; map<uint32, uint32> eases = 1;
float average = 2;
} }
message Retrievability { message Retrievability {
map<uint32, uint32> retrievability = 1; map<uint32, uint32> retrievability = 1;
float average = 2;
} }
message FutureDue { message FutureDue {
map<int32, uint32> future_due = 1; map<int32, uint32> future_due = 1;

View file

@ -10,20 +10,33 @@ impl GraphsContext {
/// (SM-2, FSRS) /// (SM-2, FSRS)
pub(super) fn eases(&self) -> (Eases, Eases) { pub(super) fn eases(&self) -> (Eases, Eases) {
let mut eases = Eases::default(); let mut eases = Eases::default();
let mut card_with_ease_count: usize = 0;
let mut difficulty = Eases::default(); let mut difficulty = Eases::default();
let mut card_with_difficulty_count: usize = 0;
for card in &self.cards { for card in &self.cards {
if let Some(state) = card.memory_state { if let Some(state) = card.memory_state {
*difficulty *difficulty
.eases .eases
.entry(percent_to_bin(state.difficulty() * 100.0)) .entry(percent_to_bin(state.difficulty() * 100.0))
.or_insert_with(Default::default) += 1; .or_insert_with(Default::default) += 1;
difficulty.average += state.difficulty();
card_with_difficulty_count += 1;
} else if matches!(card.ctype, CardType::Review | CardType::Relearn) { } else if matches!(card.ctype, CardType::Review | CardType::Relearn) {
*eases *eases
.eases .eases
.entry((card.ease_factor / 10) as u32) .entry((card.ease_factor / 10) as u32)
.or_insert_with(Default::default) += 1; .or_insert_with(Default::default) += 1;
eases.average += card.ease_factor as f32;
card_with_ease_count += 1;
} }
} }
if card_with_ease_count != 0 {
eases.average = eases.average / 10.0 / card_with_ease_count as f32;
}
if card_with_difficulty_count != 0 {
difficulty.average = difficulty.average * 100.0 / card_with_difficulty_count as f32;
}
(eases, difficulty) (eases, difficulty)
} }
} }

View file

@ -12,6 +12,7 @@ impl GraphsContext {
/// (SM-2, FSRS) /// (SM-2, FSRS)
pub(super) fn retrievability(&self) -> Retrievability { pub(super) fn retrievability(&self) -> Retrievability {
let mut retrievability = Retrievability::default(); let mut retrievability = Retrievability::default();
let mut card_with_retrievability_count: usize = 0;
let timing = SchedTimingToday { let timing = SchedTimingToday {
days_elapsed: self.days_elapsed, days_elapsed: self.days_elapsed,
now: Default::default(), now: Default::default(),
@ -28,8 +29,15 @@ impl GraphsContext {
.retrievability .retrievability
.entry(percent_to_bin(r * 100.0)) .entry(percent_to_bin(r * 100.0))
.or_insert_with(Default::default) += 1; .or_insert_with(Default::default) += 1;
retrievability.average += r;
card_with_retrievability_count += 1;
} }
} }
if card_with_retrievability_count != 0 {
retrievability.average =
retrievability.average * 100.0 / card_with_retrievability_count as f32;
}
retrievability retrievability
} }
} }

View file

@ -17,10 +17,11 @@ import type { HistogramData } from "./histogram-graph";
export interface GraphData { export interface GraphData {
eases: Map<number, number>; eases: Map<number, number>;
average: number;
} }
export function gatherData(data: GraphsResponse): GraphData { export function gatherData(data: GraphsResponse): GraphData {
return { eases: numericMap(data.difficulty!.eases) }; return { eases: numericMap(data.difficulty!.eases), average: data.difficulty!.average };
} }
function makeQuery(start: number, end: number): string { function makeQuery(start: number, end: number): string {
@ -101,7 +102,7 @@ export function prepareData(
const tableData = [ const tableData = [
{ {
label: tr.statisticsAverageDifficulty(), label: tr.statisticsAverageDifficulty(),
value: xTickFormat(sum(Array.from(allEases.entries()).map(([k, v]) => (k + 2.5) * v)) / total), value: xTickFormat(data.average),
}, },
]; ];

View file

@ -17,10 +17,11 @@ import type { HistogramData } from "./histogram-graph";
export interface GraphData { export interface GraphData {
eases: Map<number, number>; eases: Map<number, number>;
average: number;
} }
export function gatherData(data: GraphsResponse): GraphData { export function gatherData(data: GraphsResponse): GraphData {
return { eases: numericMap(data.eases!.eases) }; return { eases: numericMap(data.eases!.eases), average: data.eases!.average };
} }
function makeQuery(start: number, end: number): string { function makeQuery(start: number, end: number): string {

View file

@ -17,10 +17,11 @@ import type { HistogramData } from "./histogram-graph";
export interface GraphData { export interface GraphData {
retrievability: Map<number, number>; retrievability: Map<number, number>;
average: number;
} }
export function gatherData(data: GraphsResponse): GraphData { export function gatherData(data: GraphsResponse): GraphData {
return { retrievability: numericMap(data.retrievability!.retrievability) }; return { retrievability: numericMap(data.retrievability!.retrievability), average: data.retrievability!.average };
} }
function makeQuery(start: number, end: number): string { function makeQuery(start: number, end: number): string {
@ -101,7 +102,7 @@ export function prepareData(
const tableData = [ const tableData = [
{ {
label: tr.statisticsAverageRetrievability(), label: tr.statisticsAverageRetrievability(),
value: xTickFormat(sum(Array.from(allEases.entries()).map(([k, v]) => (k + 2.5) * v)) / total), value: xTickFormat(data.average),
}, },
]; ];