ppef 1.1.0 → 1.2.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.
Files changed (171) hide show
  1. package/README.md +76 -125
  2. package/dist/__tests__/cli/evaluate-command.integration.test.d.ts +8 -0
  3. package/dist/__tests__/cli/evaluate-command.integration.test.d.ts.map +1 -0
  4. package/dist/__tests__/cli/evaluate-command.integration.test.js +308 -0
  5. package/dist/__tests__/cli/evaluate-command.integration.test.js.map +1 -0
  6. package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts +8 -0
  7. package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts.map +1 -0
  8. package/dist/__tests__/evaluators/claims-evaluator.unit.test.js +405 -0
  9. package/dist/__tests__/evaluators/claims-evaluator.unit.test.js.map +1 -0
  10. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts +8 -0
  11. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts.map +1 -0
  12. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js +424 -0
  13. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js.map +1 -0
  14. package/dist/__tests__/evaluators/registry.unit.test.d.ts +7 -0
  15. package/dist/__tests__/evaluators/registry.unit.test.d.ts.map +1 -0
  16. package/dist/__tests__/evaluators/registry.unit.test.js +173 -0
  17. package/dist/__tests__/evaluators/registry.unit.test.js.map +1 -0
  18. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts +8 -0
  19. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts.map +1 -0
  20. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js +260 -0
  21. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js.map +1 -0
  22. package/dist/__tests__/framework-pipeline.integration.test.js +36 -9
  23. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
  24. package/dist/__tests__/index-exports.unit.test.js +9 -12
  25. package/dist/__tests__/index-exports.unit.test.js.map +1 -1
  26. package/dist/aggregation/pipeline.d.ts.map +1 -1
  27. package/dist/aggregation/pipeline.js +40 -3
  28. package/dist/aggregation/pipeline.js.map +1 -1
  29. package/dist/claims/index.d.ts +6 -3
  30. package/dist/claims/index.d.ts.map +1 -1
  31. package/dist/claims/index.js +6 -3
  32. package/dist/claims/index.js.map +1 -1
  33. package/dist/cli/__tests__/aggregate.command.unit.test.js +3 -0
  34. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -1
  35. package/dist/cli/__tests__/binary-sut.integration.test.d.ts +8 -0
  36. package/dist/cli/__tests__/binary-sut.integration.test.d.ts.map +1 -0
  37. package/dist/cli/__tests__/binary-sut.integration.test.js +165 -0
  38. package/dist/cli/__tests__/binary-sut.integration.test.js.map +1 -0
  39. package/dist/cli/__tests__/config-loader.unit.test.d.ts +7 -0
  40. package/dist/cli/__tests__/config-loader.unit.test.d.ts.map +1 -0
  41. package/dist/cli/__tests__/config-loader.unit.test.js +611 -0
  42. package/dist/cli/__tests__/config-loader.unit.test.js.map +1 -0
  43. package/dist/cli/command-deps.d.ts +13 -1
  44. package/dist/cli/command-deps.d.ts.map +1 -1
  45. package/dist/cli/commands/aggregate.d.ts.map +1 -1
  46. package/dist/cli/commands/aggregate.js +3 -0
  47. package/dist/cli/commands/aggregate.js.map +1 -1
  48. package/dist/cli/commands/evaluate.d.ts +41 -0
  49. package/dist/cli/commands/evaluate.d.ts.map +1 -0
  50. package/dist/cli/commands/evaluate.js +287 -0
  51. package/dist/cli/commands/evaluate.js.map +1 -0
  52. package/dist/cli/commands/run.d.ts.map +1 -1
  53. package/dist/cli/commands/run.js +93 -1
  54. package/dist/cli/commands/run.js.map +1 -1
  55. package/dist/cli/index.d.ts +2 -1
  56. package/dist/cli/index.d.ts.map +1 -1
  57. package/dist/cli/index.js +3 -1
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/cli/module-loader.d.ts +23 -1
  60. package/dist/cli/module-loader.d.ts.map +1 -1
  61. package/dist/cli/module-loader.js +19 -1
  62. package/dist/cli/module-loader.js.map +1 -1
  63. package/dist/cli/types.d.ts +19 -0
  64. package/dist/cli/types.d.ts.map +1 -1
  65. package/dist/evaluators/claims-evaluator.d.ts +87 -0
  66. package/dist/evaluators/claims-evaluator.d.ts.map +1 -0
  67. package/dist/evaluators/claims-evaluator.js +289 -0
  68. package/dist/evaluators/claims-evaluator.js.map +1 -0
  69. package/dist/evaluators/exploratory-evaluator.d.ts +136 -0
  70. package/dist/evaluators/exploratory-evaluator.d.ts.map +1 -0
  71. package/dist/evaluators/exploratory-evaluator.js +545 -0
  72. package/dist/evaluators/exploratory-evaluator.js.map +1 -0
  73. package/dist/evaluators/index.d.ts +13 -0
  74. package/dist/evaluators/index.d.ts.map +1 -0
  75. package/dist/evaluators/index.js +14 -0
  76. package/dist/evaluators/index.js.map +1 -0
  77. package/dist/evaluators/metrics-evaluator.d.ts +114 -0
  78. package/dist/evaluators/metrics-evaluator.d.ts.map +1 -0
  79. package/dist/evaluators/metrics-evaluator.js +433 -0
  80. package/dist/evaluators/metrics-evaluator.js.map +1 -0
  81. package/dist/evaluators/registry.d.ts +106 -0
  82. package/dist/evaluators/registry.d.ts.map +1 -0
  83. package/dist/evaluators/registry.js +148 -0
  84. package/dist/evaluators/registry.js.map +1 -0
  85. package/dist/evaluators/robustness-evaluator.d.ts +57 -0
  86. package/dist/evaluators/robustness-evaluator.d.ts.map +1 -0
  87. package/dist/evaluators/robustness-evaluator.js +186 -0
  88. package/dist/evaluators/robustness-evaluator.js.map +1 -0
  89. package/dist/executor/__tests__/binary-sut.unit.test.d.ts +8 -0
  90. package/dist/executor/__tests__/binary-sut.unit.test.d.ts.map +1 -0
  91. package/dist/executor/__tests__/binary-sut.unit.test.js +313 -0
  92. package/dist/executor/__tests__/binary-sut.unit.test.js.map +1 -0
  93. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +43 -0
  94. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
  95. package/dist/executor/__tests__/executor.unit.test.js +56 -9
  96. package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
  97. package/dist/executor/__tests__/resource-calculator.unit.test.d.ts +10 -0
  98. package/dist/executor/__tests__/resource-calculator.unit.test.d.ts.map +1 -0
  99. package/dist/executor/__tests__/resource-calculator.unit.test.js +104 -0
  100. package/dist/executor/__tests__/resource-calculator.unit.test.js.map +1 -0
  101. package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts +8 -0
  102. package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts.map +1 -0
  103. package/dist/executor/__tests__/worker-threads-executor.unit.test.js +276 -0
  104. package/dist/executor/__tests__/worker-threads-executor.unit.test.js.map +1 -0
  105. package/dist/executor/binary-sut.d.ts +105 -0
  106. package/dist/executor/binary-sut.d.ts.map +1 -0
  107. package/dist/executor/binary-sut.js +174 -0
  108. package/dist/executor/binary-sut.js.map +1 -0
  109. package/dist/executor/checkpoint-storage.d.ts.map +1 -1
  110. package/dist/executor/checkpoint-storage.js +6 -4
  111. package/dist/executor/checkpoint-storage.js.map +1 -1
  112. package/dist/executor/executor.d.ts +28 -0
  113. package/dist/executor/executor.d.ts.map +1 -1
  114. package/dist/executor/executor.js +85 -24
  115. package/dist/executor/executor.js.map +1 -1
  116. package/dist/executor/index.d.ts +4 -0
  117. package/dist/executor/index.d.ts.map +1 -1
  118. package/dist/executor/index.js +4 -0
  119. package/dist/executor/index.js.map +1 -1
  120. package/dist/executor/resource-calculator.d.ts +49 -0
  121. package/dist/executor/resource-calculator.d.ts.map +1 -0
  122. package/dist/executor/resource-calculator.js +129 -0
  123. package/dist/executor/resource-calculator.js.map +1 -0
  124. package/dist/executor/worker-entry.js +26 -10
  125. package/dist/executor/worker-entry.js.map +1 -1
  126. package/dist/executor/worker-executor.d.ts +104 -3
  127. package/dist/executor/worker-executor.d.ts.map +1 -1
  128. package/dist/executor/worker-executor.js +224 -4
  129. package/dist/executor/worker-executor.js.map +1 -1
  130. package/dist/executor/worker-threads-executor.d.ts +245 -0
  131. package/dist/executor/worker-threads-executor.d.ts.map +1 -0
  132. package/dist/executor/worker-threads-executor.js +332 -0
  133. package/dist/executor/worker-threads-executor.js.map +1 -0
  134. package/dist/index.d.ts +1 -0
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +4 -2
  137. package/dist/index.js.map +1 -1
  138. package/dist/renderers/latex-renderer.d.ts +60 -0
  139. package/dist/renderers/latex-renderer.d.ts.map +1 -1
  140. package/dist/renderers/latex-renderer.js +299 -0
  141. package/dist/renderers/latex-renderer.js.map +1 -1
  142. package/dist/renderers/types.d.ts +9 -0
  143. package/dist/renderers/types.d.ts.map +1 -1
  144. package/dist/renderers/types.js.map +1 -1
  145. package/dist/robustness/index.d.ts +5 -2
  146. package/dist/robustness/index.d.ts.map +1 -1
  147. package/dist/robustness/index.js +4 -2
  148. package/dist/robustness/index.js.map +1 -1
  149. package/dist/types/evaluator.d.ts +449 -0
  150. package/dist/types/evaluator.d.ts.map +1 -0
  151. package/dist/types/evaluator.js +9 -0
  152. package/dist/types/evaluator.js.map +1 -0
  153. package/dist/types/result.d.ts +2 -0
  154. package/dist/types/result.d.ts.map +1 -1
  155. package/package.json +2 -2
  156. package/dist/claims/__tests__/evaluator.unit.test.d.ts +0 -12
  157. package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +0 -1
  158. package/dist/claims/__tests__/evaluator.unit.test.js +0 -801
  159. package/dist/claims/__tests__/evaluator.unit.test.js.map +0 -1
  160. package/dist/claims/evaluator.d.ts +0 -33
  161. package/dist/claims/evaluator.d.ts.map +0 -1
  162. package/dist/claims/evaluator.js +0 -174
  163. package/dist/claims/evaluator.js.map +0 -1
  164. package/dist/robustness/__tests__/analyzer.unit.test.d.ts +0 -11
  165. package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +0 -1
  166. package/dist/robustness/__tests__/analyzer.unit.test.js +0 -455
  167. package/dist/robustness/__tests__/analyzer.unit.test.js.map +0 -1
  168. package/dist/robustness/analyzer.d.ts +0 -61
  169. package/dist/robustness/analyzer.d.ts.map +0 -1
  170. package/dist/robustness/analyzer.js +0 -191
  171. package/dist/robustness/analyzer.js.map +0 -1
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Worker Threads Executor
3
+ *
4
+ * Executes experiments using Node.js worker threads for parallelism.
5
+ * Each worker runs in isolation, preventing SUT crashes from affecting the main process.
6
+ *
7
+ * Architecture:
8
+ * - Main thread spawns N worker threads (75% of CPU cores by default)
9
+ * - Each worker receives a batch of runs via postMessage
10
+ * - Workers write results to sharded checkpoint files
11
+ * - Main thread merges shards after all workers complete
12
+ *
13
+ * Benefits:
14
+ * - Main thread isolation: SUT crashes don't crash the CLI
15
+ * - True parallelism: Workers run on separate OS threads
16
+ * - Resource managed: Automatic 75% resource allocation
17
+ * - Fault tolerance: Single worker failure doesn't stop others
18
+ *
19
+ * Dependency Injection:
20
+ * - Logger interface enables testing of log output
21
+ * - WorkerFactory interface enables mocking Worker for testing
22
+ * - WorkerEntryPath interface enables testing worker path resolution
23
+ */
24
+ import type { EvaluationResult } from "../types/result.js";
25
+ import type { ExecutorConfig, PlannedRun } from "./executor.js";
26
+ import type { WorkerMessage, WorkerOutputMessage } from "./worker-executor.js";
27
+ import type { ResourceLimits } from "./resource-calculator.js";
28
+ /**
29
+ * Logger interface for output handling.
30
+ * Enables testing of log messages.
31
+ */
32
+ export interface ILogger {
33
+ log(message: string): void;
34
+ debug(message: string): void;
35
+ info(message: string): void;
36
+ warn(message: string): void;
37
+ }
38
+ /**
39
+ * Production logger using console.
40
+ */
41
+ export declare class ConsoleLogger implements ILogger {
42
+ log(message: string): void;
43
+ debug(message: string): void;
44
+ info(message: string): void;
45
+ warn(message: string): void;
46
+ }
47
+ /**
48
+ * Worker interface.
49
+ * Abstraction over Node.js Worker.
50
+ */
51
+ export interface IWorker {
52
+ postMessage(message: WorkerMessage): void;
53
+ on(event: "message", listener: (data: WorkerOutputMessage) => void): void;
54
+ on(event: "error", listener: (error: Error) => void): void;
55
+ terminate(): Promise<number>;
56
+ }
57
+ /**
58
+ * Worker factory interface.
59
+ * Enables mocking of Worker construction for testing.
60
+ */
61
+ export interface IWorkerFactory {
62
+ create(workerPath: string): IWorker;
63
+ }
64
+ /**
65
+ * Production worker factory using node:worker_threads.
66
+ * Registers the tsx loader when spawning workers from TypeScript source.
67
+ */
68
+ export declare class WorkerFactory implements IWorkerFactory {
69
+ create(workerPath: string): IWorker;
70
+ }
71
+ /**
72
+ * Path resolver interface.
73
+ * Enables testing of worker entry path resolution.
74
+ */
75
+ export interface IWorkerEntryPath {
76
+ /**
77
+ * Get the absolute path to the worker entry point.
78
+ */
79
+ getWorkerEntryPath(): string;
80
+ }
81
+ /**
82
+ * Production path resolver using import.meta.url.
83
+ * Handles both compiled (dist/*.js) and source (src/*.ts via tsx) contexts.
84
+ */
85
+ export declare class WorkerEntryPath implements IWorkerEntryPath {
86
+ getWorkerEntryPath(): string;
87
+ }
88
+ /**
89
+ * Batch of runs for a worker.
90
+ */
91
+ export interface RunBatch {
92
+ /** Batch index */
93
+ index: number;
94
+ /** Run IDs in this batch */
95
+ runIds: string[];
96
+ /** Runs in this batch */
97
+ runs: PlannedRun[];
98
+ /** First run ID in batch */
99
+ firstRunId: string;
100
+ /** Last run ID in batch */
101
+ lastRunId: string;
102
+ }
103
+ /**
104
+ * Worker threads executor options.
105
+ */
106
+ export interface WorkerThreadsExecutorOptions {
107
+ /** Number of worker threads (default: auto-calculated from 75% CPU) */
108
+ workers?: number;
109
+ /** Maximum memory per worker in MB */
110
+ maxMemoryMb?: number;
111
+ /** Maximum concurrent I/O operations per worker */
112
+ maxConcurrentIo?: number;
113
+ /** Logger instance */
114
+ logger?: ILogger;
115
+ /** Worker factory instance */
116
+ workerFactory?: IWorkerFactory;
117
+ /** Worker entry path resolver */
118
+ workerEntryPath?: IWorkerEntryPath;
119
+ /** Base directory for resolving module paths (default: process.cwd()) */
120
+ baseDir?: string;
121
+ /** Use registry manifest mode for SUTs (enables registry-based SUTs with worker isolation) */
122
+ useRegistryManifest?: boolean;
123
+ }
124
+ /**
125
+ * Worker threads executor class with dependency injection.
126
+ *
127
+ * Executes experiments using Node.js worker threads for parallelism.
128
+ * Each worker runs in isolation, preventing SUT crashes from affecting the main process.
129
+ */
130
+ export declare class WorkerThreadsExecutor {
131
+ private readonly logger;
132
+ private readonly workerFactory;
133
+ private readonly workerEntryPath;
134
+ private readonly baseDir;
135
+ private readonly useRegistryManifest;
136
+ constructor(options?: WorkerThreadsExecutorOptions);
137
+ /**
138
+ * Split runs into batches for parallel processing.
139
+ * @param runs - Runs to distribute
140
+ * @param numberWorkers - Number of worker threads
141
+ * @returns Array of run batches
142
+ */
143
+ private _createBatches;
144
+ /**
145
+ * Execute runs using multiple worker threads.
146
+ *
147
+ * Each worker writes to its own sharded checkpoint file to avoid race conditions.
148
+ * After all workers complete, results are aggregated and returned.
149
+ *
150
+ * @param runs - Planned runs to execute
151
+ * @param suts - SUT definitions (serialized and passed to workers)
152
+ * @param cases - Case definitions (serialized and passed to workers)
153
+ * @param config - Executor configuration
154
+ * @param options - Worker threads executor options
155
+ * @param checkpointDir - Checkpoint directory for shard files
156
+ * @returns Execution results
157
+ */
158
+ execute(runs: PlannedRun[], suts: {
159
+ registration: {
160
+ id: string;
161
+ name: string;
162
+ version: string;
163
+ role: string;
164
+ };
165
+ factory: unknown;
166
+ }[], cases: {
167
+ case: {
168
+ caseId: string;
169
+ };
170
+ getInput: () => Promise<unknown>;
171
+ getInputs: () => unknown;
172
+ }[], config: ExecutorConfig & {
173
+ onResult?: (result: EvaluationResult) => void;
174
+ }, options?: WorkerThreadsExecutorOptions, checkpointDir?: string): Promise<{
175
+ results: EvaluationResult[];
176
+ errors: {
177
+ runId: string;
178
+ error: string;
179
+ }[];
180
+ }>;
181
+ /**
182
+ * Spawn worker threads for all batches.
183
+ * @param batches - Run batches
184
+ * @param workerPath - Path to worker entry point
185
+ * @param checkpointDir - Checkpoint directory
186
+ * @param config - Executor configuration
187
+ * @param suts - SUT definitions to serialize
188
+ * @param cases - Case definitions to serialize
189
+ * @returns Array of worker states
190
+ */
191
+ private _spawnWorkers;
192
+ /**
193
+ * Handle a message from a worker.
194
+ * @param state - Worker state
195
+ * @param data - Message data
196
+ * @param config - Executor configuration
197
+ */
198
+ private _handleWorkerMessage;
199
+ /**
200
+ * Wait for all workers to complete.
201
+ * @param workerStates - Worker states
202
+ * @returns Promise that resolves when all workers complete
203
+ */
204
+ private _waitForWorkers;
205
+ }
206
+ /**
207
+ * Execute runs using multiple worker threads.
208
+ *
209
+ * Each worker writes to its own sharded checkpoint file to avoid race conditions.
210
+ * After all workers complete, results are aggregated and returned.
211
+ *
212
+ * This is a convenience function that creates a WorkerThreadsExecutor with default dependencies.
213
+ * For testing or custom behavior, use the WorkerThreadsExecutor class directly.
214
+ *
215
+ * @param runs - Planned runs to execute
216
+ * @param suts - SUT definitions (serialized and passed to workers)
217
+ * @param cases - Case definitions (serialized and passed to workers)
218
+ * @param config - Executor configuration
219
+ * @param options - Worker threads executor options
220
+ * @returns Execution results
221
+ */
222
+ export declare const executeWithWorkerThreads: (runs: PlannedRun[], suts: {
223
+ registration: {
224
+ id: string;
225
+ name: string;
226
+ version: string;
227
+ role: string;
228
+ };
229
+ factory: unknown;
230
+ }[], cases: {
231
+ case: {
232
+ caseId: string;
233
+ };
234
+ getInput: () => Promise<unknown>;
235
+ getInputs: () => unknown;
236
+ }[], config: ExecutorConfig & {
237
+ onResult?: (result: EvaluationResult) => void;
238
+ }, options?: WorkerThreadsExecutorOptions & Partial<ResourceLimits>) => Promise<{
239
+ results: EvaluationResult[];
240
+ errors: {
241
+ runId: string;
242
+ error: string;
243
+ }[];
244
+ }>;
245
+ //# sourceMappingURL=worker-threads-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-threads-executor.d.ts","sourceRoot":"","sources":["../../src/executor/worker-threads-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Worker Threads Executor
3
+ *
4
+ * Executes experiments using Node.js worker threads for parallelism.
5
+ * Each worker runs in isolation, preventing SUT crashes from affecting the main process.
6
+ *
7
+ * Architecture:
8
+ * - Main thread spawns N worker threads (75% of CPU cores by default)
9
+ * - Each worker receives a batch of runs via postMessage
10
+ * - Workers write results to sharded checkpoint files
11
+ * - Main thread merges shards after all workers complete
12
+ *
13
+ * Benefits:
14
+ * - Main thread isolation: SUT crashes don't crash the CLI
15
+ * - True parallelism: Workers run on separate OS threads
16
+ * - Resource managed: Automatic 75% resource allocation
17
+ * - Fault tolerance: Single worker failure doesn't stop others
18
+ *
19
+ * Dependency Injection:
20
+ * - Logger interface enables testing of log output
21
+ * - WorkerFactory interface enables mocking Worker for testing
22
+ * - WorkerEntryPath interface enables testing worker path resolution
23
+ */
24
+ import { resolve } from "node:path";
25
+ import { fileURLToPath } from "node:url";
26
+ /**
27
+ * Production logger using console.
28
+ */
29
+ export class ConsoleLogger {
30
+ log(message) {
31
+ console.log(message);
32
+ }
33
+ debug(message) {
34
+ console.log(message);
35
+ }
36
+ info(message) {
37
+ console.log(message);
38
+ }
39
+ warn(message) {
40
+ console.warn(message);
41
+ }
42
+ }
43
+ import { Worker } from "node:worker_threads";
44
+ /**
45
+ * Production worker factory using node:worker_threads.
46
+ * Registers the tsx loader when spawning workers from TypeScript source.
47
+ */
48
+ export class WorkerFactory {
49
+ create(workerPath) {
50
+ const execArgv = workerPath.endsWith(".ts") ? ["--import", "tsx"] : [];
51
+ return new Worker(workerPath, { execArgv });
52
+ }
53
+ }
54
+ /**
55
+ * Production path resolver using import.meta.url.
56
+ * Handles both compiled (dist/*.js) and source (src/*.ts via tsx) contexts.
57
+ */
58
+ export class WorkerEntryPath {
59
+ getWorkerEntryPath() {
60
+ const __filename = fileURLToPath(import.meta.url);
61
+ const __dirname = resolve(__filename, "..");
62
+ const ext = __filename.endsWith(".ts") ? ".ts" : ".js";
63
+ return resolve(__dirname, `worker-entry${ext}`);
64
+ }
65
+ }
66
+ /**
67
+ * Worker threads executor class with dependency injection.
68
+ *
69
+ * Executes experiments using Node.js worker threads for parallelism.
70
+ * Each worker runs in isolation, preventing SUT crashes from affecting the main process.
71
+ */
72
+ export class WorkerThreadsExecutor {
73
+ logger;
74
+ workerFactory;
75
+ workerEntryPath;
76
+ baseDir;
77
+ useRegistryManifest;
78
+ constructor(options = {}) {
79
+ this.logger = options.logger ?? new ConsoleLogger();
80
+ this.workerFactory = options.workerFactory ?? new WorkerFactory();
81
+ this.workerEntryPath = options.workerEntryPath ?? new WorkerEntryPath();
82
+ this.baseDir = options.baseDir ?? process.cwd();
83
+ this.useRegistryManifest = options.useRegistryManifest ?? false;
84
+ }
85
+ /**
86
+ * Split runs into batches for parallel processing.
87
+ * @param runs - Runs to distribute
88
+ * @param numberWorkers - Number of worker threads
89
+ * @returns Array of run batches
90
+ */
91
+ _createBatches(runs, numberWorkers) {
92
+ const batchSize = Math.ceil(runs.length / numberWorkers);
93
+ const batches = [];
94
+ for (let i = 0; i < runs.length; i += batchSize) {
95
+ const batch = runs.slice(i, i + batchSize);
96
+ const batchIndex = Math.floor(i / batchSize);
97
+ const runIds = batch.map((r) => r.runId);
98
+ batches.push({
99
+ index: batchIndex,
100
+ runIds,
101
+ runs: batch,
102
+ firstRunId: batch[0]?.runId ?? "none",
103
+ lastRunId: batch.at(-1)?.runId ?? "none",
104
+ });
105
+ }
106
+ return batches;
107
+ }
108
+ /**
109
+ * Execute runs using multiple worker threads.
110
+ *
111
+ * Each worker writes to its own sharded checkpoint file to avoid race conditions.
112
+ * After all workers complete, results are aggregated and returned.
113
+ *
114
+ * @param runs - Planned runs to execute
115
+ * @param suts - SUT definitions (serialized and passed to workers)
116
+ * @param cases - Case definitions (serialized and passed to workers)
117
+ * @param config - Executor configuration
118
+ * @param options - Worker threads executor options
119
+ * @param checkpointDir - Checkpoint directory for shard files
120
+ * @returns Execution results
121
+ */
122
+ async execute(runs, suts, cases, config, options = {}, checkpointDir = resolve(process.cwd(), "results/execute")) {
123
+ const workerCount = options.workers ?? 1;
124
+ this.logger.info(`WorkerThreadsExecutor: Spawning ${workerCount} workers for ${runs.length} runs`);
125
+ this.logger.info(`Checkpoint directory: ${checkpointDir}`);
126
+ // Split runs into batches
127
+ const batches = this._createBatches(runs, workerCount);
128
+ // Log batch information
129
+ for (const batch of batches) {
130
+ this.logger.debug(`Batch ${batch.index} has ${batch.runIds.length} runs`);
131
+ this.logger.debug(` First run: ${batch.firstRunId}, Last run: ${batch.lastRunId}`);
132
+ }
133
+ // Get worker entry path
134
+ const workerPath = this.workerEntryPath.getWorkerEntryPath();
135
+ this.logger.debug(`Worker entry path: ${workerPath}`);
136
+ // Spawn workers
137
+ const workerStates = this._spawnWorkers(batches, workerPath, checkpointDir, config, suts, cases);
138
+ // Wait for all workers to complete
139
+ await this._waitForWorkers(workerStates);
140
+ // Aggregate results
141
+ const allResults = [];
142
+ const allErrors = [];
143
+ for (const state of workerStates) {
144
+ allResults.push(...state.results);
145
+ allErrors.push(...state.errors);
146
+ }
147
+ this.logger.info(`All workers completed: ${allResults.length} results, ${allErrors.length} errors`);
148
+ return { results: allResults, errors: allErrors };
149
+ }
150
+ /**
151
+ * Spawn worker threads for all batches.
152
+ * @param batches - Run batches
153
+ * @param workerPath - Path to worker entry point
154
+ * @param checkpointDir - Checkpoint directory
155
+ * @param config - Executor configuration
156
+ * @param suts - SUT definitions to serialize
157
+ * @param cases - Case definitions to serialize
158
+ * @returns Array of worker states
159
+ */
160
+ _spawnWorkers(batches, workerPath, checkpointDir, config, suts, cases) {
161
+ const workerStates = [];
162
+ // Serialize SUTs for WorkerMessage
163
+ const serializedSuts = suts.map((sut) => ({
164
+ id: sut.registration.id,
165
+ module: `./dist/suts/${sut.registration.id}.js`,
166
+ exportName: "createSut",
167
+ registration: {
168
+ name: sut.registration.name,
169
+ version: sut.registration.version,
170
+ role: sut.registration.role,
171
+ },
172
+ }));
173
+ // Serialize cases for WorkerMessage
174
+ const serializedCases = cases.map((c) => ({
175
+ caseId: c.case.caseId,
176
+ module: `./dist/cases/${c.case.caseId}.js`,
177
+ exportName: "createCase",
178
+ }));
179
+ for (const batch of batches) {
180
+ const checkpointPath = resolve(checkpointDir, `checkpoint-worker-${String(batch.index).padStart(2, "0")}.json`);
181
+ const worker = this.workerFactory.create(workerPath);
182
+ const state = {
183
+ worker,
184
+ index: batch.index,
185
+ batch,
186
+ checkpointPath,
187
+ completed: false,
188
+ results: [],
189
+ errors: [],
190
+ };
191
+ // Set up message handler
192
+ worker.on("message", (data) => {
193
+ this._handleWorkerMessage(state, data, config);
194
+ });
195
+ // Set up error handler
196
+ worker.on("error", (error) => {
197
+ this.logger.warn(`Worker ${batch.index} error: ${error.message}`);
198
+ state.completed = true;
199
+ // Add error for all runs in this batch
200
+ for (const runId of batch.runIds) {
201
+ state.errors.push({ runId, error: error.message });
202
+ }
203
+ });
204
+ // Send initial message to worker with serialized SUTs and cases
205
+ const workerMessage = {
206
+ runs: batch.runs.map((run) => ({
207
+ runId: run.runId,
208
+ sutId: run.sutId,
209
+ caseId: run.caseId,
210
+ repetition: run.repetition,
211
+ config: run.config,
212
+ })),
213
+ config: {
214
+ repetitions: config.repetitions,
215
+ seedBase: config.seedBase,
216
+ continueOnError: config.continueOnError,
217
+ timeoutMs: config.timeoutMs,
218
+ collectProvenance: config.collectProvenance,
219
+ },
220
+ baseDir: this.baseDir,
221
+ suts: serializedSuts,
222
+ cases: serializedCases,
223
+ };
224
+ // Add registry manifest if useRegistryManifest is enabled
225
+ if (this.useRegistryManifest) {
226
+ const registryManifest = {
227
+ suts: suts.map((sut) => ({
228
+ id: sut.registration.id,
229
+ name: sut.registration.name,
230
+ version: sut.registration.version,
231
+ role: sut.registration.role,
232
+ config: {},
233
+ tags: [],
234
+ })),
235
+ sharedCode: "", // Registry code not bundled in this implementation
236
+ sutModules: Object.fromEntries(suts.map((sut) => [sut.registration.id, `./dist/suts/${sut.registration.id}.js`])),
237
+ exportName: "createSut",
238
+ };
239
+ workerMessage.registryManifest = registryManifest;
240
+ }
241
+ worker.postMessage(workerMessage);
242
+ workerStates.push(state);
243
+ }
244
+ return workerStates;
245
+ }
246
+ /**
247
+ * Handle a message from a worker.
248
+ * @param state - Worker state
249
+ * @param data - Message data
250
+ * @param config - Executor configuration
251
+ */
252
+ _handleWorkerMessage(state, data, config) {
253
+ // Use type guards to discriminate the union type
254
+ const isError = (msg) => msg.type === "error";
255
+ const isSuccess = (msg) => msg.type === "done";
256
+ // Handle WorkerErrorMessage
257
+ if (isError(data)) {
258
+ this.logger.warn(`Worker ${state.index} error: ${data.error}`);
259
+ state.completed = true;
260
+ for (const runId of state.batch.runIds) {
261
+ state.errors.push({ runId, error: data.error });
262
+ }
263
+ return;
264
+ }
265
+ // Handle WorkerSuccessMessage
266
+ if (isSuccess(data)) {
267
+ state.results.push(...data.results);
268
+ state.errors.push(...data.errors);
269
+ state.completed = true;
270
+ this.logger.debug(`Worker ${state.index} completed: ${data.results.length} results`);
271
+ // Call onResult callback for each result
272
+ if (config.onResult) {
273
+ for (const result of data.results) {
274
+ try {
275
+ void config.onResult(result);
276
+ }
277
+ catch (error) {
278
+ this.logger.warn(`Error in onResult callback: ${String(error)}`);
279
+ }
280
+ }
281
+ }
282
+ }
283
+ }
284
+ /**
285
+ * Wait for all workers to complete.
286
+ * @param workerStates - Worker states
287
+ * @returns Promise that resolves when all workers complete
288
+ */
289
+ async _waitForWorkers(workerStates) {
290
+ return new Promise((resolve, reject) => {
291
+ let completedCount = 0;
292
+ const totalWorkers = workerStates.length;
293
+ const checkCompletion = () => {
294
+ completedCount = workerStates.filter((s) => s.completed).length;
295
+ if (completedCount === totalWorkers) {
296
+ clearInterval(interval);
297
+ clearTimeout(timeout);
298
+ resolve();
299
+ }
300
+ };
301
+ // Poll for completion
302
+ const interval = setInterval(checkCompletion, 100);
303
+ // Timeout after 1 hour
304
+ const timeout = setTimeout(() => {
305
+ clearInterval(interval);
306
+ const incomplete = workerStates.filter((s) => !s.completed).map((s) => s.index);
307
+ reject(new Error(`Worker timeout after 1 hour. Incomplete workers: ${incomplete.join(", ")}`));
308
+ }, 3_600_000);
309
+ });
310
+ }
311
+ }
312
+ /**
313
+ * Execute runs using multiple worker threads.
314
+ *
315
+ * Each worker writes to its own sharded checkpoint file to avoid race conditions.
316
+ * After all workers complete, results are aggregated and returned.
317
+ *
318
+ * This is a convenience function that creates a WorkerThreadsExecutor with default dependencies.
319
+ * For testing or custom behavior, use the WorkerThreadsExecutor class directly.
320
+ *
321
+ * @param runs - Planned runs to execute
322
+ * @param suts - SUT definitions (serialized and passed to workers)
323
+ * @param cases - Case definitions (serialized and passed to workers)
324
+ * @param config - Executor configuration
325
+ * @param options - Worker threads executor options
326
+ * @returns Execution results
327
+ */
328
+ export const executeWithWorkerThreads = async (runs, suts, cases, config, options = {}) => {
329
+ const executor = new WorkerThreadsExecutor(options);
330
+ return executor.execute(runs, suts, cases, config, options);
331
+ };
332
+ //# sourceMappingURL=worker-threads-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-threads-executor.js","sourceRoot":"","sources":["../../src/executor/worker-threads-executor.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export * from "./executor/index.js";
9
9
  export * from "./collector/index.js";
