Skip to content

Commit 2bce575

Browse files
committed
ADD test for bdd correctness
1 parent 961d9b5 commit 2bce575

File tree

2 files changed

+43
-15
lines changed

2 files changed

+43
-15
lines changed

javascript/src/bdd/bdd.generated.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
import type { StateResolveFunctionInput } from '../types/index.js';
88
import { stateResolveFunctionByIndex } from '../states/index.js';
99

10-
export const minimalBddString = '14a1b,c+d2e5f0g/h.i4j*k-l)m(n6oin8pjk8qmc8rmn8snm8tio4umq4vjp4wmr4xns4yeh6zmq6{is6|tx6}mr6~ns6nx6¡en6¢il6£nh6¤in6¥y£/¦z}/§{~/¨|/©uw/ªvw/«an/¬en/­bn/®¡n/¯cn/°kn/±¢£/²¤n/³jm/´yk0µac0¶ek0·bc0¸¥k0¹dg0º¡n0»«¯0¼¬°0½­c0¾fk0¿®n0À¸n,Á¦r,§s,ès,Ä©r,Ūr,ƽn,Ǿk,È¿n,ɱk,ʲn,˳m,̾´2Ízu2Î{|2Ͼº2йe2ÑÇÀ2ÒÁÄ2ÓÂÃ2Ô¹º2ÕÇÈ2ÖÍm5×Τ5Øum5Ùvj5ÚÒm5ÛÓÊ5ÜÄm5ÝÅË5ÞÌÑ+ßÖÚ+à×Û+áØÜ+âÙÝ+ãµ»+ä¶¼+å·Æ+æÏÕ+ç¢É+è¤Ê+éjË+êçÐ3ëmã3ìéä3íßã3îàÔ3ïáã3ðâä3ñêì7òíï7óîð7ôçé7õèé7öïå1÷ëå1øñÞ1ùòå1úóæ1û÷ö-ü÷ù-ýøú-þls-ÿôõ-Āln-āmü)Ăÿý)ăĀþ)ĄāĂ9ąmă9ĆĄû*ćąm*Ćć.';
10+
export const minimalBddString = '14a1b,c+d2e5f0g/h.i4j*k-l)m(n6obh9pce9qnh9rad9scm9tae9uan9vbf9wbe9xbn9ycg9zck9{cn9|nd9}ne9~nf9ng9¡nm9¢nk9£mh9¤mi9¥mj9¦mk9§ml9¨mn9©mc8ª¤{8«¥z8¬¨s8­¨n8®mn8¯¨¡8°¨m8±pz7²ª«7³{z7´­®7µ}n7¶¤¥7·¨m7¸wo6¹µ}6ºnq6»²¬6¼tu6½wx6¾´¯6¿µn6À®¯6Á¶§6·£6ö¨6Ä·¨6Åm¦6Æm¨6Ǥ¥5Ȩm5Ém©4Êm®4Ëǧ4ÌÈ£4ÍǬ4Îû4Ïȯ4Ðľ4Ñm¦4Òm¯4ÓÆÀ4Ôma3Õmn3ÖÉa3×Ên3ØËr3ÙÁt3ÚÌ|3Û¹3ÜÍr3Ýμ3ÞÏ|3ßп3àØÙ2áv¸2ây±2ãÚÛ2ä~º2åµ2æÜÝ2çv½2èy³2éz{2êÞß2ë~n2ìn2íÑÅ2îÒÓ2ï¢n2ðÔb1ñÕn1òÖb1ó×n1ôàá1õâz1öãä1÷æç1øèé1ùêë1úðc0ûñn0üòc0ýón0þmn0ÿÊn0Āôõ0āöå0Ă÷ø0ăùì0Ąíï0ąîï0Ćúû/ćüý/ĈĀā/ĉĂă/ĊÁÂ/ċÃÄ/Čúm.čüm.ĎĆm.ďćm.Đþm.đÿm.ǧ.ēð.ĔĈ§.ĕĉ°.ĖĄ§.ėą°.ĘÁ§.ęè.ĚĊ§.ěċ¨.Ĝŧ.ĝƨ.ĞČč-ğĎď-ĠĐđ-ġĒē-ĢĔĕ-ģĖė-ĤĘę-ĥĚě-ĦĜĝ-ħğĠ,ĨĢģ,ĩĥĦ,ĪĞħ+īġĨ+ĬĤĩ+ĭĪī)ĭĬ(';
1111

