My reading of the paper (and my intuition) is that lower bounds should be set for all point-center distances calculated, not just for the initial assignment of each point. (It says "each time d(x, c) is computed", not "each time d(x, c(x))".) Setting lower_bounds every time `d` is called in `assign_labels` cuts 17% off a benchmark with (samples, feats, clusters) = (500, 10000, 20) and 26% off (1000, 10000, 50). Results are identical.