10
10
  export * from "./statistical/index.js";
11
11
  export * from "./aggregation/index.js";
12
+ export * from "./evaluators/index.js";
12
13
  export * from "./claims/index.js";
13
14
  export * from "./robustness/index.js";
14
15
  export * from "./renderers/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -15,9 +15,11 @@ export * from "./collector/index.js";
15
15
  export * from "./statistical/index.js";
16
16
  // Aggregation
17
17
  export * from "./aggregation/index.js";
18
- // Claims
18
+ // Evaluators (new extensible evaluation system)
19
+ export * from "./evaluators/index.js";
20
+ // Claims (types only)
19
21
  export * from "./claims/index.js";
20
- // Robustness
22
+ // Robustness (types and perturbations only)
21
23
  export * from "./robustness/index.js";
22
24
  // Renderers
23
25
  export * from "./renderers/index.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,WAAW;AACX,cAAc,qBAAqB,CAAC;AAEpC,WAAW;AACX,cAAc,qBAAqB,CAAC;AAEpC,YAAY;AACZ,cAAc,sBAAsB,CAAC;AAErC,cAAc;AACd,cAAc,wBAAwB,CAAC;AAEvC,cAAc;AACd,cAAc,wBAAwB,CAAC;AAEvC,SAAS;AACT,cAAc,mBAAmB,CAAC;AAElC,aAAa;AACb,cAAc,uBAAuB,CAAC;AAEtC,YAAY;AACZ,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,WAAW;AACX,cAAc,qBAAqB,CAAC;AAEpC,WAAW;AACX,cAAc,qBAAqB,CAAC;AAEpC,YAAY;AACZ,cAAc,sBAAsB,CAAC;AAErC,cAAc;AACd,cAAc,wBAAwB,CAAC;AAEvC,cAAc;AACd,cAAc,wBAAwB,CAAC;AAEvC,gDAAgD;AAChD,cAAc,uBAAuB,CAAC;AAEtC,sBAAsB;AACtB,cAAc,mBAAmB,CAAC;AAElC,4CAA4C;AAC5C,cAAc,uBAAuB,CAAC;AAEtC,YAAY;AACZ,cAAc,sBAAsB,CAAC"}