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: | 517 / 740 |
Referenced in: | [show references] |