function* run() {
const t = 1 / 200,
target = 0.05;
let change = 1,
i = 0;
do {
const n = i++ % data.length;
const u = step(n);
change = (change + t * (u !== bmus[n])) / (1 + t);
bmus[n] = u;
if (Math.sqrt(i) % 1 === 0) {
draw();
yield `step ${i}, change rate: ${(change * 100).toFixed(1)}%`;
}
} while (change > target && i < 100000);
draw();
yield `stopped after ${i} steps, change: ${(change * 100).toFixed(1)}%`;
}