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.
Files changed (192) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +211 -31
  3. package/dist/cjs/src/abstract-node.js +7 -4
  4. package/dist/cjs/src/abstract-node.js.map +1 -1
  5. package/dist/cjs/src/branches.d.ts +4 -1
  6. package/dist/cjs/src/branches.js +10 -9
  7. package/dist/cjs/src/branches.js.map +1 -1
  8. package/dist/cjs/src/create-bdd-from-truth-table.js +1 -2
  9. package/dist/cjs/src/create-bdd-from-truth-table.js.map +1 -1
  10. package/dist/cjs/src/ensure-correct-bdd.js +2 -3
  11. package/dist/cjs/src/ensure-correct-bdd.js.map +1 -1
  12. package/dist/cjs/src/fill-truth-table.js +1 -2
  13. package/dist/cjs/src/fill-truth-table.js.map +1 -1
  14. package/dist/cjs/src/find-similar-node.js +1 -2
  15. package/dist/cjs/src/find-similar-node.js.map +1 -1
  16. package/dist/cjs/src/index.d.ts +2 -1
  17. package/dist/cjs/src/index.es5.js +17 -7
  18. package/dist/cjs/src/index.es5.js.map +1 -1
  19. package/dist/cjs/src/index.js +2 -1
  20. package/dist/cjs/src/index.js.map +1 -1
  21. package/dist/cjs/src/internal-node.js +6 -3
  22. package/dist/cjs/src/internal-node.js.map +1 -1
  23. package/dist/cjs/src/optimize-brute-force.js +10 -12
  24. package/dist/cjs/src/optimize-brute-force.js.map +1 -1
  25. package/dist/cjs/src/ordering/build-bdd.d.ts +13 -0
  26. package/dist/cjs/src/ordering/build-bdd.js +64 -0
  27. package/dist/cjs/src/ordering/build-bdd.js.map +1 -0
  28. package/dist/cjs/src/ordering/dense-truth-table.d.ts +42 -0
  29. package/dist/cjs/src/ordering/dense-truth-table.js +125 -0
  30. package/dist/cjs/src/ordering/dense-truth-table.js.map +1 -0
  31. package/dist/cjs/src/ordering/exact-cost-ordering.d.ts +91 -0
  32. package/dist/cjs/src/ordering/exact-cost-ordering.js +351 -0
  33. package/dist/cjs/src/ordering/exact-cost-ordering.js.map +1 -0
  34. package/dist/cjs/src/ordering/exact-ordering.d.ts +89 -0
  35. package/dist/cjs/src/ordering/exact-ordering.js +260 -0
  36. package/dist/cjs/src/ordering/exact-ordering.js.map +1 -0
  37. package/dist/cjs/src/ordering/index.d.ts +22 -0
  38. package/dist/cjs/src/ordering/index.js +38 -0
  39. package/dist/cjs/src/ordering/index.js.map +1 -0
  40. package/dist/cjs/src/ordering/int-pair-map.d.ts +20 -0
  41. package/dist/cjs/src/ordering/int-pair-map.js +85 -0
  42. package/dist/cjs/src/ordering/int-pair-map.js.map +1 -0
  43. package/dist/cjs/src/ordering/local-search.d.ts +114 -0
  44. package/dist/cjs/src/ordering/local-search.js +317 -0
  45. package/dist/cjs/src/ordering/local-search.js.map +1 -0
  46. package/dist/cjs/src/ordering/optimize-ordering.d.ts +153 -0
  47. package/dist/cjs/src/ordering/optimize-ordering.js +406 -0
  48. package/dist/cjs/src/ordering/optimize-ordering.js.map +1 -0
  49. package/dist/cjs/src/ordering/ordering-evaluator.d.ts +198 -0
  50. package/dist/cjs/src/ordering/ordering-evaluator.js +384 -0
  51. package/dist/cjs/src/ordering/ordering-evaluator.js.map +1 -0
  52. package/dist/cjs/src/ordering/shared-diagram.d.ts +85 -0
  53. package/dist/cjs/src/ordering/shared-diagram.js +295 -0
  54. package/dist/cjs/src/ordering/shared-diagram.js.map +1 -0
  55. package/dist/cjs/src/packed/index.d.ts +2 -0
  56. package/dist/cjs/src/{minimal-string → packed}/index.js +2 -5
  57. package/dist/cjs/src/packed/index.js.map +1 -0
  58. package/dist/cjs/src/packed/packed-bdd-base64-string.d.ts +3 -0
  59. package/dist/cjs/src/packed/packed-bdd-base64-string.js +46 -0
  60. package/dist/cjs/src/packed/packed-bdd-base64-string.js.map +1 -0
  61. package/dist/cjs/src/packed/packed-bdd.d.ts +13 -0
  62. package/dist/cjs/src/packed/packed-bdd.js +70 -0
  63. package/dist/cjs/src/packed/packed-bdd.js.map +1 -0
  64. package/dist/cjs/src/root-node.d.ts +1 -2
  65. package/dist/cjs/src/root-node.js +4 -9
  66. package/dist/cjs/src/root-node.js.map +1 -1
  67. package/dist/cjs/src/types.d.ts +0 -12
  68. package/dist/cjs/src/util.js +29 -21
  69. package/dist/cjs/src/util.js.map +1 -1
  70. package/dist/esm/src/abstract-node.js +7 -4
  71. package/dist/esm/src/abstract-node.js.map +1 -1
  72. package/dist/esm/src/branches.d.ts +4 -1
  73. package/dist/esm/src/branches.js +8 -7
  74. package/dist/esm/src/branches.js.map +1 -1
  75. package/dist/esm/src/create-bdd-from-truth-table.js.map +1 -1
  76. package/dist/esm/src/index.d.ts +2 -1
  77. package/dist/esm/src/index.js +2 -1
  78. package/dist/esm/src/index.js.map +1 -1
  79. package/dist/esm/src/internal-node.js +7 -4
  80. package/dist/esm/src/internal-node.js.map +1 -1
  81. package/dist/esm/src/optimize-brute-force.js +5 -7
  82. package/dist/esm/src/optimize-brute-force.js.map +1 -1
  83. package/dist/esm/src/ordering/build-bdd.d.ts +13 -0
  84. package/dist/esm/src/ordering/build-bdd.js +61 -0
  85. package/dist/esm/src/ordering/build-bdd.js.map +1 -0
  86. package/dist/esm/src/ordering/dense-truth-table.d.ts +42 -0
  87. package/dist/esm/src/ordering/dense-truth-table.js +117 -0
  88. package/dist/esm/src/ordering/dense-truth-table.js.map +1 -0
  89. package/dist/esm/src/ordering/exact-cost-ordering.d.ts +91 -0
  90. package/dist/esm/src/ordering/exact-cost-ordering.js +347 -0
  91. package/dist/esm/src/ordering/exact-cost-ordering.js.map +1 -0
  92. package/dist/esm/src/ordering/exact-ordering.d.ts +89 -0
  93. package/dist/esm/src/ordering/exact-ordering.js +256 -0
  94. package/dist/esm/src/ordering/exact-ordering.js.map +1 -0
  95. package/dist/esm/src/ordering/index.d.ts +22 -0
  96. package/dist/esm/src/ordering/index.js +17 -0
  97. package/dist/esm/src/ordering/index.js.map +1 -0
  98. package/dist/esm/src/ordering/int-pair-map.d.ts +20 -0
  99. package/dist/esm/src/ordering/int-pair-map.js +81 -0
  100. package/dist/esm/src/ordering/int-pair-map.js.map +1 -0
  101. package/dist/esm/src/ordering/local-search.d.ts +114 -0
  102. package/dist/esm/src/ordering/local-search.js +308 -0
  103. package/dist/esm/src/ordering/local-search.js.map +1 -0
  104. package/dist/esm/src/ordering/optimize-ordering.d.ts +153 -0
  105. package/dist/esm/src/ordering/optimize-ordering.js +399 -0
  106. package/dist/esm/src/ordering/optimize-ordering.js.map +1 -0
  107. package/dist/esm/src/ordering/ordering-evaluator.d.ts +198 -0
  108. package/dist/esm/src/ordering/ordering-evaluator.js +377 -0
  109. package/dist/esm/src/ordering/ordering-evaluator.js.map +1 -0
  110. package/dist/esm/src/ordering/shared-diagram.d.ts +85 -0
  111. package/dist/esm/src/ordering/shared-diagram.js +289 -0
  112. package/dist/esm/src/ordering/shared-diagram.js.map +1 -0
  113. package/dist/esm/src/packed/index.d.ts +2 -0
  114. package/dist/esm/src/packed/index.js +3 -0
  115. package/dist/esm/src/packed/index.js.map +1 -0
  116. package/dist/esm/src/packed/packed-bdd-base64-string.d.ts +3 -0
  117. package/dist/esm/src/packed/packed-bdd-base64-string.js +42 -0
  118. package/dist/esm/src/packed/packed-bdd-base64-string.js.map +1 -0
  119. package/dist/esm/src/packed/packed-bdd.d.ts +13 -0
  120. package/dist/esm/src/packed/packed-bdd.js +66 -0
  121. package/dist/esm/src/packed/packed-bdd.js.map +1 -0
  122. package/dist/esm/src/root-node.d.ts +1 -2
  123. package/dist/esm/src/root-node.js +5 -10
  124. package/dist/esm/src/root-node.js.map +1 -1
  125. package/dist/esm/src/types.d.ts +0 -12
  126. package/dist/esm/src/util.js +14 -5
  127. package/dist/esm/src/util.js.map +1 -1
  128. package/docs/variable-ordering.md +306 -0
  129. package/package.json +15 -12
  130. package/src/abstract-node.ts +7 -5
  131. package/src/branches.ts +9 -7
  132. package/src/create-bdd-from-truth-table.ts +1 -1
  133. package/src/index.ts +2 -1
  134. package/src/internal-node.ts +7 -4
  135. package/src/optimize-brute-force.ts +5 -7
  136. package/src/ordering/build-bdd.ts +70 -0
  137. package/src/ordering/dense-truth-table.ts +161 -0
  138. package/src/ordering/exact-cost-ordering.ts +425 -0
  139. package/src/ordering/exact-ordering.ts +317 -0
  140. package/src/ordering/index.ts +57 -0
  141. package/src/ordering/int-pair-map.ts +85 -0
  142. package/src/ordering/local-search.ts +369 -0
  143. package/src/ordering/optimize-ordering.ts +570 -0
  144. package/src/ordering/ordering-evaluator.ts +479 -0
  145. package/src/ordering/shared-diagram.ts +310 -0
  146. package/src/packed/index.ts +2 -0
  147. package/src/packed/packed-bdd-base64-string.ts +47 -0
  148. package/src/packed/packed-bdd.ts +98 -0
  149. package/src/root-node.ts +8 -17
  150. package/src/types.ts +0 -18
  151. package/src/util.ts +15 -6
  152. package/dist/cjs/src/minimal-string/bdd-to-minimal-string.d.ts +0 -8
  153. package/dist/cjs/src/minimal-string/bdd-to-minimal-string.js +0 -60
  154. package/dist/cjs/src/minimal-string/bdd-to-minimal-string.js.map +0 -1
  155. package/dist/cjs/src/minimal-string/bdd-to-simple-bdd.d.ts +0 -11
  156. package/dist/cjs/src/minimal-string/bdd-to-simple-bdd.js +0 -24
  157. package/dist/cjs/src/minimal-string/bdd-to-simple-bdd.js.map +0 -1
  158. package/dist/cjs/src/minimal-string/index.d.ts +0 -5
  159. package/dist/cjs/src/minimal-string/index.js.map +0 -1
  160. package/dist/cjs/src/minimal-string/minimal-string-to-simple-bdd.d.ts +0 -2
  161. package/dist/cjs/src/minimal-string/minimal-string-to-simple-bdd.js +0 -58
  162. package/dist/cjs/src/minimal-string/minimal-string-to-simple-bdd.js.map +0 -1
  163. package/dist/cjs/src/minimal-string/resolve-with-simple-bdd.d.ts +0 -2
  164. package/dist/cjs/src/minimal-string/resolve-with-simple-bdd.js +0 -21
  165. package/dist/cjs/src/minimal-string/resolve-with-simple-bdd.js.map +0 -1
  166. package/dist/cjs/src/minimal-string/string-format.d.ts +0 -9
  167. package/dist/cjs/src/minimal-string/string-format.js +0 -61
  168. package/dist/cjs/src/minimal-string/string-format.js.map +0 -1
  169. package/dist/esm/src/minimal-string/bdd-to-minimal-string.d.ts +0 -8
  170. package/dist/esm/src/minimal-string/bdd-to-minimal-string.js +0 -55
  171. package/dist/esm/src/minimal-string/bdd-to-minimal-string.js.map +0 -1
  172. package/dist/esm/src/minimal-string/bdd-to-simple-bdd.d.ts +0 -11
  173. package/dist/esm/src/minimal-string/bdd-to-simple-bdd.js +0 -19
  174. package/dist/esm/src/minimal-string/bdd-to-simple-bdd.js.map +0 -1
  175. package/dist/esm/src/minimal-string/index.d.ts +0 -5
  176. package/dist/esm/src/minimal-string/index.js +0 -6
  177. package/dist/esm/src/minimal-string/index.js.map +0 -1
  178. package/dist/esm/src/minimal-string/minimal-string-to-simple-bdd.d.ts +0 -2
  179. package/dist/esm/src/minimal-string/minimal-string-to-simple-bdd.js +0 -54
  180. package/dist/esm/src/minimal-string/minimal-string-to-simple-bdd.js.map +0 -1
  181. package/dist/esm/src/minimal-string/resolve-with-simple-bdd.d.ts +0 -2
  182. package/dist/esm/src/minimal-string/resolve-with-simple-bdd.js +0 -17
  183. package/dist/esm/src/minimal-string/resolve-with-simple-bdd.js.map +0 -1
  184. package/dist/esm/src/minimal-string/string-format.d.ts +0 -9
  185. package/dist/esm/src/minimal-string/string-format.js +0 -54
  186. package/dist/esm/src/minimal-string/string-format.js.map +0 -1
  187. package/src/minimal-string/bdd-to-minimal-string.ts +0 -72
  188. package/src/minimal-string/bdd-to-simple-bdd.ts +0 -31
  189. package/src/minimal-string/index.ts +0 -5
  190. package/src/minimal-string/minimal-string-to-simple-bdd.ts +0 -67
  191. package/src/minimal-string/resolve-with-simple-bdd.ts +0 -25
  192. package/src/minimal-string/string-format.ts +0 -67
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dense-truth-table.js","sourceRoot":"","sources":["../../../../src/ordering/dense-truth-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import type { DenseTruthTable } from './dense-truth-table.js';
2
+ import { CostModel } from './ordering-evaluator.js';
3
+ export interface ExactCostOrderingOptions {
4
+ /**
5
+ * The search stops without a proof when more states were expanded.
6
+ * Default: 200000
7
+ */
8
+ maxExpansions?: number;
9
+ /**
10
+ * The search stops without a proof when the stored states reference
11
+ * more rows in total (memory protection).
12
+ * Default: 2^25
13
+ */
14
+ maxStoredRows?: number;
15
+ /**
16
+ * A known good ordering. Its expected cost is used as upper bound to prune the search.
17
+ */
18
+ upperBoundOrdering?: ArrayLike<number>;
19
+ /**
20
+ * Only orderings with a lower expected cost than this are searched for.
21
+ */
22
+ upperBound?: number;
23
+ log?: (message: string) => void;
24
+ }
25
+ export interface ExactCostOrderingResult {
26
+ /**
27
+ * true when it is proven that no ordering has a lower expected cost
28
+ * than the returned one (or than the upper bound, when ordering is null)
29
+ */
30
+ solved: boolean;
31
+ /**
32
+ * The best ordering that was found. Irrelevant boolean functions
33
+ * are always at the bottom. null when no ordering below the numeric
34
+ * upper bound exists and the upperBoundOrdering (if given) is not
35
+ * below it either.
36
+ */
37
+ ordering: number[] | null;
38
+ /** expected cost of one resolve() call with `ordering`, -1 when ordering is null */
39
+ expectedCost: number;
40
+ expansions: number;
41
+ generated: number;
42
+ }
43
+ /**
44
+ * Exact minimization of the expected cost of a resolve() call.
45
+ *
46
+ * A row pays the cost of a boolean function when its path through the BDD
47
+ * visits a node of that function, which happens exactly when the cofactor of
48
+ * the row with respect to the functions above still depends on that function.
49
+ * So like the amount of nodes, the expected cost decomposes over the lattice of
50
+ * variable subsets: the edge S -> S + {x} costs cost(x) times the weight of the
51
+ * rows whose cofactor with respect to S depends on x (the root level always
52
+ * pays, because the root node always calls its function).
53
+ *
54
+ * A state keeps the rows with positive weight grouped by their cofactor.
55
+ * Rows whose cofactor became constant never pay anything again and are dropped.
56
+ * The admissible estimate for the remaining cost sums, for every function x
57
+ * not yet placed, cost(x) times the weight of the rows that are sensitive to x
58
+ * (the value changes when only x is flipped), because such rows pay for x in
59
+ * every ordering.
60
+ */
61
+ export declare class ExactCostOrderingSearch {
62
+ private readonly table;
63
+ private readonly costModel;
64
+ private readonly diagram;
65
+ private readonly n;
66
+ /** natural indexes of the rows with positive weight, ascending */
67
+ private readonly activeRows;
68
+ private readonly activeWeights;
69
+ private readonly totalWeight;
70
+ /** sensitiveWeight[v] = weight of the active rows whose value changes when only v is flipped */
71
+ private readonly sensitiveWeight;
72
+ private readonly costs;
73
+ constructor(table: DenseTruthTable, costModel: CostModel, options?: {
74
+ maxDiagramNodes?: number;
75
+ });
76
+ normalizeOrdering(ordering: ArrayLike<number>): number[];
77
+ run(options?: ExactCostOrderingOptions): ExactCostOrderingResult;
78
+ /**
79
+ * lower bound for the remaining (unnormalized) cost below the subset
80
+ */
81
+ private estimate;
82
+ /**
83
+ * the weight of the rows that pay for `variable` when it is fixed next
84
+ */
85
+ private payingWeight;
86
+ /**
87
+ * fixes `variable` additionally: returns the new grouping of the rows
88
+ * that still have a non-constant cofactor
89
+ */
90
+ private transition;
91
+ }
@@ -0,0 +1,347 @@
1
+ import { naturalOrdering } from './dense-truth-table.js';
2
+ import { OrderingEvaluator, costTolerance, costUnit } from './ordering-evaluator.js';
3
+ import { SharedDiagram, StateHeap, DiagramBudgetExceededError, DEFAULT_MAX_DIAGRAM_NODES } from './shared-diagram.js';
4
+ /**
5
+ * Exact minimization of the expected cost of a resolve() call.
6
+ *
7
+ * A row pays the cost of a boolean function when its path through the BDD
8
+ * visits a node of that function, which happens exactly when the cofactor of
9
+ * the row with respect to the functions above still depends on that function.
10
+ * So like the amount of nodes, the expected cost decomposes over the lattice of
11
+ * variable subsets: the edge S -> S + {x} costs cost(x) times the weight of the
12
+ * rows whose cofactor with respect to S depends on x (the root level always
13
+ * pays, because the root node always calls its function).
14
+ *
15
+ * A state keeps the rows with positive weight grouped by their cofactor.
16
+ * Rows whose cofactor became constant never pay anything again and are dropped.
17
+ * The admissible estimate for the remaining cost sums, for every function x
18
+ * not yet placed, cost(x) times the weight of the rows that are sensitive to x
19
+ * (the value changes when only x is flipped), because such rows pay for x in
20
+ * every ordering.
21
+ */
22
+ export class ExactCostOrderingSearch {
23
+ table;
24
+ costModel;
25
+ diagram;
26
+ n;
27
+ /** natural indexes of the rows with positive weight, ascending */
28
+ activeRows;
29
+ activeWeights;
30
+ totalWeight;
31
+ /** sensitiveWeight[v] = weight of the active rows whose value changes when only v is flipped */
32
+ sensitiveWeight;
33
+ costs;
34
+ constructor(table, costModel, options = {}) {
35
+ this.table = table;
36
+ this.costModel = costModel;
37
+ if (table.dontCareTerminal >= 0) {
38
+ throw new Error('the exact search needs a truth table without don\'t-care rows, resolve them with OrderingEvaluator.complete() first');
39
+ }
40
+ this.diagram = new SharedDiagram(table, options.maxDiagramNodes === undefined ? DEFAULT_MAX_DIAGRAM_NODES : options.maxDiagramNodes);
41
+ this.n = table.variableCount;
42
+ this.costs = costModel.functionCosts;
43
+ const rowWeights = costModel.rowWeights;
44
+ let activeCount = 0;
45
+ for (let row = 0; row < table.rowCount; row++) {
46
+ if (rowWeights[row] > 0) {
47
+ activeCount++;
48
+ }
49
+ }
50
+ this.activeRows = new Int32Array(activeCount);
51
+ this.activeWeights = new Float64Array(activeCount);
52
+ let total = 0;
53
+ let index = 0;
54
+ for (let row = 0; row < table.rowCount; row++) {
55
+ if (rowWeights[row] > 0) {
56
+ this.activeRows[index] = row;
57
+ this.activeWeights[index] = rowWeights[row];
58
+ total += rowWeights[row];
59
+ index++;
60
+ }
61
+ }
62
+ this.totalWeight = total;
63
+ this.sensitiveWeight = new Float64Array(this.n);
64
+ const ids = table.terminalIds;
65
+ for (let v = 0; v < this.n; v++) {
66
+ const bit = 1 << (this.n - 1 - v);
67
+ let weight = 0;
68
+ for (let i = 0; i < activeCount; i++) {
69
+ const row = this.activeRows[i];
70
+ if (ids[row] !== ids[row ^ bit]) {
71
+ weight += this.activeWeights[i];
72
+ }
73
+ }
74
+ this.sensitiveWeight[v] = weight;
75
+ }
76
+ }
77
+ normalizeOrdering(ordering) {
78
+ return this.diagram.normalizeOrdering(ordering);
79
+ }
80
+ run(options = {}) {
81
+ const log = options.log ? options.log : () => null;
82
+ const maxExpansions = options.maxExpansions === undefined ? 200000 : options.maxExpansions;
83
+ const maxStoredRows = options.maxStoredRows === undefined ? Math.pow(2, 25) : options.maxStoredRows;
84
+ const diagram = this.diagram;
85
+ const relevant = diagram.relevant;
86
+ const m = relevant.length;
87
+ const total = this.totalWeight;
88
+ const costs = this.costs;
89
+ const irrelevant = diagram.irrelevantVariables();
90
+ // path costs are unnormalized (multiplied by the total weight), so is the tolerance unit
91
+ const unit = costUnit(this.costModel) * total;
92
+ const tolerance = (value) => costTolerance(value, unit);
93
+ /**
94
+ * Only costs below this threshold can beat the upper bound.
95
+ * Without an upper bound every finite cost can.
96
+ */
97
+ const pruneThreshold = (bound) => isFinite(bound) ? bound - tolerance(bound) : Infinity;
98
+ // upper bound, kept unnormalized (multiplied by the total weight) like the path costs
99
+ let upperBound = options.upperBound === undefined ? Infinity : options.upperBound * total;
100
+ let incumbent = null;
101
+ if (options.upperBoundOrdering) {
102
+ incumbent = this.normalizeOrdering(options.upperBoundOrdering);
103
+ const incumbentCost = new OrderingEvaluator(this.table, this.costModel).evaluate(incumbent).expectedCost * total;
104
+ if (incumbentCost >= pruneThreshold(upperBound)) {
105
+ incumbent = null;
106
+ }
107
+ else {
108
+ upperBound = incumbentCost;
109
+ }
110
+ }
111
+ const threshold = pruneThreshold(upperBound);
112
+ const result = (solved, ordering, cost, expansionCount, generatedCount) => ({
113
+ solved,
114
+ ordering,
115
+ expectedCost: ordering ? cost / total : -1,
116
+ expansions: expansionCount,
117
+ generated: generatedCount
118
+ });
119
+ if (diagram.overBudget) {
120
+ log('exact cost search: diagram budget exceeded');
121
+ return result(false, incumbent, upperBound, 0, 0);
122
+ }
123
+ if (m === 0) {
124
+ // constant function: only the root pays, so the cheapest function goes on top
125
+ const ordering = naturalOrdering(this.n).sort((a, b) => (costs[a] - costs[b]) || (a - b));
126
+ const cost = costs[ordering[0]] * total;
127
+ if (cost >= threshold) {
128
+ return result(true, incumbent, upperBound, 0, 0);
129
+ }
130
+ return result(true, ordering, cost, 0, 0);
131
+ }
132
+ const full = (1 << m) - 1;
133
+ const states = new Map();
134
+ const bestCost = new Map();
135
+ const parentVariable = new Map();
136
+ const closed = new Set();
137
+ const heap = new StateHeap();
138
+ const startRows = new Int32Array(this.activeRows.length);
139
+ for (let i = 0; i < startRows.length; i++) {
140
+ startRows[i] = i;
141
+ }
142
+ const startState = {
143
+ rows: startRows,
144
+ groupStart: Int32Array.of(0, startRows.length),
145
+ groupFunction: Int32Array.of(diagram.rootId),
146
+ groupWeight: Float64Array.of(total)
147
+ };
148
+ states.set(0, startState);
149
+ bestCost.set(0, 0);
150
+ heap.push(this.estimate(0), 0, 0);
151
+ let expansions = 0;
152
+ let generated = 1;
153
+ let storedRows = startRows.length;
154
+ let solvedSet = -1;
155
+ let solvedCost = -1;
156
+ try {
157
+ while (heap.size > 0) {
158
+ const state = heap.pop();
159
+ const currentCost = state.cost;
160
+ const subset = state.subset;
161
+ if (currentCost !== bestCost.get(subset) || closed.has(subset)) {
162
+ continue;
163
+ }
164
+ if (state.estimate >= threshold) {
165
+ break;
166
+ }
167
+ if (subset === full) {
168
+ solvedSet = subset;
169
+ solvedCost = currentCost;
170
+ break;
171
+ }
172
+ closed.add(subset);
173
+ expansions++;
174
+ if (expansions > maxExpansions) {
175
+ log('exact cost search: expansion budget exceeded');
176
+ return result(false, incumbent, upperBound, expansions, generated);
177
+ }
178
+ if (storedRows > maxStoredRows) {
179
+ log('exact cost search: memory budget exceeded');
180
+ return result(false, incumbent, upperBound, expansions, generated);
181
+ }
182
+ if (expansions % 10000 === 0) {
183
+ log('exact cost search: ' + expansions + ' states expanded, ' + generated + ' generated, ' + heap.size + ' open');
184
+ }
185
+ const grouped = states.get(subset);
186
+ for (let c = 0; c < m; c++) {
187
+ const bit = 1 << c;
188
+ if ((subset & bit) !== 0) {
189
+ continue;
190
+ }
191
+ const variable = relevant[c];
192
+ const nextSubset = subset | bit;
193
+ const payingWeight = subset === 0 ? total : this.payingWeight(grouped, variable);
194
+ const nextCost = currentCost + costs[variable] * payingWeight;
195
+ const knownCost = bestCost.get(nextSubset);
196
+ if (knownCost !== undefined && knownCost <= nextCost + tolerance(nextCost)) {
197
+ continue;
198
+ }
199
+ const estimate = nextCost + this.estimate(nextSubset);
200
+ if (estimate >= threshold) {
201
+ continue;
202
+ }
203
+ // the grouping of the rows is only needed when the state can be expanded
204
+ if (!states.has(nextSubset)) {
205
+ const next = this.transition(grouped, variable);
206
+ states.set(nextSubset, next);
207
+ generated++;
208
+ storedRows += next.rows.length;
209
+ }
210
+ bestCost.set(nextSubset, nextCost);
211
+ parentVariable.set(nextSubset, variable);
212
+ closed.delete(nextSubset);
213
+ heap.push(estimate, nextCost, nextSubset);
214
+ }
215
+ }
216
+ }
217
+ catch (err) {
218
+ if (err instanceof DiagramBudgetExceededError) {
219
+ log('exact cost search: diagram budget exceeded');
220
+ return result(false, incumbent, upperBound, expansions, generated);
221
+ }
222
+ throw err;
223
+ }
224
+ if (solvedSet === -1) {
225
+ return result(true, incumbent, upperBound, expansions, generated);
226
+ }
227
+ const reversed = [];
228
+ let remainingSubset = solvedSet;
229
+ while (remainingSubset !== 0) {
230
+ const variable = parentVariable.get(remainingSubset);
231
+ reversed.push(variable);
232
+ remainingSubset = remainingSubset & ~(1 << diagram.compactOf[variable]);
233
+ }
234
+ return result(true, reversed.reverse().concat(irrelevant), solvedCost, expansions, generated);
235
+ }
236
+ /**
237
+ * lower bound for the remaining (unnormalized) cost below the subset
238
+ */
239
+ estimate(subset) {
240
+ const relevant = this.diagram.relevant;
241
+ let estimate = 0;
242
+ for (let c = 0; c < relevant.length; c++) {
243
+ if ((subset & (1 << c)) === 0) {
244
+ const variable = relevant[c];
245
+ estimate += this.costs[variable] * this.sensitiveWeight[variable];
246
+ }
247
+ }
248
+ return estimate;
249
+ }
250
+ /**
251
+ * the weight of the rows that pay for `variable` when it is fixed next
252
+ */
253
+ payingWeight(grouped, variable) {
254
+ const diagram = this.diagram;
255
+ const bit = 1 << diagram.compactOf[variable];
256
+ let payingWeight = 0;
257
+ for (let g = 0; g < grouped.groupFunction.length; g++) {
258
+ if ((diagram.supportOf(grouped.groupFunction[g]) & bit) !== 0) {
259
+ payingWeight += grouped.groupWeight[g];
260
+ }
261
+ }
262
+ return payingWeight;
263
+ }
264
+ /**
265
+ * fixes `variable` additionally: returns the new grouping of the rows
266
+ * that still have a non-constant cofactor
267
+ */
268
+ transition(grouped, variable) {
269
+ const diagram = this.diagram;
270
+ const rowBit = 1 << (this.n - 1 - variable);
271
+ const groupCount = grouped.groupFunction.length;
272
+ const functions = [];
273
+ const rowLists = [];
274
+ for (let g = 0; g < groupCount; g++) {
275
+ const fn = grouped.groupFunction[g];
276
+ const start = grouped.groupStart[g];
277
+ const end = grouped.groupStart[g + 1];
278
+ const rows = grouped.rows.subarray(start, end);
279
+ if (!diagram.dependsOn(fn, variable)) {
280
+ functions.push(fn);
281
+ rowLists.push(rows);
282
+ continue;
283
+ }
284
+ const lo = diagram.restrict(fn, variable, 0);
285
+ const hi = diagram.restrict(fn, variable, 1);
286
+ let loCount = 0;
287
+ for (let i = 0; i < rows.length; i++) {
288
+ if ((this.activeRows[rows[i]] & rowBit) === 0) {
289
+ loCount++;
290
+ }
291
+ }
292
+ const loRows = new Int32Array(loCount);
293
+ const hiRows = new Int32Array(rows.length - loCount);
294
+ let loIndex = 0;
295
+ let hiIndex = 0;
296
+ for (let i = 0; i < rows.length; i++) {
297
+ if ((this.activeRows[rows[i]] & rowBit) === 0) {
298
+ loRows[loIndex++] = rows[i];
299
+ }
300
+ else {
301
+ hiRows[hiIndex++] = rows[i];
302
+ }
303
+ }
304
+ if (!diagram.isTerminal(lo) && loRows.length > 0) {
305
+ functions.push(lo);
306
+ rowLists.push(loRows);
307
+ }
308
+ if (!diagram.isTerminal(hi) && hiRows.length > 0) {
309
+ functions.push(hi);
310
+ rowLists.push(hiRows);
311
+ }
312
+ }
313
+ // merge the groups with equal cofactors
314
+ const order = functions.map((_fn, index) => index).sort((a, b) => (functions[a] - functions[b]) || (a - b));
315
+ let totalRows = 0;
316
+ rowLists.forEach(list => totalRows += list.length);
317
+ const mergedRows = new Int32Array(totalRows);
318
+ const groupStart = [0];
319
+ const groupFunction = [];
320
+ const groupWeight = [];
321
+ let position = 0;
322
+ let weight = 0;
323
+ for (let i = 0; i < order.length; i++) {
324
+ const fn = functions[order[i]];
325
+ const list = rowLists[order[i]];
326
+ mergedRows.set(list, position);
327
+ position += list.length;
328
+ for (let r = 0; r < list.length; r++) {
329
+ weight += this.activeWeights[list[r]];
330
+ }
331
+ if (i + 1 < order.length && functions[order[i + 1]] === fn) {
332
+ continue;
333
+ }
334
+ groupFunction.push(fn);
335
+ groupStart.push(position);
336
+ groupWeight.push(weight);
337
+ weight = 0;
338
+ }
339
+ return {
340
+ rows: mergedRows,
341
+ groupStart: Int32Array.from(groupStart),
342
+ groupFunction: Int32Array.from(groupFunction),
343
+ groupWeight: Float64Array.from(groupWeight)
344
+ };
345
+ }
346
+ }
347
+ //# sourceMappingURL=exact-cost-ordering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-cost-ordering.js","sourceRoot":"","sources":["../../../../src/ordering/exact-cost-ordering.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import type { DenseTruthTable } from './dense-truth-table.js';
2
+ export interface ExactOrderingOptions {
3
+ /**
4
+ * The search stops without a proof when more states were expanded.
5
+ * Default: 200000
6
+ */
7
+ maxExpansions?: number;
8
+ /**
9
+ * The search stops without a proof when the stored cofactor sets
10
+ * contain more entries in total (memory protection).
11
+ * Default: 2^25
12
+ */
13
+ maxCofactorEntries?: number;
14
+ /**
15
+ * A known good ordering. Its size is used as upper bound to prune the search,
16
+ * which makes the search much faster when the ordering is already close to optimal.
17
+ */
18
+ upperBoundOrdering?: ArrayLike<number>;
19
+ /**
20
+ * Only orderings with fewer internal nodes than this are searched for.
21
+ */
22
+ upperBound?: number;
23
+ log?: (message: string) => void;
24
+ }
25
+ export interface ExactOrderingResult {
26
+ /**
27
+ * true when it is proven that no ordering has fewer internal nodes
28
+ * than the returned one (or than the upper bound, when ordering is null)
29
+ */
30
+ solved: boolean;
31
+ /**
32
+ * The best ordering that was found. Irrelevant boolean functions
33
+ * are always at the bottom. null when no ordering below the numeric
34
+ * upper bound exists and the upperBoundOrdering (if given) is not
35
+ * below it either.
36
+ */
37
+ ordering: number[] | null;
38
+ /** amount of internal (non-leaf) nodes of `ordering`, -1 when ordering is null */
39
+ internalNodeCount: number;
40
+ /** amount of expanded states */
41
+ expansions: number;
42
+ /** amount of generated states */
43
+ generated: number;
44
+ }
45
+ /**
46
+ * The number of nodes on a level of a reduced BDD only depends on the SET of
47
+ * variables above that level, not on their order (Friedman & Supowit, 1990):
48
+ * it is the amount of distinct cofactors with respect to that set that still
49
+ * depend on the level's variable.
50
+ *
51
+ * Therefore the optimal ordering is a shortest path through the lattice of
52
+ * variable subsets, from the empty set to the full set, where the edge
53
+ * S -> S + {x} costs the amount of nodes that test x when exactly the
54
+ * variables of S are above it.
55
+ *
56
+ * This class finds that shortest path with an A* search. Each subset S is
57
+ * represented by the set of its distinct non-constant cofactors, which are
58
+ * nodes of one shared hash-consed diagram in the natural variable order
59
+ * (so equal functions always have equal ids). The admissible estimate for the
60
+ * remaining cost of a subset is the amount of its distinct non-constant
61
+ * cofactors: each of them needs its own node below.
62
+ *
63
+ * With a good upper bound (from the local search) the search typically only
64
+ * has to look at a tiny fraction of the 2^n subsets.
65
+ */
66
+ export declare class ExactOrderingSearch {
67
+ private readonly table;
68
+ private readonly diagram;
69
+ private readonly n;
70
+ private readonly terminalCount;
71
+ constructor(table: DenseTruthTable, options?: {
72
+ maxDiagramNodes?: number;
73
+ });
74
+ /**
75
+ * Moves the boolean functions the truth table does not depend on
76
+ * to the bottom. This never changes the amount of internal nodes
77
+ * but ensures the root node tests a relevant boolean function.
78
+ */
79
+ normalizeOrdering(ordering: ArrayLike<number>): number[];
80
+ run(options?: ExactOrderingOptions): ExactOrderingResult;
81
+ /**
82
+ * lower bound for the amount of nodes below the given subset
83
+ */
84
+ private estimate;
85
+ /**
86
+ * the distinct non-constant cofactors after additionally fixing `variable`
87
+ */
88
+ private cofactorsAfter;
89
+ }