ppef 1.0.0 → 1.0.1
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/README.md +172 -0
- package/dist/__tests__/framework-pipeline.integration.test.d.ts +7 -0
- package/dist/__tests__/framework-pipeline.integration.test.d.ts.map +1 -0
- package/dist/__tests__/framework-pipeline.integration.test.js +413 -0
- package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -0
- package/dist/__tests__/registry-executor.integration.test.d.ts +5 -0
- package/dist/__tests__/registry-executor.integration.test.d.ts.map +1 -0
- package/dist/__tests__/registry-executor.integration.test.js +349 -0
- package/dist/__tests__/registry-executor.integration.test.js.map +1 -0
- package/dist/__tests__/test-helpers.d.ts +94 -0
- package/dist/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/__tests__/test-helpers.js +271 -0
- package/dist/__tests__/test-helpers.js.map +1 -0
- package/dist/aggregation/aggregators.d.ts +54 -0
- package/dist/aggregation/aggregators.d.ts.map +1 -0
- package/dist/aggregation/aggregators.js +228 -0
- package/dist/aggregation/aggregators.js.map +1 -0
- package/dist/aggregation/index.d.ts +8 -0
- package/dist/aggregation/index.d.ts.map +1 -0
- package/dist/aggregation/index.js +8 -0
- package/dist/aggregation/index.js.map +1 -0
- package/dist/aggregation/pipeline.d.ts +38 -0
- package/dist/aggregation/pipeline.d.ts.map +1 -0
- package/dist/aggregation/pipeline.js +198 -0
- package/dist/aggregation/pipeline.js.map +1 -0
- package/dist/claims/evaluator.d.ts +33 -0
- package/dist/claims/evaluator.d.ts.map +1 -0
- package/dist/claims/evaluator.js +174 -0
- package/dist/claims/evaluator.js.map +1 -0
- package/dist/claims/index.d.ts +7 -0
- package/dist/claims/index.d.ts.map +1 -0
- package/dist/claims/index.js +7 -0
- package/dist/claims/index.js.map +1 -0
- package/dist/collector/index.d.ts +8 -0
- package/dist/collector/index.d.ts.map +1 -0
- package/dist/collector/index.js +8 -0
- package/dist/collector/index.js.map +1 -0
- package/dist/collector/result-collector.d.ts +159 -0
- package/dist/collector/result-collector.d.ts.map +1 -0
- package/dist/collector/result-collector.js +213 -0
- package/dist/collector/result-collector.js.map +1 -0
- package/dist/collector/schema.d.ts +34 -0
- package/dist/collector/schema.d.ts.map +1 -0
- package/dist/collector/schema.js +145 -0
- package/dist/collector/schema.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts +10 -0
- package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js +122 -0
- package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts +7 -0
- package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-manager.integration.test.js +330 -0
- package/dist/executor/__tests__/checkpoint-manager.integration.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-manager.unit.test.js +449 -0
- package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +11 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +224 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts +8 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js +164 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-storage.unit.test.js +386 -0
- package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -0
- package/dist/executor/__tests__/executor.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/executor.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/executor.unit.test.js +134 -0
- package/dist/executor/__tests__/executor.unit.test.js.map +1 -0
- package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts +12 -0
- package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts.map +1 -0
- package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js +196 -0
- package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js.map +1 -0
- package/dist/executor/__tests__/parallel-executor.integration.test.d.ts +7 -0
- package/dist/executor/__tests__/parallel-executor.integration.test.d.ts.map +1 -0
- package/dist/executor/__tests__/parallel-executor.integration.test.js +249 -0
- package/dist/executor/__tests__/parallel-executor.integration.test.js.map +1 -0
- package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/parallel-executor.unit.test.js +203 -0
- package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -0
- package/dist/executor/checkpoint-manager.d.ts +231 -0
- package/dist/executor/checkpoint-manager.d.ts.map +1 -0
- package/dist/executor/checkpoint-manager.js +395 -0
- package/dist/executor/checkpoint-manager.js.map +1 -0
- package/dist/executor/checkpoint-storage.d.ts +230 -0
- package/dist/executor/checkpoint-storage.d.ts.map +1 -0
- package/dist/executor/checkpoint-storage.js +370 -0
- package/dist/executor/checkpoint-storage.js.map +1 -0
- package/dist/executor/checkpoint-types.d.ts +48 -0
- package/dist/executor/checkpoint-types.d.ts.map +1 -0
- package/dist/executor/checkpoint-types.js +8 -0
- package/dist/executor/checkpoint-types.js.map +1 -0
- package/dist/executor/executor.d.ts +164 -0
- package/dist/executor/executor.d.ts.map +1 -0
- package/dist/executor/executor.js +408 -0
- package/dist/executor/executor.js.map +1 -0
- package/dist/executor/index.d.ts +11 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +11 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/executor/memory-monitor.d.ts +115 -0
- package/dist/executor/memory-monitor.d.ts.map +1 -0
- package/dist/executor/memory-monitor.js +168 -0
- package/dist/executor/memory-monitor.js.map +1 -0
- package/dist/executor/parallel-executor.d.ts +53 -0
- package/dist/executor/parallel-executor.d.ts.map +1 -0
- package/dist/executor/parallel-executor.js +194 -0
- package/dist/executor/parallel-executor.js.map +1 -0
- package/dist/executor/run-id.d.ts +71 -0
- package/dist/executor/run-id.d.ts.map +1 -0
- package/dist/executor/run-id.js +67 -0
- package/dist/executor/run-id.js.map +1 -0
- package/dist/executor/worker-entry.d.ts +8 -0
- package/dist/executor/worker-entry.d.ts.map +1 -0
- package/dist/executor/worker-entry.js +67 -0
- package/dist/executor/worker-entry.js.map +1 -0
- package/dist/index.cjs +11 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/case-registry.d.ts +113 -0
- package/dist/registry/case-registry.d.ts.map +1 -0
- package/dist/registry/case-registry.js +160 -0
- package/dist/registry/case-registry.js.map +1 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/sut-registry.d.ts +96 -0
- package/dist/registry/sut-registry.d.ts.map +1 -0
- package/dist/registry/sut-registry.js +126 -0
- package/dist/registry/sut-registry.js.map +1 -0
- package/dist/renderers/index.d.ts +10 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/renderers/index.js +9 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/latex-renderer.d.ts +84 -0
- package/dist/renderers/latex-renderer.d.ts.map +1 -0
- package/dist/renderers/latex-renderer.js +208 -0
- package/dist/renderers/latex-renderer.js.map +1 -0
- package/dist/renderers/types.d.ts +106 -0
- package/dist/renderers/types.d.ts.map +1 -0
- package/dist/renderers/types.js +23 -0
- package/dist/renderers/types.js.map +1 -0
- package/dist/robustness/analyzer.d.ts +61 -0
- package/dist/robustness/analyzer.d.ts.map +1 -0
- package/dist/robustness/analyzer.js +191 -0
- package/dist/robustness/analyzer.js.map +1 -0
- package/dist/robustness/index.d.ts +8 -0
- package/dist/robustness/index.d.ts.map +1 -0
- package/dist/robustness/index.js +8 -0
- package/dist/robustness/index.js.map +1 -0
- package/dist/robustness/perturbations.d.ts +46 -0
- package/dist/robustness/perturbations.d.ts.map +1 -0
- package/dist/robustness/perturbations.js +184 -0
- package/dist/robustness/perturbations.js.map +1 -0
- package/dist/statistical/index.d.ts +8 -0
- package/dist/statistical/index.d.ts.map +1 -0
- package/dist/statistical/index.js +8 -0
- package/dist/statistical/index.js.map +1 -0
- package/dist/statistical/mann-whitney-u.d.ts +62 -0
- package/dist/statistical/mann-whitney-u.d.ts.map +1 -0
- package/dist/statistical/mann-whitney-u.js +127 -0
- package/dist/statistical/mann-whitney-u.js.map +1 -0
- package/dist/types/aggregate.d.ts +124 -0
- package/dist/types/aggregate.d.ts.map +1 -0
- package/dist/types/aggregate.js +9 -0
- package/dist/types/aggregate.js.map +1 -0
- package/dist/types/case.d.ts +105 -0
- package/dist/types/case.d.ts.map +1 -0
- package/dist/types/case.js +10 -0
- package/dist/types/case.js.map +1 -0
- package/dist/types/claims.d.ts +122 -0
- package/dist/types/claims.d.ts.map +1 -0
- package/dist/types/claims.js +14 -0
- package/dist/types/claims.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/perturbation.d.ts +105 -0
- package/dist/types/perturbation.d.ts.map +1 -0
- package/dist/types/perturbation.js +9 -0
- package/dist/types/perturbation.js.map +1 -0
- package/dist/types/result.d.ts +150 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +12 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/sut.d.ts +128 -0
- package/dist/types/sut.d.ts.map +1 -0
- package/dist/types/sut.js +12 -0
- package/dist/types/sut.js.map +1 -0
- package/package.json +283 -7
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experiment Executor
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates experiment execution across SUTs and cases.
|
|
5
|
+
* Handles error isolation, progress reporting, and result collection.
|
|
6
|
+
*/
|
|
7
|
+
import { execSync } from "node:child_process";
|
|
8
|
+
import { arch, platform, version as nodeVersion } from "node:process";
|
|
9
|
+
import { MemoryMonitor, MemoryWarningLevel } from "./memory-monitor.js";
|
|
10
|
+
import { generateRunId } from "./run-id.js";
|
|
11
|
+
/**
|
|
12
|
+
* Default executor configuration.
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_EXECUTOR_CONFIG = {
|
|
15
|
+
continueOnError: true,
|
|
16
|
+
repetitions: 1,
|
|
17
|
+
seedBase: 42,
|
|
18
|
+
timeoutMs: 0,
|
|
19
|
+
collectProvenance: true,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Get provenance information for reproducibility.
|
|
23
|
+
* @param collectProvenance
|
|
24
|
+
*/
|
|
25
|
+
const getProvenance = (collectProvenance) => {
|
|
26
|
+
if (!collectProvenance) {
|
|
27
|
+
return {
|
|
28
|
+
runtime: {
|
|
29
|
+
platform: platform,
|
|
30
|
+
arch: arch,
|
|
31
|
+
nodeVersion: nodeVersion,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
let gitCommit;
|
|
36
|
+
let dirty = false;
|
|
37
|
+
try {
|
|
38
|
+
gitCommit = execSync("git rev-parse HEAD", { encoding: "utf-8", env: undefined }).trim();
|
|
39
|
+
const status = execSync("git status --porcelain", { encoding: "utf-8", env: undefined });
|
|
40
|
+
dirty = status.length > 0;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Git not available or not a git repo
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
runtime: {
|
|
47
|
+
platform: platform,
|
|
48
|
+
arch: arch,
|
|
49
|
+
nodeVersion: nodeVersion,
|
|
50
|
+
},
|
|
51
|
+
gitCommit,
|
|
52
|
+
dirty,
|
|
53
|
+
timestamp: new Date().toISOString(),
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Experiment executor.
|
|
58
|
+
*
|
|
59
|
+
* @template TInput - The resource type (e.g., Graph, Dataset)
|
|
60
|
+
* @template TInputs - The algorithm inputs type
|
|
61
|
+
* @template TResult - The algorithm result type
|
|
62
|
+
*/
|
|
63
|
+
export class Executor {
|
|
64
|
+
config;
|
|
65
|
+
inputCache;
|
|
66
|
+
memoryMonitor;
|
|
67
|
+
constructor(config = {}) {
|
|
68
|
+
this.config = {
|
|
69
|
+
...DEFAULT_EXECUTOR_CONFIG,
|
|
70
|
+
monitorMemory: true,
|
|
71
|
+
...config,
|
|
72
|
+
};
|
|
73
|
+
this.inputCache = new Map();
|
|
74
|
+
// Initialize memory monitor if enabled
|
|
75
|
+
if (this.config.monitorMemory) {
|
|
76
|
+
this.memoryMonitor = new MemoryMonitor({
|
|
77
|
+
warningThresholdMb: this.config.memoryWarningThresholdMb,
|
|
78
|
+
criticalThresholdMb: this.config.memoryCriticalThresholdMb,
|
|
79
|
+
verbose: true,
|
|
80
|
+
onWarningLevelChange: (level, stats) => {
|
|
81
|
+
if (level === MemoryWarningLevel.CRITICAL && this.config.abortOnMemoryCritical) {
|
|
82
|
+
throw new Error(`Memory critical threshold exceeded (${stats.rssMb.toFixed(1)}MB). Aborting execution.`);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Plan execution runs without executing.
|
|
90
|
+
*
|
|
91
|
+
* @param suts - SUTs to execute
|
|
92
|
+
* @param cases - Cases to run against
|
|
93
|
+
* @returns Array of planned runs
|
|
94
|
+
*/
|
|
95
|
+
plan(suts, cases) {
|
|
96
|
+
const runs = [];
|
|
97
|
+
for (const sutDef of suts) {
|
|
98
|
+
for (const caseDef of cases) {
|
|
99
|
+
for (let rep = 0; rep < this.config.repetitions; rep++) {
|
|
100
|
+
const seed = this.config.seedBase + rep;
|
|
101
|
+
const runId = generateRunId({
|
|
102
|
+
sutId: sutDef.registration.id,
|
|
103
|
+
caseId: caseDef.case.caseId,
|
|
104
|
+
seed,
|
|
105
|
+
repetition: rep,
|
|
106
|
+
});
|
|
107
|
+
runs.push({
|
|
108
|
+
runId,
|
|
109
|
+
sutId: sutDef.registration.id,
|
|
110
|
+
caseId: caseDef.case.caseId,
|
|
111
|
+
repetition: rep,
|
|
112
|
+
seed,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return runs;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Execute all planned runs.
|
|
121
|
+
*
|
|
122
|
+
* @param suts - SUTs to execute
|
|
123
|
+
* @param cases - Cases to run against
|
|
124
|
+
* @param metricsExtractor - Function to extract metrics from result
|
|
125
|
+
* @param plannedRuns - Optional pre-filtered planned runs (for parallel workers)
|
|
126
|
+
* @returns Execution summary with all results
|
|
127
|
+
*/
|
|
128
|
+
async execute(suts, cases, metricsExtractor, plannedRuns) {
|
|
129
|
+
const startTime = performance.now();
|
|
130
|
+
const effectivePlannedRuns = plannedRuns ?? this.plan(suts, cases);
|
|
131
|
+
const sutMap = new Map(suts.map((s) => [s.registration.id, s]));
|
|
132
|
+
const caseMap = new Map(cases.map((c) => [c.case.caseId, c]));
|
|
133
|
+
// Use concurrency limit if specified, otherwise sequential
|
|
134
|
+
const concurrency = this.config.concurrency ?? 1;
|
|
135
|
+
if (concurrency <= 1) {
|
|
136
|
+
// Sequential execution (original behavior)
|
|
137
|
+
return this.executeSequential(effectivePlannedRuns, sutMap, caseMap, metricsExtractor, startTime);
|
|
138
|
+
}
|
|
139
|
+
// Parallel execution with concurrency limit
|
|
140
|
+
return this.executeParallel(effectivePlannedRuns, sutMap, caseMap, metricsExtractor, startTime, concurrency);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Execute runs sequentially (original behavior).
|
|
144
|
+
* @param plannedRuns
|
|
145
|
+
* @param sutMap
|
|
146
|
+
* @param caseMap
|
|
147
|
+
* @param metricsExtractor
|
|
148
|
+
* @param startTime
|
|
149
|
+
* @internal
|
|
150
|
+
*/
|
|
151
|
+
async executeSequential(plannedRuns, sutMap, caseMap, metricsExtractor, startTime) {
|
|
152
|
+
const results = [];
|
|
153
|
+
const errors = [];
|
|
154
|
+
let completed = 0;
|
|
155
|
+
let failed = 0;
|
|
156
|
+
for (const run of plannedRuns) {
|
|
157
|
+
const sutDef = sutMap.get(run.sutId);
|
|
158
|
+
const caseDef = caseMap.get(run.caseId);
|
|
159
|
+
if (!sutDef || !caseDef) {
|
|
160
|
+
errors.push({ runId: run.runId, error: "SUT or case not found" });
|
|
161
|
+
failed++;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
// Report progress
|
|
165
|
+
if (this.config.onProgress) {
|
|
166
|
+
this.config.onProgress({
|
|
167
|
+
total: plannedRuns.length,
|
|
168
|
+
completed,
|
|
169
|
+
failed,
|
|
170
|
+
currentSut: run.sutId,
|
|
171
|
+
currentCase: run.caseId,
|
|
172
|
+
currentRepetition: run.repetition,
|
|
173
|
+
elapsedMs: performance.now() - startTime,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
const result = await this.executeRun(run, sutDef, caseDef, metricsExtractor);
|
|
178
|
+
results.push(result);
|
|
179
|
+
// Call onResult callback and await if it returns a promise
|
|
180
|
+
if (this.config.onResult) {
|
|
181
|
+
const callbackResult = this.config.onResult(result);
|
|
182
|
+
if (callbackResult instanceof Promise) {
|
|
183
|
+
await callbackResult;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
completed++;
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
190
|
+
errors.push({ runId: run.runId, error: errorMessage });
|
|
191
|
+
failed++;
|
|
192
|
+
if (!this.config.continueOnError) {
|
|
193
|
+
throw error;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
totalRuns: plannedRuns.length,
|
|
199
|
+
successfulRuns: completed,
|
|
200
|
+
failedRuns: failed,
|
|
201
|
+
elapsedMs: performance.now() - startTime,
|
|
202
|
+
results,
|
|
203
|
+
errors,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Execute runs in parallel with a concurrency limit.
|
|
208
|
+
* @param plannedRuns
|
|
209
|
+
* @param sutMap
|
|
210
|
+
* @param caseMap
|
|
211
|
+
* @param metricsExtractor
|
|
212
|
+
* @param startTime
|
|
213
|
+
* @param concurrency
|
|
214
|
+
* @internal
|
|
215
|
+
*/
|
|
216
|
+
async executeParallel(plannedRuns, sutMap, caseMap, metricsExtractor, startTime, concurrency) {
|
|
217
|
+
const results = [];
|
|
218
|
+
const errors = [];
|
|
219
|
+
// Thread-safe counters
|
|
220
|
+
let completed = 0;
|
|
221
|
+
let failed = 0;
|
|
222
|
+
const mutex = { locked: false };
|
|
223
|
+
const lockQueue = [];
|
|
224
|
+
const acquireLock = () => {
|
|
225
|
+
return new Promise((resolve) => {
|
|
226
|
+
if (mutex.locked) {
|
|
227
|
+
lockQueue.push(resolve);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
mutex.locked = true;
|
|
231
|
+
resolve();
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
const releaseLock = () => {
|
|
236
|
+
const next = lockQueue.shift();
|
|
237
|
+
if (next) {
|
|
238
|
+
next();
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
mutex.locked = false;
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
// Process a single run
|
|
245
|
+
const processRun = async (run) => {
|
|
246
|
+
const sutDef = sutMap.get(run.sutId);
|
|
247
|
+
const caseDef = caseMap.get(run.caseId);
|
|
248
|
+
if (!sutDef || !caseDef) {
|
|
249
|
+
await acquireLock();
|
|
250
|
+
errors.push({ runId: run.runId, error: "SUT or case not found" });
|
|
251
|
+
failed++;
|
|
252
|
+
releaseLock();
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
const result = await this.executeRun(run, sutDef, caseDef, metricsExtractor);
|
|
257
|
+
await acquireLock();
|
|
258
|
+
results.push(result);
|
|
259
|
+
completed++;
|
|
260
|
+
// Call onResult callback (checkpoint save)
|
|
261
|
+
if (this.config.onResult) {
|
|
262
|
+
await this.config.onResult(result);
|
|
263
|
+
}
|
|
264
|
+
// Report progress
|
|
265
|
+
if (this.config.onProgress) {
|
|
266
|
+
this.config.onProgress({
|
|
267
|
+
total: plannedRuns.length,
|
|
268
|
+
completed,
|
|
269
|
+
failed,
|
|
270
|
+
currentSut: run.sutId,
|
|
271
|
+
currentCase: run.caseId,
|
|
272
|
+
currentRepetition: run.repetition,
|
|
273
|
+
elapsedMs: performance.now() - startTime,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
releaseLock();
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
await acquireLock();
|
|
280
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
281
|
+
errors.push({ runId: run.runId, error: errorMessage });
|
|
282
|
+
failed++;
|
|
283
|
+
releaseLock();
|
|
284
|
+
if (!this.config.continueOnError) {
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
// Worker pool: process runs in batches
|
|
290
|
+
for (let index = 0; index < plannedRuns.length; index += concurrency) {
|
|
291
|
+
const batch = plannedRuns.slice(index, index + concurrency);
|
|
292
|
+
await Promise.all(batch.map(processRun));
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
totalRuns: plannedRuns.length,
|
|
296
|
+
successfulRuns: completed,
|
|
297
|
+
failedRuns: failed,
|
|
298
|
+
elapsedMs: performance.now() - startTime,
|
|
299
|
+
results,
|
|
300
|
+
errors,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Execute a single run.
|
|
305
|
+
* @param run
|
|
306
|
+
* @param sutDef
|
|
307
|
+
* @param caseDef
|
|
308
|
+
* @param metricsExtractor
|
|
309
|
+
*/
|
|
310
|
+
async executeRun(run, sutDef, caseDef, metricsExtractor) {
|
|
311
|
+
const runStartTime = performance.now();
|
|
312
|
+
let peakMemoryBytes = 0;
|
|
313
|
+
// Check memory before execution
|
|
314
|
+
if (this.memoryMonitor) {
|
|
315
|
+
const initialLevel = this.memoryMonitor.check();
|
|
316
|
+
if (initialLevel === MemoryWarningLevel.EMERGENCY) {
|
|
317
|
+
throw new Error("Memory at emergency level before execution. Aborting.");
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Load or reuse input resource for this case (cached to avoid reloading)
|
|
321
|
+
const cacheKey = caseDef.case.caseId;
|
|
322
|
+
let input = this.inputCache.get(cacheKey);
|
|
323
|
+
if (!input) {
|
|
324
|
+
// Apply timeout to resource loading (large graphs can hang during loading)
|
|
325
|
+
input = await (this.config.timeoutMs > 0
|
|
326
|
+
? Promise.race([
|
|
327
|
+
caseDef.getInput(),
|
|
328
|
+
new Promise((_, reject) => setTimeout(() => {
|
|
329
|
+
reject(new Error(`Resource loading timeout after ${this.config.timeoutMs}ms`));
|
|
330
|
+
}, this.config.timeoutMs)),
|
|
331
|
+
])
|
|
332
|
+
: caseDef.getInput());
|
|
333
|
+
this.inputCache.set(cacheKey, input);
|
|
334
|
+
// Check memory after resource loading
|
|
335
|
+
if (this.memoryMonitor) {
|
|
336
|
+
const stats = this.memoryMonitor.getStats();
|
|
337
|
+
peakMemoryBytes = Math.max(peakMemoryBytes, stats.rssBytes);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// Get algorithm inputs for this case
|
|
341
|
+
const inputs = caseDef.getInputs();
|
|
342
|
+
// Create SUT instance (factory now takes only config)
|
|
343
|
+
const sut = sutDef.factory(run.config);
|
|
344
|
+
// Execute with timeout if configured
|
|
345
|
+
const sutResult = await (this.config.timeoutMs > 0
|
|
346
|
+
? Promise.race([
|
|
347
|
+
sut.run({ ...inputs, input }),
|
|
348
|
+
new Promise((_, reject) => setTimeout(() => {
|
|
349
|
+
reject(new Error(`Timeout after ${this.config.timeoutMs}ms`));
|
|
350
|
+
}, this.config.timeoutMs)),
|
|
351
|
+
])
|
|
352
|
+
: sut.run({ ...inputs, input }));
|
|
353
|
+
const executionTimeMs = performance.now() - runStartTime;
|
|
354
|
+
// Check memory after execution
|
|
355
|
+
let finalMemoryBytes = 0;
|
|
356
|
+
if (this.memoryMonitor) {
|
|
357
|
+
const stats = this.memoryMonitor.getStats();
|
|
358
|
+
peakMemoryBytes = Math.max(peakMemoryBytes, stats.rssBytes);
|
|
359
|
+
finalMemoryBytes = stats.rssBytes;
|
|
360
|
+
}
|
|
361
|
+
// Extract metrics
|
|
362
|
+
const metrics = metricsExtractor(sutResult);
|
|
363
|
+
// Build correctness result (basic - can be extended)
|
|
364
|
+
const correctness = {
|
|
365
|
+
expectedExists: caseDef.case.expectedOutput !== undefined,
|
|
366
|
+
producedOutput: true,
|
|
367
|
+
valid: true, // Assume valid if no exception
|
|
368
|
+
matchesExpected: null, // Would need comparison logic
|
|
369
|
+
};
|
|
370
|
+
// Build provenance
|
|
371
|
+
const provenance = getProvenance(this.config.collectProvenance);
|
|
372
|
+
provenance.executionTimeMs = executionTimeMs;
|
|
373
|
+
// Add memory stats if monitoring is enabled
|
|
374
|
+
if (this.memoryMonitor && this.config.collectProvenance) {
|
|
375
|
+
provenance.peakMemoryBytes = peakMemoryBytes;
|
|
376
|
+
provenance.finalMemoryBytes = finalMemoryBytes;
|
|
377
|
+
}
|
|
378
|
+
return {
|
|
379
|
+
run: {
|
|
380
|
+
runId: run.runId,
|
|
381
|
+
sut: run.sutId,
|
|
382
|
+
sutRole: sutDef.registration.role,
|
|
383
|
+
sutVersion: sutDef.registration.version,
|
|
384
|
+
caseId: run.caseId,
|
|
385
|
+
caseClass: caseDef.case.caseClass,
|
|
386
|
+
config: run.config,
|
|
387
|
+
seed: run.seed,
|
|
388
|
+
repetition: run.repetition,
|
|
389
|
+
},
|
|
390
|
+
correctness,
|
|
391
|
+
outputs: {
|
|
392
|
+
summary: {
|
|
393
|
+
// Could extract from sutResult
|
|
394
|
+
},
|
|
395
|
+
},
|
|
396
|
+
metrics: {
|
|
397
|
+
numeric: metrics,
|
|
398
|
+
},
|
|
399
|
+
provenance,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Create a default executor with standard configuration.
|
|
405
|
+
* @param config
|
|
406
|
+
*/
|
|
407
|
+
export const createExecutor = (config) => new Executor(config);
|
|
408
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executor Module
|
|
3
|
+
*
|
|
4
|
+
* Re-exports executor components.
|
|
5
|
+
*/
|
|
6
|
+
export { type CheckpointData, CheckpointManager, type CheckpointManagerOptions, type CheckpointMode, createFileCheckpointManager, getGitCommit, } from "./checkpoint-manager.js";
|
|
7
|
+
export { type CheckpointStorage, createCheckpointStorage, FileStorage, type FileSystem, getGitNamespace, GitStorage, InMemoryLock, type Lock, NodeFileSystem, } from "./checkpoint-storage.js";
|
|
8
|
+
export { createExecutor, DEFAULT_EXECUTOR_CONFIG, type ExecutionProgress, type ExecutionSummary, Executor, type ExecutorConfig, type PlannedRun, } from "./executor.js";
|
|
9
|
+
export { executeParallel, type ParallelExecutorOptions, shardPath } from "./parallel-executor.js";
|
|
10
|
+
export { generateConfigHash, generateRunId, parseRunId, type RunIdInputs, validateRunId, } from "./run-id.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACN,KAAK,cAAc,EACnB,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,2BAA2B,EAC3B,YAAY,GACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,KAAK,iBAAiB,EACtB,uBAAuB,EACvB,WAAW,EACX,KAAK,UAAU,EACf,eAAe,EACf,UAAU,EACV,YAAY,EACZ,KAAK,IAAI,EACT,cAAc,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,cAAc,EACd,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,QAAQ,EACR,KAAK,cAAc,EACnB,KAAK,UAAU,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,KAAK,uBAAuB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EACN,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,KAAK,WAAW,EAChB,aAAa,GACb,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executor Module
|
|
3
|
+
*
|
|
4
|
+
* Re-exports executor components.
|
|
5
|
+
*/
|
|
6
|
+
export { CheckpointManager, createFileCheckpointManager, getGitCommit, } from "./checkpoint-manager.js";
|
|
7
|
+
export { createCheckpointStorage, FileStorage, getGitNamespace, GitStorage, InMemoryLock, NodeFileSystem, } from "./checkpoint-storage.js";
|
|
8
|
+
export { createExecutor, DEFAULT_EXECUTOR_CONFIG, Executor, } from "./executor.js";
|
|
9
|
+
export { executeParallel, shardPath } from "./parallel-executor.js";
|
|
10
|
+
export { generateConfigHash, generateRunId, parseRunId, validateRunId, } from "./run-id.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEN,iBAAiB,EAGjB,2BAA2B,EAC3B,YAAY,GACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEN,uBAAuB,EACvB,WAAW,EAEX,eAAe,EACf,UAAU,EACV,YAAY,EAEZ,cAAc,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,cAAc,EACd,uBAAuB,EAGvB,QAAQ,GAGR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAgC,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EACN,kBAAkB,EAClB,aAAa,EACb,UAAU,EAEV,aAAa,GACb,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Monitoring for Experiment Execution
|
|
3
|
+
*
|
|
4
|
+
* Tracks memory usage during experiment execution to:
|
|
5
|
+
* 1. Detect memory leaks and excessive consumption
|
|
6
|
+
* 2. Provide early warning before OOM kills
|
|
7
|
+
* 3. Record memory statistics in provenance data
|
|
8
|
+
* 4. Enable automatic throttling or abort on memory pressure
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Memory usage statistics.
|
|
12
|
+
*/
|
|
13
|
+
export interface MemoryStats {
|
|
14
|
+
/** Resident set size in bytes (actual physical memory used) */
|
|
15
|
+
rssBytes: number;
|
|
16
|
+
/** Total heap size in bytes (allocated + unused) */
|
|
17
|
+
heapTotalBytes: number;
|
|
18
|
+
/** Heap used in bytes (actually used) */
|
|
19
|
+
heapUsedBytes: number;
|
|
20
|
+
/** External memory in bytes (C++ objects, etc) */
|
|
21
|
+
externalBytes: number;
|
|
22
|
+
/** Array buffers in bytes */
|
|
23
|
+
arrayBuffersBytes: number;
|
|
24
|
+
/** RSS in MB for human readability */
|
|
25
|
+
rssMb: number;
|
|
26
|
+
/** Heap usage percentage */
|
|
27
|
+
heapUsagePercent: number;
|
|
28
|
+
/** Timestamp when stats were collected */
|
|
29
|
+
timestamp: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Memory warning levels.
|
|
33
|
+
*/
|
|
34
|
+
export declare enum MemoryWarningLevel {
|
|
35
|
+
/** No warning (memory usage is normal) */
|
|
36
|
+
NORMAL = "normal",
|
|
37
|
+
/** Warning (memory usage is elevated) */
|
|
38
|
+
WARNING = "warning",
|
|
39
|
+
/** Critical (memory usage is dangerously high) */
|
|
40
|
+
CRITICAL = "critical",
|
|
41
|
+
/** Emergency (process is near OOM) */
|
|
42
|
+
EMERGENCY = "emergency"
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Memory monitoring configuration.
|
|
46
|
+
*/
|
|
47
|
+
export interface MemoryMonitorConfig {
|
|
48
|
+
/** Warning threshold (MB) - default: 1GB */
|
|
49
|
+
warningThresholdMb: number;
|
|
50
|
+
/** Critical threshold (MB) - default: 2GB */
|
|
51
|
+
criticalThresholdMb: number;
|
|
52
|
+
/** Emergency threshold (MB) - default: 80% of system memory */
|
|
53
|
+
emergencyThresholdMb: number;
|
|
54
|
+
/** Whether to log memory usage */
|
|
55
|
+
verbose: boolean;
|
|
56
|
+
/** Callback when warning level changes */
|
|
57
|
+
onWarningLevelChange?: (level: MemoryWarningLevel, stats: MemoryStats) => void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Default memory monitoring configuration.
|
|
61
|
+
*/
|
|
62
|
+
export declare const DEFAULT_MEMORY_CONFIG: MemoryMonitorConfig;
|
|
63
|
+
/**
|
|
64
|
+
* Memory monitor for tracking usage during execution.
|
|
65
|
+
*/
|
|
66
|
+
export declare class MemoryMonitor {
|
|
67
|
+
private readonly config;
|
|
68
|
+
private currentLevel;
|
|
69
|
+
private startTime;
|
|
70
|
+
constructor(config?: Partial<MemoryMonitorConfig>);
|
|
71
|
+
/**
|
|
72
|
+
* Get current memory usage statistics.
|
|
73
|
+
*/
|
|
74
|
+
getStats(): MemoryStats;
|
|
75
|
+
/**
|
|
76
|
+
* Get current warning level based on memory usage.
|
|
77
|
+
* @param stats
|
|
78
|
+
*/
|
|
79
|
+
getWarningLevel(stats?: MemoryStats): MemoryWarningLevel;
|
|
80
|
+
/**
|
|
81
|
+
* Check memory usage and trigger warnings if needed.
|
|
82
|
+
*
|
|
83
|
+
* @returns Current warning level
|
|
84
|
+
*/
|
|
85
|
+
check(): MemoryWarningLevel;
|
|
86
|
+
/**
|
|
87
|
+
* Log memory warning with details.
|
|
88
|
+
* @param level
|
|
89
|
+
* @param stats
|
|
90
|
+
*/
|
|
91
|
+
private logWarning;
|
|
92
|
+
/**
|
|
93
|
+
* Create a memory snapshot for provenance tracking.
|
|
94
|
+
*/
|
|
95
|
+
snapshot(): MemoryStats;
|
|
96
|
+
/**
|
|
97
|
+
* Format memory stats for logging.
|
|
98
|
+
* @param stats
|
|
99
|
+
*/
|
|
100
|
+
format(stats?: MemoryStats): string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get or create the global memory monitor.
|
|
104
|
+
* @param config
|
|
105
|
+
*/
|
|
106
|
+
export declare const getGlobalMemoryMonitor: (config?: Partial<MemoryMonitorConfig>) => MemoryMonitor;
|
|
107
|
+
/**
|
|
108
|
+
* Check memory usage using the global monitor.
|
|
109
|
+
*/
|
|
110
|
+
export declare const checkMemoryUsage: () => MemoryWarningLevel;
|
|
111
|
+
/**
|
|
112
|
+
* Get current memory stats using the global monitor.
|
|
113
|
+
*/
|
|
114
|
+
export declare const getMemoryStats: () => MemoryStats;
|
|
115
|
+
//# sourceMappingURL=memory-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-monitor.d.ts","sourceRoot":"","sources":["../../src/executor/memory-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAC;IAEvB,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAC;IAEtB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IAEtB,6BAA6B;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAE1B,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IAEd,4BAA4B;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IAEzB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,oBAAY,kBAAkB;IAC7B,0CAA0C;IAC1C,MAAM,WAAW;IAEjB,yCAAyC;IACzC,OAAO,YAAY;IAEnB,kDAAkD;IAClD,QAAQ,aAAa;IAErB,sCAAsC;IACtC,SAAS,cAAc;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,4CAA4C;IAC5C,kBAAkB,EAAE,MAAM,CAAC;IAE3B,6CAA6C;IAC7C,mBAAmB,EAAE,MAAM,CAAC;IAE5B,+DAA+D;IAC/D,oBAAoB,EAAE,MAAM,CAAC;IAE7B,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IAEjB,0CAA0C;IAC1C,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC/E;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,mBAKnC,CAAC;AAEF;;GAEG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,YAAY,CAAiD;IACrE,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKjD;;OAEG;IACH,QAAQ,IAAI,WAAW;IA0BvB;;;OAGG;IACH,eAAe,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,kBAAkB;IAexD;;;;OAIG;IACH,KAAK,IAAI,kBAAkB;IAoB3B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAkBlB;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,MAAM;CAInC;AAOD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,OAAO,CAAC,mBAAmB,CAAC,KAAG,aAG9E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAO,kBAGnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,QAAO,WAGjC,CAAC"}
|