From cb853e60989f34c4608ac3c521bf90a01d0387d9 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Fri, 27 Mar 2009 15:17:18 -0700 Subject: [PATCH] Fix bug when there are no new items to introduce Previously, mnemon would keep challenging infinitely (waiting for 10 new items to be introduced). Instead, we now decrement the to_introduce counter every time an item is selected from the smallest-number bin. --- mnemon.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/mnemon.c b/mnemon.c index 5ce7364..ac7c765 100644 --- a/mnemon.c +++ b/mnemon.c @@ -865,9 +865,20 @@ mnemon_select_item (mnemon_t *mnemon, category_t *category; bin_index = rand_within_exponential (mnemon->num_bins); - bin = &mnemon->bins[bin_index]; + /* The most intuitive understanding of the to_introduce counter is + * that it's tracking never-before-learned items as they are + * pulled from the bin with score 0. But that bin can become + * empty. So the refined rule is that we decrement to_introduce + * whenever we pull from the lowest-indexed bin with a + * non-negative score. */ + if (mnemon->to_introduce && bin->score >=0 && + (bin_index == 0 || mnemon->bins[bin_index-1].score < 0)) + { + mnemon->to_introduce--; + } + item_index = rand_within (bin->num_items); item = bin->items[item_index]; @@ -1148,9 +1159,6 @@ mnemon_do_challenges (mnemon_t *mnemon) mnemon_select_item (mnemon, &bin, &item_index, &category); item = bin->items[item_index]; - if (bin->score == 0) - mnemon->to_introduce--; - while (1) { if (category->time_limit > 0.0) { response = readline ("The next one is timed. Press enter when ready:"); -- 2.43.0