// Apply corrections one by one, greedily, until we are at the exact right sum.
if (actual_sum > prob_scale) {
- float loss = -true_prob * log2(new_val / (new_val - 1));
+ float loss = true_prob * log2(new_val / float(new_val - 1));
voting_areas[i] = 0xffffffff;
memoryBarrierShared();
if (my_vote == voting_areas[vote_no]) {
--new_val;
- loss = -true_prob * log2(new_val / (new_val - 1));
+ loss = true_prob * log2(new_val / float(new_val - 1));
}
}
} else {
- float benefit = true_prob * log2(new_val / (new_val + 1));
+ float benefit = -true_prob * log2(new_val / float(new_val + 1));
voting_areas[i] = 0;
memoryBarrierShared();
if (my_vote == voting_areas[vote_no]) {
++new_val;
- benefit = true_prob * log2(new_val / (new_val + 1));
+ benefit = -true_prob * log2(new_val / float(new_val + 1));
}
}
}
memoryBarrierShared();
barrier();
+ new_val = new_dist[i];
+
+ // TODO: Why do we need this next barrier? It makes no sense.
+ memoryBarrierShared();
+ barrier();
+
for (uint layer = 2; layer <= 256; layer *= 2) {
if ((i & (layer - 1)) == layer - 1) {
new_dist[i] += new_dist[i - (layer / 2)];
memoryBarrierShared();
barrier();
}
- ransdist[base + i] = uvec2(new_val, new_dist[i]);
+ ransdist[base + i] = uvec2(new_dist[i] - new_val, new_val);
}