Commit Diff


commit - 7e15a2c893e203a68e2edce3688ffbecb938cd8e
commit + d01528a063b3d747c9fe5ea5b7e56c7e85fef0a1
blob - 17917dd4c6bd7662840459cb059ea173dcfb1197
blob + 18cb5b0e703211165baf00b3d5e8956b84422e2c
--- NOTES
+++ NOTES
@@ -188,6 +188,21 @@ Own thoughts:
 - If the intended use is to start every session at the beginning, I think I
   prefer starting with 4 characters. Otherwise the initial bunch of of 7s and
   Qs is much too simple (only distinguishing two characters is mechanical).
+- After a while of good performance on known characters, these tend to become
+  so rare that they are forgotten until one eventually reappears, leading to
+  frustrating errors and less effective learning. At first, I considered
+  clamping the error estimate at some minimum value, but decided against
+  tampering with measurements to counter their consequences. The idea I came
+  up with instead is to use the overall error rate as a baseline weight when
+  selecting the symbol to sound, i.e. each symbol's weight is the current
+  overall rate plus that symbol's individual rate. This means that "good"
+  symbols still appear less often than bad ones, but symbols are only allowed
+  to fade from rotation as long as the student is consistently performing very
+  well.
+  This should also counter the effect that old symbols become very rare
+  immediately when a new one is introduced only to suddenly reappear all
+  at once when that new symbol has been answered correctly a number of times
+  (which might not even have been very indicative of true progress).
 
 Differences in my version:
 - Advancement threshold is 30% error rate (overall *and* maximum individual).
@@ -199,12 +214,14 @@ Differences in my version:
   as response time more than one sigma over average.
 - Response times are clamped to within one sigma of average for the purpose of
   updating the estimate.
+- Uses overall error rate as a heuristic baseline to stop symbols from
+  completely disappearing from training.
 - No periodic resounding or automatic hinting.
 - Visual hint and resound on pressing Space. Hint disappears after sound
   finishes.
 - Hints appear under the cursor without advancing it.
 - (Like original) only prints bargraph on pause (Return).
-  training level (number of symbols activated), and session duration (excl.
+  Also training level (number of symbols activated), and session duration (excl.
   pauses).
 - Measures/displays average response time and equivalent wpm.
 - Measures/displays session duration (excluding pauses).
blob - c8aa0f8c51695f3a093a54f420cf896c927387d7
blob + 51a2872cfb0430c612a401be8222561fe904b309
--- teach.c
+++ teach.c
@@ -354,15 +354,16 @@ teach(void)
 	while (!feof(stdin) && input != 4) {
 		/*
 		 * Pick a random character from the active training set,
-		 * distributed according to the failure rates.
+		 * distributed according to the failure rates and using the
+		 * overall failure rate as a baseline.
 		 */
 		l = 0;
 		for (i = 0; i < nactive; i++)
-			l += failprob[i];
+			l += overall + failprob[i];
 		x = l * rand() / RAND_MAX;
 		assert(nactive > 1);
 		for (i = 0; i < nactive - 1; i++) {
-			x -= failprob[i];
+			x -= overall + failprob[i];
 			if (x < 0)
 				break;
 		}