1 | static O analyzeBitMap_idToText; // func(long) -> S |
2 | |
3 | // Looks only at the values |
4 | static void analyzeBitMap(MultiMap<Long, Long> bitMap) {
|
5 | analyzeBitMap(values(bitMap.data)); |
6 | } |
7 | |
8 | static void analyzeBitMap(Collection<L<Long>> bitMap) {
|
9 | if (bitMap.isEmpty()) ret; |
10 | |
11 | new HashSet<Long> allSeen; |
12 | for (L<Long> l : bitMap) |
13 | allSeen.addAll(l); |
14 | printStruct(+allSeen); |
15 | MultiMap<Long, Long> implies = fullSelfMap(allSeen); |
16 | MultiMap<Long, Long> eq = fullSelfMap(allSeen); |
17 | |
18 | for (L<Long> l : bitMap) {
|
19 | HashSet<Long> set = new HashSet(l); |
20 | for (Long a : cloneList(implies.keySet())) {
|
21 | bool ax = set.contains(a); |
22 | for (Long b : cloneList(implies.get(a))) {
|
23 | bool bx = set.contains(b); |
24 | if (ax && !bx) |
25 | implies.remove(a, b); |
26 | } |
27 | } |
28 | |
29 | for (Long a : cloneList(eq.keySet())) {
|
30 | bool ax = set.contains(a); |
31 | for (Long b : cloneList(eq.get(a))) {
|
32 | bool bx = set.contains(b); |
33 | if (ax != bx) |
34 | eq.remove(a, b); |
35 | } |
36 | } |
37 | } |
38 | |
39 | printStruct(+implies); |
40 | //printStruct(+eq); |
41 | |
42 | L<L<Long>> clusters = multiMapToClusters(eq); |
43 | for i over clusters: |
44 | print("Cluster \* i+1 */: " + struct(mapIfFunctionNotNull(analyzeBitMap_idToText, clusters.get(i))));
|
45 | } |
46 | |
47 | static MultiMap<Long, Long> fullSelfMap(Collection<Long> l) {
|
48 | new MultiMap<Long, Long> mm; |
49 | for (Long x : l) mm.putAll(x, l); |
50 | ret mm; |
51 | } |
52 | |
53 | static L<L<Long>> multiMapToClusters(MultiMap<Long, Long> mm) {
|
54 | // a cluster is a list of concepts. |
55 | // first, make trivial clusters (one per item). |
56 | |
57 | Map<Long, L<Long>> clusters = new TreeMap<Long, L<Long>>(); |
58 | for (Long a : mm.keySet()) {
|
59 | if (!clusters.containsKey(a)) |
60 | clusters.put(a, ll(a)); |
61 | } |
62 | |
63 | // then, merge the clusters. |
64 | |
65 | for (Long a : mm.keySet()) |
66 | for (Long b : mm.get(a)) {
|
67 | L<Long> c1 = clusters.get(a); |
68 | L<Long> c2 = clusters.get(b); |
69 | if (c1 != c2) // different clusters, need to merge! |
70 | mergeClusters(clusters, c1, c2); |
71 | } |
72 | |
73 | ret asList(new HashSet<L<Long>>(clusters.values())); |
74 | } |
75 | |
76 | static void mergeClusters(Map<Long, L<Long>> clusters, L<Long> c1, L<Long> c2) {
|
77 | for (Long x : c2) {
|
78 | clusters.put(x, c1); |
79 | c1.add(x); |
80 | } |
81 | } |
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, ddnzoavkxhuk, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1005534 |
| Snippet name: | analyzeBitMap |
| Eternal ID of this version: | #1005534/1 |
| Text MD5: | a41a73c41a52102f55e6478537f2e7b0 |
| Author: | stefan |
| Category: | javax / logic |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2016-11-27 14:04:39 |
| Source code size: | 2265 bytes / 81 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 723 / 963 |
| Referenced in: | [show references] |