If more than 350 accounts are sent to this group-sorting algorithm, then it begins to just loose accounts. If 400 accounts are sent in, then only 399 accounts are added to hangoutGroups[][]
function commit(bytes32 POIuser) {
uint groupNumber = uint(POIuser) / (uint(maxHash) / numGroups()) + 1;
if(hangoutGroups[groupNumber].length >= groupSize) {
for(uint i = 0; i < numUsers(); i++) {
if(groupNumber - i >= 1) {
if(hangoutGroups[groupNumber - i].length < groupSize) { groupNumber -= i; break; }
}
if(groupNumber + i <= numGroups()) {
if(hangoutGroups[groupNumber + i].length < groupSize) { groupNumber += i; break; }
}
}
}
hangoutGroups[groupNumber].push(POIuser);
}
If the loop code is changed slightly then it outputs 400
function commit(bytes32 POIuser) {
uint groupNumber = uint(POIuser) / (uint(maxHash) / numGroups()) + 1;
if(hangoutGroups[groupNumber].length >= groupSize) {
for(uint i = 0; i < 2; i++) {
if(groupNumber - i >= 1) {
if(hangoutGroups[groupNumber - i].length < groupSize) { groupNumber -= i; break; }
}
if(groupNumber + i <= numGroups()) {
if(hangoutGroups[groupNumber + i].length < groupSize) { groupNumber += i; break; }
}
}
}
hangoutGroups[groupNumber].push(POIuser);
}
Then if the loop is incremented just one step, it looses an account again
function commit(bytes32 POIuser) {
uint groupNumber = uint(POIuser) / (uint(maxHash) / numGroups()) + 1;
if(hangoutGroups[groupNumber].length >= groupSize) {
for(uint i = 0; i < 3; i++) {
if(groupNumber - i >= 1) {
if(hangoutGroups[groupNumber - i].length < groupSize) { groupNumber -= i; break; }
}
if(groupNumber + i <= numGroups()) {
if(hangoutGroups[groupNumber + i].length < groupSize) { groupNumber += i; break; }
}
}
}
hangoutGroups[groupNumber].push(POIuser);
}
This is the output for the loop with < numUsers(), 399 accounts
0, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 0
This is the output if the loops is limited to 2, 400 accounts
0, 6, 5, 1, 3, 4, 5, 5, 7, 5, 1, 4, 3, 5, 5, 5, 5, 5, 7, 6, 6, 7, 7, 7, 5, 2,
5, 5, 4, 5, 5, 5, 3, 5, 5, 5, 3, 3, 5, 5, 4, 3, 5, 2, 5, 5, 7, 6, 5, 5, 1, 5,
7, 5, 4, 5, 6, 5, 6, 7, 8, 6, 5, 5, 4, 5, 5, 5, 8, 8, 8, 6, 7, 6, 5, 5, 4, 4,
5, 5, 4, 0
This is the output if the loop is incremented to 3, 399 accounts
0, 5, 5, 1, 3, 4, 5, 5, 5, 5, 3, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 5, 5, 4,
5, 5, 4, 5, 5, 5, 3, 5, 5, 5, 3, 3, 5, 5, 4, 3, 5, 2, 5, 5, 7, 6, 5, 5, 3, 5,
5, 5, 5, 5, 5, 5, 6, 7, 8, 6, 5, 5, 5, 5, 6, 5, 6, 6, 9, 7, 7, 5, 5, 5, 5, 4,
5, 5, 4, 0
The accounts are generated by this code, and I've used hashes to simulate accounts
bytes32[] public fourHundredAddresses;
function generateFourHundredAddresses() {
for(uint i = 0; i < 400; i++) {
fourHundredAddresses.push(sha3(i));
numUsers++;
}
}
function batchRegisterOne() {
for(uint i = 0; i < fourHundredAddresses.length; i++) {
commit(fourHundredAddresses[i]);
}
}
The rest of the code
mapping(uint => bytes32[]) public hangoutGroups;
uint groupSize;
uint public numUsers;
bytes32 maxHash = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
function numGroups() returns(uint){ return numUsers / groupSize;}
function poi() {
groupSize = 5;
}
