ppef 1.0.1 → 1.1.0

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 (175) hide show
  1. package/bin/ppef.mjs +20 -0
  2. package/dist/__tests__/framework-pipeline.integration.test.js +13 -11
  3. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
  4. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  5. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/index-exports.unit.test.js +127 -0
  7. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  8. package/dist/__tests__/registry-executor.integration.test.js +12 -9
  9. package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
  10. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  11. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  12. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  13. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  14. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  15. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  16. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  17. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  18. package/dist/aggregation/aggregators.d.ts +9 -0
  19. package/dist/aggregation/aggregators.d.ts.map +1 -1
  20. package/dist/aggregation/aggregators.js +1 -1
  21. package/dist/aggregation/aggregators.js.map +1 -1
  22. package/dist/aggregation/index.d.ts +1 -1
  23. package/dist/aggregation/index.d.ts.map +1 -1
  24. package/dist/aggregation/index.js +1 -1
  25. package/dist/aggregation/index.js.map +1 -1
  26. package/dist/claims/__tests__/evaluator.unit.test.d.ts +12 -0
  27. package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +1 -0
  28. package/dist/claims/__tests__/evaluator.unit.test.js +801 -0
  29. package/dist/claims/__tests__/evaluator.unit.test.js.map +1 -0
  30. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  31. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  32. package/dist/cli/__tests__/aggregate.command.unit.test.js +396 -0
  33. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  34. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  35. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  36. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  37. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  38. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  39. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  40. package/dist/cli/__tests__/index.unit.test.js +65 -0
  41. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  42. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  43. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  44. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  45. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  46. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  47. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  48. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  49. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  50. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  51. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  52. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  53. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  54. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  55. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  56. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  57. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  58. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  59. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  60. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  61. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  62. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  63. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  64. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  65. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  66. package/dist/cli/command-deps.d.ts +125 -0
  67. package/dist/cli/command-deps.d.ts.map +1 -0
  68. package/dist/cli/command-deps.js +7 -0
  69. package/dist/cli/command-deps.js.map +1 -0
  70. package/dist/cli/commands/aggregate.d.ts +35 -0
  71. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  72. package/dist/cli/commands/aggregate.js +121 -0
  73. package/dist/cli/commands/aggregate.js.map +1 -0
  74. package/dist/cli/commands/plan.d.ts +36 -0
  75. package/dist/cli/commands/plan.d.ts.map +1 -0
  76. package/dist/cli/commands/plan.js +109 -0
  77. package/dist/cli/commands/plan.js.map +1 -0
  78. package/dist/cli/commands/run.d.ts +33 -0
  79. package/dist/cli/commands/run.d.ts.map +1 -0
  80. package/dist/cli/commands/run.js +185 -0
  81. package/dist/cli/commands/run.js.map +1 -0
  82. package/dist/cli/commands/validate.d.ts +27 -0
  83. package/dist/cli/commands/validate.d.ts.map +1 -0
  84. package/dist/cli/commands/validate.js +88 -0
  85. package/dist/cli/commands/validate.js.map +1 -0
  86. package/dist/cli/config-loader.d.ts +30 -0
  87. package/dist/cli/config-loader.d.ts.map +1 -0
  88. package/dist/cli/config-loader.js +181 -0
  89. package/dist/cli/config-loader.js.map +1 -0
  90. package/dist/cli/index.d.ts +26 -0
  91. package/dist/cli/index.d.ts.map +1 -0
  92. package/dist/cli/index.js +58 -0
  93. package/dist/cli/index.js.map +1 -0
  94. package/dist/cli/logger.d.ts +75 -0
  95. package/dist/cli/logger.d.ts.map +1 -0
  96. package/dist/cli/logger.js +131 -0
  97. package/dist/cli/logger.js.map +1 -0
  98. package/dist/cli/module-loader.d.ts +46 -0
  99. package/dist/cli/module-loader.d.ts.map +1 -0
  100. package/dist/cli/module-loader.js +116 -0
  101. package/dist/cli/module-loader.js.map +1 -0
  102. package/dist/cli/output-writer.d.ts +51 -0
  103. package/dist/cli/output-writer.d.ts.map +1 -0
  104. package/dist/cli/output-writer.js +65 -0
  105. package/dist/cli/output-writer.js.map +1 -0
  106. package/dist/cli/types.d.ts +174 -0
  107. package/dist/cli/types.d.ts.map +1 -0
  108. package/dist/cli/types.js +7 -0
  109. package/dist/cli/types.js.map +1 -0
  110. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  111. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  112. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  113. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  114. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  115. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  116. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  117. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  118. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
  119. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
  120. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
  121. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
  122. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
  123. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
  124. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +105 -1
  125. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
  126. package/dist/executor/__tests__/executor.unit.test.js +69 -1
  127. package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
  128. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  129. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  130. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  131. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  132. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
  133. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
  134. package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
  135. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
  136. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  137. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  138. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  139. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  140. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  141. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  142. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  143. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  144. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  145. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  146. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  147. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  148. package/dist/executor/parallel-executor.d.ts +186 -0
  149. package/dist/executor/parallel-executor.d.ts.map +1 -1
  150. package/dist/executor/parallel-executor.js +218 -83
  151. package/dist/executor/parallel-executor.js.map +1 -1
  152. package/dist/executor/run-id.d.ts.map +1 -1
  153. package/dist/executor/run-id.js +8 -1
  154. package/dist/executor/run-id.js.map +1 -1
  155. package/dist/executor/worker-entry.d.ts +2 -0
  156. package/dist/executor/worker-entry.d.ts.map +1 -1
  157. package/dist/executor/worker-entry.js +29 -54
  158. package/dist/executor/worker-entry.js.map +1 -1
  159. package/dist/executor/worker-executor.d.ts +156 -0
  160. package/dist/executor/worker-executor.d.ts.map +1 -0
  161. package/dist/executor/worker-executor.js +88 -0
  162. package/dist/executor/worker-executor.js.map +1 -0
  163. package/dist/robustness/__tests__/analyzer.unit.test.d.ts +11 -0
  164. package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +1 -0
  165. package/dist/robustness/__tests__/analyzer.unit.test.js +455 -0
  166. package/dist/robustness/__tests__/analyzer.unit.test.js.map +1 -0
  167. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  168. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  169. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  170. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  171. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  172. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  173. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  174. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  175. package/package.json +8 -1
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Unit tests for Perturbations
3
+ *
4
+ * Tests perturbation application including:
5
+ * - Edge removal perturbation
6
+ * - Seed shift perturbation
7
+ * - Node removal perturbation
8
+ * - Weight noise perturbation
9
+ */
10
+ import { describe, it } from "node:test";
11
+ import { strict as assert } from "node:assert";
12
+ import { PERTURBATIONS, createPerturbation, edgeRemovalPerturbation, getPerturbation, nodeRemovalPerturbation, seedShiftPerturbation, weightNoisePerturbation, } from "../perturbations.js";
13
+ /**
14
+ * Create a mock evaluation case for testing.
15
+ */
16
+ const createMockCase = (caseId) => ({
17
+ caseId,
18
+ name: `Test Case ${caseId}`,
19
+ caseClass: "test-class",
20
+ version: "1.0.0",
21
+ tags: ["baseline"],
22
+ inputs: {
23
+ summary: {
24
+ nodes: 100,
25
+ edges: 500,
26
+ seeds: ["node1", "node2"],
27
+ },
28
+ artefacts: [
29
+ {
30
+ type: "graph",
31
+ uri: `/data/${caseId}.graph.json`,
32
+ hash: "abc123",
33
+ metadata: { format: "json" },
34
+ },
35
+ ],
36
+ },
37
+ });
38
+ describe("perturbations", () => {
39
+ describe("edgeRemovalPerturbation", () => {
40
+ it("should preserve required fields (caseId, inputs)", () => {
41
+ const mockCase = createMockCase("case-001");
42
+ const perturbed = edgeRemovalPerturbation.apply(mockCase, 42);
43
+ assert.ok(perturbed.caseId);
44
+ assert.ok(perturbed.inputs);
45
+ assert.ok(perturbed.inputs.summary);
46
+ assert.ok(perturbed.inputs.artefacts);
47
+ });
48
+ it("should generate a unique caseId for perturbed case", () => {
49
+ const mockCase = createMockCase("case-001");
50
+ const perturbed = edgeRemovalPerturbation.apply(mockCase, 42);
51
+ assert.notStrictEqual(perturbed.caseId, mockCase.caseId);
52
+ assert.strictEqual(perturbed.caseId.length, 16); // SHA-256 slice
53
+ });
54
+ it("should add perturbation metadata to summary", () => {
55
+ const mockCase = createMockCase("case-001");
56
+ const perturbed = edgeRemovalPerturbation.apply(mockCase, 42);
57
+ assert.ok(perturbed.inputs.summary);
58
+ const summary = perturbed.inputs.summary;
59
+ assert.strictEqual(summary.perturbation, "edge-removal");
60
+ assert.strictEqual(summary.perturbationIntensity, 0.1);
61
+ assert.strictEqual(summary.perturbationSeed, 42);
62
+ });
63
+ it("should add perturbation metadata to artefacts", () => {
64
+ const mockCase = createMockCase("case-001");
65
+ const perturbed = edgeRemovalPerturbation.apply(mockCase, 42);
66
+ assert.ok(perturbed.inputs.artefacts);
67
+ const artefacts = perturbed.inputs.artefacts;
68
+ assert.strictEqual(artefacts.length, 1);
69
+ assert.ok(artefacts[0].metadata);
70
+ const metadata = artefacts[0].metadata;
71
+ assert.strictEqual(metadata.perturbation, "edge-removal");
72
+ assert.strictEqual(metadata.perturbationIntensity, 0.1);
73
+ assert.strictEqual(metadata.perturbationSeed, 42);
74
+ });
75
+ it("should add perturbation tags", () => {
76
+ const mockCase = createMockCase("case-001");
77
+ const perturbed = edgeRemovalPerturbation.apply(mockCase, 42);
78
+ assert.ok(perturbed.tags?.includes("perturbed"));
79
+ assert.ok(perturbed.tags?.includes("edge-removal"));
80
+ assert.ok(perturbed.tags?.includes("baseline")); // Original tag preserved
81
+ });
82
+ it("should update name with intensity percentage", () => {
83
+ const mockCase = createMockCase("case-001");
84
+ const perturbed = edgeRemovalPerturbation.apply(mockCase, 42);
85
+ assert.ok(perturbed.name?.includes("10%"));
86
+ assert.ok(perturbed.name?.includes("edges removed"));
87
+ });
88
+ it("should preserve other inputs.summary fields", () => {
89
+ const mockCase = createMockCase("case-001");
90
+ const perturbed = edgeRemovalPerturbation.apply(mockCase, 42);
91
+ assert.ok(perturbed.inputs.summary);
92
+ const summary = perturbed.inputs.summary;
93
+ assert.strictEqual(summary.nodes, 100);
94
+ assert.strictEqual(summary.edges, 500);
95
+ assert.deepStrictEqual(summary.seeds, ["node1", "node2"]);
96
+ });
97
+ });
98
+ describe("seedShiftPerturbation", () => {
99
+ it("should preserve required fields (caseId, inputs)", () => {
100
+ const mockCase = createMockCase("case-002");
101
+ const perturbed = seedShiftPerturbation.apply(mockCase, 42);
102
+ assert.ok(perturbed.caseId);
103
+ assert.ok(perturbed.inputs);
104
+ assert.ok(perturbed.inputs.summary);
105
+ });
106
+ it("should generate a unique caseId for perturbed case", () => {
107
+ const mockCase = createMockCase("case-002");
108
+ const perturbed = seedShiftPerturbation.apply(mockCase, 42);
109
+ assert.notStrictEqual(perturbed.caseId, mockCase.caseId);
110
+ assert.strictEqual(perturbed.caseId.length, 16);
111
+ });
112
+ it("should add perturbation metadata to summary", () => {
113
+ const mockCase = createMockCase("case-002");
114
+ const perturbed = seedShiftPerturbation.apply(mockCase, 42);
115
+ assert.ok(perturbed.inputs.summary);
116
+ const summary = perturbed.inputs.summary;
117
+ assert.strictEqual(summary.perturbation, "seed-shift");
118
+ assert.strictEqual(summary.perturbationSeed, 42);
119
+ });
120
+ it("should add perturbation tags", () => {
121
+ const mockCase = createMockCase("case-002");
122
+ const perturbed = seedShiftPerturbation.apply(mockCase, 42);
123
+ assert.ok(perturbed.tags?.includes("perturbed"));
124
+ assert.ok(perturbed.tags?.includes("seed-shift"));
125
+ });
126
+ it("should update name with perturbation description", () => {
127
+ const mockCase = createMockCase("case-002");
128
+ const perturbed = seedShiftPerturbation.apply(mockCase, 42);
129
+ assert.ok(perturbed.name?.includes("seeds shifted"));
130
+ });
131
+ });
132
+ describe("nodeRemovalPerturbation", () => {
133
+ it("should preserve required fields (caseId, inputs)", () => {
134
+ const mockCase = createMockCase("case-003");
135
+ const perturbed = nodeRemovalPerturbation.apply(mockCase, 42);
136
+ assert.ok(perturbed.caseId);
137
+ assert.ok(perturbed.inputs);
138
+ assert.ok(perturbed.inputs.summary);
139
+ });
140
+ it("should generate a unique caseId for perturbed case", () => {
141
+ const mockCase = createMockCase("case-003");
142
+ const perturbed = nodeRemovalPerturbation.apply(mockCase, 42);
143
+ assert.notStrictEqual(perturbed.caseId, mockCase.caseId);
144
+ assert.strictEqual(perturbed.caseId.length, 16);
145
+ });
146
+ it("should add perturbation metadata to summary", () => {
147
+ const mockCase = createMockCase("case-003");
148
+ const perturbed = nodeRemovalPerturbation.apply(mockCase, 42);
149
+ assert.ok(perturbed.inputs.summary);
150
+ const summary = perturbed.inputs.summary;
151
+ assert.strictEqual(summary.perturbation, "node-removal");
152
+ assert.strictEqual(summary.perturbationIntensity, 0.05);
153
+ assert.strictEqual(summary.perturbationSeed, 42);
154
+ });
155
+ it("should add perturbation tags", () => {
156
+ const mockCase = createMockCase("case-003");
157
+ const perturbed = nodeRemovalPerturbation.apply(mockCase, 42);
158
+ assert.ok(perturbed.tags?.includes("perturbed"));
159
+ assert.ok(perturbed.tags?.includes("node-removal"));
160
+ });
161
+ it("should update name with intensity percentage", () => {
162
+ const mockCase = createMockCase("case-003");
163
+ const perturbed = nodeRemovalPerturbation.apply(mockCase, 42);
164
+ assert.ok(perturbed.name?.includes("5%"));
165
+ assert.ok(perturbed.name?.includes("nodes removed"));
166
+ });
167
+ });
168
+ describe("weightNoisePerturbation", () => {
169
+ it("should preserve required fields (caseId, inputs)", () => {
170
+ const mockCase = createMockCase("case-004");
171
+ const perturbed = weightNoisePerturbation.apply(mockCase, 42);
172
+ assert.ok(perturbed.caseId);
173
+ assert.ok(perturbed.inputs);
174
+ assert.ok(perturbed.inputs.summary);
175
+ });
176
+ it("should generate a unique caseId for perturbed case", () => {
177
+ const mockCase = createMockCase("case-004");
178
+ const perturbed = weightNoisePerturbation.apply(mockCase, 42);
179
+ assert.notStrictEqual(perturbed.caseId, mockCase.caseId);
180
+ assert.strictEqual(perturbed.caseId.length, 16);
181
+ });
182
+ it("should add perturbation metadata to summary", () => {
183
+ const mockCase = createMockCase("case-004");
184
+ const perturbed = weightNoisePerturbation.apply(mockCase, 42);
185
+ assert.ok(perturbed.inputs.summary);
186
+ const summary = perturbed.inputs.summary;
187
+ assert.strictEqual(summary.perturbation, "weight-noise");
188
+ assert.strictEqual(summary.perturbationIntensity, 0.1);
189
+ assert.strictEqual(summary.perturbationSeed, 42);
190
+ });
191
+ it("should add perturbation tags", () => {
192
+ const mockCase = createMockCase("case-004");
193
+ const perturbed = weightNoisePerturbation.apply(mockCase, 42);
194
+ assert.ok(perturbed.tags?.includes("perturbed"));
195
+ assert.ok(perturbed.tags?.includes("weight-noise"));
196
+ });
197
+ it("should update name with intensity percentage", () => {
198
+ const mockCase = createMockCase("case-004");
199
+ const perturbed = weightNoisePerturbation.apply(mockCase, 42);
200
+ assert.ok(perturbed.name?.includes("10%"));
201
+ assert.ok(perturbed.name?.includes("weight noise"));
202
+ });
203
+ });
204
+ describe("PERTURBATIONS array", () => {
205
+ it("should contain all four built-in perturbations", () => {
206
+ assert.strictEqual(PERTURBATIONS.length, 4);
207
+ assert.ok(PERTURBATIONS.some((p) => p.id === "edge-removal"), "Should contain edge-removal");
208
+ assert.ok(PERTURBATIONS.some((p) => p.id === "seed-shift"), "Should contain seed-shift");
209
+ assert.ok(PERTURBATIONS.some((p) => p.id === "node-removal"), "Should contain node-removal");
210
+ assert.ok(PERTURBATIONS.some((p) => p.id === "weight-noise"), "Should contain weight-noise");
211
+ });
212
+ });
213
+ describe("getPerturbation", () => {
214
+ it("should return perturbation by id", () => {
215
+ const edgeRemoval = getPerturbation("edge-removal");
216
+ assert.ok(edgeRemoval);
217
+ assert.strictEqual(edgeRemoval.id, "edge-removal");
218
+ });
219
+ it("should return undefined for unknown id", () => {
220
+ const unknown = getPerturbation("unknown-perturbation");
221
+ assert.strictEqual(unknown, undefined);
222
+ });
223
+ it("should find all built-in perturbations by id", () => {
224
+ const ids = ["edge-removal", "seed-shift", "node-removal", "weight-noise"];
225
+ for (const id of ids) {
226
+ const perturbation = getPerturbation(id);
227
+ assert.ok(perturbation, `Should find perturbation with id: ${id}`);
228
+ assert.strictEqual(perturbation.id, id);
229
+ }
230
+ });
231
+ });
232
+ describe("createPerturbation", () => {
233
+ it("should create perturbation with custom intensity", () => {
234
+ const custom = createPerturbation({ type: "edge-removal", intensity: 0.25 });
235
+ assert.strictEqual(custom.id, "edge-removal");
236
+ assert.strictEqual(custom.intensity, 0.25);
237
+ });
238
+ it("should apply custom intensity to perturbed case", () => {
239
+ const mockCase = createMockCase("case-005");
240
+ const custom = createPerturbation({ type: "node-removal", intensity: 0.15 });
241
+ const perturbed = custom.apply(mockCase, 42);
242
+ assert.strictEqual(perturbed.inputs.summary?.perturbationIntensity, 0.15);
243
+ assert.ok(perturbed.name?.includes("15%"));
244
+ });
245
+ it("should throw error for unknown perturbation type", () => {
246
+ assert.throws(() => createPerturbation({
247
+ type: "unknown-type",
248
+ intensity: 0.1,
249
+ }), /Unknown perturbation type: unknown-type/);
250
+ });
251
+ it("should preserve name and description from base perturbation", () => {
252
+ const custom = createPerturbation({ type: "edge-removal", intensity: 0.2 });
253
+ assert.strictEqual(custom.name, "Edge Removal");
254
+ assert.strictEqual(custom.description, "Randomly remove a fraction of edges");
255
+ });
256
+ it("should preserve type from base perturbation", () => {
257
+ const custom = createPerturbation({ type: "weight-noise", intensity: 0.05 });
258
+ assert.strictEqual(custom.type, "noise");
259
+ });
260
+ });
261
+ describe("perturbation determinism", () => {
262
+ it("should produce same caseId for same inputs", () => {
263
+ const mockCase = createMockCase("case-006");
264
+ const perturbed1 = edgeRemovalPerturbation.apply(mockCase, 42);
265
+ const perturbed2 = edgeRemovalPerturbation.apply(mockCase, 42);
266
+ assert.strictEqual(perturbed1.caseId, perturbed2.caseId);
267
+ });
268
+ it("should produce different caseId for different seeds", () => {
269
+ const mockCase = createMockCase("case-007");
270
+ const perturbed1 = nodeRemovalPerturbation.apply(mockCase, 42);
271
+ const perturbed2 = nodeRemovalPerturbation.apply(mockCase, 100);
272
+ assert.notStrictEqual(perturbed1.caseId, perturbed2.caseId);
273
+ });
274
+ it("should produce different caseId for different intensities", () => {
275
+ const mockCase = createMockCase("case-008");
276
+ const custom1 = createPerturbation({ type: "edge-removal", intensity: 0.1 });
277
+ const custom2 = createPerturbation({ type: "edge-removal", intensity: 0.2 });
278
+ const perturbed1 = custom1.apply(mockCase, 42);
279
+ const perturbed2 = custom2.apply(mockCase, 42);
280
+ assert.notStrictEqual(perturbed1.caseId, perturbed2.caseId);
281
+ });
282
+ });
283
+ });
284
+ //# sourceMappingURL=perturbations.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perturbations.unit.test.js","sourceRoot":"","sources":["../../../src/robustness/__tests__/perturbations.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for Mann-Whitney U test and related statistical functions.
3
+ *
4
+ * Tests the non-parametric statistical test for comparing two independent samples.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=mann-whitney-u.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mann-whitney-u.unit.test.d.ts","sourceRoot":"","sources":["../../../src/statistical/__tests__/mann-whitney-u.unit.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Unit tests for Mann-Whitney U test and related statistical functions.
3
+ *
4
+ * Tests the non-parametric statistical test for comparing two independent samples.
5
+ */
6
+ import { describe, it } from "node:test";
7
+ import { strict as assert } from "node:assert";
8
+ import { normalCDF, mannWhitneyUTest, cohensD, confidenceInterval } from "../mann-whitney-u.js";
9
+ describe("normalCDF", () => {
10
+ it("should return 0.5 for z = 0", () => {
11
+ const result = normalCDF(0);
12
+ assert.ok(Math.abs(result - 0.5) < 0.001);
13
+ });
14
+ it("should approach 1 for large positive z", () => {
15
+ const result = normalCDF(5);
16
+ assert.ok(result > 0.99);
17
+ });
18
+ it("should approach 0 for large negative z", () => {
19
+ const result = normalCDF(-5);
20
+ assert.ok(result < 0.01);
21
+ });
22
+ it("should be symmetric around 0", () => {
23
+ const z = 1.5;
24
+ const positive = normalCDF(z);
25
+ const negative = normalCDF(-z);
26
+ assert.ok(Math.abs(positive + negative - 1) < 0.001);
27
+ });
28
+ it("should handle negative z values", () => {
29
+ const result = normalCDF(-1);
30
+ assert.ok(result < 0.5);
31
+ assert.ok(result > 0.1);
32
+ });
33
+ });
34
+ describe("mannWhitneyUTest", () => {
35
+ it("should calculate U statistic for distinct samples", () => {
36
+ const sampleA = [1, 2, 3];
37
+ const sampleB = [4, 5, 6];
38
+ const result = mannWhitneyUTest(sampleA, sampleB);
39
+ assert.ok(typeof result.u === "number");
40
+ assert.ok(result.u >= 0);
41
+ assert.ok(typeof result.pValue === "number");
42
+ assert.ok(typeof result.significant === "boolean");
43
+ });
44
+ it("should detect significant difference between distinct samples", () => {
45
+ const sampleA = [1, 1, 1, 1, 1];
46
+ const sampleB = [100, 100, 100, 100, 100];
47
+ const result = mannWhitneyUTest(sampleA, sampleB);
48
+ assert.ok(result.pValue < 0.05);
49
+ assert.strictEqual(result.significant, true);
50
+ });
51
+ it("should not detect difference in similar samples", () => {
52
+ const sampleA = [5, 5, 5, 5, 5];
53
+ const sampleB = [5, 5, 5, 5, 5];
54
+ const result = mannWhitneyUTest(sampleA, sampleB);
55
+ // When samples are identical, p-value should be 1
56
+ assert.ok(result.pValue >= 0.95);
57
+ assert.strictEqual(result.significant, false);
58
+ });
59
+ it("should handle overlapping samples", () => {
60
+ const sampleA = [1, 2, 3, 4, 5];
61
+ const sampleB = [3, 4, 5, 6, 7];
62
+ const result = mannWhitneyUTest(sampleA, sampleB);
63
+ assert.ok(result.pValue >= 0 && result.pValue <= 1);
64
+ assert.ok(typeof result.significant === "boolean");
65
+ });
66
+ it("should handle samples with ties", () => {
67
+ const sampleA = [1, 2, 2, 3];
68
+ const sampleB = [2, 3, 4, 5];
69
+ const result = mannWhitneyUTest(sampleA, sampleB);
70
+ assert.ok(typeof result.u === "number");
71
+ assert.ok(result.pValue >= 0 && result.pValue <= 1);
72
+ });
73
+ it("should handle single-element samples", () => {
74
+ const sampleA = [5];
75
+ const sampleB = [10];
76
+ const result = mannWhitneyUTest(sampleA, sampleB);
77
+ assert.ok(typeof result.u === "number");
78
+ assert.ok(typeof result.pValue === "number");
79
+ });
80
+ it("should handle empty sample A", () => {
81
+ const sampleA = [];
82
+ const sampleB = [1, 2, 3];
83
+ const result = mannWhitneyUTest(sampleA, sampleB);
84
+ assert.strictEqual(result.u, 0);
85
+ });
86
+ it("should handle empty sample B", () => {
87
+ const sampleA = [1, 2, 3];
88
+ const sampleB = [];
89
+ const result = mannWhitneyUTest(sampleA, sampleB);
90
+ assert.strictEqual(result.u, 0);
91
+ });
92
+ });
93
+ describe("cohensD", () => {
94
+ it("should calculate effect size for distinct samples", () => {
95
+ const sampleA = [1, 2, 3, 4, 5];
96
+ const sampleB = [6, 7, 8, 9, 10];
97
+ const result = cohensD(sampleA, sampleB);
98
+ assert.ok(result > 0);
99
+ assert.ok(typeof result === "number");
100
+ });
101
+ it("should be zero for identical samples", () => {
102
+ const sampleA = [5, 5, 5, 5, 5];
103
+ const sampleB = [5, 5, 5, 5, 5];
104
+ const result = cohensD(sampleA, sampleB);
105
+ assert.strictEqual(result, 0);
106
+ });
107
+ it("should be symmetric", () => {
108
+ const sampleA = [1, 2, 3, 4, 5];
109
+ const sampleB = [10, 20, 30, 40, 50];
110
+ const d1 = cohensD(sampleA, sampleB);
111
+ const d2 = cohensD(sampleB, sampleA);
112
+ assert.ok(Math.abs(d1 - d2) < 0.001);
113
+ });
114
+ it("should handle large effect sizes", () => {
115
+ const sampleA = [1, 2, 1, 2, 1]; // Mean ~1.4, small variance
116
+ const sampleB = [100, 101, 100, 101, 100]; // Mean ~100.4, small variance
117
+ const result = cohensD(sampleA, sampleB);
118
+ assert.ok(result > 0.8); // Large effect due to separation of means
119
+ });
120
+ it("should handle small effect sizes", () => {
121
+ const sampleA = [10, 11, 12, 13, 14];
122
+ const sampleB = [12, 13, 14, 15, 16];
123
+ const result = cohensD(sampleA, sampleB);
124
+ assert.ok(result >= 0);
125
+ assert.ok(result < 2); // Should be reasonable
126
+ });
127
+ it("should handle samples with variance", () => {
128
+ const sampleA = [1, 2, 3, 4, 5];
129
+ const sampleB = [3, 4, 5, 6, 7];
130
+ const result = cohensD(sampleA, sampleB);
131
+ assert.ok(result >= 0);
132
+ });
133
+ it("should handle samples with same mean but different variance", () => {
134
+ const sampleA = [0, 10, 0, 10, 0, 10];
135
+ const sampleB = [4, 6, 4, 6, 4, 6];
136
+ // Both have mean 5
137
+ const meanA = sampleA.reduce((a, b) => a + b, 0) / sampleA.length;
138
+ const meanB = sampleB.reduce((a, b) => a + b, 0) / sampleB.length;
139
+ const result = cohensD(sampleA, sampleB);
140
+ assert.strictEqual(meanA, 5);
141
+ assert.strictEqual(meanB, 5);
142
+ assert.strictEqual(result, 0);
143
+ });
144
+ });
145
+ describe("confidenceInterval", () => {
146
+ it("should calculate interval for sample values", () => {
147
+ const values = [1, 2, 3, 4, 5];
148
+ const result = confidenceInterval(values);
149
+ assert.ok(typeof result.lower === "number");
150
+ assert.ok(typeof result.upper === "number");
151
+ assert.ok(result.lower < result.upper);
152
+ });
153
+ it("should be centered around mean", () => {
154
+ const values = [10, 20, 30, 40, 50];
155
+ const mean = values.reduce((a, b) => a + b, 0) / values.length;
156
+ const result = confidenceInterval(values);
157
+ const midpoint = (result.lower + result.upper) / 2;
158
+ assert.ok(Math.abs(midpoint - mean) < 0.1);
159
+ });
160
+ it("should handle identical values", () => {
161
+ const values = [5, 5, 5, 5, 5];
162
+ const result = confidenceInterval(values);
163
+ // With no variance, lower and upper should be same
164
+ assert.ok(Math.abs(result.lower - 5) < 0.01);
165
+ assert.ok(Math.abs(result.upper - 5) < 0.01);
166
+ });
167
+ it("should handle two values", () => {
168
+ const values = [0, 10];
169
+ const result = confidenceInterval(values);
170
+ assert.ok(result.lower < result.upper);
171
+ assert.ok(result.lower < 5);
172
+ assert.ok(result.upper > 5);
173
+ });
174
+ it("should have reasonable interval width for low variance", () => {
175
+ const values = [50, 51, 50, 51, 50, 51];
176
+ const mean = values.reduce((a, b) => a + b, 0) / values.length;
177
+ const result = confidenceInterval(values);
178
+ // Low variance should give narrow interval
179
+ const width = result.upper - result.lower;
180
+ assert.ok(width < 2); // Should be narrow
181
+ assert.ok(result.lower <= mean);
182
+ assert.ok(result.upper >= mean);
183
+ });
184
+ });
185
+ //# sourceMappingURL=mann-whitney-u.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mann-whitney-u.unit.test.js","sourceRoot":"","sources":["../../../src/statistical/__tests__/mann-whitney-u.unit.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "name": "ppef",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "Portable Programmatic Evaluation Framework - Claim-driven, deterministic evaluation for experiments",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
7
7
  "module": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
9
+ "bin": {
10
+ "ppef": "./bin/ppef.mjs"
11
+ },
9
12
  "exports": {
10
13
  ".": {
11
14
  "types": "./dist/index.d.ts",
@@ -268,6 +271,7 @@
268
271
  "c8": "10.1.3",
269
272
  "eslint": "9.39.2",
270
273
  "eslint-config-prettier": "10.1.8",
274
+ "@eslint-community/eslint-plugin-eslint-comments": "4.6.0",
271
275
  "eslint-plugin-jsonc": "2.21.0",
272
276
  "eslint-plugin-prettier": "5.5.5",
273
277
  "husky": "9.1.7",
@@ -282,6 +286,9 @@
282
286
  "peerDependencies": {
283
287
  "typescript": "5.0.0"
284
288
  },
289
+ "dependencies": {
290
+ "commander": "^12.0.0"
291
+ },
285
292
  "publishConfig": {
286
293
  "provenance": true
287
294
  }