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.
Files changed (199) hide show
  1. package/README.md +172 -0
  2. package/dist/__tests__/framework-pipeline.integration.test.d.ts +7 -0
  3. package/dist/__tests__/framework-pipeline.integration.test.d.ts.map +1 -0
  4. package/dist/__tests__/framework-pipeline.integration.test.js +413 -0
  5. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -0
  6. package/dist/__tests__/registry-executor.integration.test.d.ts +5 -0
  7. package/dist/__tests__/registry-executor.integration.test.d.ts.map +1 -0
  8. package/dist/__tests__/registry-executor.integration.test.js +349 -0
  9. package/dist/__tests__/registry-executor.integration.test.js.map +1 -0
  10. package/dist/__tests__/test-helpers.d.ts +94 -0
  11. package/dist/__tests__/test-helpers.d.ts.map +1 -0
  12. package/dist/__tests__/test-helpers.js +271 -0
  13. package/dist/__tests__/test-helpers.js.map +1 -0
  14. package/dist/aggregation/aggregators.d.ts +54 -0
  15. package/dist/aggregation/aggregators.d.ts.map +1 -0
  16. package/dist/aggregation/aggregators.js +228 -0
  17. package/dist/aggregation/aggregators.js.map +1 -0
  18. package/dist/aggregation/index.d.ts +8 -0
  19. package/dist/aggregation/index.d.ts.map +1 -0
  20. package/dist/aggregation/index.js +8 -0
  21. package/dist/aggregation/index.js.map +1 -0
  22. package/dist/aggregation/pipeline.d.ts +38 -0
  23. package/dist/aggregation/pipeline.d.ts.map +1 -0
  24. package/dist/aggregation/pipeline.js +198 -0
  25. package/dist/aggregation/pipeline.js.map +1 -0
  26. package/dist/claims/evaluator.d.ts +33 -0
  27. package/dist/claims/evaluator.d.ts.map +1 -0
  28. package/dist/claims/evaluator.js +174 -0
  29. package/dist/claims/evaluator.js.map +1 -0
  30. package/dist/claims/index.d.ts +7 -0
  31. package/dist/claims/index.d.ts.map +1 -0
  32. package/dist/claims/index.js +7 -0
  33. package/dist/claims/index.js.map +1 -0
  34. package/dist/collector/index.d.ts +8 -0
  35. package/dist/collector/index.d.ts.map +1 -0
  36. package/dist/collector/index.js +8 -0
  37. package/dist/collector/index.js.map +1 -0
  38. package/dist/collector/result-collector.d.ts +159 -0
  39. package/dist/collector/result-collector.d.ts.map +1 -0
  40. package/dist/collector/result-collector.js +213 -0
  41. package/dist/collector/result-collector.js.map +1 -0
  42. package/dist/collector/schema.d.ts +34 -0
  43. package/dist/collector/schema.d.ts.map +1 -0
  44. package/dist/collector/schema.js +145 -0
  45. package/dist/collector/schema.js.map +1 -0
  46. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts +10 -0
  47. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts.map +1 -0
  48. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js +122 -0
  49. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js.map +1 -0
  50. package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts +7 -0
  51. package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts.map +1 -0
  52. package/dist/executor/__tests__/checkpoint-manager.integration.test.js +330 -0
  53. package/dist/executor/__tests__/checkpoint-manager.integration.test.js.map +1 -0
  54. package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts +7 -0
  55. package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts.map +1 -0
  56. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +449 -0
  57. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -0
  58. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +11 -0
  59. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -0
  60. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +224 -0
  61. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -0
  62. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts +8 -0
  63. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts.map +1 -0
  64. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js +164 -0
  65. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js.map +1 -0
  66. package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts +7 -0
  67. package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts.map +1 -0
  68. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +386 -0
  69. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -0
  70. package/dist/executor/__tests__/executor.unit.test.d.ts +7 -0
  71. package/dist/executor/__tests__/executor.unit.test.d.ts.map +1 -0
  72. package/dist/executor/__tests__/executor.unit.test.js +134 -0
  73. package/dist/executor/__tests__/executor.unit.test.js.map +1 -0
  74. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts +12 -0
  75. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts.map +1 -0
  76. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js +196 -0
  77. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js.map +1 -0
  78. package/dist/executor/__tests__/parallel-executor.integration.test.d.ts +7 -0
  79. package/dist/executor/__tests__/parallel-executor.integration.test.d.ts.map +1 -0
  80. package/dist/executor/__tests__/parallel-executor.integration.test.js +249 -0
  81. package/dist/executor/__tests__/parallel-executor.integration.test.js.map +1 -0
  82. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +7 -0
  83. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -0
  84. package/dist/executor/__tests__/parallel-executor.unit.test.js +203 -0
  85. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -0
  86. package/dist/executor/checkpoint-manager.d.ts +231 -0
  87. package/dist/executor/checkpoint-manager.d.ts.map +1 -0
  88. package/dist/executor/checkpoint-manager.js +395 -0
  89. package/dist/executor/checkpoint-manager.js.map +1 -0
  90. package/dist/executor/checkpoint-storage.d.ts +230 -0
  91. package/dist/executor/checkpoint-storage.d.ts.map +1 -0
  92. package/dist/executor/checkpoint-storage.js +370 -0
  93. package/dist/executor/checkpoint-storage.js.map +1 -0
  94. package/dist/executor/checkpoint-types.d.ts +48 -0
  95. package/dist/executor/checkpoint-types.d.ts.map +1 -0
  96. package/dist/executor/checkpoint-types.js +8 -0
  97. package/dist/executor/checkpoint-types.js.map +1 -0
  98. package/dist/executor/executor.d.ts +164 -0
  99. package/dist/executor/executor.d.ts.map +1 -0
  100. package/dist/executor/executor.js +408 -0
  101. package/dist/executor/executor.js.map +1 -0
  102. package/dist/executor/index.d.ts +11 -0
  103. package/dist/executor/index.d.ts.map +1 -0
  104. package/dist/executor/index.js +11 -0
  105. package/dist/executor/index.js.map +1 -0
  106. package/dist/executor/memory-monitor.d.ts +115 -0
  107. package/dist/executor/memory-monitor.d.ts.map +1 -0
  108. package/dist/executor/memory-monitor.js +168 -0
  109. package/dist/executor/memory-monitor.js.map +1 -0
  110. package/dist/executor/parallel-executor.d.ts +53 -0
  111. package/dist/executor/parallel-executor.d.ts.map +1 -0
  112. package/dist/executor/parallel-executor.js +194 -0
  113. package/dist/executor/parallel-executor.js.map +1 -0
  114. package/dist/executor/run-id.d.ts +71 -0
  115. package/dist/executor/run-id.d.ts.map +1 -0
  116. package/dist/executor/run-id.js +67 -0
  117. package/dist/executor/run-id.js.map +1 -0
  118. package/dist/executor/worker-entry.d.ts +8 -0
  119. package/dist/executor/worker-entry.d.ts.map +1 -0
  120. package/dist/executor/worker-entry.js +67 -0
  121. package/dist/executor/worker-entry.js.map +1 -0
  122. package/dist/index.cjs +11 -0
  123. package/dist/index.d.ts +15 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +24 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/registry/case-registry.d.ts +113 -0
  128. package/dist/registry/case-registry.d.ts.map +1 -0
  129. package/dist/registry/case-registry.js +160 -0
  130. package/dist/registry/case-registry.js.map +1 -0
  131. package/dist/registry/index.d.ts +8 -0
  132. package/dist/registry/index.d.ts.map +1 -0
  133. package/dist/registry/index.js +8 -0
  134. package/dist/registry/index.js.map +1 -0
  135. package/dist/registry/sut-registry.d.ts +96 -0
  136. package/dist/registry/sut-registry.d.ts.map +1 -0
  137. package/dist/registry/sut-registry.js +126 -0
  138. package/dist/registry/sut-registry.js.map +1 -0
  139. package/dist/renderers/index.d.ts +10 -0
  140. package/dist/renderers/index.d.ts.map +1 -0
  141. package/dist/renderers/index.js +9 -0
  142. package/dist/renderers/index.js.map +1 -0
  143. package/dist/renderers/latex-renderer.d.ts +84 -0
  144. package/dist/renderers/latex-renderer.d.ts.map +1 -0
  145. package/dist/renderers/latex-renderer.js +208 -0
  146. package/dist/renderers/latex-renderer.js.map +1 -0
  147. package/dist/renderers/types.d.ts +106 -0
  148. package/dist/renderers/types.d.ts.map +1 -0
  149. package/dist/renderers/types.js +23 -0
  150. package/dist/renderers/types.js.map +1 -0
  151. package/dist/robustness/analyzer.d.ts +61 -0
  152. package/dist/robustness/analyzer.d.ts.map +1 -0
  153. package/dist/robustness/analyzer.js +191 -0
  154. package/dist/robustness/analyzer.js.map +1 -0
  155. package/dist/robustness/index.d.ts +8 -0
  156. package/dist/robustness/index.d.ts.map +1 -0
  157. package/dist/robustness/index.js +8 -0
  158. package/dist/robustness/index.js.map +1 -0
  159. package/dist/robustness/perturbations.d.ts +46 -0
  160. package/dist/robustness/perturbations.d.ts.map +1 -0
  161. package/dist/robustness/perturbations.js +184 -0
  162. package/dist/robustness/perturbations.js.map +1 -0
  163. package/dist/statistical/index.d.ts +8 -0
  164. package/dist/statistical/index.d.ts.map +1 -0
  165. package/dist/statistical/index.js +8 -0
  166. package/dist/statistical/index.js.map +1 -0
  167. package/dist/statistical/mann-whitney-u.d.ts +62 -0
  168. package/dist/statistical/mann-whitney-u.d.ts.map +1 -0
  169. package/dist/statistical/mann-whitney-u.js +127 -0
  170. package/dist/statistical/mann-whitney-u.js.map +1 -0
  171. package/dist/types/aggregate.d.ts +124 -0
  172. package/dist/types/aggregate.d.ts.map +1 -0
  173. package/dist/types/aggregate.js +9 -0
  174. package/dist/types/aggregate.js.map +1 -0
  175. package/dist/types/case.d.ts +105 -0
  176. package/dist/types/case.d.ts.map +1 -0
  177. package/dist/types/case.js +10 -0
  178. package/dist/types/case.js.map +1 -0
  179. package/dist/types/claims.d.ts +122 -0
  180. package/dist/types/claims.d.ts.map +1 -0
  181. package/dist/types/claims.js +14 -0
  182. package/dist/types/claims.js.map +1 -0
  183. package/dist/types/index.d.ts +12 -0
  184. package/dist/types/index.d.ts.map +1 -0
  185. package/dist/types/index.js +7 -0
  186. package/dist/types/index.js.map +1 -0
  187. package/dist/types/perturbation.d.ts +105 -0
  188. package/dist/types/perturbation.d.ts.map +1 -0
  189. package/dist/types/perturbation.js +9 -0
  190. package/dist/types/perturbation.js.map +1 -0
  191. package/dist/types/result.d.ts +150 -0
  192. package/dist/types/result.d.ts.map +1 -0
  193. package/dist/types/result.js +12 -0
  194. package/dist/types/result.js.map +1 -0
  195. package/dist/types/sut.d.ts +128 -0
  196. package/dist/types/sut.d.ts.map +1 -0
  197. package/dist/types/sut.js +12 -0
  198. package/dist/types/sut.js.map +1 -0
  199. package/package.json +283 -7
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Unit tests for ParallelExecutor
3
+ *
4
+ * Tests worker name generation, run batch distribution, and shard path generation.
5
+ */
6
+ import { describe, it } from "node:test";
7
+ import { strict as assert } from "node:assert";
8
+ import { shardPath } from "../parallel-executor.js";
9
+ describe("ParallelExecutor", () => {
10
+ describe("shardPath", () => {
11
+ it("should generate zero-padded worker indices", () => {
12
+ const path0 = shardPath("/tmp/checkpoints", 0);
13
+ const path1 = shardPath("/tmp/checkpoints", 1);
14
+ const path9 = shardPath("/tmp/checkpoints", 9);
15
+ const path10 = shardPath("/tmp/checkpoints", 10);
16
+ const path99 = shardPath("/tmp/checkpoints", 99);
17
+ const path100 = shardPath("/tmp/checkpoints", 100);
18
+ assert.ok(path0.includes("checkpoint-worker-00.json"));
19
+ assert.ok(path1.includes("checkpoint-worker-01.json"));
20
+ assert.ok(path9.includes("checkpoint-worker-09.json"));
21
+ assert.ok(path10.includes("checkpoint-worker-10.json"));
22
+ assert.ok(path99.includes("checkpoint-worker-99.json"));
23
+ assert.ok(path100.includes("checkpoint-worker-100.json"));
24
+ });
25
+ it("should include checkpoint directory in path", () => {
26
+ const path = shardPath("/my/checkpoint/dir", 5);
27
+ assert.ok(path.includes("/my/checkpoint/dir"));
28
+ assert.ok(path.includes("checkpoint-worker-05.json"));
29
+ });
30
+ });
31
+ describe("run batch distribution (conceptual)", () => {
32
+ /**
33
+ * The executeParallel function uses the following algorithm:
34
+ * 1. Calculate batch size = ceil(runs.length / numWorkers)
35
+ * 2. Split runs into batches using slice(i, i + batchSize)
36
+ *
37
+ * This test verifies the algorithm produces expected results.
38
+ */
39
+ it("should distribute runs evenly across workers", () => {
40
+ const runs = Array.from({ length: 100 }, (_, index) => ({
41
+ runId: `run${index}`,
42
+ sutId: "sut",
43
+ caseId: "case",
44
+ repetition: 0,
45
+ seed: index,
46
+ }));
47
+ const numberWorkers = 4;
48
+ const batchSize = Math.ceil(runs.length / numberWorkers); // 25
49
+ const batches = [];
50
+ for (let index = 0; index < runs.length; index += batchSize) {
51
+ batches.push(runs.slice(index, index + batchSize));
52
+ }
53
+ assert.strictEqual(batches.length, 4);
54
+ assert.strictEqual(batches[0].length, 25);
55
+ assert.strictEqual(batches[1].length, 25);
56
+ assert.strictEqual(batches[2].length, 25);
57
+ assert.strictEqual(batches[3].length, 25);
58
+ });
59
+ it("should handle uneven distribution", () => {
60
+ const runs = Array.from({ length: 10 }, (_, index) => ({
61
+ runId: `run${index}`,
62
+ sutId: "sut",
63
+ caseId: "case",
64
+ repetition: 0,
65
+ seed: index,
66
+ }));
67
+ const numberWorkers = 3;
68
+ const batchSize = Math.ceil(runs.length / numberWorkers); // 4
69
+ const batches = [];
70
+ for (let index = 0; index < runs.length; index += batchSize) {
71
+ batches.push(runs.slice(index, index + batchSize));
72
+ }
73
+ assert.strictEqual(batches.length, 3);
74
+ assert.strictEqual(batches[0].length, 4);
75
+ assert.strictEqual(batches[1].length, 4);
76
+ assert.strictEqual(batches[2].length, 2); // Last batch gets remainder
77
+ });
78
+ it("should handle single worker", () => {
79
+ const runs = Array.from({ length: 50 }, (_, index) => ({
80
+ runId: `run${index}`,
81
+ sutId: "sut",
82
+ caseId: "case",
83
+ repetition: 0,
84
+ seed: index,
85
+ }));
86
+ const numberWorkers = 1;
87
+ const batchSize = Math.ceil(runs.length / numberWorkers); // 50
88
+ const batches = [];
89
+ for (let index = 0; index < runs.length; index += batchSize) {
90
+ batches.push(runs.slice(index, index + batchSize));
91
+ }
92
+ assert.strictEqual(batches.length, 1);
93
+ assert.strictEqual(batches[0].length, 50);
94
+ });
95
+ it("should handle more workers than runs", () => {
96
+ const runs = [
97
+ { runId: "run0", sutId: "sut", caseId: "case", repetition: 0, seed: 0 },
98
+ { runId: "run1", sutId: "sut", caseId: "case", repetition: 0, seed: 1 },
99
+ ];
100
+ const numberWorkers = 5;
101
+ const batchSize = Math.ceil(runs.length / numberWorkers); // 1
102
+ const batches = [];
103
+ for (let index = 0; index < runs.length; index += batchSize) {
104
+ batches.push(runs.slice(index, index + batchSize));
105
+ }
106
+ // With batchSize=1, we get 2 batches (one per run)
107
+ // The last 3 workers would get empty batches in the actual implementation
108
+ assert.ok(batches.length >= 2);
109
+ assert.strictEqual(batches[0].length, 1);
110
+ assert.strictEqual(batches[1].length, 1);
111
+ });
112
+ });
113
+ describe("run filter generation (conceptual)", () => {
114
+ /**
115
+ * Each worker receives a run filter as a JSON array of run IDs.
116
+ * This test verifies the filter format.
117
+ */
118
+ it("should generate JSON array of run IDs for each batch", () => {
119
+ const runs = [
120
+ { runId: "alpha", sutId: "sut", caseId: "case", repetition: 0, seed: 0 },
121
+ { runId: "bravo", sutId: "sut", caseId: "case", repetition: 0, seed: 1 },
122
+ { runId: "charlie", sutId: "sut", caseId: "case", repetition: 0, seed: 2 },
123
+ ];
124
+ const numberWorkers = 2;
125
+ const batchSize = Math.ceil(runs.length / numberWorkers); // 2
126
+ const runFilters = [];
127
+ for (let index = 0; index < runs.length; index += batchSize) {
128
+ const batch = runs.slice(index, index + batchSize);
129
+ const runIds = new Set(batch.map((r) => r.runId));
130
+ runFilters.push(JSON.stringify([...runIds]));
131
+ }
132
+ assert.strictEqual(runFilters.length, 2);
133
+ const filter0 = JSON.parse(runFilters[0]);
134
+ const filter1 = JSON.parse(runFilters[1]);
135
+ assert.ok(filter0.includes("alpha"));
136
+ assert.ok(filter0.includes("bravo"));
137
+ assert.ok(filter1.includes("charlie"));
138
+ });
139
+ });
140
+ describe("worker names generation (conceptual)", () => {
141
+ /**
142
+ * Worker names follow the pattern: {adjective}-{noun}-{hex-suffix}
143
+ * This test verifies names are unique and well-formatted.
144
+ */
145
+ it("should generate unique worker names", () => {
146
+ // The actual implementation uses random adjectives, nouns, and hex suffix
147
+ // Here we verify the pattern is followed
148
+ const adjectives = ["swift", "nimble", "quick"];
149
+ const nouns = ["runner", "worker", "processor"];
150
+ const usedNames = new Set();
151
+ const names = [];
152
+ for (let index = 0; index < 10; index++) {
153
+ const adj = adjectives[index % adjectives.length];
154
+ const noun = nouns[index % nouns.length];
155
+ const suffix = index.toString(16).padStart(4, "0"); // Simulate hex suffix
156
+ const name = `${adj}-${noun}-${suffix}`;
157
+ // Verify uniqueness
158
+ assert.ok(!usedNames.has(name));
159
+ usedNames.add(name);
160
+ names.push(name);
161
+ }
162
+ assert.strictEqual(names.length, 10);
163
+ assert.strictEqual(new Set(names).size, 10); // All unique
164
+ });
165
+ });
166
+ describe("spawn arguments (conceptual)", () => {
167
+ /**
168
+ * Verify that workers are spawned with correct arguments.
169
+ */
170
+ it("should include checkpoint-path argument for each worker", () => {
171
+ const checkpointDir = "/tmp/checkpoints";
172
+ const workerIndex = 2;
173
+ const checkpointPath = shardPath(checkpointDir, workerIndex);
174
+ assert.ok(checkpointPath.includes("checkpoint-worker-02.json"));
175
+ assert.ok(checkpointPath.includes(checkpointDir));
176
+ });
177
+ it("should include worker-index in environment variables", () => {
178
+ const workerIndex = 3;
179
+ const environmentVariable = `GRAPHBOX_WORKER_INDEX=${workerIndex}`;
180
+ assert.strictEqual(environmentVariable, "GRAPHBOX_WORKER_INDEX=3");
181
+ });
182
+ it("should include total-workers in environment variables", () => {
183
+ const totalWorkers = 5;
184
+ const environmentVariable = `GRAPHBOX_TOTAL_WORKERS=${totalWorkers}`;
185
+ assert.strictEqual(environmentVariable, "GRAPHBOX_TOTAL_WORKERS=5");
186
+ });
187
+ });
188
+ });
189
+ describe("ParallelExecutorOptions", () => {
190
+ describe("defaults", () => {
191
+ it("should use default checkpoint directory when not specified", () => {
192
+ const options = {};
193
+ const checkpointDir = options.checkpointDir ?? "/default/path";
194
+ assert.strictEqual(checkpointDir, "/default/path");
195
+ });
196
+ it("should use custom checkpoint directory when specified", () => {
197
+ const options = { checkpointDir: "/custom/path" };
198
+ const checkpointDir = options.checkpointDir;
199
+ assert.strictEqual(checkpointDir, "/custom/path");
200
+ });
201
+ });
202
+ });
203
+ //# sourceMappingURL=parallel-executor.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-executor.unit.test.js","sourceRoot":"","sources":["../../../src/executor/__tests__/parallel-executor.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Checkpoint Manager for Experiment Execution
3
+ *
4
+ * Enables resumable experiment execution by:
5
+ * 1. Writing incremental checkpoints after each completed run
6
+ * 2. Detecting configuration changes to invalidate stale checkpoints
7
+ * 3. Skipping completed runs when resuming
8
+ * 4. Supporting sharded checkpoints for parallel workers
9
+ *
10
+ * Supports pluggable storage backends:
11
+ * - FileStorage: JSON files (fast, local)
12
+ * - GitStorage: Git notes (version controlled, shareable)
13
+ *
14
+ * Dependency Injection:
15
+ * - Storage backend can be injected for testing
16
+ * - Lock implementation can be injected for custom concurrency control
17
+ *
18
+ * Usage:
19
+ * ```typescript
20
+ * // Direct instantiation with injected storage
21
+ * const storage = new FileStorage("results/execute/checkpoint.json");
22
+ * const lock = new InMemoryLock();
23
+ * const checkpoint = new CheckpointManager({ storage, lock });
24
+ *
25
+ * // Sharded mode for parallel workers
26
+ * const shardStorage = new FileStorage("results/execute/checkpoint-worker-0.json");
27
+ * const checkpoint = new CheckpointManager({
28
+ * storage: shardStorage,
29
+ * lock,
30
+ * workerIndex: 0,
31
+ * totalWorkers: 4,
32
+ * basePath: "results/execute"
33
+ * });
34
+ *
35
+ * await checkpoint.load();
36
+ *
37
+ * if (checkpoint.isStale(suts, cases, config)) {
38
+ * checkpoint.invalidate();
39
+ * }
40
+ *
41
+ * const remainingRuns = plannedRuns.filter(
42
+ * run => !checkpoint.isCompleted(run.runId)
43
+ * );
44
+ *
45
+ * executor.execute({...}, {
46
+ * onResult: (result) => checkpoint.saveIncremental(result)
47
+ * });
48
+ *
49
+ * // After all workers complete, merge shards
50
+ * await checkpoint.mergeShards([
51
+ * "results/execute/checkpoint-worker-0.json",
52
+ * "results/execute/checkpoint-worker-1.json",
53
+ * ...
54
+ * ]);
55
+ * ```
56
+ */
57
+ import type { CaseDefinition } from "../types/case.js";
58
+ import type { EvaluationResult } from "../types/result.js";
59
+ import type { SutDefinition } from "../types/sut.js";
60
+ import type { CheckpointStorage, Lock } from "./checkpoint-storage.js";
61
+ import type { ExecutorConfig, PlannedRun } from "./executor.js";
62
+ export type { CheckpointMode } from "./checkpoint-storage.js";
63
+ export type { Lock } from "./checkpoint-storage.js";
64
+ export { InMemoryLock } from "./checkpoint-storage.js";
65
+ /**
66
+ * Checkpoint file format.
67
+ */
68
+ export interface CheckpointData {
69
+ /** Hash of the execution configuration (SUTs, cases, config) */
70
+ configHash: string;
71
+ /** Timestamp when checkpoint was created */
72
+ createdAt: string;
73
+ /** Timestamp of last update */
74
+ updatedAt: string;
75
+ /** IDs of completed runs (for quick lookup) */
76
+ completedRunIds: string[];
77
+ /** Stored results by run ID */
78
+ results: Record<string, EvaluationResult>;
79
+ /** Total number of planned runs */
80
+ totalPlanned: number;
81
+ /** Git commit at checkpoint time (for reproducibility) */
82
+ gitCommit?: string;
83
+ /** Worker index (for sharded checkpoints) */
84
+ workerIndex?: number;
85
+ /** Total workers (for sharded checkpoints) */
86
+ totalWorkers?: number;
87
+ }
88
+ /**
89
+ * Checkpoint manager constructor options.
90
+ */
91
+ export interface CheckpointManagerOptions {
92
+ /** Storage backend for checkpoint data */
93
+ storage: CheckpointStorage;
94
+ /** Concurrency lock for checkpoint saves */
95
+ lock?: Lock;
96
+ /** Worker identity for sharded mode */
97
+ workerIndex?: number;
98
+ /** Total number of workers in sharded mode */
99
+ totalWorkers?: number;
100
+ /** Base checkpoint path (for sharding) */
101
+ basePath?: string;
102
+ }
103
+ /**
104
+ * Checkpoint manager for resumable execution.
105
+ *
106
+ * Uses dependency injection for storage and lock.
107
+ * Enables sharded checkpoints for parallel worker execution.
108
+ */
109
+ export declare class CheckpointManager {
110
+ private readonly storage;
111
+ private readonly lock;
112
+ private readonly workerIndex?;
113
+ private readonly totalWorkers?;
114
+ private readonly basePath?;
115
+ private data;
116
+ private dirty;
117
+ /**
118
+ * Create a new CheckpointManager.
119
+ *
120
+ * @param options - CheckpointManagerOptions with injected storage
121
+ */
122
+ constructor(options: CheckpointManagerOptions);
123
+ /**
124
+ * Get the storage backend being used.
125
+ */
126
+ getStorageType(): string;
127
+ /**
128
+ * Load checkpoint from storage if it exists.
129
+ * @returns true if checkpoint was loaded, false if not found or invalid
130
+ */
131
+ load(): Promise<boolean>;
132
+ /**
133
+ * Save checkpoint to storage.
134
+ */
135
+ save(): Promise<void>;
136
+ /**
137
+ * Save checkpoint incrementally (after each result).
138
+ * Uses the injected lock to prevent concurrent writes.
139
+ * @param result
140
+ */
141
+ saveIncremental(result: EvaluationResult): Promise<void>;
142
+ /**
143
+ * Check if checkpoint exists and is valid.
144
+ */
145
+ exists(): boolean;
146
+ /**
147
+ * Check if a specific run has been completed.
148
+ * @param runId - Run identifier
149
+ */
150
+ isCompleted(runId: string): boolean;
151
+ /**
152
+ * Get all completed results.
153
+ */
154
+ getResults(): EvaluationResult[];
155
+ /**
156
+ * Get progress information.
157
+ */
158
+ getProgress(): {
159
+ completed: number;
160
+ total: number;
161
+ percent: number;
162
+ };
163
+ /**
164
+ * Check if checkpoint is stale (configuration has changed).
165
+ * @param suts - Current SUT definitions
166
+ * @param cases - Current case definitions
167
+ * @param config - Current executor config
168
+ * @param totalRuns - Total planned runs
169
+ */
170
+ isStale<TExpander, TResult>(suts: SutDefinition<TExpander, TResult>[], cases: CaseDefinition<TExpander>[], config: Partial<ExecutorConfig>, totalRuns: number): boolean;
171
+ /**
172
+ * Invalidate checkpoint (delete and start fresh).
173
+ */
174
+ invalidate(): void;
175
+ /**
176
+ * Initialize empty checkpoint data.
177
+ * @param suts
178
+ * @param cases
179
+ * @param config
180
+ * @param totalRuns
181
+ * @param gitCommit
182
+ */
183
+ initializeEmpty<TExpander, TResult>(suts?: SutDefinition<TExpander, TResult>[], cases?: CaseDefinition<TExpander>[], config?: Partial<ExecutorConfig>, totalRuns?: number, gitCommit?: string): void;
184
+ /**
185
+ * Compute hash of execution configuration.
186
+ * Used to detect when configuration changes invalidate checkpoint.
187
+ * @param suts
188
+ * @param cases
189
+ * @param config
190
+ * @param totalRuns
191
+ */
192
+ private computeConfigHash;
193
+ /**
194
+ * Get remaining planned runs (excluding completed).
195
+ * @param plannedRuns - All planned runs
196
+ */
197
+ filterRemaining<T extends PlannedRun>(plannedRuns: T[]): T[];
198
+ /**
199
+ * Merge new results into checkpoint (for batch updates).
200
+ * @param results - New results to add
201
+ */
202
+ mergeResults(results: EvaluationResult[]): void;
203
+ /**
204
+ * Merge multiple worker checkpoint shards into a single aggregated checkpoint.
205
+ *
206
+ * This is called after all parallel workers complete to aggregate their results.
207
+ * Each worker writes to its own shard file to avoid race conditions.
208
+ *
209
+ * @param shardPaths - Array of checkpoint shard file paths
210
+ * @returns The merged checkpoint data
211
+ */
212
+ mergeShards(shardPaths: string[]): Promise<CheckpointData>;
213
+ /**
214
+ * Get checkpoint summary for logging.
215
+ */
216
+ getSummary(): string;
217
+ }
218
+ /**
219
+ * Get git commit hash for reproducibility.
220
+ */
221
+ export declare const getGitCommit: () => Promise<string | undefined>;
222
+ /**
223
+ * Create a checkpoint manager with default file storage.
224
+ *
225
+ * Convenience factory for simple cases.
226
+ *
227
+ * @param path - Checkpoint file path
228
+ * @param lock - Optional lock implementation
229
+ */
230
+ export declare const createFileCheckpointManager: (path?: string, lock?: Lock) => CheckpointManager;
231
+ //# sourceMappingURL=checkpoint-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-manager.d.ts","sourceRoot":"","sources":["../../src/executor/checkpoint-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEvE,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IAEnB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAElB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAElB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,EAAE,CAAC;IAE1B,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAE1C,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IAErB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAuBD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACxC,0CAA0C;IAC1C,OAAO,EAAE,iBAAiB,CAAC;IAE3B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,KAAK,CAAS;IAEtB;;;;OAIG;gBACS,OAAO,EAAE,wBAAwB;IAQ7C;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAkB9B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B;;;;OAIG;IACG,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC9D;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAInC;;OAEG;IACH,UAAU,IAAI,gBAAgB,EAAE;IAOhC;;OAEG;IACH,WAAW,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAUpE;;;;;;OAMG;IACH,OAAO,CAAC,SAAS,EAAE,OAAO,EACzB,IAAI,EAAE,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EACzC,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,EAClC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,SAAS,EAAE,MAAM,GACf,OAAO;IASV;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;;;;;;OAOG;IACH,eAAe,CAAC,SAAS,EAAE,OAAO,EACjC,IAAI,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAC1C,KAAK,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,EACnC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,EAChC,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GAChB,IAAI;IAoBP;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IA0BzB;;;OAGG;IACH,eAAe,CAAC,CAAC,SAAS,UAAU,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAQ5D;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAmB/C;;;;;;;;OAQG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IA6DhE;;OAEG;IACH,UAAU,IAAI,MAAM;CAQpB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,MAAM,GAAG,SAAS,CAO/D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,GACvC,aAAwC,EACxC,OAAO,IAAI,KACT,iBAGF,CAAC"}