1212
let simpleBdd: SimpleBdd | undefined;
1313
export function getSimpleBdd() {

javascript/src/truth-table-generator/runner.node.ts

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import {
66
fillTruthTable,
77
optimizeBruteForce,
88
OptimisationResult,
9-
RootNode
9+
RootNode,
10+
resolveWithSimpleBdd,
11+
ResolverFunctions,
12+
booleanStringToBoolean,
13+
minimalStringToSimpleBdd
1014
} from 'binary-decision-diagram';
1115

1216
import type { StateActionIdMap } from './types.js';
@@ -33,6 +37,7 @@ import {
3337
getBetterBdd,
3438
getQualityOfBdd
3539
} from './calculate-bdd-quality.js';
40+
import { orderedStateList } from '../states/index.js';
3641

3742
/**
3843
* sort object attributes
@@ -48,6 +53,14 @@ export function sortObject<T>(obj: T): T {
4853
}), {}) as T;
4954
}
5055

56+
function loadTruthTable() {
57+
const truthTable: TruthTable = objectToMap(
58+
readJsonFile(OUTPUT_TRUTH_TABLE_PATH)
59+
);
60+
return truthTable;
61+
}
62+
63+
5164
const unknownValueActionId: number = 42;
5265

5366
async function run() {
@@ -109,11 +122,6 @@ async function run() {
109122
let totalAmountOfHandled = 0;
110123
let totalAmountOfOptimized = 0;
111124

112-
function loadTruthTable(): StateActionIdMap {
113-
return objectToMap(
114-
readJsonFile(OUTPUT_TRUTH_TABLE_PATH)
115-
);
116-
}
117125
let truthTable: StateActionIdMap = loadTruthTable();
118126
const startTruthTableEntries = truthTable.size;
119127

@@ -213,9 +221,7 @@ async function run() {
213221
case 'create-bdd':
214222
(async function createBdd() {
215223
console.log('read table..');
216-
const truthTable: TruthTable = objectToMap(
217-
readJsonFile(OUTPUT_TRUTH_TABLE_PATH)
218-
);
224+
const truthTable = loadTruthTable();
219225
console.log('table size: ' + truthTable.size);
220226

221227
// fill missing rows with unknown
@@ -226,6 +232,7 @@ async function run() {
226232
);
227233

228234
console.log('create bdd..');
235+
229236
const bdd = createBddFromTruthTable(truthTable);
230237
console.log('mimizing..');
231238
console.log('remove unkown states..');
@@ -248,9 +255,7 @@ async function run() {
248255
(async function optimizeBdd() {
249256
console.log('read table..');
250257
let lastBetterFoundTime = new Date().getTime();
251-
const truthTable: TruthTable = objectToMap(
252-
readJsonFile(OUTPUT_TRUTH_TABLE_PATH)
253-
);
258+
const truthTable = loadTruthTable();
254259
console.log('table size: ' + truthTable.size);
255260

256261
// fill missing rows with unknown
@@ -267,6 +272,12 @@ async function run() {
267272
console.dir(perfMeasurement);
268273

269274

275+
const resolvers: ResolverFunctions = {};
276+
new Array(orderedStateList.length).fill(0).forEach((_x, index) => {
277+
const fn = (state: string) => booleanStringToBoolean((state as any)[index]);
278+
resolvers[index] = fn;
279+
});
280+
270281
function getQuality(bdd: RootNode) {
271282
return getQualityOfBdd(
272283
bdd,
@@ -280,12 +291,29 @@ async function run() {
280291
truthTable,
281292
iterations: 10000000,
282293
afterBddCreation: (bdd: RootNode) => {
283-
284294
const lastBetterAgo = new Date().getTime() - lastBetterFoundTime;
285295
const lastBetterHours = lastBetterAgo / 1000 / 60 / 60;
286296
console.log('Last better bdd found ' + roundToTwoDecimals(lastBetterHours) + 'hours ago');
287-
288297
bdd.removeIrrelevantLeafNodes(unknownValueActionId);
298+
299+
// ensure correctness to have a double-check that the bdd works correctly
300+
const bddMinimalString = bddToMinimalString(bdd);
301+
const simpleBdd = minimalStringToSimpleBdd(bddMinimalString);
302+
for (const [key, value] of loadTruthTable().entries()) {
303+
const bddValue = resolveWithSimpleBdd(
304+
simpleBdd,
305+
resolvers,
306+
key
307+
);
308+
309+
if (value !== bddValue) {
310+
console.error('# Error: minimalBdd has different value compared to truth table ' + key);
311+
console.dir({ value, bddValue });
312+
process.exit(-1);
313+
}
314+
}
315+
316+
289317
if (currentBest) {
290318
console.log(
291319
'current best bdd has ' + currentBest.countNodes() + ' nodes ' +

0 commit comments

Comments
 (0)