binary-decision-diagram 1.3.1 → 2.0.0
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.
- package/.github/workflows/main.yml +22 -0
- package/README.md +3 -2
- package/dist/es/abstract-node.d.ts +1 -1
- package/dist/es/abstract-node.js +45 -51
- package/dist/es/abstract-node.js.map +1 -1
- package/dist/es/branches.d.ts +1 -1
- package/dist/es/branches.js +20 -22
- package/dist/es/branches.js.map +1 -1
- package/dist/es/create-bdd-from-truth-table.d.ts +1 -1
- package/dist/es/create-bdd-from-truth-table.js +19 -57
- package/dist/es/create-bdd-from-truth-table.js.map +1 -1
- package/dist/es/ensure-correct-bdd.js +26 -27
- package/dist/es/ensure-correct-bdd.js.map +1 -1
- package/dist/es/fill-truth-table.d.ts +1 -1
- package/dist/es/fill-truth-table.js +3 -3
- package/dist/es/fill-truth-table.js.map +1 -1
- package/dist/es/find-similar-node.js +3 -3
- package/dist/es/find-similar-node.js.map +1 -1
- package/dist/es/index.d.ts +7 -1
- package/dist/es/index.js.map +1 -1
- package/dist/es/internal-node.d.ts +1 -1
- package/dist/es/internal-node.js +15 -33
- package/dist/es/internal-node.js.map +1 -1
- package/dist/es/leaf-node.d.ts +1 -1
- package/dist/es/leaf-node.js +14 -32
- package/dist/es/leaf-node.js.map +1 -1
- package/dist/es/minimal-string/bdd-to-minimal-string.js +15 -15
- package/dist/es/minimal-string/bdd-to-minimal-string.js.map +1 -1
- package/dist/es/minimal-string/bdd-to-simple-bdd.js +2 -2
- package/dist/es/minimal-string/bdd-to-simple-bdd.js.map +1 -1
- package/dist/es/minimal-string/minimal-string-to-simple-bdd.js +27 -27
- package/dist/es/minimal-string/minimal-string-to-simple-bdd.js.map +1 -1
- package/dist/es/minimal-string/resolve-with-simple-bdd.js +4 -4
- package/dist/es/minimal-string/resolve-with-simple-bdd.js.map +1 -1
- package/dist/es/minimal-string/string-format.js +7 -7
- package/dist/es/minimal-string/string-format.js.map +1 -1
- package/dist/es/optimize-brute-force.d.ts +5 -5
- package/dist/es/optimize-brute-force.js +88 -186
- package/dist/es/optimize-brute-force.js.map +1 -1
- package/dist/es/parents.d.ts +1 -1
- package/dist/es/parents.js +19 -47
- package/dist/es/parents.js.map +1 -1
- package/dist/es/root-node.d.ts +1 -1
- package/dist/es/root-node.js +79 -131
- package/dist/es/root-node.js.map +1 -1
- package/dist/es/types.d.ts +9 -9
- package/dist/es/types.js +1 -0
- package/dist/es/util.d.ts +1 -1
- package/dist/es/util.js +21 -39
- package/dist/es/util.js.map +1 -1
- package/dist/lib/abstract-node.d.ts +1 -1
- package/dist/lib/abstract-node.js +48 -56
- package/dist/lib/abstract-node.js.map +1 -1
- package/dist/lib/branches.d.ts +1 -1
- package/dist/lib/branches.js +21 -26
- package/dist/lib/branches.js.map +1 -1
- package/dist/lib/create-bdd-from-truth-table.d.ts +1 -1
- package/dist/lib/create-bdd-from-truth-table.js +24 -65
- package/dist/lib/create-bdd-from-truth-table.js.map +1 -1
- package/dist/lib/ensure-correct-bdd.js +27 -32
- package/dist/lib/ensure-correct-bdd.js.map +1 -1
- package/dist/lib/fill-truth-table.d.ts +1 -1
- package/dist/lib/fill-truth-table.js +6 -9
- package/dist/lib/fill-truth-table.js.map +1 -1
- package/dist/lib/find-similar-node.js +4 -7
- package/dist/lib/find-similar-node.js.map +1 -1
- package/dist/lib/index.d.ts +7 -1
- package/dist/lib/index.js +13 -18
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/internal-node.d.ts +1 -1
- package/dist/lib/internal-node.js +18 -38
- package/dist/lib/internal-node.js.map +1 -1
- package/dist/lib/leaf-node.d.ts +1 -1
- package/dist/lib/leaf-node.js +17 -37
- package/dist/lib/leaf-node.js.map +1 -1
- package/dist/lib/minimal-string/bdd-to-minimal-string.js +21 -25
- package/dist/lib/minimal-string/bdd-to-minimal-string.js.map +1 -1
- package/dist/lib/minimal-string/bdd-to-simple-bdd.js +4 -8
- package/dist/lib/minimal-string/bdd-to-simple-bdd.js.map +1 -1
- package/dist/lib/minimal-string/index.js +5 -10
- package/dist/lib/minimal-string/index.js.map +1 -1
- package/dist/lib/minimal-string/minimal-string-to-simple-bdd.js +30 -33
- package/dist/lib/minimal-string/minimal-string-to-simple-bdd.js.map +1 -1
- package/dist/lib/minimal-string/resolve-with-simple-bdd.js +6 -9
- package/dist/lib/minimal-string/resolve-with-simple-bdd.js.map +1 -1
- package/dist/lib/minimal-string/string-format.js +12 -18
- package/dist/lib/minimal-string/string-format.js.map +1 -1
- package/dist/lib/optimize-brute-force.d.ts +5 -5
- package/dist/lib/optimize-brute-force.js +93 -197
- package/dist/lib/optimize-brute-force.js.map +1 -1
- package/dist/lib/parents.d.ts +1 -1
- package/dist/lib/parents.js +19 -49
- package/dist/lib/parents.js.map +1 -1
- package/dist/lib/root-node.d.ts +1 -1
- package/dist/lib/root-node.js +84 -138
- package/dist/lib/root-node.js.map +1 -1
- package/dist/lib/types.d.ts +9 -9
- package/dist/lib/types.js +1 -2
- package/dist/lib/util.d.ts +1 -1
- package/dist/lib/util.js +36 -71
- package/dist/lib/util.js.map +1 -1
- package/package.json +16 -11
- package/renovate.json +3 -2
- package/src/abstract-node.ts +1 -1
- package/src/branches.ts +1 -2
- package/src/create-bdd-from-truth-table.ts +1 -1
- package/src/ensure-correct-bdd.ts +1 -1
- package/src/fill-truth-table.ts +1 -1
- package/src/index.ts +19 -1
- package/src/internal-node.ts +1 -1
- package/src/leaf-node.ts +1 -1
- package/src/optimize-brute-force.ts +1 -1
- package/src/parents.ts +1 -1
- package/src/root-node.ts +1 -1
- package/src/types.ts +1 -1
- package/src/util.ts +1 -1
- package/tsconfig.json +2 -2
- package/.travis.yml +0 -13
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var AbstractNode = /** @class */ (function () {
|
|
6
|
-
function AbstractNode(level, rootNode, type) {
|
|
1
|
+
import { nextNodeId } from './util';
|
|
2
|
+
import { findSimilarNode } from './find-similar-node';
|
|
3
|
+
export class AbstractNode {
|
|
4
|
+
constructor(level, rootNode, type) {
|
|
7
5
|
this.level = level;
|
|
8
|
-
this.id =
|
|
6
|
+
this.id = nextNodeId();
|
|
9
7
|
this.deleted = false;
|
|
10
8
|
this.type = type;
|
|
11
9
|
this.rootNode = rootNode;
|
|
@@ -13,26 +11,25 @@ var AbstractNode = /** @class */ (function () {
|
|
|
13
11
|
this.rootNode.addNode(this);
|
|
14
12
|
}
|
|
15
13
|
}
|
|
16
|
-
|
|
14
|
+
isEqualToOtherNode(otherNode,
|
|
17
15
|
// optimisation shortcut, is faster if own string already known
|
|
18
|
-
ownString) {
|
|
19
|
-
|
|
20
|
-
var ret = ownString === otherNode.toString();
|
|
16
|
+
ownString = this.toString()) {
|
|
17
|
+
const ret = ownString === otherNode.toString();
|
|
21
18
|
return ret;
|
|
22
|
-
}
|
|
19
|
+
}
|
|
23
20
|
// deletes the whole node
|
|
24
|
-
|
|
21
|
+
remove() {
|
|
25
22
|
this.ensureNotDeleted('remove');
|
|
26
23
|
// console.log('AbstractNode().remove() node: ' + this.id);
|
|
27
24
|
// console.log(this.toJSON(true));
|
|
28
25
|
if (this.isInternalNode()) {
|
|
29
|
-
|
|
26
|
+
const useNode = this;
|
|
30
27
|
if (useNode.parents.size > 0) {
|
|
31
28
|
throw new Error('cannot remove node with parents ' + this.id);
|
|
32
29
|
}
|
|
33
30
|
}
|
|
34
31
|
if (this.branches) {
|
|
35
|
-
|
|
32
|
+
const useNode = this;
|
|
36
33
|
if (useNode.branches.areBranchesStrictEqual()) {
|
|
37
34
|
useNode.branches.getBranch('0').parents.remove(useNode);
|
|
38
35
|
}
|
|
@@ -43,10 +40,9 @@ var AbstractNode = /** @class */ (function () {
|
|
|
43
40
|
}
|
|
44
41
|
this.deleted = true;
|
|
45
42
|
this.rootNode.removeNode(this);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
var ret = {
|
|
43
|
+
}
|
|
44
|
+
toJSON(withId = false) {
|
|
45
|
+
const ret = {
|
|
50
46
|
id: withId ? this.id : undefined,
|
|
51
47
|
deleted: withId ? this.deleted : undefined,
|
|
52
48
|
type: this.type,
|
|
@@ -59,22 +55,22 @@ var AbstractNode = /** @class */ (function () {
|
|
|
59
55
|
ret.value = this.asLeafNode().value;
|
|
60
56
|
}
|
|
61
57
|
if (this.branches && !this.branches.deleted) {
|
|
62
|
-
|
|
58
|
+
const branches = this.branches;
|
|
63
59
|
ret.branches = {
|
|
64
60
|
'0': branches.getBranch('0').toJSON(withId),
|
|
65
61
|
'1': branches.getBranch('1').toJSON(withId)
|
|
66
62
|
};
|
|
67
63
|
}
|
|
68
64
|
return ret;
|
|
69
|
-
}
|
|
65
|
+
}
|
|
70
66
|
// a strange string-representation
|
|
71
67
|
// to make an equal check between nodes
|
|
72
|
-
|
|
73
|
-
|
|
68
|
+
toString() {
|
|
69
|
+
let ret = '' +
|
|
74
70
|
'<' +
|
|
75
71
|
this.type + ':' + this.level;
|
|
76
72
|
if (this.branches) {
|
|
77
|
-
|
|
73
|
+
const branches = this.branches;
|
|
78
74
|
ret += '|0:' + branches.getBranch('0');
|
|
79
75
|
ret += '|1:' + branches.getBranch('1');
|
|
80
76
|
}
|
|
@@ -83,43 +79,42 @@ var AbstractNode = /** @class */ (function () {
|
|
|
83
79
|
}
|
|
84
80
|
ret += '>';
|
|
85
81
|
return ret;
|
|
86
|
-
}
|
|
87
|
-
|
|
82
|
+
}
|
|
83
|
+
isRootNode() {
|
|
88
84
|
return this.type === 'RootNode';
|
|
89
|
-
}
|
|
90
|
-
|
|
85
|
+
}
|
|
86
|
+
isInternalNode() {
|
|
91
87
|
return this.type === 'InternalNode';
|
|
92
|
-
}
|
|
93
|
-
|
|
88
|
+
}
|
|
89
|
+
isLeafNode() {
|
|
94
90
|
return this.type === 'LeafNode';
|
|
95
|
-
}
|
|
96
|
-
|
|
91
|
+
}
|
|
92
|
+
asRootNode() {
|
|
97
93
|
if (!this.isRootNode()) {
|
|
98
94
|
throw new Error('ouch');
|
|
99
95
|
}
|
|
100
96
|
return this;
|
|
101
|
-
}
|
|
102
|
-
|
|
97
|
+
}
|
|
98
|
+
asInternalNode() {
|
|
103
99
|
if (!this.isInternalNode()) {
|
|
104
100
|
throw new Error('ouch');
|
|
105
101
|
}
|
|
106
102
|
return this;
|
|
107
|
-
}
|
|
108
|
-
|
|
103
|
+
}
|
|
104
|
+
asLeafNode() {
|
|
109
105
|
if (!this.isLeafNode()) {
|
|
110
106
|
throw new Error('ouch');
|
|
111
107
|
}
|
|
112
108
|
return this;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (op === void 0) { op = 'unknown'; }
|
|
109
|
+
}
|
|
110
|
+
ensureNotDeleted(op = 'unknown') {
|
|
116
111
|
if (this.deleted) {
|
|
117
112
|
throw new Error('forbidden operation ' + op + ' on deleted node ' + this.id);
|
|
118
113
|
}
|
|
119
|
-
}
|
|
120
|
-
|
|
114
|
+
}
|
|
115
|
+
log() {
|
|
121
116
|
console.log(JSON.stringify(this.toJSON(true), null, 2));
|
|
122
|
-
}
|
|
117
|
+
}
|
|
123
118
|
/**
|
|
124
119
|
* by the elimination-rule of bdd,
|
|
125
120
|
* if two branches of the same level are equal,
|
|
@@ -128,35 +123,34 @@ var AbstractNode = /** @class */ (function () {
|
|
|
128
123
|
* See page 21 at:
|
|
129
124
|
* @link https://people.eecs.berkeley.edu/~sseshia/219c/lectures/BinaryDecisionDiagrams.pdf
|
|
130
125
|
*/
|
|
131
|
-
|
|
126
|
+
applyEliminationRule(
|
|
132
127
|
// can be provided for better performance
|
|
133
128
|
nodesOfSameLevel) {
|
|
134
|
-
var _this = this;
|
|
135
129
|
this.ensureNotDeleted('applyEliminationRule');
|
|
136
130
|
if (!nodesOfSameLevel) {
|
|
137
131
|
nodesOfSameLevel = this.rootNode.getNodesOfLevel(this.level);
|
|
138
132
|
}
|
|
139
|
-
|
|
133
|
+
const other = findSimilarNode(this, nodesOfSameLevel);
|
|
140
134
|
if (other) {
|
|
141
135
|
// console.log('applyEliminationRule() remove:' + this.id + '; other: ' + other.id);
|
|
142
136
|
// keep 'other', remove 'this'
|
|
143
137
|
// move own parents to other
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
ownParents.forEach(
|
|
138
|
+
const ownParents = this.parents.getAll();
|
|
139
|
+
const parentsWithStrictEqualBranches = [];
|
|
140
|
+
ownParents.forEach((parent) => {
|
|
147
141
|
// console.log('ownParent: ' + parent.id);
|
|
148
|
-
|
|
142
|
+
const branchKey = parent.branches.getKeyOfNode(this);
|
|
149
143
|
// console.log('branchKey: ' + branchKey);
|
|
150
144
|
parent.branches.setBranch(branchKey, other);
|
|
151
145
|
if (parent.branches.areBranchesStrictEqual()) {
|
|
152
|
-
|
|
146
|
+
parentsWithStrictEqualBranches.push(parent);
|
|
153
147
|
}
|
|
154
148
|
// remove parents from own list
|
|
155
149
|
// this will auto-remove the connection to the other '1'-branch
|
|
156
|
-
|
|
150
|
+
this.parents.remove(parent);
|
|
157
151
|
});
|
|
158
152
|
// parents that now have equal branches, must be removed again
|
|
159
|
-
|
|
153
|
+
parentsWithStrictEqualBranches.forEach(node => {
|
|
160
154
|
if (node.isInternalNode()) {
|
|
161
155
|
// console.log('trigger applyReductionRule from applyEliminationRule');
|
|
162
156
|
node.applyReductionRule();
|
|
@@ -167,8 +161,6 @@ var AbstractNode = /** @class */ (function () {
|
|
|
167
161
|
else {
|
|
168
162
|
return false;
|
|
169
163
|
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
}());
|
|
173
|
-
exports.AbstractNode = AbstractNode;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
174
166
|
//# sourceMappingURL=abstract-node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-node.js","sourceRoot":"","sources":["../../src/abstract-node.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"abstract-node.js","sourceRoot":"","sources":["../../src/abstract-node.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/branches.d.ts
CHANGED
package/dist/lib/branches.js
CHANGED
|
@@ -1,24 +1,22 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
1
|
/**
|
|
4
2
|
* represents the branches of a single node
|
|
5
3
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
export class Branches {
|
|
5
|
+
constructor(node) {
|
|
8
6
|
this.node = node;
|
|
9
7
|
this.deleted = false;
|
|
10
8
|
this.branches = {};
|
|
11
9
|
}
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
setBranch(which, branchNode) {
|
|
11
|
+
const previous = this.branches[which];
|
|
14
12
|
if (previous === branchNode) {
|
|
15
13
|
return;
|
|
16
14
|
}
|
|
17
15
|
// set new branch
|
|
18
16
|
this.branches[which] = branchNode;
|
|
19
17
|
branchNode.parents.add(this.node);
|
|
20
|
-
}
|
|
21
|
-
|
|
18
|
+
}
|
|
19
|
+
getKeyOfNode(node) {
|
|
22
20
|
if (this.getBranch('0') === node) {
|
|
23
21
|
return '0';
|
|
24
22
|
}
|
|
@@ -28,17 +26,17 @@ var Branches = /** @class */ (function () {
|
|
|
28
26
|
else {
|
|
29
27
|
throw new Error('none matched');
|
|
30
28
|
}
|
|
31
|
-
}
|
|
32
|
-
|
|
29
|
+
}
|
|
30
|
+
getBranch(which) {
|
|
33
31
|
return this.branches[which];
|
|
34
|
-
}
|
|
35
|
-
|
|
32
|
+
}
|
|
33
|
+
getBothBranches() {
|
|
36
34
|
return [
|
|
37
35
|
this.getBranch('0'),
|
|
38
36
|
this.getBranch('1')
|
|
39
37
|
];
|
|
40
|
-
}
|
|
41
|
-
|
|
38
|
+
}
|
|
39
|
+
hasBranchAsNode(node) {
|
|
42
40
|
if (this.getBranch('0') === node ||
|
|
43
41
|
this.getBranch('1') === node) {
|
|
44
42
|
return true;
|
|
@@ -46,8 +44,8 @@ var Branches = /** @class */ (function () {
|
|
|
46
44
|
else {
|
|
47
45
|
return false;
|
|
48
46
|
}
|
|
49
|
-
}
|
|
50
|
-
|
|
47
|
+
}
|
|
48
|
+
hasNodeIdAsBranch(id) {
|
|
51
49
|
if (this.getBranch('0').id === id ||
|
|
52
50
|
this.getBranch('1').id === id) {
|
|
53
51
|
return true;
|
|
@@ -55,21 +53,18 @@ var Branches = /** @class */ (function () {
|
|
|
55
53
|
else {
|
|
56
54
|
return false;
|
|
57
55
|
}
|
|
58
|
-
}
|
|
59
|
-
|
|
56
|
+
}
|
|
57
|
+
areBranchesStrictEqual() {
|
|
60
58
|
return this.branches['0'] === this.branches['1'];
|
|
61
|
-
}
|
|
62
|
-
|
|
59
|
+
}
|
|
60
|
+
hasEqualBranches() {
|
|
63
61
|
return JSON.stringify(this.branches['0']) ===
|
|
64
62
|
JSON.stringify(this.branches['1']);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
exports.Branches = Branches;
|
|
69
|
-
function ensureNodesNotStrictEqual(node1, node2) {
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function ensureNodesNotStrictEqual(node1, node2) {
|
|
70
66
|
if (node1 === node2) {
|
|
71
67
|
throw new Error('cannot have two strict equal branches');
|
|
72
68
|
}
|
|
73
69
|
}
|
|
74
|
-
exports.ensureNodesNotStrictEqual = ensureNodesNotStrictEqual;
|
|
75
70
|
//# sourceMappingURL=branches.js.map
|
package/dist/lib/branches.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branches.js","sourceRoot":"","sources":["../../src/branches.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"branches.js","sourceRoot":"","sources":["../../src/branches.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,QAAQ;IAMjB,YACY,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;QANtB,YAAO,GAAY,KAAK,CAAC;QACxB,aAAQ,GAEZ,EAAS,CAAC;IAIV,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;AAED,MAAM,UAAU,yBAAyB,CACrC,KAAkB,EAClB,KAAkB;IAElB,IAAI,KAAK,KAAK,KAAK,EAAE;QACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;KAC5D;AACL,CAAC"}
|
|
@@ -1,75 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
};
|
|
11
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
12
|
-
};
|
|
13
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
-
if (!m) return o;
|
|
16
|
-
var i = m.call(o), r, ar = [], e;
|
|
17
|
-
try {
|
|
18
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
-
}
|
|
20
|
-
catch (error) { e = { error: error }; }
|
|
21
|
-
finally {
|
|
22
|
-
try {
|
|
23
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
-
}
|
|
25
|
-
finally { if (e) throw e.error; }
|
|
26
|
-
}
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
var root_node_1 = require("./root-node");
|
|
31
|
-
var util_1 = require("./util");
|
|
32
|
-
var internal_node_1 = require("./internal-node");
|
|
33
|
-
var leaf_node_1 = require("./leaf-node");
|
|
34
|
-
function createBddFromTruthTable(truthTable) {
|
|
35
|
-
var e_1, _a;
|
|
36
|
-
var root = new root_node_1.RootNode();
|
|
37
|
-
var firstKey = truthTable.keys().next().value;
|
|
38
|
-
var keyLength = firstKey.length;
|
|
39
|
-
var mustBeSize = Math.pow(2, keyLength);
|
|
1
|
+
import { RootNode } from './root-node';
|
|
2
|
+
import { lastChar } from './util';
|
|
3
|
+
import { InternalNode } from './internal-node';
|
|
4
|
+
import { LeafNode } from './leaf-node';
|
|
5
|
+
export function createBddFromTruthTable(truthTable) {
|
|
6
|
+
const root = new RootNode();
|
|
7
|
+
const firstKey = truthTable.keys().next().value;
|
|
8
|
+
const keyLength = firstKey.length;
|
|
9
|
+
const mustBeSize = Math.pow(2, keyLength);
|
|
40
10
|
if (truthTable.size !== mustBeSize) {
|
|
41
11
|
throw new Error('truth table has missing entries');
|
|
42
12
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (!lastNode.branches.getBranch(state)) {
|
|
53
|
-
lastNode.branches.setBranch(state, new internal_node_1.InternalNode(level, root, lastNode));
|
|
54
|
-
}
|
|
55
|
-
lastNode = lastNode.branches.getBranch(state);
|
|
56
|
-
}
|
|
57
|
-
// last node is leaf-node
|
|
58
|
-
var lastState = util_1.lastChar(stateSet);
|
|
59
|
-
if (lastNode.branches.getBranch(lastState)) {
|
|
60
|
-
throw new Error('leafNode already exists, this should not happen');
|
|
13
|
+
for (const [stateSet, value] of truthTable) {
|
|
14
|
+
let lastNode = root;
|
|
15
|
+
// itterate over each char of the state
|
|
16
|
+
for (let i = 0; i < (stateSet.length - 1); i++) {
|
|
17
|
+
const level = i + 1;
|
|
18
|
+
const state = stateSet.charAt(i);
|
|
19
|
+
// if node for this state-char not exists, add new one
|
|
20
|
+
if (!lastNode.branches.getBranch(state)) {
|
|
21
|
+
lastNode.branches.setBranch(state, new InternalNode(level, root, lastNode));
|
|
61
22
|
}
|
|
62
|
-
lastNode.branches.
|
|
23
|
+
lastNode = lastNode.branches.getBranch(state);
|
|
63
24
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (truthTable_1_1 && !truthTable_1_1.done && (_a = truthTable_1.return)) _a.call(truthTable_1);
|
|
25
|
+
// last node is leaf-node
|
|
26
|
+
const lastState = lastChar(stateSet);
|
|
27
|
+
if (lastNode.branches.getBranch(lastState)) {
|
|
28
|
+
throw new Error('leafNode already exists, this should not happen');
|
|
69
29
|
}
|
|
70
|
-
|
|
30
|
+
lastNode.branches.setBranch(lastState, new LeafNode(stateSet.length, root, value, lastNode));
|
|
71
31
|
}
|
|
72
32
|
return root;
|
|
73
33
|
}
|
|
74
|
-
exports.createBddFromTruthTable = createBddFromTruthTable;
|
|
75
34
|
//# sourceMappingURL=create-bdd-from-truth-table.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-bdd-from-truth-table.js","sourceRoot":"","sources":["../../src/create-bdd-from-truth-table.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-bdd-from-truth-table.js","sourceRoot":"","sources":["../../src/create-bdd-from-truth-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,UAAU,uBAAuB,CACnC,UAAsB;IAEtB,MAAM,IAAI,GAAG,IAAI,QAAQ,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,YAAY,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,QAAQ,CAAC,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,QAAQ,CACR,QAAQ,CAAC,MAAM,EACf,IAAI,EACJ,KAAK,EACL,QAAQ,CACX,CACJ,CAAC;KACL;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -1,32 +1,30 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
1
|
/**
|
|
4
2
|
* run some tests on the bdd
|
|
5
3
|
* to ensure everything is correct
|
|
6
4
|
*/
|
|
7
|
-
function ensureCorrectBdd(bdd) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
bdd.getLevels().forEach(
|
|
12
|
-
|
|
13
|
-
levelNodes.forEach(
|
|
5
|
+
export function ensureCorrectBdd(bdd) {
|
|
6
|
+
const jsonString = JSON.stringify(bdd.toJSON(true));
|
|
7
|
+
let allNodes = [];
|
|
8
|
+
const nodesById = new Map();
|
|
9
|
+
bdd.getLevels().forEach(level => {
|
|
10
|
+
const levelNodes = bdd.getNodesOfLevel(level);
|
|
11
|
+
levelNodes.forEach(node => {
|
|
14
12
|
nodesById.set(node.id, node);
|
|
15
13
|
});
|
|
16
14
|
allNodes = allNodes.concat(levelNodes);
|
|
17
15
|
});
|
|
18
|
-
|
|
16
|
+
const recursiveNodes = getNodesRecursive(bdd);
|
|
19
17
|
if (allNodes.length !== recursiveNodes.size) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
const allNodesIds = allNodes.map(n => n.id).sort();
|
|
19
|
+
const recursiveNodesIds = Array.from(recursiveNodes).map(n => n.id).sort();
|
|
20
|
+
const nodesOnlyInRecursive = recursiveNodesIds.filter(id => !allNodesIds.includes(id));
|
|
23
21
|
// console.log(JSON.stringify(allNodes.map(n => n.id).sort(), null, 2));
|
|
24
22
|
// console.log(JSON.stringify(Array.from(recursiveNodes).map(n => n.id).sort(), null, 2));
|
|
25
23
|
if (recursiveNodes.size > allNodes.length) {
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
const firstId = nodesOnlyInRecursive[0];
|
|
25
|
+
const referenceToFirst = allNodes.find(n => {
|
|
28
26
|
if (n.isInternalNode()) {
|
|
29
|
-
return n.branches.hasNodeIdAsBranch(
|
|
27
|
+
return n.branches.hasNodeIdAsBranch(firstId);
|
|
30
28
|
}
|
|
31
29
|
return false;
|
|
32
30
|
});
|
|
@@ -39,11 +37,11 @@ function ensureCorrectBdd(bdd) {
|
|
|
39
37
|
'recursiveNodes: ' + recursiveNodes.size + ' ' +
|
|
40
38
|
'nodesOnlyInRecursive: ' + nodesOnlyInRecursive.join(', ') + ' ');
|
|
41
39
|
}
|
|
42
|
-
allNodes.forEach(
|
|
40
|
+
allNodes.forEach(node => {
|
|
43
41
|
if (node.isRootNode()) {
|
|
44
42
|
return;
|
|
45
43
|
}
|
|
46
|
-
|
|
44
|
+
const useNode = node;
|
|
47
45
|
if (node.deleted) {
|
|
48
46
|
throw new Error('ensureCorrectBdd() ' +
|
|
49
47
|
'bdd includes a deleted node');
|
|
@@ -54,24 +52,24 @@ function ensureCorrectBdd(bdd) {
|
|
|
54
52
|
'node has no parent ' + useNode.id);
|
|
55
53
|
}
|
|
56
54
|
if (useNode.isInternalNode()) {
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
const internalNode = useNode;
|
|
56
|
+
const bothBranches = internalNode.branches.getBothBranches();
|
|
59
57
|
// a node should not have 2 equal branches
|
|
60
|
-
if (
|
|
58
|
+
if (internalNode.branches.areBranchesStrictEqual()) {
|
|
61
59
|
throw new Error('ensureCorrectBdd() ' +
|
|
62
60
|
'node has two equal branches: ' +
|
|
63
|
-
bothBranches.map(
|
|
61
|
+
bothBranches.map(n => n.id).join(', '));
|
|
64
62
|
}
|
|
65
63
|
// each branch should have the node as parent
|
|
66
|
-
bothBranches.forEach(
|
|
67
|
-
if (!branch.parents.has(
|
|
64
|
+
bothBranches.forEach(branch => {
|
|
65
|
+
if (!branch.parents.has(internalNode)) {
|
|
68
66
|
throw new Error('ensureCorrectBdd() ' +
|
|
69
67
|
'branch must have the node as parent');
|
|
70
68
|
}
|
|
71
69
|
});
|
|
72
70
|
}
|
|
73
71
|
// each parent should have the child as branch
|
|
74
|
-
useNode.parents.getAll().forEach(
|
|
72
|
+
useNode.parents.getAll().forEach(parent => {
|
|
75
73
|
if (!parent.branches.hasBranchAsNode(useNode)) {
|
|
76
74
|
throw new Error('ensureCorrectBdd() ' +
|
|
77
75
|
'parent node does not have child as branch');
|
|
@@ -83,20 +81,17 @@ function ensureCorrectBdd(bdd) {
|
|
|
83
81
|
'bdd includes a deleted node');
|
|
84
82
|
}
|
|
85
83
|
}
|
|
86
|
-
|
|
87
|
-
function getNodesRecursive(node, set) {
|
|
88
|
-
if (set === void 0) { set = new Set(); }
|
|
84
|
+
export function getNodesRecursive(node, set = new Set()) {
|
|
89
85
|
set.add(node);
|
|
90
86
|
if (!node.isLeafNode()) {
|
|
91
|
-
|
|
92
|
-
|
|
87
|
+
const useNode = node;
|
|
88
|
+
const branch1 = useNode.branches.getBranch('0');
|
|
93
89
|
set.add(branch1);
|
|
94
90
|
getNodesRecursive(branch1, set);
|
|
95
|
-
|
|
91
|
+
const branch2 = useNode.branches.getBranch('1');
|
|
96
92
|
set.add(branch2);
|
|
97
93
|
getNodesRecursive(branch2, set);
|
|
98
94
|
}
|
|
99
95
|
return set;
|
|
100
96
|
}
|
|
101
|
-
exports.getNodesRecursive = getNodesRecursive;
|
|
102
97
|
//# sourceMappingURL=ensure-correct-bdd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-correct-bdd.js","sourceRoot":"","sources":["../../src/ensure-correct-bdd.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ensure-correct-bdd.js","sourceRoot":"","sources":["../../src/ensure-correct-bdd.ts"],"names":[],"mappings":"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"}
|