| … | … | @@ -662,6 +662,14 @@ static void merge_majority (long cls, long *g, int n) { |
| 662 | 662 | int nleft = 0, mshcnt = 0; |
| 663 | 663 | long *left = malloc(sizeof(long) * (ndj + 1)); |
| 664 | 664 | for (size_t k = 0; k < ndj; k++) if (!is_marked(done, djs[k])) left[nleft++] = djs[k]; |
| 665 | if (getenv("CLUSTER_SHUFFLE")) { // diagnostic: does the left-over order (Linas: atom-set order) matter? |
| 666 | uint64_t z = strtoull(getenv("CLUSTER_SHUFFLE"), NULL, 10) * 0x9e3779b97f4a7c15ULL + 1; |
| 667 | for (int k = nleft - 1; k > 0; k--) { |
| 668 | z ^= z << 13; z ^= z >> 7; z ^= z << 17; |
| 669 | int j = (int) (z % (uint64_t) (k + 1)); |
| 670 | long t = left[k]; left[k] = left[j]; left[j] = t; |
| 671 | } |
| 672 | } |
| 665 | 673 | for (int k = 0; k < nleft; k++) { |
| 666 | 674 | long shp = left[k]; |
| 667 | 675 | if (once_shape_done(shp)) continue; |
| … | … | @@ -767,6 +775,12 @@ int main (int argc, char **argv) { |
| 767 | 775 | long cls = make_class_node(grp, n); |
| 768 | 776 | merge_majority(cls, grp, n); |
| 769 | 777 | printf("------ Merged into `%s`\n", aname(cls)); |
| 778 | if (getenv("CLUSTER_SHUFFLE")) { // diagnostic: class row and member counts after the merge |
| 779 | double cs = 0, cx = 0, ns = 0, nx = 0, mc = 0; |
| 780 | for (size_t k = 0; k < npairs; k++) if (pairs[k].alive && pairs[k].r == cls) { if (cols[pairs[k].c].shape) { cx += pairs[k].n; nx++; } else { cs += pairs[k].n; ns++; } } |
| 781 | for (size_t k = 0; k < nmembs; k++) if (membs[k].cls == cls) mc += membs[k].n; |
| 782 | printf("class: sections %.0f (count %.0f) crosses %.0f (count %.0f) member-count %.0f\n", ns, cs, nx, cx, mc); |
| 783 | } |
| 770 | 784 | |
| 771 | 785 | recompute(); // marginals of everything touched (full recompute is equivalent) |
| 772 | 786 | remove_empty(cls); |