Skip to content

Commit ae14ae4

Browse files
authored
Merge pull request #449 from pubkey/feature/optmize-parallel
ADD optimze in multiple cpous
2 parents fe3c97b + e73e2c1 commit ae14ae4

File tree

10 files changed

+107
-46
lines changed

10 files changed

+107
-46
lines changed

javascript/optimize-nohup.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#!/bin/bash
22
set -e
33

4-
nohup npm run optimize-bdd > optimize.nohup.out &
4+
nohup npm run optimize-parallel > optimize.nohup.out &

javascript/package.json

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,16 @@
5858
"iterative-fuzzing:5": "npm run iterative-fuzzing",
5959
"iterative-fuzzing:6": "npm run iterative-fuzzing",
6060
"iterative-fuzzing:7": "npm run iterative-fuzzing",
61-
"iterative-fuzzing:8": "npm run iterative-fuzzing"
61+
"iterative-fuzzing:8": "npm run iterative-fuzzing",
62+
"optimize-parallel": "npm-run-all --parallel optimize:*",
63+
"optimize:1": "npm run optimize-bdd",
64+
"optimize:2": "npm run optimize-bdd",
65+
"optimize:3": "npm run optimize-bdd",
66+
"optimize:4": "npm run optimize-bdd",
67+
"optimize:5": "npm run optimize-bdd",
68+
"optimize:6": "npm run optimize-bdd",
69+
"optimize:7": "npm run optimize-bdd",
70+
"optimize:8": "npm run optimize-bdd"
6271
},
6372
"author": "pubkey",
6473
"devDependencies": {
@@ -83,6 +92,6 @@
8392
},
8493
"dependencies": {
8594
"array-push-at-sort-position": "4.0.1",
86-
"binary-decision-diagram": "3.1.0"
95+
"binary-decision-diagram": "3.2.0"
8796
}
8897
}

