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,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/*
|
|
3
2
|
let t = 0;
|
|
4
3
|
while (t < 10000) {
|
|
@@ -7,7 +6,6 @@ while (t < 10000) {
|
|
|
7
6
|
t++;
|
|
8
7
|
}
|
|
9
8
|
*/
|
|
10
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
9
|
/*
|
|
12
10
|
|
|
13
11
|
To have a really small string representation, we have to hack some stuff
|
|
@@ -28,33 +26,29 @@ Rules for the string:
|
|
|
28
26
|
|
|
29
27
|
*/
|
|
30
28
|
// we use this because 39 is the quotes which causes problems
|
|
31
|
-
|
|
32
|
-
function getCharOfLevel(level) {
|
|
33
|
-
|
|
29
|
+
export const CHAR_CODE_OFFSET = 40; // String.fromCharCode(33) === ')'
|
|
30
|
+
export function getCharOfLevel(level) {
|
|
31
|
+
const charCode = CHAR_CODE_OFFSET + level;
|
|
34
32
|
return String.fromCharCode(charCode);
|
|
35
33
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return charCode - exports.CHAR_CODE_OFFSET;
|
|
34
|
+
export function getNumberOfChar(char) {
|
|
35
|
+
const charCode = char.charCodeAt(0);
|
|
36
|
+
return charCode - CHAR_CODE_OFFSET;
|
|
40
37
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
var charCode = exports.CHAR_CODE_OFFSET + value;
|
|
38
|
+
export function getCharOfValue(value) {
|
|
39
|
+
const charCode = CHAR_CODE_OFFSET + value;
|
|
44
40
|
return String.fromCharCode(charCode);
|
|
45
41
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
function getNextCharId(lastCode) {
|
|
42
|
+
export const FIRST_CHAR_CODE_FOR_ID = 97; // String.fromCharCode(97) === 'a'
|
|
43
|
+
export function getNextCharId(lastCode) {
|
|
49
44
|
// jump these codes because they look strange
|
|
50
45
|
if (lastCode >= 128 && lastCode <= 160) {
|
|
51
46
|
lastCode = 161;
|
|
52
47
|
}
|
|
53
|
-
|
|
48
|
+
const char = String.fromCharCode(lastCode);
|
|
54
49
|
return {
|
|
55
|
-
char
|
|
50
|
+
char,
|
|
56
51
|
nextCode: lastCode + 1
|
|
57
52
|
};
|
|
58
53
|
}
|
|
59
|
-
exports.getNextCharId = getNextCharId;
|
|
60
54
|
//# sourceMappingURL=string-format.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-format.js","sourceRoot":"","sources":["../../../src/minimal-string/string-format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"string-format.js","sourceRoot":"","sources":["../../../src/minimal-string/string-format.ts"],"names":[],"mappings":"AAAA;;;;;;;EAOE;AAEF;;;;;;;;;;;;;;;;;;EAkBE;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC,CAAC,kCAAkC;AAGtE,MAAM,UAAU,cAAc,CAAC,KAAa;IACxC,MAAM,QAAQ,GAAG,gBAAgB,GAAG,KAAK,CAAC;IAC1C,OAAO,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,QAAQ,GAAG,gBAAgB,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IACxC,MAAM,QAAQ,GAAG,gBAAgB,GAAG,KAAK,CAAC;IAC1C,OAAO,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAGD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC,CAAC,kCAAkC;AAE5E,MAAM,UAAU,aAAa,CAAC,QAAgB;IAK1C,6CAA6C;IAC7C,IAAI,QAAQ,IAAI,GAAG,IAAI,QAAQ,IAAI,GAAG,EAAE;QACpC,QAAQ,GAAG,GAAG,CAAC;KAClB;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC3C,OAAO;QACH,IAAI;QACJ,QAAQ,EAAE,QAAQ,GAAG,CAAC;KACzB,CAAC;AACN,CAAC"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { TruthTable } from './types';
|
|
1
|
+
import type { TruthTable } from './types';
|
|
2
2
|
import { RootNode } from './root-node';
|
|
3
3
|
/**
|
|
4
4
|
* a function that is called each time
|
|
5
5
|
* a 'better' bdd was found
|
|
6
6
|
*/
|
|
7
|
-
export
|
|
7
|
+
export type OptmisiationCallback = (bdd: OptimisationResult) => void;
|
|
8
8
|
export interface OptimisationResult {
|
|
9
9
|
bdd: RootNode;
|
|
10
10
|
truthTable: TruthTable;
|
|
11
11
|
}
|
|
12
|
-
export
|
|
12
|
+
export type CompareResultsFunction = (a: RootNode, b: RootNode) => RootNode | Promise<RootNode>;
|
|
13
13
|
/**
|
|
14
14
|
* returns the bdd with less nodes
|
|
15
15
|
*/
|
|
@@ -28,10 +28,10 @@ export interface OptimizeBruteForceInput {
|
|
|
28
28
|
* and checking the resulting bdd
|
|
29
29
|
*/
|
|
30
30
|
export declare function optimizeBruteForce({ truthTable, iterations, onBetterBdd, compareResults, afterBddCreation, log }: OptimizeBruteForceInput): Promise<OptimisationResult>;
|
|
31
|
-
export
|
|
31
|
+
export type BooleanFunctionReorderMapping = {
|
|
32
32
|
[indexAfter: number]: number;
|
|
33
33
|
};
|
|
34
|
-
export
|
|
34
|
+
export type BooleanFunctionReorderMappingReverse = {
|
|
35
35
|
[indexBefore: number]: number;
|
|
36
36
|
};
|
|
37
37
|
export declare function shuffleBooleanOrdering(truthTable: TruthTable): {
|
|
@@ -1,74 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
var __values = (this && this.__values) || function(o) {
|
|
39
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
40
|
-
if (m) return m.call(o);
|
|
41
|
-
if (o && typeof o.length === "number") return {
|
|
42
|
-
next: function () {
|
|
43
|
-
if (o && i >= o.length) o = void 0;
|
|
44
|
-
return { value: o && o[i++], done: !o };
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
48
|
-
};
|
|
49
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
50
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
51
|
-
if (!m) return o;
|
|
52
|
-
var i = m.call(o), r, ar = [], e;
|
|
53
|
-
try {
|
|
54
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
55
|
-
}
|
|
56
|
-
catch (error) { e = { error: error }; }
|
|
57
|
-
finally {
|
|
58
|
-
try {
|
|
59
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
60
|
-
}
|
|
61
|
-
finally { if (e) throw e.error; }
|
|
62
|
-
}
|
|
63
|
-
return ar;
|
|
64
|
-
};
|
|
65
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
66
|
-
var create_bdd_from_truth_table_1 = require("./create-bdd-from-truth-table");
|
|
67
|
-
var util_1 = require("./util");
|
|
1
|
+
import { createBddFromTruthTable } from './create-bdd-from-truth-table';
|
|
2
|
+
import { firstKeyOfMap, shuffleArray, lastOfArray } from './util';
|
|
68
3
|
/**
|
|
69
4
|
* returns the bdd with less nodes
|
|
70
5
|
*/
|
|
71
|
-
|
|
6
|
+
export const defaultCompareResults = function (a, b) {
|
|
72
7
|
if (a.countNodes() <= b.countNodes()) {
|
|
73
8
|
return a;
|
|
74
9
|
}
|
|
@@ -81,156 +16,117 @@ exports.defaultCompareResults = function (a, b) {
|
|
|
81
16
|
* by randomly sorting the array
|
|
82
17
|
* and checking the resulting bdd
|
|
83
18
|
*/
|
|
84
|
-
function optimizeBruteForce(
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
.forEach(function (level) {
|
|
121
|
-
var newLevel = shuffledOrdering.mappingBeforeToAfter[level];
|
|
122
|
-
newSortedLevels.push(newLevel);
|
|
123
|
-
var levelSet = new Set();
|
|
124
|
-
newNodesByLevel.set(newLevel, levelSet);
|
|
125
|
-
nextBdd.getNodesOfLevel(level).forEach(function (node) {
|
|
126
|
-
node.level = newLevel;
|
|
127
|
-
levelSet.add(node);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
lastLevelSet = new Set();
|
|
131
|
-
nextBdd.getNodesOfLevel(lastLevel).forEach(function (node) { return lastLevelSet.add(node); });
|
|
132
|
-
newNodesByLevel.set(lastLevel, lastLevelSet);
|
|
133
|
-
newSortedLevels.push(lastLevel);
|
|
134
|
-
nextBdd.nodesByLevel = newNodesByLevel;
|
|
135
|
-
nextBdd.levels = newSortedLevels;
|
|
136
|
-
afterBddCreation(nextBdd);
|
|
137
|
-
nextBdd.minimize();
|
|
138
|
-
if (log) {
|
|
139
|
-
console.log('got new bdd with nodes amount of ' + nextBdd.countNodes());
|
|
140
|
-
// nextBdd.log();
|
|
141
|
-
console.dir(shuffledOrdering.mappingBeforeToAfter);
|
|
142
|
-
}
|
|
143
|
-
return [4 /*yield*/, compareResults(currentBestResult.bdd, nextBdd)];
|
|
144
|
-
case 1:
|
|
145
|
-
betterBdd = _a.sent();
|
|
146
|
-
if (betterBdd.type !== 'RootNode') {
|
|
147
|
-
throw new Error('compareResults did not return a bdd');
|
|
148
|
-
}
|
|
149
|
-
if (betterBdd === nextBdd) {
|
|
150
|
-
if (log) {
|
|
151
|
-
console.log('#'.repeat(50));
|
|
152
|
-
console.log('found better bdd ' + nextBdd.countNodes());
|
|
153
|
-
}
|
|
154
|
-
currentBestResult = {
|
|
155
|
-
bdd: nextBdd,
|
|
156
|
-
truthTable: shuffledOrdering.newTable
|
|
157
|
-
};
|
|
158
|
-
onBetterBdd(currentBestResult);
|
|
159
|
-
}
|
|
160
|
-
return [2 /*return*/];
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
};
|
|
164
|
-
_g.label = 1;
|
|
165
|
-
case 1:
|
|
166
|
-
if (!(t < iterations)) return [3 /*break*/, 3];
|
|
167
|
-
return [5 /*yield**/, _loop_1()];
|
|
168
|
-
case 2:
|
|
169
|
-
_g.sent();
|
|
170
|
-
return [3 /*break*/, 1];
|
|
171
|
-
case 3: return [2 /*return*/, currentBestResult];
|
|
172
|
-
}
|
|
19
|
+
export async function optimizeBruteForce({ truthTable, iterations = Infinity, onBetterBdd = () => null, compareResults = defaultCompareResults, afterBddCreation = () => null, log = false }) {
|
|
20
|
+
const initialBdd = createBddFromTruthTable(truthTable);
|
|
21
|
+
afterBddCreation(initialBdd);
|
|
22
|
+
initialBdd.minimize();
|
|
23
|
+
let currentBestResult = {
|
|
24
|
+
truthTable,
|
|
25
|
+
bdd: initialBdd
|
|
26
|
+
};
|
|
27
|
+
if (log) {
|
|
28
|
+
initialBdd.log();
|
|
29
|
+
console.log('initial nodes amount: ' + initialBdd.countNodes());
|
|
30
|
+
}
|
|
31
|
+
let t = 0;
|
|
32
|
+
while (t < iterations) {
|
|
33
|
+
t++;
|
|
34
|
+
if (log) {
|
|
35
|
+
console.log('-'.repeat(50));
|
|
36
|
+
console.log('optimizeBruteForce() itterate once');
|
|
37
|
+
}
|
|
38
|
+
const shuffledOrdering = shuffleBooleanOrdering(truthTable);
|
|
39
|
+
const nextBdd = createBddFromTruthTable(shuffledOrdering.newTable);
|
|
40
|
+
// change the levels of each node
|
|
41
|
+
const newNodesByLevel = new Map();
|
|
42
|
+
const lastLevel = lastOfArray(nextBdd.getLevels());
|
|
43
|
+
const newSortedLevels = [];
|
|
44
|
+
nextBdd.getLevels()
|
|
45
|
+
.filter(level => level !== lastLevel)
|
|
46
|
+
.forEach(level => {
|
|
47
|
+
const newLevel = shuffledOrdering.mappingBeforeToAfter[level];
|
|
48
|
+
newSortedLevels.push(newLevel);
|
|
49
|
+
const levelSet = new Set();
|
|
50
|
+
newNodesByLevel.set(newLevel, levelSet);
|
|
51
|
+
nextBdd.getNodesOfLevel(level).forEach(node => {
|
|
52
|
+
node.level = newLevel;
|
|
53
|
+
levelSet.add(node);
|
|
54
|
+
});
|
|
173
55
|
});
|
|
174
|
-
|
|
56
|
+
const lastLevelSet = new Set();
|
|
57
|
+
nextBdd.getNodesOfLevel(lastLevel).forEach(node => lastLevelSet.add(node));
|
|
58
|
+
newNodesByLevel.set(lastLevel, lastLevelSet);
|
|
59
|
+
newSortedLevels.push(lastLevel);
|
|
60
|
+
nextBdd.nodesByLevel = newNodesByLevel;
|
|
61
|
+
nextBdd.levels = newSortedLevels;
|
|
62
|
+
afterBddCreation(nextBdd);
|
|
63
|
+
nextBdd.minimize();
|
|
64
|
+
if (log) {
|
|
65
|
+
console.log('got new bdd with nodes amount of ' + nextBdd.countNodes());
|
|
66
|
+
// nextBdd.log();
|
|
67
|
+
console.dir(shuffledOrdering.mappingBeforeToAfter);
|
|
68
|
+
}
|
|
69
|
+
const betterBdd = await compareResults(currentBestResult.bdd, nextBdd);
|
|
70
|
+
if (betterBdd.type !== 'RootNode') {
|
|
71
|
+
throw new Error('compareResults did not return a bdd');
|
|
72
|
+
}
|
|
73
|
+
if (betterBdd === nextBdd) {
|
|
74
|
+
if (log) {
|
|
75
|
+
console.log('#'.repeat(50));
|
|
76
|
+
console.log('found better bdd ' + nextBdd.countNodes());
|
|
77
|
+
}
|
|
78
|
+
currentBestResult = {
|
|
79
|
+
bdd: nextBdd,
|
|
80
|
+
truthTable: shuffledOrdering.newTable
|
|
81
|
+
};
|
|
82
|
+
onBetterBdd(currentBestResult);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return currentBestResult;
|
|
175
86
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
var mappingBeforeToAfter = {};
|
|
184
|
-
shuffled.forEach(function (indexBefore, indexAfter) {
|
|
87
|
+
export function shuffleBooleanOrdering(truthTable) {
|
|
88
|
+
const firstKey = firstKeyOfMap(truthTable);
|
|
89
|
+
const arrayWithIndexes = getArrayWithIndexes(firstKey.length);
|
|
90
|
+
const shuffled = shuffleArray(arrayWithIndexes);
|
|
91
|
+
const mapping = {};
|
|
92
|
+
const mappingBeforeToAfter = {};
|
|
93
|
+
shuffled.forEach((indexBefore, indexAfter) => {
|
|
185
94
|
mapping[indexAfter] = indexBefore;
|
|
186
95
|
mappingBeforeToAfter[indexBefore] = indexAfter;
|
|
187
96
|
});
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
var newKey = changeKeyOrder(key, mapping);
|
|
193
|
-
newTable.set(newKey, value);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
197
|
-
finally {
|
|
198
|
-
try {
|
|
199
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
200
|
-
}
|
|
201
|
-
finally { if (e_1) throw e_1.error; }
|
|
97
|
+
const newTable = new Map();
|
|
98
|
+
for (const [key, value] of truthTable.entries()) {
|
|
99
|
+
const newKey = changeKeyOrder(key, mapping);
|
|
100
|
+
newTable.set(newKey, value);
|
|
202
101
|
}
|
|
203
102
|
return {
|
|
204
|
-
newTable
|
|
205
|
-
mapping
|
|
206
|
-
mappingBeforeToAfter
|
|
103
|
+
newTable,
|
|
104
|
+
mapping,
|
|
105
|
+
mappingBeforeToAfter
|
|
207
106
|
};
|
|
208
107
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
var chars = oldKey
|
|
108
|
+
export function changeKeyOrder(oldKey, mappingBeforeToAfter) {
|
|
109
|
+
const chars = oldKey
|
|
212
110
|
.split('')
|
|
213
|
-
.map(
|
|
111
|
+
.map((char, indexBefore) => {
|
|
214
112
|
return {
|
|
215
|
-
char
|
|
216
|
-
indexBefore
|
|
113
|
+
char,
|
|
114
|
+
indexBefore,
|
|
217
115
|
indexAfter: mappingBeforeToAfter[indexBefore]
|
|
218
116
|
};
|
|
219
117
|
})
|
|
220
|
-
.sort(
|
|
221
|
-
.map(
|
|
118
|
+
.sort((a, b) => a.indexAfter - b.indexAfter)
|
|
119
|
+
.map(charObj => charObj.char)
|
|
222
120
|
.join('');
|
|
223
121
|
return chars;
|
|
224
122
|
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
var last = 0;
|
|
123
|
+
export function getArrayWithIndexes(size) {
|
|
124
|
+
const ret = [];
|
|
125
|
+
let last = 0;
|
|
229
126
|
while (last < size) {
|
|
230
127
|
ret.push(last);
|
|
231
128
|
last++;
|
|
232
129
|
}
|
|
233
130
|
return ret;
|
|
234
131
|
}
|
|
235
|
-
exports.getArrayWithIndexes = getArrayWithIndexes;
|
|
236
132
|
//# sourceMappingURL=optimize-brute-force.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimize-brute-force.js","sourceRoot":"","sources":["../../src/optimize-brute-force.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"optimize-brute-force.js","sourceRoot":"","sources":["../../src/optimize-brute-force.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/parents.d.ts
CHANGED
package/dist/lib/parents.js
CHANGED
|
@@ -1,68 +1,38 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __values = (this && this.__values) || function(o) {
|
|
3
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
4
|
-
if (m) return m.call(o);
|
|
5
|
-
if (o && typeof o.length === "number") return {
|
|
6
|
-
next: function () {
|
|
7
|
-
if (o && i >= o.length) o = void 0;
|
|
8
|
-
return { value: o && o[i++], done: !o };
|
|
9
|
-
}
|
|
10
|
-
};
|
|
11
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
12
|
-
};
|
|
13
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
1
|
/**
|
|
15
2
|
* represents the parents of a single node
|
|
16
3
|
*/
|
|
17
|
-
|
|
18
|
-
|
|
4
|
+
export class Parents {
|
|
5
|
+
constructor(node) {
|
|
19
6
|
this.node = node;
|
|
20
7
|
this.parents = new Set();
|
|
21
8
|
}
|
|
22
|
-
|
|
9
|
+
remove(node) {
|
|
23
10
|
this.parents.delete(node);
|
|
24
11
|
if (this.parents.size === 0) {
|
|
25
12
|
this.node.remove();
|
|
26
13
|
}
|
|
27
|
-
}
|
|
28
|
-
|
|
14
|
+
}
|
|
15
|
+
getAll() {
|
|
29
16
|
return Array.from(this.parents);
|
|
30
|
-
}
|
|
31
|
-
|
|
17
|
+
}
|
|
18
|
+
add(node) {
|
|
32
19
|
if (this.node.level === node.level) {
|
|
33
20
|
throw new Error('a node cannot be parent of a node with the same level');
|
|
34
21
|
}
|
|
35
22
|
this.parents.add(node);
|
|
36
|
-
}
|
|
37
|
-
|
|
23
|
+
}
|
|
24
|
+
has(node) {
|
|
38
25
|
return this.parents.has(node);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
for (var _b = __values(this.parents), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
45
|
-
var parent_1 = _c.value;
|
|
46
|
-
ret.push(parent_1.id);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
50
|
-
finally {
|
|
51
|
-
try {
|
|
52
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
53
|
-
}
|
|
54
|
-
finally { if (e_1) throw e_1.error; }
|
|
26
|
+
}
|
|
27
|
+
toString() {
|
|
28
|
+
const ret = [];
|
|
29
|
+
for (const parent of this.parents) {
|
|
30
|
+
ret.push(parent.id);
|
|
55
31
|
}
|
|
56
32
|
return ret.join(', ');
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
enumerable: true,
|
|
63
|
-
configurable: true
|
|
64
|
-
});
|
|
65
|
-
return Parents;
|
|
66
|
-
}());
|
|
67
|
-
exports.Parents = Parents;
|
|
33
|
+
}
|
|
34
|
+
get size() {
|
|
35
|
+
return this.parents.size;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
68
38
|
//# sourceMappingURL=parents.js.map
|
package/dist/lib/parents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parents.js","sourceRoot":"","sources":["../../src/parents.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parents.js","sourceRoot":"","sources":["../../src/parents.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,OAAO,OAAO;IAIhB,YACW,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;QAHpB,YAAO,GAAqB,IAAI,GAAG,EAAE,CAAC;IAI1C,CAAC;IAEE,MAAM,CAAC,IAAiB;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;SACtB;IACL,CAAC;IAEM,MAAM;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAEM,GAAG,CAAC,IAAiB;QACxB,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;SAC5E;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAEM,GAAG,CAAC,IAAiB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ;QACJ,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAC/B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACvB;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;CACJ"}
|
package/dist/lib/root-node.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AbstractNode } from './abstract-node';
|
|
2
2
|
import { Branches } from './branches';
|
|
3
|
-
import { NonRootNode, ResolverFunctions, SimpleBdd } from './types';
|
|
3
|
+
import type { NonRootNode, ResolverFunctions, SimpleBdd } from './types';
|
|
4
4
|
import { LeafNode } from './leaf-node';
|
|
5
5
|
export declare class RootNode extends AbstractNode {
|
|
6
6
|
branches: Branches;
|