binary-decision-diagram 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/cjs/src/abstract-node.js +173 -0
  2. package/dist/cjs/src/abstract-node.js.map +1 -0
  3. package/dist/cjs/src/branches.js +76 -0
  4. package/dist/cjs/src/branches.js.map +1 -0
  5. package/dist/cjs/src/create-bdd-from-truth-table.js +38 -0
  6. package/dist/cjs/src/create-bdd-from-truth-table.js.map +1 -0
  7. package/dist/cjs/src/ensure-correct-bdd.js +102 -0
  8. package/dist/cjs/src/ensure-correct-bdd.js.map +1 -0
  9. package/dist/cjs/src/fill-truth-table.js +26 -0
  10. package/dist/cjs/src/fill-truth-table.js.map +1 -0
  11. package/dist/cjs/src/find-similar-node.js +22 -0
  12. package/dist/cjs/src/find-similar-node.js.map +1 -0
  13. package/dist/cjs/src/index.es5.d.ts +9 -0
  14. package/dist/cjs/src/index.es5.js +36 -0
  15. package/dist/cjs/src/index.es5.js.map +1 -0
  16. package/dist/cjs/src/index.js +30 -0
  17. package/dist/cjs/src/index.js.map +1 -0
  18. package/dist/cjs/src/internal-node.js +46 -0
  19. package/dist/cjs/src/internal-node.js.map +1 -0
  20. package/dist/cjs/src/leaf-node.js +34 -0
  21. package/dist/cjs/src/leaf-node.js.map +1 -0
  22. package/dist/cjs/src/minimal-string/bdd-to-minimal-string.js +60 -0
  23. package/dist/cjs/src/minimal-string/bdd-to-minimal-string.js.map +1 -0
  24. package/dist/cjs/src/minimal-string/bdd-to-simple-bdd.js +24 -0
  25. package/dist/cjs/src/minimal-string/bdd-to-simple-bdd.js.map +1 -0
  26. package/dist/cjs/src/minimal-string/index.js +22 -0
  27. package/dist/cjs/src/minimal-string/index.js.map +1 -0
  28. package/dist/cjs/src/minimal-string/minimal-string-to-simple-bdd.js +58 -0
  29. package/dist/cjs/src/minimal-string/minimal-string-to-simple-bdd.js.map +1 -0
  30. package/dist/cjs/src/minimal-string/resolve-with-simple-bdd.js +21 -0
  31. package/dist/cjs/src/minimal-string/resolve-with-simple-bdd.js.map +1 -0
  32. package/dist/cjs/src/minimal-string/string-format.js +61 -0
  33. package/dist/cjs/src/minimal-string/string-format.js.map +1 -0
  34. package/dist/cjs/src/optimize-brute-force.js +140 -0
  35. package/dist/cjs/src/optimize-brute-force.js.map +1 -0
  36. package/dist/cjs/src/parents.js +43 -0
  37. package/dist/cjs/src/parents.js.map +1 -0
  38. package/dist/cjs/src/root-node.js +158 -0
  39. package/dist/cjs/src/root-node.js.map +1 -0
  40. package/dist/cjs/src/types.js +3 -0
  41. package/dist/{src → cjs/src}/types.js.map +1 -1
  42. package/dist/cjs/src/util.js +127 -0
  43. package/dist/cjs/src/util.js.map +1 -0
  44. package/dist/esm/src/abstract-node.d.ts +33 -0
  45. package/dist/esm/src/abstract-node.js.map +1 -0
  46. package/dist/esm/src/branches.d.ts +20 -0
  47. package/dist/esm/src/branches.js.map +1 -0
  48. package/dist/esm/src/create-bdd-from-truth-table.d.ts +3 -0
  49. package/dist/esm/src/create-bdd-from-truth-table.js.map +1 -0
  50. package/dist/esm/src/ensure-correct-bdd.d.ts +8 -0
  51. package/dist/esm/src/ensure-correct-bdd.js.map +1 -0
  52. package/dist/esm/src/fill-truth-table.d.ts +6 -0
  53. package/dist/esm/src/fill-truth-table.js.map +1 -0
  54. package/dist/esm/src/find-similar-node.d.ts +7 -0
  55. package/dist/esm/src/find-similar-node.js.map +1 -0
  56. package/dist/esm/src/index.d.ts +14 -0
  57. package/dist/esm/src/index.es5.d.ts +9 -0
  58. package/dist/esm/src/index.es5.js +11 -0
  59. package/dist/esm/src/index.es5.js.map +1 -0
  60. package/dist/esm/src/index.js.map +1 -0
  61. package/dist/esm/src/internal-node.d.ts +16 -0
  62. package/dist/esm/src/internal-node.js.map +1 -0
  63. package/dist/esm/src/leaf-node.d.ts +10 -0
  64. package/dist/esm/src/leaf-node.js.map +1 -0
  65. package/dist/esm/src/minimal-string/bdd-to-minimal-string.d.ts +8 -0
  66. package/dist/esm/src/minimal-string/bdd-to-minimal-string.js.map +1 -0
  67. package/dist/esm/src/minimal-string/bdd-to-simple-bdd.d.ts +11 -0
  68. package/dist/esm/src/minimal-string/bdd-to-simple-bdd.js.map +1 -0
  69. package/dist/esm/src/minimal-string/index.d.ts +5 -0
  70. package/dist/esm/src/minimal-string/index.js.map +1 -0
  71. package/dist/esm/src/minimal-string/minimal-string-to-simple-bdd.d.ts +2 -0
  72. package/dist/esm/src/minimal-string/minimal-string-to-simple-bdd.js.map +1 -0
  73. package/dist/esm/src/minimal-string/resolve-with-simple-bdd.d.ts +2 -0
  74. package/dist/esm/src/minimal-string/resolve-with-simple-bdd.js.map +1 -0
  75. package/dist/esm/src/minimal-string/string-format.d.ts +9 -0
  76. package/dist/esm/src/minimal-string/string-format.js.map +1 -0
  77. package/dist/esm/src/optimize-brute-force.d.ts +43 -0
  78. package/dist/esm/src/optimize-brute-force.js.map +1 -0
  79. package/dist/esm/src/package.json +1 -0
  80. package/dist/esm/src/parents.d.ts +15 -0
  81. package/dist/esm/src/parents.js.map +1 -0
  82. package/dist/esm/src/root-node.d.ts +28 -0
  83. package/dist/esm/src/root-node.js.map +1 -0
  84. package/dist/esm/src/types.d.ts +24 -0
  85. package/dist/esm/src/types.js.map +1 -0
  86. package/dist/esm/src/util.d.ts +26 -0
  87. package/dist/esm/src/util.js.map +1 -0
  88. package/package.json +17 -7
  89. package/src/index.es5.ts +12 -0
  90. package/dist/src/abstract-node.js.map +0 -1
  91. package/dist/src/branches.js.map +0 -1
  92. package/dist/src/create-bdd-from-truth-table.js.map +0 -1
  93. package/dist/src/ensure-correct-bdd.js.map +0 -1
  94. package/dist/src/fill-truth-table.js.map +0 -1
  95. package/dist/src/find-similar-node.js.map +0 -1
  96. package/dist/src/index.js.map +0 -1
  97. package/dist/src/internal-node.js.map +0 -1
  98. package/dist/src/leaf-node.js.map +0 -1
  99. package/dist/src/minimal-string/bdd-to-minimal-string.js.map +0 -1
  100. package/dist/src/minimal-string/bdd-to-simple-bdd.js.map +0 -1
  101. package/dist/src/minimal-string/index.js.map +0 -1
  102. package/dist/src/minimal-string/minimal-string-to-simple-bdd.js.map +0 -1
  103. package/dist/src/minimal-string/resolve-with-simple-bdd.js.map +0 -1
  104. package/dist/src/minimal-string/string-format.js.map +0 -1
  105. package/dist/src/optimize-brute-force.js.map +0 -1
  106. package/dist/src/parents.js.map +0 -1
  107. package/dist/src/root-node.js.map +0 -1
  108. package/dist/src/util.js.map +0 -1
  109. /package/dist/{src → cjs/src}/abstract-node.d.ts +0 -0
  110. /package/dist/{src → cjs/src}/branches.d.ts +0 -0
  111. /package/dist/{src → cjs/src}/create-bdd-from-truth-table.d.ts +0 -0
  112. /package/dist/{src → cjs/src}/ensure-correct-bdd.d.ts +0 -0
  113. /package/dist/{src → cjs/src}/fill-truth-table.d.ts +0 -0
  114. /package/dist/{src → cjs/src}/find-similar-node.d.ts +0 -0
  115. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  116. /package/dist/{src → cjs/src}/internal-node.d.ts +0 -0
  117. /package/dist/{src → cjs/src}/leaf-node.d.ts +0 -0
  118. /package/dist/{src → cjs/src}/minimal-string/bdd-to-minimal-string.d.ts +0 -0
  119. /package/dist/{src → cjs/src}/minimal-string/bdd-to-simple-bdd.d.ts +0 -0
  120. /package/dist/{src → cjs/src}/minimal-string/index.d.ts +0 -0
  121. /package/dist/{src → cjs/src}/minimal-string/minimal-string-to-simple-bdd.d.ts +0 -0
  122. /package/dist/{src → cjs/src}/minimal-string/resolve-with-simple-bdd.d.ts +0 -0
  123. /package/dist/{src → cjs/src}/minimal-string/string-format.d.ts +0 -0
  124. /package/dist/{src → cjs/src}/optimize-brute-force.d.ts +0 -0
  125. /package/dist/{src → cjs/src}/parents.d.ts +0 -0
  126. /package/dist/{src → cjs/src}/root-node.d.ts +0 -0
  127. /package/dist/{src → cjs/src}/types.d.ts +0 -0
  128. /package/dist/{src → cjs/src}/util.d.ts +0 -0
  129. /package/dist/{src → esm/src}/abstract-node.js +0 -0
  130. /package/dist/{src → esm/src}/branches.js +0 -0
  131. /package/dist/{src → esm/src}/create-bdd-from-truth-table.js +0 -0
  132. /package/dist/{src → esm/src}/ensure-correct-bdd.js +0 -0
  133. /package/dist/{src → esm/src}/fill-truth-table.js +0 -0
  134. /package/dist/{src → esm/src}/find-similar-node.js +0 -0
  135. /package/dist/{src → esm/src}/index.js +0 -0
  136. /package/dist/{src → esm/src}/internal-node.js +0 -0
  137. /package/dist/{src → esm/src}/leaf-node.js +0 -0
  138. /package/dist/{src → esm/src}/minimal-string/bdd-to-minimal-string.js +0 -0
  139. /package/dist/{src → esm/src}/minimal-string/bdd-to-simple-bdd.js +0 -0
  140. /package/dist/{src → esm/src}/minimal-string/index.js +0 -0
  141. /package/dist/{src → esm/src}/minimal-string/minimal-string-to-simple-bdd.js +0 -0
  142. /package/dist/{src → esm/src}/minimal-string/resolve-with-simple-bdd.js +0 -0
  143. /package/dist/{src → esm/src}/minimal-string/string-format.js +0 -0
  144. /package/dist/{src → esm/src}/optimize-brute-force.js +0 -0
  145. /package/dist/{src → esm/src}/parents.js +0 -0
  146. /package/dist/{src → esm/src}/root-node.js +0 -0
  147. /package/dist/{src → esm/src}/types.js +0 -0
  148. /package/dist/{src → esm/src}/util.js +0 -0
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractNode = void 0;
4
+ const util_js_1 = require("./util.js");
5
+ const find_similar_node_js_1 = require("./find-similar-node.js");
6
+ class AbstractNode {
7
+ level;
8
+ id = (0, util_js_1.nextNodeId)();
9
+ deleted = false;
10
+ type;
11
+ rootNode;
12
+ constructor(level, rootNode, type) {
13
+ this.level = level;
14
+ this.type = type;
15
+ this.rootNode = rootNode;
16
+ if (rootNode) {
17
+ this.rootNode.addNode(this);
18
+ }
19
+ }
20
+ isEqualToOtherNode(otherNode,
21
+ // optimisation shortcut, is faster if own string already known
22
+ ownString = this.toString()) {
23
+ const ret = ownString === otherNode.toString();
24
+ return ret;
25
+ }
26
+ // deletes the whole node
27
+ remove() {
28
+ this.ensureNotDeleted('remove');
29
+ // console.log('AbstractNode().remove() node: ' + this.id);
30
+ // console.log(this.toJSON(true));
31
+ if (this.isInternalNode()) {
32
+ const useNode = this;
33
+ if (useNode.parents.size > 0) {
34
+ throw new Error('cannot remove node with parents ' + this.id);
35
+ }
36
+ }
37
+ if (this.branches) {
38
+ const useNode = this;
39
+ if (useNode.branches.areBranchesStrictEqual()) {
40
+ useNode.branches.getBranch('0').parents.remove(useNode);
41
+ }
42
+ else {
43
+ useNode.branches.getBranch('0').parents.remove(useNode);
44
+ useNode.branches.getBranch('1').parents.remove(useNode);
45
+ }
46
+ }
47
+ this.deleted = true;
48
+ this.rootNode.removeNode(this);
49
+ }
50
+ toJSON(withId = false) {
51
+ const ret = {
52
+ id: withId ? this.id : undefined,
53
+ deleted: withId ? this.deleted : undefined,
54
+ type: this.type,
55
+ level: this.level
56
+ };
57
+ if (withId && this.parents) {
58
+ ret.parents = this.parents.toString();
59
+ }
60
+ if (this.isLeafNode()) {
61
+ ret.value = this.asLeafNode().value;
62
+ }
63
+ if (this.branches && !this.branches.deleted) {
64
+ const branches = this.branches;
65
+ ret.branches = {
66
+ '0': branches.getBranch('0').toJSON(withId),
67
+ '1': branches.getBranch('1').toJSON(withId)
68
+ };
69
+ }
70
+ return ret;
71
+ }
72
+ // a strange string-representation
73
+ // to make an equal check between nodes
74
+ toString() {
75
+ let ret = '' +
76
+ '<' +
77
+ this.type + ':' + this.level;
78
+ if (this.branches) {
79
+ const branches = this.branches;
80
+ ret += '|0:' + branches.getBranch('0');
81
+ ret += '|1:' + branches.getBranch('1');
82
+ }
83
+ if (this.isLeafNode()) {
84
+ ret += '|v:' + this.asLeafNode().value;
85
+ }
86
+ ret += '>';
87
+ return ret;
88
+ }
89
+ isRootNode() {
90
+ return this.type === 'RootNode';
91
+ }
92
+ isInternalNode() {
93
+ return this.type === 'InternalNode';
94
+ }
95
+ isLeafNode() {
96
+ return this.type === 'LeafNode';
97
+ }
98
+ asRootNode() {
99
+ if (!this.isRootNode()) {
100
+ throw new Error('ouch');
101
+ }
102
+ return this;
103
+ }
104
+ asInternalNode() {
105
+ if (!this.isInternalNode()) {
106
+ throw new Error('ouch');
107
+ }
108
+ return this;
109
+ }
110
+ asLeafNode() {
111
+ if (!this.isLeafNode()) {
112
+ throw new Error('ouch');
113
+ }
114
+ return this;
115
+ }
116
+ ensureNotDeleted(op = 'unknown') {
117
+ if (this.deleted) {
118
+ throw new Error('forbidden operation ' + op + ' on deleted node ' + this.id);
119
+ }
120
+ }
121
+ log() {
122
+ console.log(JSON.stringify(this.toJSON(true), null, 2));
123
+ }
124
+ /**
125
+ * by the elimination-rule of bdd,
126
+ * if two branches of the same level are equal,
127
+ * one can be removed
128
+ *
129
+ * See page 21 at:
130
+ * @link https://people.eecs.berkeley.edu/~sseshia/219c/lectures/BinaryDecisionDiagrams.pdf
131
+ */
132
+ applyEliminationRule(
133
+ // can be provided for better performance
134
+ nodesOfSameLevel) {
135
+ this.ensureNotDeleted('applyEliminationRule');
136
+ if (!nodesOfSameLevel) {
137
+ nodesOfSameLevel = this.rootNode.getNodesOfLevel(this.level);
138
+ }
139
+ const other = (0, find_similar_node_js_1.findSimilarNode)(this, nodesOfSameLevel);
140
+ if (other) {
141
+ // console.log('applyEliminationRule() remove:' + this.id + '; other: ' + other.id);
142
+ // keep 'other', remove 'this'
143
+ // move own parents to other
144
+ const ownParents = this.parents.getAll();
145
+ const parentsWithStrictEqualBranches = [];
146
+ ownParents.forEach((parent) => {
147
+ // console.log('ownParent: ' + parent.id);
148
+ const branchKey = parent.branches.getKeyOfNode(this);
149
+ // console.log('branchKey: ' + branchKey);
150
+ parent.branches.setBranch(branchKey, other);
151
+ if (parent.branches.areBranchesStrictEqual()) {
152
+ parentsWithStrictEqualBranches.push(parent);
153
+ }
154
+ // remove parents from own list
155
+ // this will auto-remove the connection to the other '1'-branch
156
+ this.parents.remove(parent);
157
+ });
158
+ // parents that now have equal branches, must be removed again
159
+ parentsWithStrictEqualBranches.forEach(node => {
160
+ if (node.isInternalNode()) {
161
+ // console.log('trigger applyReductionRule from applyEliminationRule');
162
+ node.applyReductionRule();
163
+ }
164
+ });
165
+ return true;
166
+ }
167
+ else {
168
+ return false;
169
+ }
170
+ }
171
+ }
172
+ exports.AbstractNode = AbstractNode;
173
+ //# sourceMappingURL=abstract-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract-node.js","sourceRoot":"","sources":["../../../src/abstract-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureNodesNotStrictEqual = exports.Branches = void 0;
4
+ /**
5
+ * represents the branches of a single node
6
+ */
7
+ class Branches {
8
+ node;
9
+ deleted = false;
10
+ branches = {};
11
+ constructor(node) {
12
+ this.node = node;
13
+ }
14
+ setBranch(which, branchNode) {
15
+ const previous = this.branches[which];
16
+ if (previous === branchNode) {
17
+ return;
18
+ }
19
+ // set new branch
20
+ this.branches[which] = branchNode;
21
+ branchNode.parents.add(this.node);
22
+ }
23
+ getKeyOfNode(node) {
24
+ if (this.getBranch('0') === node) {
25
+ return '0';
26
+ }
27
+ else if (this.getBranch('1') === node) {
28
+ return '1';
29
+ }
30
+ else {
31
+ throw new Error('none matched');
32
+ }
33
+ }
34
+ getBranch(which) {
35
+ return this.branches[which];
36
+ }
37
+ getBothBranches() {
38
+ return [
39
+ this.getBranch('0'),
40
+ this.getBranch('1')
41
+ ];
42
+ }
43
+ hasBranchAsNode(node) {
44
+ if (this.getBranch('0') === node ||
45
+ this.getBranch('1') === node) {
46
+ return true;
47
+ }
48
+ else {
49
+ return false;
50
+ }
51
+ }
52
+ hasNodeIdAsBranch(id) {
53
+ if (this.getBranch('0').id === id ||
54
+ this.getBranch('1').id === id) {
55
+ return true;
56
+ }
57
+ else {
58
+ return false;
59
+ }
60
+ }
61
+ areBranchesStrictEqual() {
62
+ return this.branches['0'] === this.branches['1'];
63
+ }
64
+ hasEqualBranches() {
65
+ return JSON.stringify(this.branches['0']) ===
66
+ JSON.stringify(this.branches['1']);
67
+ }
68
+ }
69
+ exports.Branches = Branches;
70
+ function ensureNodesNotStrictEqual(node1, node2) {
71
+ if (node1 === node2) {
72
+ throw new Error('cannot have two strict equal branches');
73
+ }
74
+ }
75
+ exports.ensureNodesNotStrictEqual = ensureNodesNotStrictEqual;
76
+ //# sourceMappingURL=branches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branches.js","sourceRoot":"","sources":["../../../src/branches.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,QAAQ;IAOL;IANL,OAAO,GAAY,KAAK,CAAC;IACxB,QAAQ,GAEZ,EAAS,CAAC;IAEd,YACY,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IACzB,CAAC;IAEE,SAAS,CAAC,KAAoB,EAAE,UAAuB;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,QAAQ,KAAK,UAAU,EAAE;YACzB,OAAO;SACV;QAED,iBAAiB;QACjB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;QAClC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEM,YAAY,CAAC,IAAiB;QACjC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC9B,OAAO,GAAG,CAAC;SACd;aAAM,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YACrC,OAAO,GAAG,CAAC;SACd;aAAM;YACH,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;SACnC;IACL,CAAC;IAEM,SAAS,CAAC,KAAoB;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAEM,eAAe;QAClB,OAAO;YACH,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;SACtB,CAAC;IACN,CAAC;IAEM,eAAe,CAAC,IAAkB;QACrC,IACI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI;YAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAC9B;YACE,OAAO,IAAI,CAAC;SACf;aAAM;YACH,OAAO,KAAK,CAAC;SAChB;IACL,CAAC;IAEM,iBAAiB,CAAC,EAAU;QAC/B,IACI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAC/B;YACE,OAAO,IAAI,CAAC;SACf;aAAM;YACH,OAAO,KAAK,CAAC;SAChB;IACL,CAAC;IAEM,sBAAsB;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAEM,gBAAgB;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;CACJ;AAxED,4BAwEC;AAED,SAAgB,yBAAyB,CACrC,KAAkB,EAClB,KAAkB;IAElB,IAAI,KAAK,KAAK,KAAK,EAAE;QACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;KAC5D;AACL,CAAC;AAPD,8DAOC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBddFromTruthTable = void 0;
4
+ const root_node_js_1 = require("./root-node.js");
5
+ const util_js_1 = require("./util.js");
6
+ const internal_node_js_1 = require("./internal-node.js");
7
+ const leaf_node_js_1 = require("./leaf-node.js");
8
+ function createBddFromTruthTable(truthTable) {
9
+ const root = new root_node_js_1.RootNode();
10
+ const firstKey = truthTable.keys().next().value;
11
+ const keyLength = firstKey.length;
12
+ const mustBeSize = Math.pow(2, keyLength);
13
+ if (truthTable.size !== mustBeSize) {
14
+ throw new Error('truth table has missing entries');
15
+ }
16
+ for (const [stateSet, value] of truthTable) {
17
+ let lastNode = root;
18
+ // itterate over each char of the state
19
+ for (let i = 0; i < (stateSet.length - 1); i++) {
20
+ const level = i + 1;
21
+ const state = stateSet.charAt(i);
22
+ // if node for this state-char not exists, add new one
23
+ if (!lastNode.branches.getBranch(state)) {
24
+ lastNode.branches.setBranch(state, new internal_node_js_1.InternalNode(level, root, lastNode));
25
+ }
26
+ lastNode = lastNode.branches.getBranch(state);
27
+ }
28
+ // last node is leaf-node
29
+ const lastState = (0, util_js_1.lastChar)(stateSet);
30
+ if (lastNode.branches.getBranch(lastState)) {
31
+ throw new Error('leafNode already exists, this should not happen');
32
+ }
33
+ lastNode.branches.setBranch(lastState, new leaf_node_js_1.LeafNode(stateSet.length, root, value, lastNode));
34
+ }
35
+ return root;
36
+ }
37
+ exports.createBddFromTruthTable = createBddFromTruthTable;
38
+ //# sourceMappingURL=create-bdd-from-truth-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-bdd-from-truth-table.js","sourceRoot":"","sources":["../../../src/create-bdd-from-truth-table.ts"],"names":[],"mappings":";;;AAAA,iDAA0C;AAC1C,uCAAqC;AACrC,yDAAkD;AAClD,iDAA0C;AAG1C,SAAgB,uBAAuB,CACnC,UAAsB;IAEtB,MAAM,IAAI,GAAG,IAAI,uBAAQ,EAAE,CAAC;IAE5B,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;IAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;KACtD;IAGD,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE;QACxC,IAAI,QAAQ,GAAgB,IAAI,CAAC;QAEjC,uCAAuC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,MAAM,KAAK,GAAkB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAkB,CAAC;YAEjE,sDAAsD;YACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;gBACrC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CACvB,KAAK,EACL,IAAI,+BAAY,CACZ,KAAK,EACL,IAAI,EACJ,QAAQ,CACX,CACJ,CAAC;aACL;YACD,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAgB,CAAC;SAChE;QAED,yBAAyB;QACzB,MAAM,SAAS,GAAG,IAAA,kBAAQ,EAAC,QAAQ,CAAkB,CAAC;QACtD,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACtE;QACD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CACvB,SAAS,EACT,IAAI,uBAAQ,CACR,QAAQ,CAAC,MAAM,EACf,IAAI,EACJ,KAAK,EACL,QAAQ,CACX,CACJ,CAAC;KACL;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AApDD,0DAoDC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNodesRecursive = exports.ensureCorrectBdd = void 0;
4
+ /**
5
+ * run some tests on the bdd
6
+ * to ensure everything is correct
7
+ */
8
+ function ensureCorrectBdd(bdd) {
9
+ const jsonString = JSON.stringify(bdd.toJSON(true));
10
+ let allNodes = [];
11
+ const nodesById = new Map();
12
+ bdd.getLevels().forEach(level => {
13
+ const levelNodes = bdd.getNodesOfLevel(level);
14
+ levelNodes.forEach(node => {
15
+ nodesById.set(node.id, node);
16
+ });
17
+ allNodes = allNodes.concat(levelNodes);
18
+ });
19
+ const recursiveNodes = getNodesRecursive(bdd);
20
+ if (allNodes.length !== recursiveNodes.size) {
21
+ const allNodesIds = allNodes.map(n => n.id).sort();
22
+ const recursiveNodesIds = Array.from(recursiveNodes).map(n => n.id).sort();
23
+ const nodesOnlyInRecursive = recursiveNodesIds.filter(id => !allNodesIds.includes(id));
24
+ // console.log(JSON.stringify(allNodes.map(n => n.id).sort(), null, 2));
25
+ // console.log(JSON.stringify(Array.from(recursiveNodes).map(n => n.id).sort(), null, 2));
26
+ if (recursiveNodes.size > allNodes.length) {
27
+ const firstId = nodesOnlyInRecursive[0];
28
+ const referenceToFirst = allNodes.find(n => {
29
+ if (n.isInternalNode()) {
30
+ return n.branches.hasNodeIdAsBranch(firstId);
31
+ }
32
+ return false;
33
+ });
34
+ console.log('referenceToFirst:');
35
+ referenceToFirst?.log();
36
+ }
37
+ throw new Error('ensureCorrectBdd() ' +
38
+ 'nodes in list not equal size to recursive nodes ' +
39
+ 'allNodes: ' + allNodes.length + ' ' +
40
+ 'recursiveNodes: ' + recursiveNodes.size + ' ' +
41
+ 'nodesOnlyInRecursive: ' + nodesOnlyInRecursive.join(', ') + ' ');
42
+ }
43
+ allNodes.forEach(node => {
44
+ if (node.isRootNode()) {
45
+ return;
46
+ }
47
+ const useNode = node;
48
+ if (node.deleted) {
49
+ throw new Error('ensureCorrectBdd() ' +
50
+ 'bdd includes a deleted node');
51
+ }
52
+ // each node should have a parent
53
+ if (useNode.parents.size === 0) {
54
+ throw new Error('ensureCorrectBdd() ' +
55
+ 'node has no parent ' + useNode.id);
56
+ }
57
+ if (useNode.isInternalNode()) {
58
+ const internalNode = useNode;
59
+ const bothBranches = internalNode.branches.getBothBranches();
60
+ // a node should not have 2 equal branches
61
+ if (internalNode.branches.areBranchesStrictEqual()) {
62
+ throw new Error('ensureCorrectBdd() ' +
63
+ 'node has two equal branches: ' +
64
+ bothBranches.map(n => n.id).join(', '));
65
+ }
66
+ // each branch should have the node as parent
67
+ bothBranches.forEach(branch => {
68
+ if (!branch.parents.has(internalNode)) {
69
+ throw new Error('ensureCorrectBdd() ' +
70
+ 'branch must have the node as parent');
71
+ }
72
+ });
73
+ }
74
+ // each parent should have the child as branch
75
+ useNode.parents.getAll().forEach(parent => {
76
+ if (!parent.branches.hasBranchAsNode(useNode)) {
77
+ throw new Error('ensureCorrectBdd() ' +
78
+ 'parent node does not have child as branch');
79
+ }
80
+ });
81
+ });
82
+ if (jsonString.includes('"deleted":true')) {
83
+ throw new Error('ensureCorrectBdd() ' +
84
+ 'bdd includes a deleted node');
85
+ }
86
+ }
87
+ exports.ensureCorrectBdd = ensureCorrectBdd;
88
+ function getNodesRecursive(node, set = new Set()) {
89
+ set.add(node);
90
+ if (!node.isLeafNode()) {
91
+ const useNode = node;
92
+ const branch1 = useNode.branches.getBranch('0');
93
+ set.add(branch1);
94
+ getNodesRecursive(branch1, set);
95
+ const branch2 = useNode.branches.getBranch('1');
96
+ set.add(branch2);
97
+ getNodesRecursive(branch2, set);
98
+ }
99
+ return set;
100
+ }
101
+ exports.getNodesRecursive = getNodesRecursive;
102
+ //# sourceMappingURL=ensure-correct-bdd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-correct-bdd.js","sourceRoot":"","sources":["../../../src/ensure-correct-bdd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fillTruthTable = void 0;
4
+ const util_js_1 = require("./util.js");
5
+ /**
6
+ * fills each missing row of a table
7
+ * with the given value
8
+ */
9
+ function fillTruthTable(truthTable, inputLength, value) {
10
+ const endInput = (0, util_js_1.maxBinaryWithLength)(inputLength);
11
+ let currentInput = (0, util_js_1.minBinaryWithLength)(inputLength);
12
+ let done = false;
13
+ while (!done) {
14
+ if (!truthTable.has(currentInput)) {
15
+ truthTable.set(currentInput, value);
16
+ }
17
+ if (currentInput === endInput) {
18
+ done = true;
19
+ }
20
+ else {
21
+ currentInput = (0, util_js_1.getNextStateSet)(currentInput);
22
+ }
23
+ }
24
+ }
25
+ exports.fillTruthTable = fillTruthTable;
26
+ //# sourceMappingURL=fill-truth-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill-truth-table.js","sourceRoot":"","sources":["../../../src/fill-truth-table.ts"],"names":[],"mappings":";;;AAAA,uCAImB;AAGnB;;;GAGG;AACH,SAAgB,cAAc,CAC1B,UAAsB,EACtB,WAAmB,EACnB,KAAa;IAEb,MAAM,QAAQ,GAAG,IAAA,6BAAmB,EAAC,WAAW,CAAC,CAAC;IAClD,IAAI,YAAY,GAAG,IAAA,6BAAmB,EAAC,WAAW,CAAC,CAAC;IACpD,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,OAAO,CAAC,IAAI,EAAE;QACV,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YAC/B,UAAU,CAAC,GAAG,CACV,YAAY,EACZ,KAAK,CACR,CAAC;SACL;QACD,IAAI,YAAY,KAAK,QAAQ,EAAE;YAC3B,IAAI,GAAG,IAAI,CAAC;SACf;aAAM;YACH,YAAY,GAAG,IAAA,yBAAe,EAC1B,YAAY,CACf,CAAC;SACL;KACJ;AACL,CAAC;AAvBD,wCAuBC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findSimilarNode = void 0;
4
+ /**
5
+ * find an simliar node in a list of nodes
6
+ * which is not exactly the same node
7
+ * @hotpath
8
+ */
9
+ function findSimilarNode(own, others) {
10
+ const ownString = own.toString();
11
+ for (let i = 0; i < others.length; i++) {
12
+ const other = others[i];
13
+ if (own !== other &&
14
+ !other.deleted &&
15
+ own.isEqualToOtherNode(other, ownString)) {
16
+ return other;
17
+ }
18
+ }
19
+ return null;
20
+ }
21
+ exports.findSimilarNode = findSimilarNode;
22
+ //# sourceMappingURL=find-similar-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-similar-node.js","sourceRoot":"","sources":["../../../src/find-similar-node.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,SAAgB,eAAe,CAC3B,GAAM,EACN,MAAW;IAEX,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IACI,GAAG,KAAK,KAAK;YACb,CAAC,KAAK,CAAC,OAAO;YACd,GAAG,CAAC,kBAAkB,CAClB,KAAY,EACZ,SAAS,CACZ,EACH;YACE,OAAO,KAAK,CAAC;SAChB;KACJ;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAnBD,0CAmBC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * because babel can only export on default-attribute,
3
+ * we use this for the non-module-build
4
+ * this ensures that users do not have to use
5
+ * var BroadcastChannel = require('broadcast-channel').default;
6
+ * but
7
+ * var BroadcastChannel = require('broadcast-channel');
8
+ */
9
+ export {};
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * because babel can only export on default-attribute,
4
+ * we use this for the non-module-build
5
+ * this ensures that users do not have to use
6
+ * var BroadcastChannel = require('broadcast-channel').default;
7
+ * but
8
+ * var BroadcastChannel = require('broadcast-channel');
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || function (mod) {
27
+ if (mod && mod.__esModule) return mod;
28
+ var result = {};
29
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
30
+ __setModuleDefault(result, mod);
31
+ return result;
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ const pkg = __importStar(require("./index.js"));
35
+ module.exports = pkg;
36
+ //# sourceMappingURL=index.es5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.es5.js","sourceRoot":"","sources":["../../../src/index.es5.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,gDAAkC;AAElC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./minimal-string/index.js"), exports);
18
+ __exportStar(require("./abstract-node.js"), exports);
19
+ __exportStar(require("./branches.js"), exports);
20
+ __exportStar(require("./create-bdd-from-truth-table.js"), exports);
21
+ __exportStar(require("./ensure-correct-bdd.js"), exports);
22
+ __exportStar(require("./fill-truth-table.js"), exports);
23
+ __exportStar(require("./find-similar-node.js"), exports);
24
+ __exportStar(require("./internal-node.js"), exports);
25
+ __exportStar(require("./leaf-node.js"), exports);
26
+ __exportStar(require("./optimize-brute-force.js"), exports);
27
+ __exportStar(require("./parents.js"), exports);
28
+ __exportStar(require("./root-node.js"), exports);
29
+ __exportStar(require("./util.js"), exports);
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,qDAAmC;AACnC,gDAA8B;AAC9B,mEAAiD;AACjD,0DAAwC;AACxC,wDAAsC;AACtC,yDAAuC;AACvC,qDAAmC;AACnC,iDAA+B;AAC/B,4DAA0C;AAC1C,+CAA6B;AAC7B,iDAA+B;AAC/B,4CAA0B"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InternalNode = void 0;
4
+ const branches_js_1 = require("./branches.js");
5
+ const parents_js_1 = require("./parents.js");
6
+ const abstract_node_js_1 = require("./abstract-node.js");
7
+ class InternalNode extends abstract_node_js_1.AbstractNode {
8
+ branches = new branches_js_1.Branches(this);
9
+ parents = new parents_js_1.Parents(this);
10
+ constructor(level, rootNode, parent) {
11
+ super(level, rootNode, 'InternalNode');
12
+ this.parents.add(parent);
13
+ }
14
+ /**
15
+ * by the reduction-rule of bdd,
16
+ * if both branches are equal,
17
+ * we can remove this node from the bdd
18
+ */
19
+ applyReductionRule() {
20
+ // console.log('applyReductionRule() ' + this.id);
21
+ if (this.branches.hasEqualBranches()) {
22
+ this.ensureNotDeleted('applyReductionRule');
23
+ const keepBranch = this.branches.getBranch('0');
24
+ // move own parents to keepBranch
25
+ const ownParents = this.parents.getAll();
26
+ ownParents.forEach(parent => {
27
+ // console.log('ownParent: ' + parent.id);
28
+ const branchKey = parent.branches.getKeyOfNode(this);
29
+ parent.branches.setBranch(branchKey, keepBranch);
30
+ // remove parents from own list
31
+ // this will auto-remove the connection to the other '1'-branch
32
+ this.parents.remove(parent);
33
+ // if parent has now two equal branches,
34
+ // we have to apply the reduction again
35
+ // to ensure we end in a valid state
36
+ if (parent.branches.areBranchesStrictEqual() && parent.isInternalNode()) {
37
+ parent.applyReductionRule();
38
+ }
39
+ });
40
+ return true;
41
+ }
42
+ return false;
43
+ }
44
+ }
45
+ exports.InternalNode = InternalNode;
46
+ //# sourceMappingURL=internal-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-node.js","sourceRoot":"","sources":["../../../src/internal-node.ts"],"names":[],"mappings":";;;AAAA,+CAAyC;AACzC,6CAAuC;AAEvC,yDAAkD;AAGlD,MAAa,YAAa,SAAQ,+BAAY;IACnC,QAAQ,GAAa,IAAI,sBAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,GAAG,IAAI,oBAAO,CAAC,IAAI,CAAC,CAAC;IAEnC,YACI,KAAa,EACb,QAAkB,EAClB,MAAmB;QAEnB,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAID;;;;OAIG;IACH,kBAAkB;QAEd,kDAAkD;QAElD,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE;YAClC,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAgB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAE7D,iCAAiC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACzC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBACxB,0CAA0C;gBAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACrD,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBAEjD,+BAA+B;gBAC/B,+DAA+D;gBAC/D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAE5B,wCAAwC;gBACxC,uCAAuC;gBACvC,oCAAoC;gBACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,sBAAsB,EAAE,IAAI,MAAM,CAAC,cAAc,EAAE,EAAE;oBACpE,MAAuB,CAAC,kBAAkB,EAAE,CAAC;iBACjD;YACL,CAAC,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;CAEJ;AApDD,oCAoDC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LeafNode = void 0;
4
+ const parents_js_1 = require("./parents.js");
5
+ const abstract_node_js_1 = require("./abstract-node.js");
6
+ const util_js_1 = require("./util.js");
7
+ class LeafNode extends abstract_node_js_1.AbstractNode {
8
+ value;
9
+ parents = new parents_js_1.Parents(this);
10
+ constructor(level, rootNode, value, parent) {
11
+ super(level, rootNode, 'LeafNode');
12
+ this.value = value;
13
+ this.parents.add(parent);
14
+ }
15
+ removeIfValueEquals(value) {
16
+ this.ensureNotDeleted();
17
+ if (this.value !== value) {
18
+ return false;
19
+ }
20
+ const parents = this.parents.getAll();
21
+ parents.forEach(parent => {
22
+ const branchKey = parent.branches.getKeyOfNode(this);
23
+ const otherBranch = parent.branches.getBranch((0, util_js_1.oppositeBoolean)(branchKey));
24
+ this.parents.remove(parent);
25
+ parent.branches.setBranch(branchKey, otherBranch);
26
+ if (parent.isInternalNode()) {
27
+ parent.applyReductionRule();
28
+ }
29
+ });
30
+ return true;
31
+ }
32
+ }
33
+ exports.LeafNode = LeafNode;
34
+ //# sourceMappingURL=leaf-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leaf-node.js","sourceRoot":"","sources":["../../../src/leaf-node.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AACvC,yDAAkD;AAGlD,uCAA4C;AAG5C,MAAa,QAAS,SAAQ,+BAAY;IAM3B;IALJ,OAAO,GAAG,IAAI,oBAAO,CAAC,IAAI,CAAC,CAAC;IAEnC,YACI,KAAa,EACb,QAAkB,EACX,KAAa,EACpB,MAAmB;QAEnB,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAH5B,UAAK,GAAL,KAAK,CAAQ;QAIpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,mBAAmB,CAAC,KAAa;QAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE;YACtB,OAAO,KAAK,CAAC;SAChB;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACrB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAA,yBAAe,EAAC,SAAS,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAClD,IAAI,MAAM,CAAC,cAAc,EAAE,EAAE;gBACxB,MAAuB,CAAC,kBAAkB,EAAE,CAAC;aACjD;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;CAGJ;AAnCD,4BAmCC"}