javascript/src/actions/action-functions.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ export const removeExisting: ActionFunction<any> = (input) => {
7575
for (let i = 0; i < results.length; i++) {
7676
const item = results[i];
7777
// remove
78-
// console.dir(item);
7978
if (item[primary] === input.changeEvent.id) {
8079
results.splice(i, 1);
8180
break;

javascript/src/bdd/bdd.generated.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ import {
33
minimalStringToSimpleBdd,
44
resolveWithSimpleBdd
55
} from 'binary-decision-diagram';
6-
76
import type { StateResolveFunctionInput } from '../types/index.js';
87
import { stateResolveFunctionByIndex } from '../states/index.js';
98

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²mª4³£©4´¤«4µ¥¬4¶¨­4·¨®4¸m¯4¹¨°4ºpz7»´µ7¼{z7½·¸7¾}n7¿¤¥7À¨m7Á¤§6Âwo6ä­6Ä»¶6Åtu6Æwx6Ǩ©6ÈÀ³6ɾ}6Ênq6˨°6̽¹6;n6ο§6Ï¿¨6ÐÀ©6ÑÀ¨6Òac0Óbc0Ôtº0ÕÂz0Öry0׿0Øvz0ÙÆ{0Úɾ0ÛÊn0Ü|0ÝÍn0Þ~¢0ß²m5à¸m5áÁ¥5âÃ¥5ãÄÏ5äÇm5åÈÐ5æËm5çÌÑ5èáÎ2éÖÔ2êØÕ2ëâã2ìÖ×2íØÙ2îäå2ïÜÚ2ðÞÛ2ñæç2òÜÝ2óÞn2ôßà/õÒn/öÓn/÷èî/øéï/ùêð/úëñ/ûìò/üíó/ýÎÐ/þÏÑ/ÿmô-Ā÷ú-āøû-Ăùü-ă§±-Ąýþ-্-Ćõö1ćāĂ1ĈĀÿ*ĉćĆ*Ċăm*ċĈĉ3ČċĊ.襹.Čč(';
9+
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.ǧ.ēð.ĔĈ§.ĕĉ°.ĖĄ§.ėą°.ĘÁ§.ęè.ĚĊ§.ěċ¨.Ĝŧ.ĝƨ.ĞČč-ğĎď-ĠĐđ-ġĒē-ĢĔĕ-ģĖė-ĤĘę-ĥĚě-ĦĜĝ-ħğĠ,ĨĢģ,ĩĥĦ,ĪĞħ+īġĨ+ĬĤĩ+ĭĪī)ĭĬ(';
1110

1211
let simpleBdd: SimpleBdd | undefined;
1312
export function getSimpleBdd() {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"performanceMeasurement": {
3+
"isInsert": 0.0005134089980274439,
4+
"isUpdate": 0.0005059200078248977,
5+
"isDelete": 0.0005452740341424942,
6+
"hasLimit": 0.0004327639751136303,
7+
"isFindOne": 0.00046740003488957883,
8+
"hasSkip": 0.0004786954801529646,
9+
"wasResultsEmpty": 0.00046854151226580145,
10+
"wasLimitReached": 0.0005687805358320474,
11+
"wasFirst": 0.0006331859696656466,
12+
"wasLast": 0.000993298990651965,
13+
"sortParamsChanged": 0.0021037884596735237,
14+
"wasInResult": 0.001067824000492692,
15+
"wasSortedBeforeFirst": 0.005706427520141006,
16+
"wasSortedAfterLast": 0.0063148145023733376,
17+
"isSortedBeforeFirst": 0.005680875465273857,
18+
"isSortedAfterLast": 0.006254887519404292,
19+
"wasMatching": 0.02021647496894002,
20+
"doesMatchNow": 0.016383298518136143
21+
},
22+
"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.ǧ.ēð.ĔĈ§.ĕĉ°.ĖĄ§.ėą°.ĘÁ§.ęè.ĚĊ§.ěċ¨.Ĝŧ.ĝƨ.ĞČč-ğĎď-ĠĐđ-ġĒē-ĢĔĕ-ģĖė-ĤĘę-ĥĚě-ĦĜĝ-ħğĠ,ĨĢģ,ĩĥĦ,ĪĞħ+īġĨ+ĬĤĩ+ĭĪī)ĭĬ(",
23+
"quality": 587.3026994052454
24+
}

javascript/src/bdd/bdd.template.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
minimalStringToSimpleBdd,
44
resolveWithSimpleBdd
55
} from 'binary-decision-diagram';
6-
76
import type { StateResolveFunctionInput } from '../types/index.js';
87
import { stateResolveFunctionByIndex } from '../states/index.js';
98

javascript/src/bdd/write-bdd-template.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
import * as fs from 'fs';
22
import path from 'path';
3+
import {
4+
PerformanceMeasurement
5+
} from '../truth-table-generator/calculate-bdd-quality.js';
36

47
export const BDD_TEMPLATE_LOCATION = path.join(
58
__dirname,
69
'./bdd.template.ts'
710
);
11+
export const BDD_OPTIMIZE_STATE_LOCATION = path.join(
12+
__dirname,
13+
'./bdd.optimize.state.json'
14+
);
815
export const BDD_TEMPLATE_GOAL = path.join(
916
__dirname,
1017
'./bdd.generated.ts'
1118
);
1219

1320
export function writeBddTemplate(
14-
minimalBddString: string
21+
minimalBddString: string,
22+
performanceMeasurement: PerformanceMeasurement,
23+
quality: number
1524
) {
1625
let templateString: string = fs.readFileSync(BDD_TEMPLATE_LOCATION, 'utf-8');
1726
const replaceVariables = {
@@ -24,6 +33,17 @@ export function writeBddTemplate(
2433
templateString = templateString.replace(templateVar, contentString);
2534
});
2635

36+
fs.writeFileSync(
37+
BDD_OPTIMIZE_STATE_LOCATION,
38+
JSON.stringify({
39+
performanceMeasurement,
40+
minimalBddString,
41+
quality
42+
}, null, 4),
43+
{ encoding: 'utf8', flag: 'w' }
44+
);
45+
46+
2747
fs.writeFileSync(
2848
BDD_TEMPLATE_GOAL,
2949
templateString,

javascript/src/truth-table-generator/calculate-bdd-quality.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
ResolverFunctions
55
} from 'binary-decision-diagram';
66
import {
7-
performanceNow
7+
performanceNow, wait
88
} from 'async-test-util';
99

1010
import type {
@@ -133,11 +133,15 @@ export async function measurePerformanceOfStateFunctions(
133133
const diff = endTime - startTime;
134134
ret[stateName] = ret[stateName] + diff;
135135
}
136+
137+
if (remainingRounds % 10 === 0) {
138+
console.log('.. ' + remainingRounds);
139+
await wait(50);
140+
}
136141
}
137142

138143
// calculate average
139144
orderedStateList.forEach(k => ret[k] = (ret[k] / rounds));
140-
141145
return ret;
142146
}
143147

@@ -166,6 +170,8 @@ export async function getBetterBdd(
166170
}
167171
}
168172

173+
174+
169175
export type FunctionUsageCount = {
170176
[k in StateName]: number;
171177
};

javascript/src/truth-table-generator/index.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,19 +182,12 @@ export function doesActionWork(
182182
return true;
183183
}
184184

185-
/*
186-
console.log('--- '.repeat(100));
187-
console.dir(input);
188-
console.dir(input.previousResults);
189-
console.dir(resultAfter);*/
190-
191185
const calculatedResults = runAction(
192186
actionName,
193187
input.queryParams,
194188
input.changeEvent,
195189
input.previousResults.slice()
196190
);
197-
// console.dir(calculatedResults);
198191

199192
if (
200193
// optimisation shortcut, this is faster because we know we have two arrays

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

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@ import {
3131
writeJsonFile
3232
} from './util.js';
3333
import { fuzzing } from './fuzzing.js';
34-
import { writeBddTemplate } from '../bdd/write-bdd-template.js';
34+
import { BDD_OPTIMIZE_STATE_LOCATION, writeBddTemplate } from '../bdd/write-bdd-template.js';
3535
import {
3636
measurePerformanceOfStateFunctions,
3737
getBetterBdd,
38-
getQualityOfBdd
38+
getQualityOfBdd,
39+
PerformanceMeasurement,
40+
QUALITY_BY_BDD_CACHE
3941
} from './calculate-bdd-quality.js';
4042
import { orderedStateList } from '../states/index.js';
4143

@@ -59,6 +61,17 @@ function loadTruthTable() {
5961
);
6062
return truthTable;
6163
}
64+
function getQuality(
65+
bdd: RootNode,
66+
perfMeasurement: PerformanceMeasurement
67+
) {
68+
return getQualityOfBdd(
69+
bdd,
70+
perfMeasurement,
71+
getQueryVariations(),
72+
getTestProcedures()
73+
);
74+
}
6275

6376

6477
const unknownValueActionId: number = 42;
@@ -239,10 +252,14 @@ async function run() {
239252
bdd.removeIrrelevantLeafNodes(unknownValueActionId);
240253

241254
bdd.log();
255+
const performanceMeasurement = await measurePerformanceOfStateFunctions(2000)
256+
const quality = getQuality(bdd, performanceMeasurement);
242257

243258
const bddMinimalString = bddToMinimalString(bdd);
244259
writeBddTemplate(
245-
bddMinimalString
260+
bddMinimalString,
261+
performanceMeasurement,
262+
quality
246263
);
247264

248265
console.log('nodes after minify: ' + bdd.countNodes());
@@ -265,28 +282,16 @@ async function run() {
265282
unknownValueActionId
266283
);
267284

268-
let currentBest: RootNode;
269-
270-
const perfMeasurement = await measurePerformanceOfStateFunctions(10000);
271-
console.log('state function performance:');
272-
console.dir(perfMeasurement);
273-
274285

286+
const optimizeState = JSON.parse(fs.readFileSync(BDD_OPTIMIZE_STATE_LOCATION, 'utf-8'));
287+
const performanceMeasurement = optimizeState.performanceMeasurement;
288+
let currentBest: RootNode;
275289
const resolvers: ResolverFunctions = {};
276290
new Array(orderedStateList.length).fill(0).forEach((_x, index) => {
277291
const fn = (state: string) => booleanStringToBoolean((state as any)[index]);
278292
resolvers[index] = fn;
279293
});
280294

281-
function getQuality(bdd: RootNode) {
282-
return getQualityOfBdd(
283-
bdd,
284-
perfMeasurement,
285-
getQueryVariations(),
286-
getTestProcedures()
287-
);
288-
}
289-
290295
await optimizeBruteForce({
291296
truthTable,
292297
iterations: 10000000,
@@ -313,12 +318,11 @@ async function run() {
313318
}
314319
}
315320

316-
317321
if (currentBest) {
318322
console.log(
319323
'current best bdd has ' + currentBest.countNodes() + ' nodes ' +
320-
'and a quality of ' + getQuality(currentBest) + ' ' +
321-
'while newly tested one has quality of ' + getQuality(bdd)
324+
'and a quality of ' + getQuality(currentBest, performanceMeasurement) + ' ' +
325+
'while newly tested one has quality of ' + getQuality(bdd, performanceMeasurement)
322326
);
323327
} else {
324328
currentBest = bdd;
@@ -327,7 +331,7 @@ async function run() {
327331
compareResults: (a: RootNode, b: RootNode) => {
328332
const betterOne = getBetterBdd(
329333
a, b,
330-
perfMeasurement,
334+
performanceMeasurement,
331335
getQueryVariations(),
332336
getTestProcedures()
333337
);
@@ -338,19 +342,27 @@ async function run() {
338342
console.log('## Yeah! found better bdd ##');
339343
lastBetterFoundTime = new Date().getTime();
340344
const bddMinimalString = bddToMinimalString(currentBest);
341-
const quality = getQuality(currentBest);
345+
const quality = getQuality(currentBest, performanceMeasurement);
342346
console.log('nodes: ' + currentBest.countNodes());
343347
console.log('quality(new): ' + quality);
344-
console.log('quality(old): ' + getQuality(currentBest));
348+
console.log('quality(old): ' + getQuality(currentBest, performanceMeasurement));
345349
console.log('new string: ' + bddMinimalString);
346350
currentBest = res.bdd;
347351

348-
writeBddTemplate(
349-
bddMinimalString
350-
);
351-
console.log('-'.repeat(100));
352+
const currentOptimizeState = JSON.parse(fs.readFileSync(BDD_OPTIMIZE_STATE_LOCATION, 'utf-8'));
353+
if (quality > currentOptimizeState.quality) {
354+
console.log('########## BETTER THEN BEFORE ! -> Save it');
355+
writeBddTemplate(
356+
bddMinimalString,
357+
performanceMeasurement,
358+
quality
359+
);
360+
console.log('-'.repeat(100));
361+
} else {
362+
console.log('# DROP BECAUSE has better one with quality ' + currentOptimizeState.quality);
363+
}
352364
},
353-
log: true
365+
log: false
354366
});
355367
})();
356368
break;

0 commit comments

Comments
 (0)