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
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [ master ]
|
|
5
|
+
pull_request:
|
|
6
|
+
branches: [ master ]
|
|
7
|
+
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v3
|
|
15
|
+
- name: Use Node.js
|
|
16
|
+
uses: actions/setup-node@v3
|
|
17
|
+
with:
|
|
18
|
+
node-version: 16.10.0
|
|
19
|
+
- run: npm install
|
|
20
|
+
- run: npm run build
|
|
21
|
+
- run: npm run test
|
|
22
|
+
- run: npm run lint
|
package/README.md
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# binary decision diagram
|
|
2
2
|
|
|
3
|
-
A library to create
|
|
3
|
+
A library to **create**, **minimize** and **optimize** binary decision diagrams in JavaScript.
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
A binary decision diagram is a data structure that represents a set of boolean function in an efficient way. To learn more about it, follow these links:
|
|
7
8
|
|
|
8
9
|
- [Introduction on BDDs](https://web.archive.org/web/20110304135553/http://configit.com/fileadmin/Configit/Documents/bdd-eap.pdf)
|
|
9
10
|
- [Presentation on BDDs](https://de.slideshare.net/RajeshYadav49/reduced-ordered-binary-decision-diagram-devi)
|
package/dist/es/abstract-node.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { nextNodeId } from './util';
|
|
2
2
|
import { findSimilarNode } from './find-similar-node';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
export class AbstractNode {
|
|
4
|
+
constructor(level, rootNode, type) {
|
|
5
5
|
this.level = level;
|
|
6
6
|
this.id = nextNodeId();
|
|
7
7
|
this.deleted = false;
|
|
@@ -11,26 +11,25 @@ var AbstractNode = /** @class */ (function () {
|
|
|
11
11
|
this.rootNode.addNode(this);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
isEqualToOtherNode(otherNode,
|
|
15
15
|
// optimisation shortcut, is faster if own string already known
|
|
16
|
-
ownString) {
|
|
17
|
-
|
|
18
|
-
var ret = ownString === otherNode.toString();
|
|
16
|
+
ownString = this.toString()) {
|
|
17
|
+
const ret = ownString === otherNode.toString();
|
|
19
18
|
return ret;
|
|
20
|
-
}
|
|
19
|
+
}
|
|
21
20
|
// deletes the whole node
|
|
22
|
-
|
|
21
|
+
remove() {
|
|
23
22
|
this.ensureNotDeleted('remove');
|
|
24
23
|
// console.log('AbstractNode().remove() node: ' + this.id);
|
|
25
24
|
// console.log(this.toJSON(true));
|
|
26
25
|
if (this.isInternalNode()) {
|
|
27
|
-
|
|
26
|
+
const useNode = this;
|
|
28
27
|
if (useNode.parents.size > 0) {
|
|
29
28
|
throw new Error('cannot remove node with parents ' + this.id);
|
|
30
29
|
}
|
|
31
30
|
}
|
|
32
31
|
if (this.branches) {
|
|
33
|
-
|
|
32
|
+
const useNode = this;
|
|
34
33
|
if (useNode.branches.areBranchesStrictEqual()) {
|
|
35
34
|
useNode.branches.getBranch('0').parents.remove(useNode);
|
|
36
35
|
}
|
|
@@ -41,10 +40,9 @@ var AbstractNode = /** @class */ (function () {
|
|
|
41
40
|
}
|
|
42
41
|
this.deleted = true;
|
|
43
42
|
this.rootNode.removeNode(this);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
var ret = {
|
|
43
|
+
}
|
|
44
|
+
toJSON(withId = false) {
|
|
45
|
+
const ret = {
|
|
48
46
|
id: withId ? this.id : undefined,
|
|
49
47
|
deleted: withId ? this.deleted : undefined,
|
|
50
48
|
type: this.type,
|
|
@@ -57,22 +55,22 @@ var AbstractNode = /** @class */ (function () {
|
|
|
57
55
|
ret.value = this.asLeafNode().value;
|
|
58
56
|
}
|
|
59
57
|
if (this.branches && !this.branches.deleted) {
|
|
60
|
-
|
|
58
|
+
const branches = this.branches;
|
|
61
59
|
ret.branches = {
|
|
62
60
|
'0': branches.getBranch('0').toJSON(withId),
|
|
63
61
|
'1': branches.getBranch('1').toJSON(withId)
|
|
64
62
|
};
|
|
65
63
|
}
|
|
66
64
|
return ret;
|
|
67
|
-
}
|
|
65
|
+
}
|
|
68
66
|
// a strange string-representation
|
|
69
67
|
// to make an equal check between nodes
|
|
70
|
-
|
|
71
|
-
|
|
68
|
+
toString() {
|
|
69
|
+
let ret = '' +
|
|
72
70
|
'<' +
|
|
73
71
|
this.type + ':' + this.level;
|
|
74
72
|
if (this.branches) {
|
|
75
|
-
|
|
73
|
+
const branches = this.branches;
|
|
76
74
|
ret += '|0:' + branches.getBranch('0');
|
|
77
75
|
ret += '|1:' + branches.getBranch('1');
|
|
78
76
|
}
|
|
@@ -81,43 +79,42 @@ var AbstractNode = /** @class */ (function () {
|
|
|
81
79
|
}
|
|
82
80
|
ret += '>';
|
|
83
81
|
return ret;
|
|
84
|
-
}
|
|
85
|
-
|
|
82
|
+
}
|
|
83
|
+
isRootNode() {
|
|
86
84
|
return this.type === 'RootNode';
|
|
87
|
-
}
|
|
88
|
-
|
|
85
|
+
}
|
|
86
|
+
isInternalNode() {
|
|
89
87
|
return this.type === 'InternalNode';
|
|
90
|
-
}
|
|
91
|
-
|
|
88
|
+
}
|
|
89
|
+
isLeafNode() {
|
|
92
90
|
return this.type === 'LeafNode';
|
|
93
|
-
}
|
|
94
|
-
|
|
91
|
+
}
|
|
92
|
+
asRootNode() {
|
|
95
93
|
if (!this.isRootNode()) {
|
|
96
94
|
throw new Error('ouch');
|
|
97
95
|
}
|
|
98
96
|
return this;
|
|
99
|
-
}
|
|
100
|
-
|
|
97
|
+
}
|
|
98
|
+
asInternalNode() {
|
|
101
99
|
if (!this.isInternalNode()) {
|
|
102
100
|
throw new Error('ouch');
|
|
103
101
|
}
|
|
104
102
|
return this;
|
|
105
|
-
}
|
|
106
|
-
|
|
103
|
+
}
|
|
104
|
+
asLeafNode() {
|
|
107
105
|
if (!this.isLeafNode()) {
|
|
108
106
|
throw new Error('ouch');
|
|
109
107
|
}
|
|
110
108
|
return this;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (op === void 0) { op = 'unknown'; }
|
|
109
|
+
}
|
|
110
|
+
ensureNotDeleted(op = 'unknown') {
|
|
114
111
|
if (this.deleted) {
|
|
115
112
|
throw new Error('forbidden operation ' + op + ' on deleted node ' + this.id);
|
|
116
113
|
}
|
|
117
|
-
}
|
|
118
|
-
|
|
114
|
+
}
|
|
115
|
+
log() {
|
|
119
116
|
console.log(JSON.stringify(this.toJSON(true), null, 2));
|
|
120
|
-
}
|
|
117
|
+
}
|
|
121
118
|
/**
|
|
122
119
|
* by the elimination-rule of bdd,
|
|
123
120
|
* if two branches of the same level are equal,
|
|
@@ -126,35 +123,34 @@ var AbstractNode = /** @class */ (function () {
|
|
|
126
123
|
* See page 21 at:
|
|
127
124
|
* @link https://people.eecs.berkeley.edu/~sseshia/219c/lectures/BinaryDecisionDiagrams.pdf
|
|
128
125
|
*/
|
|
129
|
-
|
|
126
|
+
applyEliminationRule(
|
|
130
127
|
// can be provided for better performance
|
|
131
128
|
nodesOfSameLevel) {
|
|
132
|
-
var _this = this;
|
|
133
129
|
this.ensureNotDeleted('applyEliminationRule');
|
|
134
130
|
if (!nodesOfSameLevel) {
|
|
135
131
|
nodesOfSameLevel = this.rootNode.getNodesOfLevel(this.level);
|
|
136
132
|
}
|
|
137
|
-
|
|
133
|
+
const other = findSimilarNode(this, nodesOfSameLevel);
|
|
138
134
|
if (other) {
|
|
139
135
|
// console.log('applyEliminationRule() remove:' + this.id + '; other: ' + other.id);
|
|
140
136
|
// keep 'other', remove 'this'
|
|
141
137
|
// move own parents to other
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
ownParents.forEach(
|
|
138
|
+
const ownParents = this.parents.getAll();
|
|
139
|
+
const parentsWithStrictEqualBranches = [];
|
|
140
|
+
ownParents.forEach((parent) => {
|
|
145
141
|
// console.log('ownParent: ' + parent.id);
|
|
146
|
-
|
|
142
|
+
const branchKey = parent.branches.getKeyOfNode(this);
|
|
147
143
|
// console.log('branchKey: ' + branchKey);
|
|
148
144
|
parent.branches.setBranch(branchKey, other);
|
|
149
145
|
if (parent.branches.areBranchesStrictEqual()) {
|
|
150
|
-
|
|
146
|
+
parentsWithStrictEqualBranches.push(parent);
|
|
151
147
|
}
|
|
152
148
|
// remove parents from own list
|
|
153
149
|
// this will auto-remove the connection to the other '1'-branch
|
|
154
|
-
|
|
150
|
+
this.parents.remove(parent);
|
|
155
151
|
});
|
|
156
152
|
// parents that now have equal branches, must be removed again
|
|
157
|
-
|
|
153
|
+
parentsWithStrictEqualBranches.forEach(node => {
|
|
158
154
|
if (node.isInternalNode()) {
|
|
159
155
|
// console.log('trigger applyReductionRule from applyEliminationRule');
|
|
160
156
|
node.applyReductionRule();
|
|
@@ -165,8 +161,6 @@ var AbstractNode = /** @class */ (function () {
|
|
|
165
161
|
else {
|
|
166
162
|
return false;
|
|
167
163
|
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
}());
|
|
171
|
-
export { AbstractNode };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
172
166
|
//# sourceMappingURL=abstract-node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-node.js","sourceRoot":"","sources":["../../src/abstract-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAMpC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;
|
|
1
|
+
{"version":3,"file":"abstract-node.js","sourceRoot":"","sources":["../../src/abstract-node.ts"],"names":[],"mappings":"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"}
|
package/dist/es/branches.d.ts
CHANGED
package/dist/es/branches.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* represents the branches of a single node
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
export class Branches {
|
|
5
|
+
constructor(node) {
|
|
6
6
|
this.node = node;
|
|
7
7
|
this.deleted = false;
|
|
8
8
|
this.branches = {};
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
setBranch(which, branchNode) {
|
|
11
|
+
const previous = this.branches[which];
|
|
12
12
|
if (previous === branchNode) {
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
15
|
// set new branch
|
|
16
16
|
this.branches[which] = branchNode;
|
|
17
17
|
branchNode.parents.add(this.node);
|
|
18
|
-
}
|
|
19
|
-
|
|
18
|
+
}
|
|
19
|
+
getKeyOfNode(node) {
|
|
20
20
|
if (this.getBranch('0') === node) {
|
|
21
21
|
return '0';
|
|
22
22
|
}
|
|
@@ -26,17 +26,17 @@ var Branches = /** @class */ (function () {
|
|
|
26
26
|
else {
|
|
27
27
|
throw new Error('none matched');
|
|
28
28
|
}
|
|
29
|
-
}
|
|
30
|
-
|
|
29
|
+
}
|
|
30
|
+
getBranch(which) {
|
|
31
31
|
return this.branches[which];
|
|
32
|
-
}
|
|
33
|
-
|
|
32
|
+
}
|
|
33
|
+
getBothBranches() {
|
|
34
34
|
return [
|
|
35
35
|
this.getBranch('0'),
|
|
36
36
|
this.getBranch('1')
|
|
37
37
|
];
|
|
38
|
-
}
|
|
39
|
-
|
|
38
|
+
}
|
|
39
|
+
hasBranchAsNode(node) {
|
|
40
40
|
if (this.getBranch('0') === node ||
|
|
41
41
|
this.getBranch('1') === node) {
|
|
42
42
|
return true;
|
|
@@ -44,8 +44,8 @@ var Branches = /** @class */ (function () {
|
|
|
44
44
|
else {
|
|
45
45
|
return false;
|
|
46
46
|
}
|
|
47
|
-
}
|
|
48
|
-
|
|
47
|
+
}
|
|
48
|
+
hasNodeIdAsBranch(id) {
|
|
49
49
|
if (this.getBranch('0').id === id ||
|
|
50
50
|
this.getBranch('1').id === id) {
|
|
51
51
|
return true;
|
|
@@ -53,17 +53,15 @@ var Branches = /** @class */ (function () {
|
|
|
53
53
|
else {
|
|
54
54
|
return false;
|
|
55
55
|
}
|
|
56
|
-
}
|
|
57
|
-
|
|
56
|
+
}
|
|
57
|
+
areBranchesStrictEqual() {
|
|
58
58
|
return this.branches['0'] === this.branches['1'];
|
|
59
|
-
}
|
|
60
|
-
|
|
59
|
+
}
|
|
60
|
+
hasEqualBranches() {
|
|
61
61
|
return JSON.stringify(this.branches['0']) ===
|
|
62
62
|
JSON.stringify(this.branches['1']);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
}());
|
|
66
|
-
export { Branches };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
67
65
|
export function ensureNodesNotStrictEqual(node1, node2) {
|
|
68
66
|
if (node1 === node2) {
|
|
69
67
|
throw new Error('cannot have two strict equal branches');
|
package/dist/es/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,71 +1,33 @@
|
|
|
1
|
-
var __values = (this && this.__values) || function(o) {
|
|
2
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
3
|
-
if (m) return m.call(o);
|
|
4
|
-
if (o && typeof o.length === "number") return {
|
|
5
|
-
next: function () {
|
|
6
|
-
if (o && i >= o.length) o = void 0;
|
|
7
|
-
return { value: o && o[i++], done: !o };
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
11
|
-
};
|
|
12
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
13
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
14
|
-
if (!m) return o;
|
|
15
|
-
var i = m.call(o), r, ar = [], e;
|
|
16
|
-
try {
|
|
17
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
18
|
-
}
|
|
19
|
-
catch (error) { e = { error: error }; }
|
|
20
|
-
finally {
|
|
21
|
-
try {
|
|
22
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
23
|
-
}
|
|
24
|
-
finally { if (e) throw e.error; }
|
|
25
|
-
}
|
|
26
|
-
return ar;
|
|
27
|
-
};
|
|
28
1
|
import { RootNode } from './root-node';
|
|
29
2
|
import { lastChar } from './util';
|
|
30
3
|
import { InternalNode } from './internal-node';
|
|
31
4
|
import { LeafNode } from './leaf-node';
|
|
32
5
|
export function createBddFromTruthTable(truthTable) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
var mustBeSize = Math.pow(2, keyLength);
|
|
6
|
+
const root = new RootNode();
|
|
7
|
+
const firstKey = truthTable.keys().next().value;
|
|
8
|
+
const keyLength = firstKey.length;
|
|
9
|
+
const mustBeSize = Math.pow(2, keyLength);
|
|
38
10
|
if (truthTable.size !== mustBeSize) {
|
|
39
11
|
throw new Error('truth table has missing entries');
|
|
40
12
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (!lastNode.branches.getBranch(state)) {
|
|
51
|
-
lastNode.branches.setBranch(state, new InternalNode(level, root, lastNode));
|
|
52
|
-
}
|
|
53
|
-
lastNode = lastNode.branches.getBranch(state);
|
|
54
|
-
}
|
|
55
|
-
// last node is leaf-node
|
|
56
|
-
var lastState = lastChar(stateSet);
|
|
57
|
-
if (lastNode.branches.getBranch(lastState)) {
|
|
58
|
-
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));
|
|
59
22
|
}
|
|
60
|
-
lastNode.branches.
|
|
23
|
+
lastNode = lastNode.branches.getBranch(state);
|
|
61
24
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
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');
|
|
67
29
|
}
|
|
68
|
-
|
|
30
|
+
lastNode.branches.setBranch(lastState, new LeafNode(stateSet.length, root, value, lastNode));
|
|
69
31
|
}
|
|
70
32
|
return root;
|
|
71
33
|
}
|
|
@@ -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"}
|
|
@@ -3,28 +3,28 @@
|
|
|
3
3
|
* to ensure everything is correct
|
|
4
4
|
*/
|
|
5
5
|
export function ensureCorrectBdd(bdd) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
bdd.getLevels().forEach(
|
|
10
|
-
|
|
11
|
-
levelNodes.forEach(
|
|
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 => {
|
|
12
12
|
nodesById.set(node.id, node);
|
|
13
13
|
});
|
|
14
14
|
allNodes = allNodes.concat(levelNodes);
|
|
15
15
|
});
|
|
16
|
-
|
|
16
|
+
const recursiveNodes = getNodesRecursive(bdd);
|
|
17
17
|
if (allNodes.length !== recursiveNodes.size) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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));
|
|
21
21
|
// console.log(JSON.stringify(allNodes.map(n => n.id).sort(), null, 2));
|
|
22
22
|
// console.log(JSON.stringify(Array.from(recursiveNodes).map(n => n.id).sort(), null, 2));
|
|
23
23
|
if (recursiveNodes.size > allNodes.length) {
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
const firstId = nodesOnlyInRecursive[0];
|
|
25
|
+
const referenceToFirst = allNodes.find(n => {
|
|
26
26
|
if (n.isInternalNode()) {
|
|
27
|
-
return n.branches.hasNodeIdAsBranch(
|
|
27
|
+
return n.branches.hasNodeIdAsBranch(firstId);
|
|
28
28
|
}
|
|
29
29
|
return false;
|
|
30
30
|
});
|
|
@@ -37,11 +37,11 @@ export function ensureCorrectBdd(bdd) {
|
|
|
37
37
|
'recursiveNodes: ' + recursiveNodes.size + ' ' +
|
|
38
38
|
'nodesOnlyInRecursive: ' + nodesOnlyInRecursive.join(', ') + ' ');
|
|
39
39
|
}
|
|
40
|
-
allNodes.forEach(
|
|
40
|
+
allNodes.forEach(node => {
|
|
41
41
|
if (node.isRootNode()) {
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
|
-
|
|
44
|
+
const useNode = node;
|
|
45
45
|
if (node.deleted) {
|
|
46
46
|
throw new Error('ensureCorrectBdd() ' +
|
|
47
47
|
'bdd includes a deleted node');
|
|
@@ -52,24 +52,24 @@ export function ensureCorrectBdd(bdd) {
|
|
|
52
52
|
'node has no parent ' + useNode.id);
|
|
53
53
|
}
|
|
54
54
|
if (useNode.isInternalNode()) {
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
const internalNode = useNode;
|
|
56
|
+
const bothBranches = internalNode.branches.getBothBranches();
|
|
57
57
|
// a node should not have 2 equal branches
|
|
58
|
-
if (
|
|
58
|
+
if (internalNode.branches.areBranchesStrictEqual()) {
|
|
59
59
|
throw new Error('ensureCorrectBdd() ' +
|
|
60
60
|
'node has two equal branches: ' +
|
|
61
|
-
bothBranches.map(
|
|
61
|
+
bothBranches.map(n => n.id).join(', '));
|
|
62
62
|
}
|
|
63
63
|
// each branch should have the node as parent
|
|
64
|
-
bothBranches.forEach(
|
|
65
|
-
if (!branch.parents.has(
|
|
64
|
+
bothBranches.forEach(branch => {
|
|
65
|
+
if (!branch.parents.has(internalNode)) {
|
|
66
66
|
throw new Error('ensureCorrectBdd() ' +
|
|
67
67
|
'branch must have the node as parent');
|
|
68
68
|
}
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
71
|
// each parent should have the child as branch
|
|
72
|
-
useNode.parents.getAll().forEach(
|
|
72
|
+
useNode.parents.getAll().forEach(parent => {
|
|
73
73
|
if (!parent.branches.hasBranchAsNode(useNode)) {
|
|
74
74
|
throw new Error('ensureCorrectBdd() ' +
|
|
75
75
|
'parent node does not have child as branch');
|
|
@@ -81,15 +81,14 @@ export function ensureCorrectBdd(bdd) {
|
|
|
81
81
|
'bdd includes a deleted node');
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
export function getNodesRecursive(node, set) {
|
|
85
|
-
if (set === void 0) { set = new Set(); }
|
|
84
|
+
export function getNodesRecursive(node, set = new Set()) {
|
|
86
85
|
set.add(node);
|
|
87
86
|
if (!node.isLeafNode()) {
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
const useNode = node;
|
|
88
|
+
const branch1 = useNode.branches.getBranch('0');
|
|
90
89
|
set.add(branch1);
|
|
91
90
|
getNodesRecursive(branch1, set);
|
|
92
|
-
|
|
91
|
+
const branch2 = useNode.branches.getBranch('1');
|
|
93
92
|
set.add(branch2);
|
|
94
93
|
getNodesRecursive(branch2, set);
|
|
95
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-correct-bdd.js","sourceRoot":"","sources":["../../src/ensure-correct-bdd.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAa;IAC1C,
|
|
1
|
+
{"version":3,"file":"ensure-correct-bdd.js","sourceRoot":"","sources":["../../src/ensure-correct-bdd.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,9 @@ import { minBinaryWithLength, maxBinaryWithLength, getNextStateSet } from './uti
|
|
|
4
4
|
* with the given value
|
|
5
5
|
*/
|
|
6
6
|
export function fillTruthTable(truthTable, inputLength, value) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
const endInput = maxBinaryWithLength(inputLength);
|
|
8
|
+
let currentInput = minBinaryWithLength(inputLength);
|
|
9
|
+
let done = false;
|
|
10
10
|
while (!done) {
|
|
11
11
|
if (!truthTable.has(currentInput)) {
|
|
12
12
|
truthTable.set(currentInput, value);
|