loose-assciations 0.2

+ The result is always safe, when a group is undersizes, it gets redistributed between the other groups.

+ When a row cannot be redistributed without breaking heterogenity it gets dropped and all the groups containing the row that are not full get redistributed. This lead to a chain of reditribute/delete until we reach a safe partitioning where every group respects the three heterogenity principles and also has at least k elements.

+ Add logging in order to check what the algorithm is doing.

+ We can set how often the associate function is logging the progress passing another argument to it [default = 1000]

+ Add statistics on group size.

+ Improve performaces keeping the index of the first non-full group for each fragment, so we can start to check for non-full groups from there.

+ Added the ability to define a skip_probability in order to deal with minimality attacks. If the algorithm always follows the same path, the input can be reconstructed by an attacker. The skip_pribability [default = 0] is a float number between 0 and 1 passed as another argument to the Loose constructor and it defines the probability on the first scan to skip also a nonfull group while looking for a group where to put a tuple.

+ Exploiting the skip probability there is a bruteforce method on Loose that allows us to try n times to find an association that doesn't drop any tuple. This is not a full scan but just a repetition of the algorithm that can lead to different results because of the randomness of skip_probability. [WARNING: this is only done for demonstration purposes, in fact the this normally keeps choosing the same subset of solution, in fact the probability to skip a nonfull group is skip_probability, but the probability of skipping a second nonfull one is skip_probability squared, which is non linear]

+ There can be situations where adding a couple of groups over tuples/k can lead to better results. We log a warning message whenever we drop a tuple on the first scan because that tuple could be preserved allowing more groups. We don't allow infinite groups because if we have a very common attribute we can lead to non-terminant situations. So this tweak is left to the user.

This is a stable release that could be used for testing the algorithm.