binary-decision-diagram 3.2.0 → 5.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/CHANGELOG.md +6 -0
- package/README.md +211 -31
- package/dist/cjs/src/abstract-node.js +7 -4
- package/dist/cjs/src/abstract-node.js.map +1 -1
- package/dist/cjs/src/branches.d.ts +4 -1
- package/dist/cjs/src/branches.js +10 -9
- package/dist/cjs/src/branches.js.map +1 -1
- package/dist/cjs/src/create-bdd-from-truth-table.js +1 -2
- package/dist/cjs/src/create-bdd-from-truth-table.js.map +1 -1
- package/dist/cjs/src/ensure-correct-bdd.js +2 -3
- package/dist/cjs/src/ensure-correct-bdd.js.map +1 -1
- package/dist/cjs/src/fill-truth-table.js +1 -2
- package/dist/cjs/src/fill-truth-table.js.map +1 -1
- package/dist/cjs/src/find-similar-node.js +1 -2
- package/dist/cjs/src/find-similar-node.js.map +1 -1
- package/dist/cjs/src/index.d.ts +2 -1
- package/dist/cjs/src/index.es5.js +17 -7
- package/dist/cjs/src/index.es5.js.map +1 -1
- package/dist/cjs/src/index.js +2 -1
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/internal-node.js +6 -3
- package/dist/cjs/src/internal-node.js.map +1 -1
- package/dist/cjs/src/optimize-brute-force.js +10 -12
- package/dist/cjs/src/optimize-brute-force.js.map +1 -1
- package/dist/cjs/src/ordering/build-bdd.d.ts +13 -0
- package/dist/cjs/src/ordering/build-bdd.js +64 -0
- package/dist/cjs/src/ordering/build-bdd.js.map +1 -0
- package/dist/cjs/src/ordering/dense-truth-table.d.ts +42 -0
- package/dist/cjs/src/ordering/dense-truth-table.js +125 -0
- package/dist/cjs/src/ordering/dense-truth-table.js.map +1 -0
- package/dist/cjs/src/ordering/exact-cost-ordering.d.ts +91 -0
- package/dist/cjs/src/ordering/exact-cost-ordering.js +351 -0
- package/dist/cjs/src/ordering/exact-cost-ordering.js.map +1 -0
- package/dist/cjs/src/ordering/exact-ordering.d.ts +89 -0
- package/dist/cjs/src/ordering/exact-ordering.js +260 -0
- package/dist/cjs/src/ordering/exact-ordering.js.map +1 -0
- package/dist/cjs/src/ordering/index.d.ts +22 -0
- package/dist/cjs/src/ordering/index.js +38 -0
- package/dist/cjs/src/ordering/index.js.map +1 -0
- package/dist/cjs/src/ordering/int-pair-map.d.ts +20 -0
- package/dist/cjs/src/ordering/int-pair-map.js +85 -0
- package/dist/cjs/src/ordering/int-pair-map.js.map +1 -0
- package/dist/cjs/src/ordering/local-search.d.ts +114 -0
- package/dist/cjs/src/ordering/local-search.js +317 -0
- package/dist/cjs/src/ordering/local-search.js.map +1 -0
- package/dist/cjs/src/ordering/optimize-ordering.d.ts +153 -0
- package/dist/cjs/src/ordering/optimize-ordering.js +406 -0
- package/dist/cjs/src/ordering/optimize-ordering.js.map +1 -0
- package/dist/cjs/src/ordering/ordering-evaluator.d.ts +198 -0
- package/dist/cjs/src/ordering/ordering-evaluator.js +384 -0
- package/dist/cjs/src/ordering/ordering-evaluator.js.map +1 -0
- package/dist/cjs/src/ordering/shared-diagram.d.ts +85 -0
- package/dist/cjs/src/ordering/shared-diagram.js +295 -0
- package/dist/cjs/src/ordering/shared-diagram.js.map +1 -0
- package/dist/cjs/src/packed/index.d.ts +2 -0
- package/dist/cjs/src/{minimal-string → packed}/index.js +2 -5
- package/dist/cjs/src/packed/index.js.map +1 -0
- package/dist/cjs/src/packed/packed-bdd-base64-string.d.ts +3 -0
- package/dist/cjs/src/packed/packed-bdd-base64-string.js +46 -0
- package/dist/cjs/src/packed/packed-bdd-base64-string.js.map +1 -0
- package/dist/cjs/src/packed/packed-bdd.d.ts +13 -0
- package/dist/cjs/src/packed/packed-bdd.js +70 -0
- package/dist/cjs/src/packed/packed-bdd.js.map +1 -0
- package/dist/cjs/src/root-node.d.ts +1 -2
- package/dist/cjs/src/root-node.js +4 -9
- package/dist/cjs/src/root-node.js.map +1 -1
- package/dist/cjs/src/types.d.ts +0 -12
- package/dist/cjs/src/util.js +29 -21
- package/dist/cjs/src/util.js.map +1 -1
- package/dist/esm/src/abstract-node.js +7 -4
- package/dist/esm/src/abstract-node.js.map +1 -1
- package/dist/esm/src/branches.d.ts +4 -1
- package/dist/esm/src/branches.js +8 -7
- package/dist/esm/src/branches.js.map +1 -1
- package/dist/esm/src/create-bdd-from-truth-table.js.map +1 -1
- package/dist/esm/src/index.d.ts +2 -1
- package/dist/esm/src/index.js +2 -1
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/internal-node.js +7 -4
- package/dist/esm/src/internal-node.js.map +1 -1
- package/dist/esm/src/optimize-brute-force.js +5 -7
- package/dist/esm/src/optimize-brute-force.js.map +1 -1
- package/dist/esm/src/ordering/build-bdd.d.ts +13 -0
- package/dist/esm/src/ordering/build-bdd.js +61 -0
- package/dist/esm/src/ordering/build-bdd.js.map +1 -0
- package/dist/esm/src/ordering/dense-truth-table.d.ts +42 -0
- package/dist/esm/src/ordering/dense-truth-table.js +117 -0
- package/dist/esm/src/ordering/dense-truth-table.js.map +1 -0
- package/dist/esm/src/ordering/exact-cost-ordering.d.ts +91 -0
- package/dist/esm/src/ordering/exact-cost-ordering.js +347 -0
- package/dist/esm/src/ordering/exact-cost-ordering.js.map +1 -0
- package/dist/esm/src/ordering/exact-ordering.d.ts +89 -0
- package/dist/esm/src/ordering/exact-ordering.js +256 -0
- package/dist/esm/src/ordering/exact-ordering.js.map +1 -0
- package/dist/esm/src/ordering/index.d.ts +22 -0
- package/dist/esm/src/ordering/index.js +17 -0
- package/dist/esm/src/ordering/index.js.map +1 -0
- package/dist/esm/src/ordering/int-pair-map.d.ts +20 -0
- package/dist/esm/src/ordering/int-pair-map.js +81 -0
- package/dist/esm/src/ordering/int-pair-map.js.map +1 -0
- package/dist/esm/src/ordering/local-search.d.ts +114 -0
- package/dist/esm/src/ordering/local-search.js +308 -0
- package/dist/esm/src/ordering/local-search.js.map +1 -0
- package/dist/esm/src/ordering/optimize-ordering.d.ts +153 -0
- package/dist/esm/src/ordering/optimize-ordering.js +399 -0
- package/dist/esm/src/ordering/optimize-ordering.js.map +1 -0
- package/dist/esm/src/ordering/ordering-evaluator.d.ts +198 -0
- package/dist/esm/src/ordering/ordering-evaluator.js +377 -0
- package/dist/esm/src/ordering/ordering-evaluator.js.map +1 -0
- package/dist/esm/src/ordering/shared-diagram.d.ts +85 -0
- package/dist/esm/src/ordering/shared-diagram.js +289 -0
- package/dist/esm/src/ordering/shared-diagram.js.map +1 -0
- package/dist/esm/src/packed/index.d.ts +2 -0
- package/dist/esm/src/packed/index.js +3 -0
- package/dist/esm/src/packed/index.js.map +1 -0
- package/dist/esm/src/packed/packed-bdd-base64-string.d.ts +3 -0
- package/dist/esm/src/packed/packed-bdd-base64-string.js +42 -0
- package/dist/esm/src/packed/packed-bdd-base64-string.js.map +1 -0
- package/dist/esm/src/packed/packed-bdd.d.ts +13 -0
- package/dist/esm/src/packed/packed-bdd.js +66 -0
- package/dist/esm/src/packed/packed-bdd.js.map +1 -0
- package/dist/esm/src/root-node.d.ts +1 -2
- package/dist/esm/src/root-node.js +5 -10
- package/dist/esm/src/root-node.js.map +1 -1
- package/dist/esm/src/types.d.ts +0 -12
- package/dist/esm/src/util.js +14 -5
- package/dist/esm/src/util.js.map +1 -1
- package/docs/variable-ordering.md +306 -0
- package/package.json +15 -12
- package/src/abstract-node.ts +7 -5
- package/src/branches.ts +9 -7
- package/src/create-bdd-from-truth-table.ts +1 -1
- package/src/index.ts +2 -1
- package/src/internal-node.ts +7 -4
- package/src/optimize-brute-force.ts +5 -7
- package/src/ordering/build-bdd.ts +70 -0
- package/src/ordering/dense-truth-table.ts +161 -0
- package/src/ordering/exact-cost-ordering.ts +425 -0
- package/src/ordering/exact-ordering.ts +317 -0
- package/src/ordering/index.ts +57 -0
- package/src/ordering/int-pair-map.ts +85 -0
- package/src/ordering/local-search.ts +369 -0
- package/src/ordering/optimize-ordering.ts +570 -0
- package/src/ordering/ordering-evaluator.ts +479 -0
- package/src/ordering/shared-diagram.ts +310 -0
- package/src/packed/index.ts +2 -0
- package/src/packed/packed-bdd-base64-string.ts +47 -0
- package/src/packed/packed-bdd.ts +98 -0
- package/src/root-node.ts +8 -17
- package/src/types.ts +0 -18
- package/src/util.ts +15 -6
- package/dist/cjs/src/minimal-string/bdd-to-minimal-string.d.ts +0 -8
- package/dist/cjs/src/minimal-string/bdd-to-minimal-string.js +0 -60
- package/dist/cjs/src/minimal-string/bdd-to-minimal-string.js.map +0 -1
- package/dist/cjs/src/minimal-string/bdd-to-simple-bdd.d.ts +0 -11
- package/dist/cjs/src/minimal-string/bdd-to-simple-bdd.js +0 -24
- package/dist/cjs/src/minimal-string/bdd-to-simple-bdd.js.map +0 -1
- package/dist/cjs/src/minimal-string/index.d.ts +0 -5
- package/dist/cjs/src/minimal-string/index.js.map +0 -1
- package/dist/cjs/src/minimal-string/minimal-string-to-simple-bdd.d.ts +0 -2
- package/dist/cjs/src/minimal-string/minimal-string-to-simple-bdd.js +0 -58
- package/dist/cjs/src/minimal-string/minimal-string-to-simple-bdd.js.map +0 -1
- package/dist/cjs/src/minimal-string/resolve-with-simple-bdd.d.ts +0 -2
- package/dist/cjs/src/minimal-string/resolve-with-simple-bdd.js +0 -21
- package/dist/cjs/src/minimal-string/resolve-with-simple-bdd.js.map +0 -1
- package/dist/cjs/src/minimal-string/string-format.d.ts +0 -9
- package/dist/cjs/src/minimal-string/string-format.js +0 -61
- package/dist/cjs/src/minimal-string/string-format.js.map +0 -1
- package/dist/esm/src/minimal-string/bdd-to-minimal-string.d.ts +0 -8
- package/dist/esm/src/minimal-string/bdd-to-minimal-string.js +0 -55
- package/dist/esm/src/minimal-string/bdd-to-minimal-string.js.map +0 -1
- package/dist/esm/src/minimal-string/bdd-to-simple-bdd.d.ts +0 -11
- package/dist/esm/src/minimal-string/bdd-to-simple-bdd.js +0 -19
- package/dist/esm/src/minimal-string/bdd-to-simple-bdd.js.map +0 -1
- package/dist/esm/src/minimal-string/index.d.ts +0 -5
- package/dist/esm/src/minimal-string/index.js +0 -6
- package/dist/esm/src/minimal-string/index.js.map +0 -1
- package/dist/esm/src/minimal-string/minimal-string-to-simple-bdd.d.ts +0 -2
- package/dist/esm/src/minimal-string/minimal-string-to-simple-bdd.js +0 -54
- package/dist/esm/src/minimal-string/minimal-string-to-simple-bdd.js.map +0 -1
- package/dist/esm/src/minimal-string/resolve-with-simple-bdd.d.ts +0 -2
- package/dist/esm/src/minimal-string/resolve-with-simple-bdd.js +0 -17
- package/dist/esm/src/minimal-string/resolve-with-simple-bdd.js.map +0 -1
- package/dist/esm/src/minimal-string/string-format.d.ts +0 -9
- package/dist/esm/src/minimal-string/string-format.js +0 -54
- package/dist/esm/src/minimal-string/string-format.js.map +0 -1
- package/src/minimal-string/bdd-to-minimal-string.ts +0 -72
- package/src/minimal-string/bdd-to-simple-bdd.ts +0 -31
- package/src/minimal-string/index.ts +0 -5
- package/src/minimal-string/minimal-string-to-simple-bdd.ts +0 -67
- package/src/minimal-string/resolve-with-simple-bdd.ts +0 -25
- package/src/minimal-string/string-format.ts +0 -67
package/dist/cjs/src/util.js
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.booleanStringToBoolean = booleanStringToBoolean;
|
|
4
|
+
exports.booleanToBooleanString = booleanToBooleanString;
|
|
5
|
+
exports.oppositeBoolean = oppositeBoolean;
|
|
6
|
+
exports.lastChar = lastChar;
|
|
7
|
+
exports.nextNodeId = nextNodeId;
|
|
8
|
+
exports.decimalToPaddedBinary = decimalToPaddedBinary;
|
|
9
|
+
exports.oppositeBinary = oppositeBinary;
|
|
10
|
+
exports.binaryToDecimal = binaryToDecimal;
|
|
11
|
+
exports.minBinaryWithLength = minBinaryWithLength;
|
|
12
|
+
exports.maxBinaryWithLength = maxBinaryWithLength;
|
|
13
|
+
exports.getNextStateSet = getNextStateSet;
|
|
14
|
+
exports.firstKeyOfMap = firstKeyOfMap;
|
|
15
|
+
exports.shuffleArray = shuffleArray;
|
|
16
|
+
exports.lastOfArray = lastOfArray;
|
|
17
|
+
exports.splitStringToChunks = splitStringToChunks;
|
|
4
18
|
function booleanStringToBoolean(str) {
|
|
5
19
|
if (str === '1') {
|
|
6
20
|
return true;
|
|
@@ -9,7 +23,6 @@ function booleanStringToBoolean(str) {
|
|
|
9
23
|
return false;
|
|
10
24
|
}
|
|
11
25
|
}
|
|
12
|
-
exports.booleanStringToBoolean = booleanStringToBoolean;
|
|
13
26
|
function booleanToBooleanString(b) {
|
|
14
27
|
if (b) {
|
|
15
28
|
return '1';
|
|
@@ -18,7 +31,6 @@ function booleanToBooleanString(b) {
|
|
|
18
31
|
return '0';
|
|
19
32
|
}
|
|
20
33
|
}
|
|
21
|
-
exports.booleanToBooleanString = booleanToBooleanString;
|
|
22
34
|
function oppositeBoolean(input) {
|
|
23
35
|
if (input === '1') {
|
|
24
36
|
return '0';
|
|
@@ -27,11 +39,9 @@ function oppositeBoolean(input) {
|
|
|
27
39
|
return '1';
|
|
28
40
|
}
|
|
29
41
|
}
|
|
30
|
-
exports.oppositeBoolean = oppositeBoolean;
|
|
31
42
|
function lastChar(str) {
|
|
32
43
|
return str.slice(-1);
|
|
33
44
|
}
|
|
34
|
-
exports.lastChar = lastChar;
|
|
35
45
|
/**
|
|
36
46
|
* @link https://stackoverflow.com/a/1349426
|
|
37
47
|
*/
|
|
@@ -51,16 +61,15 @@ function nextNodeId() {
|
|
|
51
61
|
lastIdGen++;
|
|
52
62
|
return ret;
|
|
53
63
|
}
|
|
54
|
-
exports.nextNodeId = nextNodeId;
|
|
55
64
|
/**
|
|
56
65
|
* @link https://stackoverflow.com/a/16155417
|
|
57
66
|
*/
|
|
58
67
|
function decimalToPaddedBinary(decimal, padding) {
|
|
59
|
-
|
|
68
|
+
// >>> 0 would cut off everything above 32 bits, only use it for the two's complement of negative numbers
|
|
69
|
+
const binary = (decimal < 0 ? decimal >>> 0 : decimal).toString(2);
|
|
60
70
|
const padded = binary.padStart(padding, '0');
|
|
61
71
|
return padded;
|
|
62
72
|
}
|
|
63
|
-
exports.decimalToPaddedBinary = decimalToPaddedBinary;
|
|
64
73
|
function oppositeBinary(i) {
|
|
65
74
|
if (i === '1') {
|
|
66
75
|
return '0';
|
|
@@ -72,31 +81,33 @@ function oppositeBinary(i) {
|
|
|
72
81
|
throw new Error('non-binary given');
|
|
73
82
|
}
|
|
74
83
|
}
|
|
75
|
-
exports.oppositeBinary = oppositeBinary;
|
|
76
84
|
function binaryToDecimal(binary) {
|
|
77
85
|
return parseInt(binary, 2);
|
|
78
86
|
}
|
|
79
|
-
exports.binaryToDecimal = binaryToDecimal;
|
|
80
87
|
function minBinaryWithLength(length) {
|
|
81
88
|
return new Array(length).fill(0).map(() => '0').join('');
|
|
82
89
|
}
|
|
83
|
-
exports.minBinaryWithLength = minBinaryWithLength;
|
|
84
90
|
function maxBinaryWithLength(length) {
|
|
85
91
|
return new Array(length).fill(0).map(() => '1').join('');
|
|
86
92
|
}
|
|
87
|
-
exports.maxBinaryWithLength = maxBinaryWithLength;
|
|
88
93
|
function getNextStateSet(stateSet) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
94
|
+
if (stateSet.length <= 52) {
|
|
95
|
+
// fast path, the number stays exact
|
|
96
|
+
const decimal = binaryToDecimal(stateSet);
|
|
97
|
+
return decimalToPaddedBinary(decimal + 1, stateSet.length);
|
|
98
|
+
}
|
|
99
|
+
// longer keys would lose precision as a number, so increment the string directly
|
|
100
|
+
const lastZero = stateSet.lastIndexOf('0');
|
|
101
|
+
if (lastZero === -1) {
|
|
102
|
+
// overflow, the result gets one char longer
|
|
103
|
+
return '1' + '0'.repeat(stateSet.length);
|
|
104
|
+
}
|
|
105
|
+
return stateSet.slice(0, lastZero) + '1' + '0'.repeat(stateSet.length - lastZero - 1);
|
|
93
106
|
}
|
|
94
|
-
exports.getNextStateSet = getNextStateSet;
|
|
95
107
|
function firstKeyOfMap(map) {
|
|
96
108
|
const iterator1 = map.keys();
|
|
97
109
|
return iterator1.next().value;
|
|
98
110
|
}
|
|
99
|
-
exports.firstKeyOfMap = firstKeyOfMap;
|
|
100
111
|
/**
|
|
101
112
|
* Shuffles array in place. ES6 version
|
|
102
113
|
* @link https://stackoverflow.com/a/6274381
|
|
@@ -108,11 +119,9 @@ function shuffleArray(a) {
|
|
|
108
119
|
}
|
|
109
120
|
return a;
|
|
110
121
|
}
|
|
111
|
-
exports.shuffleArray = shuffleArray;
|
|
112
122
|
function lastOfArray(ar) {
|
|
113
123
|
return ar[ar.length - 1];
|
|
114
124
|
}
|
|
115
|
-
exports.lastOfArray = lastOfArray;
|
|
116
125
|
/**
|
|
117
126
|
* @link https://stackoverflow.com/a/6259536
|
|
118
127
|
*/
|
|
@@ -123,5 +132,4 @@ function splitStringToChunks(str, chunkSize) {
|
|
|
123
132
|
}
|
|
124
133
|
return chunks;
|
|
125
134
|
}
|
|
126
|
-
exports.splitStringToChunks = splitStringToChunks;
|
|
127
135
|
//# sourceMappingURL=util.js.map
|
package/dist/cjs/src/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { nextNodeId } from './util.js';
|
|
2
|
+
import { BRANCH_KEYS } from './branches.js';
|
|
2
3
|
import { findSimilarNode } from './find-similar-node.js';
|
|
3
4
|
export class AbstractNode {
|
|
4
5
|
level;
|
|
@@ -141,10 +142,12 @@ export class AbstractNode {
|
|
|
141
142
|
const ownParents = this.parents.getAll();
|
|
142
143
|
const parentsWithStrictEqualBranches = [];
|
|
143
144
|
ownParents.forEach((parent) => {
|
|
144
|
-
//
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
145
|
+
// a parent (the root node) can have this node in both branches
|
|
146
|
+
BRANCH_KEYS.forEach(branchKey => {
|
|
147
|
+
if (parent.branches.getBranch(branchKey) === this) {
|
|
148
|
+
parent.branches.setBranch(branchKey, other);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
148
151
|
if (parent.branches.areBranchesStrictEqual()) {
|
|
149
152
|
parentsWithStrictEqualBranches.push(parent);
|
|
150
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-node.js","sourceRoot":"","sources":["../../../src/abstract-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"abstract-node.js","sourceRoot":"","sources":["../../../src/abstract-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import type { BooleanString, NonRootNode, NonLeafNode } from './types.js';
|
|
2
2
|
import { AbstractNode } from './abstract-node.js';
|
|
3
|
+
export declare const BRANCH_KEYS: BooleanString[];
|
|
3
4
|
/**
|
|
4
5
|
* represents the branches of a single node
|
|
5
6
|
*/
|
|
6
7
|
export declare class Branches {
|
|
7
8
|
private node;
|
|
8
9
|
deleted: boolean;
|
|
9
|
-
|
|
10
|
+
data: {
|
|
11
|
+
[k in BooleanString]: NonRootNode;
|
|
12
|
+
};
|
|
10
13
|
constructor(node: NonLeafNode);
|
|
11
14
|
setBranch(which: BooleanString, branchNode: NonRootNode): void;
|
|
12
15
|
getKeyOfNode(node: NonRootNode): BooleanString;
|
package/dist/esm/src/branches.js
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
|
+
export const BRANCH_KEYS = ['0', '1'];
|
|
1
2
|
/**
|
|
2
3
|
* represents the branches of a single node
|
|
3
4
|
*/
|
|
4
5
|
export class Branches {
|
|
5
6
|
node;
|
|
6
7
|
deleted = false;
|
|
7
|
-
|
|
8
|
+
data = {};
|
|
8
9
|
constructor(node) {
|
|
9
10
|
this.node = node;
|
|
10
11
|
}
|
|
11
12
|
setBranch(which, branchNode) {
|
|
12
|
-
const previous = this.
|
|
13
|
+
const previous = this.data[which];
|
|
13
14
|
if (previous === branchNode) {
|
|
14
15
|
return;
|
|
15
16
|
}
|
|
16
17
|
// set new branch
|
|
17
|
-
this.
|
|
18
|
+
this.data[which] = branchNode;
|
|
18
19
|
branchNode.parents.add(this.node);
|
|
19
20
|
}
|
|
20
21
|
getKeyOfNode(node) {
|
|
@@ -29,7 +30,7 @@ export class Branches {
|
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
getBranch(which) {
|
|
32
|
-
return this.
|
|
33
|
+
return this.data[which];
|
|
33
34
|
}
|
|
34
35
|
getBothBranches() {
|
|
35
36
|
return [
|
|
@@ -56,11 +57,11 @@ export class Branches {
|
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
areBranchesStrictEqual() {
|
|
59
|
-
return this.
|
|
60
|
+
return this.data['0'] === this.data['1'];
|
|
60
61
|
}
|
|
61
62
|
hasEqualBranches() {
|
|
62
|
-
return JSON.stringify(this.
|
|
63
|
-
JSON.stringify(this.
|
|
63
|
+
return JSON.stringify(this.data['0']) ===
|
|
64
|
+
JSON.stringify(this.data['1']);
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
67
|
export function ensureNodesNotStrictEqual(node1, node2) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branches.js","sourceRoot":"","sources":["../../../src/branches.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,QAAQ;IAOL;IANL,OAAO,GAAY,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"branches.js","sourceRoot":"","sources":["../../../src/branches.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,WAAW,GAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAEvD;;GAEG;AACH,MAAM,OAAO,QAAQ;IAOL;IANL,OAAO,GAAY,KAAK,CAAC;IACzB,IAAI,GAEP,EAAS,CAAC;IAEd,YACY,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IACzB,CAAC;IAEE,SAAS,CAAC,KAAoB,EAAE,UAAuB;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC1B,OAAO;QACX,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;QAC9B,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,CAAC;YAC/B,OAAO,GAAG,CAAC;QACf,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC;QACf,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;IAEM,SAAS,CAAC,KAAoB;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,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,CAAC;YACC,OAAO,IAAI,CAAC;QAChB,CAAC;aAAM,CAAC;YACJ,OAAO,KAAK,CAAC;QACjB,CAAC;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,CAAC;YACC,OAAO,IAAI,CAAC;QAChB,CAAC;aAAM,CAAC;YACJ,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAEM,sBAAsB;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAEM,gBAAgB;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;CACJ;AAED,MAAM,UAAU,yBAAyB,CACrC,KAAkB,EAClB,KAAkB;IAElB,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC7D,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
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,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,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,
|
|
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,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,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,KAAe,CAAC;IAC1D,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,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACvD,CAAC;IAGD,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QACzC,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,CAAC;YAC7C,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,CAAC;gBACtC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CACvB,KAAK,EACL,IAAI,YAAY,CACZ,KAAK,EACL,IAAI,EACJ,QAAQ,CACX,CACJ,CAAC;YACN,CAAC;YACD,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAgB,CAAC;QACjE,CAAC;QAED,yBAAyB;QACzB,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAkB,CAAC;QACtD,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACvE,CAAC;QACD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CACvB,SAAS,EACT,IAAI,QAAQ,CACR,QAAQ,CAAC,MAAM,EACf,IAAI,EACJ,KAAK,EACL,QAAQ,CACX,CACJ,CAAC;IACN,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
package/dist/esm/src/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export * from './minimal-string/index.js';
|
|
2
1
|
export * from './abstract-node.js';
|
|
3
2
|
export * from './branches.js';
|
|
4
3
|
export * from './create-bdd-from-truth-table.js';
|
|
@@ -8,6 +7,8 @@ export * from './find-similar-node.js';
|
|
|
8
7
|
export * from './internal-node.js';
|
|
9
8
|
export * from './leaf-node.js';
|
|
10
9
|
export * from './optimize-brute-force.js';
|
|
10
|
+
export * from './packed/index.js';
|
|
11
|
+
export * from './ordering/index.js';
|
|
11
12
|
export * from './parents.js';
|
|
12
13
|
export * from './root-node.js';
|
|
13
14
|
export * from './util.js';
|
package/dist/esm/src/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export * from './minimal-string/index.js';
|
|
2
1
|
export * from './abstract-node.js';
|
|
3
2
|
export * from './branches.js';
|
|
4
3
|
export * from './create-bdd-from-truth-table.js';
|
|
@@ -8,6 +7,8 @@ export * from './find-similar-node.js';
|
|
|
8
7
|
export * from './internal-node.js';
|
|
9
8
|
export * from './leaf-node.js';
|
|
10
9
|
export * from './optimize-brute-force.js';
|
|
10
|
+
export * from './packed/index.js';
|
|
11
|
+
export * from './ordering/index.js';
|
|
11
12
|
export * from './parents.js';
|
|
12
13
|
export * from './root-node.js';
|
|
13
14
|
export * from './util.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Branches } from './branches.js';
|
|
1
|
+
import { Branches, BRANCH_KEYS } from './branches.js';
|
|
2
2
|
import { Parents } from './parents.js';
|
|
3
3
|
import { AbstractNode } from './abstract-node.js';
|
|
4
4
|
export class InternalNode extends AbstractNode {
|
|
@@ -21,9 +21,12 @@ export class InternalNode extends AbstractNode {
|
|
|
21
21
|
// move own parents to keepBranch
|
|
22
22
|
const ownParents = this.parents.getAll();
|
|
23
23
|
ownParents.forEach(parent => {
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
// a parent (the root node) can have this node in both branches
|
|
25
|
+
BRANCH_KEYS.forEach(branchKey => {
|
|
26
|
+
if (parent.branches.getBranch(branchKey) === this) {
|
|
27
|
+
parent.branches.setBranch(branchKey, keepBranch);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
27
30
|
// remove parents from own list
|
|
28
31
|
// this will auto-remove the connection to the other '1'-branch
|
|
29
32
|
this.parents.remove(parent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-node.js","sourceRoot":"","sources":["../../../src/internal-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"internal-node.js","sourceRoot":"","sources":["../../../src/internal-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,OAAO,YAAa,SAAQ,YAAY;IACnC,QAAQ,GAAa,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,GAAG,IAAI,OAAO,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,CAAC;YACnC,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,+DAA+D;gBAC/D,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;oBAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;wBAChD,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;oBACrD,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,+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,CAAC;oBACrE,MAAuB,CAAC,kBAAkB,EAAE,CAAC;gBAClD,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;CAEJ"}
|
|
@@ -109,13 +109,11 @@ export function shuffleBooleanOrdering(truthTable) {
|
|
|
109
109
|
export function changeKeyOrder(oldKey, mappingBeforeToAfter) {
|
|
110
110
|
const chars = oldKey
|
|
111
111
|
.split('')
|
|
112
|
-
.map((char, indexBefore) => {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
};
|
|
118
|
-
})
|
|
112
|
+
.map((char, indexBefore) => ({
|
|
113
|
+
char,
|
|
114
|
+
indexBefore,
|
|
115
|
+
indexAfter: mappingBeforeToAfter[indexBefore]
|
|
116
|
+
}))
|
|
119
117
|
.sort((a, b) => a.indexAfter - b.indexAfter)
|
|
120
118
|
.map(charObj => charObj.char)
|
|
121
119
|
.join('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimize-brute-force.js","sourceRoot":"","sources":["../../../src/optimize-brute-force.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"optimize-brute-force.js","sourceRoot":"","sources":["../../../src/optimize-brute-force.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { RootNode } from '../root-node.js';
|
|
2
|
+
import type { DenseTruthTable } from './dense-truth-table.js';
|
|
3
|
+
import type { ReducedDiagram } from './ordering-evaluator.js';
|
|
4
|
+
/**
|
|
5
|
+
* Creates the RootNode based BDD out of a reduced diagram.
|
|
6
|
+
* The result is already minimal, so no minimize() call is needed.
|
|
7
|
+
*
|
|
8
|
+
* Like the BDDs returned by optimizeBruteForce(), the level of each node
|
|
9
|
+
* is the index of the boolean function it tests (so resolve() works
|
|
10
|
+
* with the original resolver functions) and RootNode.levels lists the
|
|
11
|
+
* levels from top to bottom, followed by the leaf level.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildBddFromDiagram(diagram: ReducedDiagram, table: DenseTruthTable): RootNode;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { RootNode } from '../root-node.js';
|
|
2
|
+
import { InternalNode } from '../internal-node.js';
|
|
3
|
+
import { LeafNode } from '../leaf-node.js';
|
|
4
|
+
/**
|
|
5
|
+
* Creates the RootNode based BDD out of a reduced diagram.
|
|
6
|
+
* The result is already minimal, so no minimize() call is needed.
|
|
7
|
+
*
|
|
8
|
+
* Like the BDDs returned by optimizeBruteForce(), the level of each node
|
|
9
|
+
* is the index of the boolean function it tests (so resolve() works
|
|
10
|
+
* with the original resolver functions) and RootNode.levels lists the
|
|
11
|
+
* levels from top to bottom, followed by the leaf level.
|
|
12
|
+
*/
|
|
13
|
+
export function buildBddFromDiagram(diagram, table) {
|
|
14
|
+
const n = diagram.variableCount;
|
|
15
|
+
const ordering = diagram.ordering;
|
|
16
|
+
const terminalCount = diagram.terminalCount;
|
|
17
|
+
const leafLevel = n;
|
|
18
|
+
const root = new RootNode();
|
|
19
|
+
root.level = ordering[0];
|
|
20
|
+
root.levels = ordering.slice();
|
|
21
|
+
root.levels.push(leafLevel);
|
|
22
|
+
root.nodesByLevel = new Map();
|
|
23
|
+
root.levels.forEach(level => root.nodesByLevel.set(level, new Set()));
|
|
24
|
+
root.nodesByLevel.get(root.level).add(root);
|
|
25
|
+
const internalById = new Map();
|
|
26
|
+
const leafById = new Map();
|
|
27
|
+
const attach = (parent, branch, id) => {
|
|
28
|
+
if (id < terminalCount) {
|
|
29
|
+
let leaf = leafById.get(id);
|
|
30
|
+
if (!leaf) {
|
|
31
|
+
leaf = new LeafNode(leafLevel, root, table.terminalValues[id], parent);
|
|
32
|
+
leafById.set(id, leaf);
|
|
33
|
+
}
|
|
34
|
+
parent.branches.setBranch(branch, leaf);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const existing = internalById.get(id);
|
|
38
|
+
if (existing) {
|
|
39
|
+
parent.branches.setBranch(branch, existing);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const index = id - terminalCount;
|
|
43
|
+
const node = new InternalNode(ordering[diagram.nodeLevel[index]], root, parent);
|
|
44
|
+
internalById.set(id, node);
|
|
45
|
+
parent.branches.setBranch(branch, node);
|
|
46
|
+
attach(node, '0', diagram.nodeLo[index]);
|
|
47
|
+
attach(node, '1', diagram.nodeHi[index]);
|
|
48
|
+
};
|
|
49
|
+
const rootId = diagram.root;
|
|
50
|
+
if (rootId >= terminalCount && diagram.nodeLevel[rootId - terminalCount] === 0) {
|
|
51
|
+
attach(root, '0', diagram.nodeLo[rootId - terminalCount]);
|
|
52
|
+
attach(root, '1', diagram.nodeHi[rootId - terminalCount]);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// the top level variable is irrelevant, the root node points to the same node twice
|
|
56
|
+
attach(root, '0', rootId);
|
|
57
|
+
attach(root, '1', rootId);
|
|
58
|
+
}
|
|
59
|
+
return root;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=build-bdd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-bdd.js","sourceRoot":"","sources":["../../../../src/ordering/build-bdd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { TruthTable } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* A truth table stored as a flat array of terminal ids.
|
|
4
|
+
*
|
|
5
|
+
* Row index: parseInt(key, 2). The first character of a key
|
|
6
|
+
* (= boolean function 0) is the most significant bit of the row index,
|
|
7
|
+
* so variable v corresponds to bit (variableCount - 1 - v).
|
|
8
|
+
*
|
|
9
|
+
* Values are mapped to small consecutive "terminal ids" so that the
|
|
10
|
+
* hot loops only ever compare 32-bit integers.
|
|
11
|
+
*/
|
|
12
|
+
export interface DenseTruthTable {
|
|
13
|
+
/** amount of boolean functions, equals the key length of the truth table */
|
|
14
|
+
variableCount: number;
|
|
15
|
+
/** 2^variableCount */
|
|
16
|
+
rowCount: number;
|
|
17
|
+
/** terminal id of each row */
|
|
18
|
+
terminalIds: Int32Array;
|
|
19
|
+
/** terminal id -> value of the truth table */
|
|
20
|
+
terminalValues: number[];
|
|
21
|
+
/** terminal id of the don't-care value, -1 when there is none */
|
|
22
|
+
dontCareTerminal: number;
|
|
23
|
+
/** amount of leaf nodes the final BDD will have */
|
|
24
|
+
leafCount: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The hard limit of variables. Row indexes are handled with 32 bit integer
|
|
28
|
+
* operations and a table with 2^30 rows would need gigabytes of memory anyway.
|
|
29
|
+
*/
|
|
30
|
+
export declare const MAX_VARIABLE_COUNT = 30;
|
|
31
|
+
export declare function parseTruthTable(truthTable: TruthTable, dontCareValue?: number): DenseTruthTable;
|
|
32
|
+
/**
|
|
33
|
+
* Creates a dense table with the same terminal values
|
|
34
|
+
* but other row contents, for example after don't-care rows have been resolved.
|
|
35
|
+
*/
|
|
36
|
+
export declare function withTerminalIds(table: DenseTruthTable, terminalIds: Int32Array, dontCareTerminal: number): DenseTruthTable;
|
|
37
|
+
/**
|
|
38
|
+
* Converts the dense table back into a Map with keys in the original order.
|
|
39
|
+
*/
|
|
40
|
+
export declare function denseTruthTableToMap(table: DenseTruthTable): TruthTable;
|
|
41
|
+
export declare function naturalOrdering(variableCount: number): number[];
|
|
42
|
+
export declare function ensureValidOrdering(ordering: ArrayLike<number>, variableCount: number): void;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The hard limit of variables. Row indexes are handled with 32 bit integer
|
|
3
|
+
* operations and a table with 2^30 rows would need gigabytes of memory anyway.
|
|
4
|
+
*/
|
|
5
|
+
export const MAX_VARIABLE_COUNT = 30;
|
|
6
|
+
export function parseTruthTable(truthTable, dontCareValue) {
|
|
7
|
+
if (truthTable.size === 0) {
|
|
8
|
+
throw new Error('truth table is empty');
|
|
9
|
+
}
|
|
10
|
+
const firstKey = truthTable.keys().next().value;
|
|
11
|
+
const variableCount = firstKey.length;
|
|
12
|
+
if (variableCount < 1 || variableCount > MAX_VARIABLE_COUNT) {
|
|
13
|
+
throw new Error('truth table keys must have between 1 and ' + MAX_VARIABLE_COUNT + ' characters');
|
|
14
|
+
}
|
|
15
|
+
const rowCount = Math.pow(2, variableCount);
|
|
16
|
+
if (truthTable.size !== rowCount) {
|
|
17
|
+
throw new Error('truth table has missing entries');
|
|
18
|
+
}
|
|
19
|
+
const terminalIds = new Int32Array(rowCount).fill(-1);
|
|
20
|
+
const terminalValues = [];
|
|
21
|
+
const idByValue = new Map();
|
|
22
|
+
for (const [key, value] of truthTable) {
|
|
23
|
+
if (key.length !== variableCount || !/^[01]+$/.test(key)) {
|
|
24
|
+
throw new Error('invalid truth table key ' + key);
|
|
25
|
+
}
|
|
26
|
+
const row = parseInt(key, 2);
|
|
27
|
+
if (terminalIds[row] !== -1) {
|
|
28
|
+
throw new Error('duplicate truth table key ' + key);
|
|
29
|
+
}
|
|
30
|
+
let id = idByValue.get(value);
|
|
31
|
+
if (id === undefined) {
|
|
32
|
+
id = terminalValues.length;
|
|
33
|
+
terminalValues.push(value);
|
|
34
|
+
idByValue.set(value, id);
|
|
35
|
+
}
|
|
36
|
+
terminalIds[row] = id;
|
|
37
|
+
}
|
|
38
|
+
let dontCareTerminal = -1;
|
|
39
|
+
if (dontCareValue !== undefined) {
|
|
40
|
+
const dcId = idByValue.get(dontCareValue);
|
|
41
|
+
if (dcId !== undefined) {
|
|
42
|
+
dontCareTerminal = dcId;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const leafCount = terminalValues.length - (dontCareTerminal >= 0 ? 1 : 0);
|
|
46
|
+
if (leafCount === 0) {
|
|
47
|
+
throw new Error('truth table only consists of don\'t-care rows');
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
variableCount,
|
|
51
|
+
rowCount,
|
|
52
|
+
terminalIds,
|
|
53
|
+
terminalValues,
|
|
54
|
+
dontCareTerminal,
|
|
55
|
+
leafCount
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Creates a dense table with the same terminal values
|
|
60
|
+
* but other row contents, for example after don't-care rows have been resolved.
|
|
61
|
+
*/
|
|
62
|
+
export function withTerminalIds(table, terminalIds, dontCareTerminal) {
|
|
63
|
+
let leafCount = 0;
|
|
64
|
+
const seen = new Uint8Array(table.terminalValues.length);
|
|
65
|
+
for (let i = 0; i < terminalIds.length; i++) {
|
|
66
|
+
const id = terminalIds[i];
|
|
67
|
+
if (seen[id] === 0) {
|
|
68
|
+
seen[id] = 1;
|
|
69
|
+
if (id !== dontCareTerminal) {
|
|
70
|
+
leafCount++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (leafCount === 0) {
|
|
75
|
+
leafCount = 1;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
variableCount: table.variableCount,
|
|
79
|
+
rowCount: table.rowCount,
|
|
80
|
+
terminalIds,
|
|
81
|
+
terminalValues: table.terminalValues,
|
|
82
|
+
dontCareTerminal,
|
|
83
|
+
leafCount
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Converts the dense table back into a Map with keys in the original order.
|
|
88
|
+
*/
|
|
89
|
+
export function denseTruthTableToMap(table) {
|
|
90
|
+
const ret = new Map();
|
|
91
|
+
const n = table.variableCount;
|
|
92
|
+
for (let row = 0; row < table.rowCount; row++) {
|
|
93
|
+
ret.set(row.toString(2).padStart(n, '0'), table.terminalValues[table.terminalIds[row]]);
|
|
94
|
+
}
|
|
95
|
+
return ret;
|
|
96
|
+
}
|
|
97
|
+
export function naturalOrdering(variableCount) {
|
|
98
|
+
const ret = [];
|
|
99
|
+
for (let i = 0; i < variableCount; i++) {
|
|
100
|
+
ret.push(i);
|
|
101
|
+
}
|
|
102
|
+
return ret;
|
|
103
|
+
}
|
|
104
|
+
export function ensureValidOrdering(ordering, variableCount) {
|
|
105
|
+
if (ordering.length !== variableCount) {
|
|
106
|
+
throw new Error('ordering must contain each of the ' + variableCount + ' boolean functions exactly once');
|
|
107
|
+
}
|
|
108
|
+
const seen = new Uint8Array(variableCount);
|
|
109
|
+
for (let i = 0; i < ordering.length; i++) {
|
|
110
|
+
const v = ordering[i];
|
|
111
|
+
if (!Number.isInteger(v) || v < 0 || v >= variableCount || seen[v] === 1) {
|
|
112
|
+
throw new Error('ordering must contain each of the ' + variableCount + ' boolean functions exactly once');
|
|
113
|
+
}
|
|
114
|
+
seen[v] = 1;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=dense-truth-table.js.map
|