universal-physics-tensor 0.44.1 → 0.44.3

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 (129) hide show
  1. package/README.md +51 -164
  2. package/dist/bridges/bridge-equations.d.ts +28 -6
  3. package/dist/bridges/bridge-equations.d.ts.map +1 -1
  4. package/dist/bridges/bridge-equations.js +30 -8
  5. package/dist/bridges/bridge-equations.js.map +1 -1
  6. package/dist/cli/commands/index.d.ts +1 -0
  7. package/dist/cli/commands/index.d.ts.map +1 -1
  8. package/dist/cli/commands/index.js +1 -0
  9. package/dist/cli/commands/index.js.map +1 -1
  10. package/dist/cli/commands/probe.d.ts +3 -0
  11. package/dist/cli/commands/probe.d.ts.map +1 -0
  12. package/dist/cli/commands/probe.js +169 -0
  13. package/dist/cli/commands/probe.js.map +1 -0
  14. package/dist/cli/main.d.ts.map +1 -1
  15. package/dist/cli/main.js +5 -0
  16. package/dist/cli/main.js.map +1 -1
  17. package/dist/cli-api.d.ts +1 -0
  18. package/dist/cli-api.d.ts.map +1 -1
  19. package/dist/cli-api.js +3 -0
  20. package/dist/cli-api.js.map +1 -1
  21. package/dist/composition/probe/backend-protocol.d.ts +31 -0
  22. package/dist/composition/probe/backend-protocol.d.ts.map +1 -0
  23. package/dist/composition/probe/backend-protocol.js +83 -0
  24. package/dist/composition/probe/backend-protocol.js.map +1 -0
  25. package/dist/composition/probe/candidate-store.d.ts +33 -0
  26. package/dist/composition/probe/candidate-store.d.ts.map +1 -0
  27. package/dist/composition/probe/candidate-store.js +110 -0
  28. package/dist/composition/probe/candidate-store.js.map +1 -0
  29. package/dist/composition/probe/corpus.d.ts +23 -0
  30. package/dist/composition/probe/corpus.d.ts.map +1 -0
  31. package/dist/composition/probe/corpus.js +51 -0
  32. package/dist/composition/probe/corpus.js.map +1 -0
  33. package/dist/composition/probe/dataset.d.ts +35 -0
  34. package/dist/composition/probe/dataset.d.ts.map +1 -0
  35. package/dist/composition/probe/dataset.js +154 -0
  36. package/dist/composition/probe/dataset.js.map +1 -0
  37. package/dist/composition/probe/experiment-design.d.ts +32 -0
  38. package/dist/composition/probe/experiment-design.d.ts.map +1 -0
  39. package/dist/composition/probe/experiment-design.js +86 -0
  40. package/dist/composition/probe/experiment-design.js.map +1 -0
  41. package/dist/composition/probe/falsify.d.ts +29 -0
  42. package/dist/composition/probe/falsify.d.ts.map +1 -0
  43. package/dist/composition/probe/falsify.js +142 -0
  44. package/dist/composition/probe/falsify.js.map +1 -0
  45. package/dist/composition/probe/fingerprint.d.ts +20 -0
  46. package/dist/composition/probe/fingerprint.d.ts.map +1 -0
  47. package/dist/composition/probe/fingerprint.js +99 -0
  48. package/dist/composition/probe/fingerprint.js.map +1 -0
  49. package/dist/composition/probe/fit.d.ts +23 -0
  50. package/dist/composition/probe/fit.d.ts.map +1 -0
  51. package/dist/composition/probe/fit.js +92 -0
  52. package/dist/composition/probe/fit.js.map +1 -0
  53. package/dist/composition/probe/frontier.d.ts +30 -0
  54. package/dist/composition/probe/frontier.d.ts.map +1 -0
  55. package/dist/composition/probe/frontier.js +169 -0
  56. package/dist/composition/probe/frontier.js.map +1 -0
  57. package/dist/composition/probe/generator.d.ts +26 -0
  58. package/dist/composition/probe/generator.d.ts.map +1 -0
  59. package/dist/composition/probe/generator.js +123 -0
  60. package/dist/composition/probe/generator.js.map +1 -0
  61. package/dist/composition/probe/index.d.ts +49 -0
  62. package/dist/composition/probe/index.d.ts.map +1 -0
  63. package/dist/composition/probe/index.js +35 -0
  64. package/dist/composition/probe/index.js.map +1 -0
  65. package/dist/composition/probe/limits.d.ts +27 -0
  66. package/dist/composition/probe/limits.d.ts.map +1 -0
  67. package/dist/composition/probe/limits.js +71 -0
  68. package/dist/composition/probe/limits.js.map +1 -0
  69. package/dist/composition/probe/metadata.d.ts +19 -0
  70. package/dist/composition/probe/metadata.d.ts.map +1 -0
  71. package/dist/composition/probe/metadata.js +30 -0
  72. package/dist/composition/probe/metadata.js.map +1 -0
  73. package/dist/composition/probe/pipeline.d.ts +42 -0
  74. package/dist/composition/probe/pipeline.d.ts.map +1 -0
  75. package/dist/composition/probe/pipeline.js +307 -0
  76. package/dist/composition/probe/pipeline.js.map +1 -0
  77. package/dist/composition/probe/problem.d.ts +40 -0
  78. package/dist/composition/probe/problem.d.ts.map +1 -0
  79. package/dist/composition/probe/problem.js +101 -0
  80. package/dist/composition/probe/problem.js.map +1 -0
  81. package/dist/composition/probe/report.d.ts +15 -0
  82. package/dist/composition/probe/report.d.ts.map +1 -0
  83. package/dist/composition/probe/report.js +91 -0
  84. package/dist/composition/probe/report.js.map +1 -0
  85. package/dist/composition/probe/residual.d.ts +20 -0
  86. package/dist/composition/probe/residual.d.ts.map +1 -0
  87. package/dist/composition/probe/residual.js +72 -0
  88. package/dist/composition/probe/residual.js.map +1 -0
  89. package/dist/composition/probe/run-manifest.d.ts +24 -0
  90. package/dist/composition/probe/run-manifest.d.ts.map +1 -0
  91. package/dist/composition/probe/run-manifest.js +48 -0
  92. package/dist/composition/probe/run-manifest.js.map +1 -0
  93. package/dist/composition/probe/scoring.d.ts +19 -0
  94. package/dist/composition/probe/scoring.d.ts.map +1 -0
  95. package/dist/composition/probe/scoring.js +55 -0
  96. package/dist/composition/probe/scoring.js.map +1 -0
  97. package/dist/composition/probe/search-budget.d.ts +26 -0
  98. package/dist/composition/probe/search-budget.d.ts.map +1 -0
  99. package/dist/composition/probe/search-budget.js +36 -0
  100. package/dist/composition/probe/search-budget.js.map +1 -0
  101. package/dist/composition/probe/serialize.d.ts +33 -0
  102. package/dist/composition/probe/serialize.d.ts.map +1 -0
  103. package/dist/composition/probe/serialize.js +61 -0
  104. package/dist/composition/probe/serialize.js.map +1 -0
  105. package/dist/composition/probe/structure.d.ts +51 -0
  106. package/dist/composition/probe/structure.d.ts.map +1 -0
  107. package/dist/composition/probe/structure.js +93 -0
  108. package/dist/composition/probe/structure.js.map +1 -0
  109. package/dist/composition/probe/types.d.ts +281 -0
  110. package/dist/composition/probe/types.d.ts.map +1 -0
  111. package/dist/composition/probe/types.js +23 -0
  112. package/dist/composition/probe/types.js.map +1 -0
  113. package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
  114. package/dist/diff/bridge-ast-gradient.js +22 -2
  115. package/dist/diff/bridge-ast-gradient.js.map +1 -1
  116. package/dist/numerical/float64-engine.d.ts.map +1 -1
  117. package/dist/numerical/float64-engine.js +22 -8
  118. package/dist/numerical/float64-engine.js.map +1 -1
  119. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  120. package/dist/numerical/geodesic-integrator.js +85 -14
  121. package/dist/numerical/geodesic-integrator.js.map +1 -1
  122. package/dist/numerical/gl4-integrator.d.ts +2 -0
  123. package/dist/numerical/gl4-integrator.d.ts.map +1 -1
  124. package/dist/numerical/gl4-integrator.js +345 -156
  125. package/dist/numerical/gl4-integrator.js.map +1 -1
  126. package/dist/numerical/weyl-lowering.d.ts.map +1 -1
  127. package/dist/numerical/weyl-lowering.js +158 -48
  128. package/dist/numerical/weyl-lowering.js.map +1 -1
  129. package/package.json +15 -5
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Observation adapters for Product B.
3
+ *
4
+ * In-memory / JSON / CSV. Does not live in `src/bridges/observations/` —
5
+ * that tree is Product A's confrontation ledger and must stay cycle-free
6
+ * from probe.
7
+ *
8
+ * @internal
9
+ */
10
+ import { readFileSync } from 'node:fs';
11
+ import { SCHEMA_VERSION } from './types.js';
12
+ /** Build an in-memory dataset. @internal */
13
+ export function datasetFromRows(rows, observable, role, id = 'inline', sigma) {
14
+ return { id, role, rows, observable, ...(sigma !== undefined ? { sigma } : {}), schemaVersion: SCHEMA_VERSION };
15
+ }
16
+ /** Coerce unknown JSON into a ProbeDataset. @internal */
17
+ export function asDatasetSafe(raw, fallbackId, fallbackRole) {
18
+ if (!raw || typeof raw !== 'object') {
19
+ throw new Error(`dataset JSON is not an object (${fallbackId})`);
20
+ }
21
+ const obj = raw;
22
+ if (!Array.isArray(obj.rows)) {
23
+ throw new Error(`dataset at ${fallbackId} is missing rows[]`);
24
+ }
25
+ if (typeof obj.observable !== 'string' || obj.observable.length === 0) {
26
+ throw new Error(`dataset at ${fallbackId} is missing observable`);
27
+ }
28
+ const role = (typeof obj.role === 'string' ? obj.role : fallbackRole);
29
+ if (role !== 'exploratory-fit' &&
30
+ role !== 'validation-holdout' &&
31
+ role !== 'external-replication' &&
32
+ role !== 'falsification-only') {
33
+ throw new Error(`dataset at ${fallbackId} has invalid role '${String(obj.role)}'`);
34
+ }
35
+ const rows = obj.rows.map((row, i) => {
36
+ if (!row || typeof row !== 'object' || Array.isArray(row)) {
37
+ throw new Error(`dataset ${fallbackId} row ${i} is not an object`);
38
+ }
39
+ const out = {};
40
+ for (const [k, v] of Object.entries(row)) {
41
+ const n = typeof v === 'number' ? v : Number(v);
42
+ if (!Number.isFinite(n)) {
43
+ throw new Error(`dataset ${fallbackId} row ${i} column ${k}: not a finite number`);
44
+ }
45
+ out[k] = n;
46
+ }
47
+ return out;
48
+ });
49
+ return {
50
+ id: typeof obj.id === 'string' ? obj.id : fallbackId,
51
+ role,
52
+ rows,
53
+ observable: obj.observable,
54
+ ...(typeof obj.sigma === 'number' && Number.isFinite(obj.sigma) ? { sigma: obj.sigma } : {}),
55
+ schemaVersion: typeof obj.schemaVersion === 'string' ? obj.schemaVersion : SCHEMA_VERSION,
56
+ };
57
+ }
58
+ /** Load a single ProbeDataset JSON object. @internal */
59
+ export function loadDatasetFromJson(path, fallbackRole) {
60
+ const raw = JSON.parse(readFileSync(path, 'utf8'));
61
+ return asDatasetSafe(raw, path, fallbackRole);
62
+ }
63
+ /** Load `{ exploratory, holdout }` JSON. @internal */
64
+ export function loadSplitDatasetsFromJson(path) {
65
+ const raw = JSON.parse(readFileSync(path, 'utf8'));
66
+ if (raw.exploratory || raw.holdout) {
67
+ return {
68
+ exploratory: raw.exploratory
69
+ ? asDatasetSafe(raw.exploratory, `${path}#exploratory`, 'exploratory-fit')
70
+ : undefined,
71
+ holdout: raw.holdout
72
+ ? asDatasetSafe(raw.holdout, `${path}#holdout`, 'validation-holdout')
73
+ : undefined,
74
+ };
75
+ }
76
+ if (raw.observations) {
77
+ return {
78
+ exploratory: asDatasetSafe({ ...raw.observations, role: 'exploratory-fit' }, `${path}#observations`, 'exploratory-fit'),
79
+ };
80
+ }
81
+ throw new Error(`JSON at ${path} needs exploratory/holdout or observations`);
82
+ }
83
+ /**
84
+ * Minimal CSV: first row headers, remaining rows numeric values.
85
+ * Optional `split` column (`exploratory`/`holdout`/`blind`).
86
+ *
87
+ * @internal
88
+ */
89
+ export function loadDatasetFromCsv(path, observable, role, id = path) {
90
+ const text = readFileSync(path, 'utf8').trim();
91
+ const lines = text.split(/\r?\n/).filter((l) => l.length > 0);
92
+ if (lines.length < 2) {
93
+ throw new Error(`CSV dataset at ${path} needs a header and at least one row`);
94
+ }
95
+ const headers = lines[0].split(',').map((h) => h.trim());
96
+ const rows = [];
97
+ for (let i = 1; i < lines.length; i++) {
98
+ const cells = lines[i].split(',').map((c) => c.trim());
99
+ const row = {};
100
+ for (let c = 0; c < headers.length; c++) {
101
+ const h = headers[c];
102
+ if (h === 'split')
103
+ continue;
104
+ const n = Number(cells[c] ?? '');
105
+ if (!Number.isFinite(n)) {
106
+ throw new Error(`CSV ${path} row ${i + 1} column ${h}: not a finite number`);
107
+ }
108
+ row[h] = n;
109
+ }
110
+ rows.push(row);
111
+ }
112
+ if (!(observable in (rows[0] ?? {}))) {
113
+ throw new Error(`CSV ${path} is missing observable column '${observable}'`);
114
+ }
115
+ return datasetFromRows(rows, observable, role, id);
116
+ }
117
+ /** Partition a mixed-split CSV (uses a `split` column). @internal */
118
+ export function loadSplitCsv(path, observable) {
119
+ const text = readFileSync(path, 'utf8').trim();
120
+ const lines = text.split(/\r?\n/).filter((l) => l.length > 0);
121
+ if (lines.length < 2) {
122
+ throw new Error(`CSV dataset at ${path} needs a header and at least one row`);
123
+ }
124
+ const headers = lines[0].split(',').map((h) => h.trim());
125
+ const splitIdx = headers.indexOf('split');
126
+ if (splitIdx < 0) {
127
+ throw new Error(`CSV ${path} has no split column`);
128
+ }
129
+ const exploratoryRows = [];
130
+ const holdoutRows = [];
131
+ for (let i = 1; i < lines.length; i++) {
132
+ const cells = lines[i].split(',').map((c) => c.trim());
133
+ const row = {};
134
+ for (let c = 0; c < headers.length; c++) {
135
+ if (c === splitIdx)
136
+ continue;
137
+ const n = Number(cells[c] ?? '');
138
+ if (!Number.isFinite(n)) {
139
+ throw new Error(`CSV ${path} row ${i + 1} column ${headers[c]}: not a finite number`);
140
+ }
141
+ row[headers[c]] = n;
142
+ }
143
+ const split = cells[splitIdx];
144
+ if (split === 'holdout')
145
+ holdoutRows.push(row);
146
+ else
147
+ exploratoryRows.push(row);
148
+ }
149
+ return {
150
+ exploratory: datasetFromRows(exploratoryRows, observable, 'exploratory-fit', `${path}#exploratory`),
151
+ holdout: datasetFromRows(holdoutRows, observable, 'validation-holdout', `${path}#holdout`),
152
+ };
153
+ }
154
+ //# sourceMappingURL=dataset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../../src/composition/probe/dataset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Cheap experiment-design suggestions for two competing hypotheses.
3
+ *
4
+ * Grid-search max |H1−H2|/σ under declared bounds. Never recommend a
5
+ * forbidden region.
6
+ *
7
+ * @internal
8
+ */
9
+ import type { ExprNode } from '../../dimensional/ast-types.js';
10
+ export interface DesignBounds {
11
+ readonly variables: Readonly<Record<string, {
12
+ min: number;
13
+ max: number;
14
+ steps?: number;
15
+ }>>;
16
+ readonly forbidden?: readonly Readonly<Record<string, {
17
+ min: number;
18
+ max: number;
19
+ }>>[];
20
+ readonly sigma?: number;
21
+ }
22
+ export interface DesignSuggestion {
23
+ readonly point: Readonly<Record<string, number>>;
24
+ readonly discrimination: number;
25
+ readonly h1: number;
26
+ readonly h2: number;
27
+ readonly abstained?: boolean;
28
+ readonly reason?: string;
29
+ }
30
+ /** Suggest the grid point that maximises |H1−H2|/σ, skipping forbidden regions. @internal */
31
+ export declare function suggestDiscriminatingPoint(h1: ExprNode, h2: ExprNode, bounds: DesignBounds): DesignSuggestion;
32
+ //# sourceMappingURL=experiment-design.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experiment-design.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/experiment-design.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAG/D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC3F,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,EAAE,CAAC;IACvF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAeD,6FAA6F;AAC7F,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,QAAQ,EACZ,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,YAAY,GACnB,gBAAgB,CAkElB"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Cheap experiment-design suggestions for two competing hypotheses.
3
+ *
4
+ * Grid-search max |H1−H2|/σ under declared bounds. Never recommend a
5
+ * forbidden region.
6
+ *
7
+ * @internal
8
+ */
9
+ import { evalExpr } from '../expr-eval.js';
10
+ function inForbidden(point, forbidden) {
11
+ if (!forbidden)
12
+ return false;
13
+ return forbidden.some((region) => Object.entries(region).every(([k, r]) => {
14
+ const v = point[k];
15
+ return v !== undefined && v >= r.min && v <= r.max;
16
+ }));
17
+ }
18
+ /** Suggest the grid point that maximises |H1−H2|/σ, skipping forbidden regions. @internal */
19
+ export function suggestDiscriminatingPoint(h1, h2, bounds) {
20
+ const names = Object.keys(bounds.variables);
21
+ if (names.length === 0) {
22
+ return {
23
+ point: {},
24
+ discrimination: 0,
25
+ h1: NaN,
26
+ h2: NaN,
27
+ abstained: true,
28
+ reason: 'no free variables in bounds',
29
+ };
30
+ }
31
+ const sigma = bounds.sigma ?? 1;
32
+ let best = null;
33
+ const grids = names.map((n) => {
34
+ const b = bounds.variables[n];
35
+ const steps = Math.max(2, b.steps ?? 8);
36
+ const out = [];
37
+ for (let i = 0; i < steps; i++) {
38
+ const t = i / (steps - 1);
39
+ out.push(b.min + t * (b.max - b.min));
40
+ }
41
+ return out;
42
+ });
43
+ const idx = new Array(names.length).fill(0);
44
+ const rec = (d) => {
45
+ if (d === names.length) {
46
+ const point = {};
47
+ for (let i = 0; i < names.length; i++)
48
+ point[names[i]] = grids[i][idx[i]];
49
+ if (inForbidden(point, bounds.forbidden))
50
+ return;
51
+ let y1;
52
+ let y2;
53
+ try {
54
+ y1 = evalExpr(h1, point);
55
+ y2 = evalExpr(h2, point);
56
+ }
57
+ catch {
58
+ return;
59
+ }
60
+ if (!Number.isFinite(y1) || !Number.isFinite(y2))
61
+ return;
62
+ const disc = Math.abs(y1 - y2) / sigma;
63
+ if (!best || disc > best.discrimination) {
64
+ best = { point, discrimination: disc, h1: y1, h2: y2 };
65
+ }
66
+ return;
67
+ }
68
+ for (let i = 0; i < grids[d].length; i++) {
69
+ idx[d] = i;
70
+ rec(d + 1);
71
+ }
72
+ };
73
+ rec(0);
74
+ if (!best) {
75
+ return {
76
+ point: {},
77
+ discrimination: 0,
78
+ h1: NaN,
79
+ h2: NaN,
80
+ abstained: true,
81
+ reason: 'every grid point was forbidden or non-finite',
82
+ };
83
+ }
84
+ return best;
85
+ }
86
+ //# sourceMappingURL=experiment-design.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experiment-design.js","sourceRoot":"","sources":["../../../src/composition/probe/experiment-design.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Falsification batteries for probe candidates.
3
+ *
4
+ * Persist counterexamples. Failed limits are fatal only when the candidate
5
+ * claims that domain (see limits.ts). Catalog retrodiction is Product A and
6
+ * is not treated as a candidate-level verdict.
7
+ *
8
+ * @internal
9
+ */
10
+ import type { ExprNode } from '../../dimensional/ast-types.js';
11
+ import type { DeclaredLimit, FalsificationBattery, FalsificationRecord, ProbeDataset } from './types.js';
12
+ export interface FalsifyInput {
13
+ readonly expr: ExprNode;
14
+ readonly dataset?: ProbeDataset;
15
+ readonly prefactor?: number;
16
+ readonly claimedRegimes?: Readonly<Record<string, string>>;
17
+ readonly limits?: readonly DeclaredLimit[];
18
+ readonly observationalBoundIds?: readonly string[];
19
+ readonly skipDimensional?: boolean;
20
+ }
21
+ export interface FalsifyResult {
22
+ readonly records: readonly FalsificationRecord[];
23
+ readonly survived: boolean;
24
+ readonly counterexamples: readonly Readonly<Record<string, number>>[];
25
+ }
26
+ /** Run the Product B falsification batteries. @internal */
27
+ export declare function runFalsification(input: FalsifyInput): FalsifyResult;
28
+ export declare const DEFAULT_BATTERIES: readonly FalsificationBattery[];
29
+ //# sourceMappingURL=falsify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"falsify.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/falsify.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAI/D,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnD,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CACvE;AAqHD,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CA2BnE;AAED,eAAO,MAAM,iBAAiB,EAAE,SAAS,oBAAoB,EAM5D,CAAC"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Falsification batteries for probe candidates.
3
+ *
4
+ * Persist counterexamples. Failed limits are fatal only when the candidate
5
+ * claims that domain (see limits.ts). Catalog retrodiction is Product A and
6
+ * is not treated as a candidate-level verdict.
7
+ *
8
+ * @internal
9
+ */
10
+ import { validate } from '../../dimensional/validator.js';
11
+ import { evalExpr } from '../expr-eval.js';
12
+ import { checkDeclaredLimits } from './limits.js';
13
+ function dimBattery(expr) {
14
+ const v = validate(expr);
15
+ if (!v.ok || v.inferredDimension === null) {
16
+ return {
17
+ battery: 'dimensional',
18
+ outcome: 'fail',
19
+ detail: 'expression is dimensionally inconsistent',
20
+ };
21
+ }
22
+ return {
23
+ battery: 'dimensional',
24
+ outcome: 'pass',
25
+ detail: 'expression is dimensionally consistent',
26
+ };
27
+ }
28
+ function finitenessBattery(expr, dataset, prefactor) {
29
+ if (!dataset || dataset.rows.length === 0) {
30
+ return {
31
+ record: {
32
+ battery: 'finiteness',
33
+ outcome: 'pass',
34
+ detail: 'no rows to evaluate',
35
+ },
36
+ counterexamples: [],
37
+ };
38
+ }
39
+ const counterexamples = [];
40
+ for (const row of dataset.rows) {
41
+ let y;
42
+ try {
43
+ y = prefactor * evalExpr(expr, row);
44
+ }
45
+ catch {
46
+ counterexamples.push({ ...row });
47
+ continue;
48
+ }
49
+ if (!Number.isFinite(y))
50
+ counterexamples.push({ ...row });
51
+ }
52
+ if (counterexamples.length > 0) {
53
+ return {
54
+ record: {
55
+ battery: 'finiteness',
56
+ outcome: 'fail',
57
+ detail: `${counterexamples.length} observation(s) produced non-finite predictions`,
58
+ },
59
+ counterexamples,
60
+ };
61
+ }
62
+ return {
63
+ record: {
64
+ battery: 'finiteness',
65
+ outcome: 'pass',
66
+ detail: 'all predictions finite',
67
+ },
68
+ counterexamples: [],
69
+ };
70
+ }
71
+ function limitsBattery(checks) {
72
+ const fatal = checks.filter((c) => c.fatal);
73
+ if (fatal.length > 0) {
74
+ return {
75
+ battery: 'limits',
76
+ outcome: 'fail',
77
+ detail: fatal.map((c) => c.detail).join('; '),
78
+ };
79
+ }
80
+ const failedNonFatal = checks.filter((c) => !c.passed && !c.fatal);
81
+ if (failedNonFatal.length > 0) {
82
+ return {
83
+ battery: 'limits',
84
+ outcome: 'inconclusive',
85
+ detail: failedNonFatal.map((c) => c.detail).join('; '),
86
+ };
87
+ }
88
+ return {
89
+ battery: 'limits',
90
+ outcome: 'pass',
91
+ detail: checks.length === 0
92
+ ? 'no declared limits'
93
+ : 'declared limits held or were out of claimed domain',
94
+ };
95
+ }
96
+ function retrodictionBattery() {
97
+ return {
98
+ battery: 'retrodiction',
99
+ outcome: 'inconclusive',
100
+ detail: 'catalog retrodiction is Product A (needs a composition graph + ground truth) — not a probe-candidate verdict',
101
+ };
102
+ }
103
+ function observationalBoundsBattery(ids) {
104
+ if (!ids || ids.length === 0) {
105
+ return {
106
+ battery: 'observational-bounds',
107
+ outcome: 'pass',
108
+ detail: 'no observational bound ids supplied',
109
+ };
110
+ }
111
+ return {
112
+ battery: 'observational-bounds',
113
+ outcome: 'inconclusive',
114
+ detail: `bound ids ${ids.join(', ')} recorded; candidate-level bound evaluation is data-specific`,
115
+ };
116
+ }
117
+ /** Run the Product B falsification batteries. @internal */
118
+ export function runFalsification(input) {
119
+ const prefactor = input.prefactor ?? 1;
120
+ const records = [];
121
+ const counterexamples = [];
122
+ if (!input.skipDimensional) {
123
+ records.push(dimBattery(input.expr));
124
+ }
125
+ const fin = finitenessBattery(input.expr, input.dataset, prefactor);
126
+ records.push(fin.record);
127
+ counterexamples.push(...fin.counterexamples);
128
+ const limitChecks = checkDeclaredLimits(input.expr, input.dataset, prefactor, input.limits ?? [], input.claimedRegimes ?? {});
129
+ records.push(limitsBattery(limitChecks));
130
+ records.push(retrodictionBattery());
131
+ records.push(observationalBoundsBattery(input.observationalBoundIds));
132
+ const survived = records.every((r) => r.outcome !== 'fail');
133
+ return { records, survived, counterexamples };
134
+ }
135
+ export const DEFAULT_BATTERIES = [
136
+ 'dimensional',
137
+ 'finiteness',
138
+ 'limits',
139
+ 'retrodiction',
140
+ 'observational-bounds',
141
+ ];
142
+ //# sourceMappingURL=falsify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"falsify.js","sourceRoot":"","sources":["../../../src/composition/probe/falsify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Candidate fingerprints — `normalForm` is the cheap algebraic hash.
3
+ *
4
+ * @module composition/probe/fingerprint
5
+ */
6
+ import type { ExprNode } from '../../dimensional/ast-types.js';
7
+ import type { CandidateFingerprint, ComplexityMetrics, ProbeCandidateBody } from './types.js';
8
+ /** Expression of a probe body. @internal */
9
+ export declare function bodyExpression(body: ProbeCandidateBody): ExprNode;
10
+ /** Recursively count AST nodes. @internal */
11
+ export declare function countAstNodes(node: ExprNode): number;
12
+ /** Operator / transcendental count. @internal */
13
+ export declare function countOperators(node: ExprNode): number;
14
+ /** Max `^` numeric exponent used as a derivative-order proxy for monomials. @internal */
15
+ export declare function maxPowerOrder(node: ExprNode): number;
16
+ /** Complexity metrics for an expression. @internal */
17
+ export declare function complexityOf(node: ExprNode, freeParameters?: number): ComplexityMetrics;
18
+ /** Fingerprint an expression under optional regime/assumption signatures. @internal */
19
+ export declare function fingerprintExpr(node: ExprNode, regimeSignature?: string, assumptionSignature?: string): CandidateFingerprint;
20
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAK/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,QAAQ,CAEjE;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAyBpD;AAED,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAsBrD;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAQpD;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,SAAI,GAAG,iBAAiB,CAUlF;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,eAAe,SAAK,EACpB,mBAAmB,SAAK,GACvB,oBAAoB,CAYtB"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Candidate fingerprints — `normalForm` is the cheap algebraic hash.
3
+ *
4
+ * @module composition/probe/fingerprint
5
+ */
6
+ import { validate } from '../../dimensional/validator.js';
7
+ import { format } from '../../dimensional/algebra.js';
8
+ import { normalForm } from '../../canonical/normal-form.js';
9
+ import { hashCanonical, sha256Hex } from './serialize.js';
10
+ /** Expression of a probe body. @internal */
11
+ export function bodyExpression(body) {
12
+ return body.kind === 'scalar-expr' ? body.expression : body.correction;
13
+ }
14
+ /** Recursively count AST nodes. @internal */
15
+ export function countAstNodes(node) {
16
+ switch (node.kind) {
17
+ case 'symbol':
18
+ return 1;
19
+ case 'op':
20
+ return 1 + node.args.reduce((n, a) => n + countAstNodes(a), 0);
21
+ case 'transcendental':
22
+ case 'abs':
23
+ case 'dirac-delta':
24
+ return 1 + countAstNodes(node.arg);
25
+ case 'integral':
26
+ return (1 +
27
+ countAstNodes(node.integrand) +
28
+ countAstNodes(node.over) +
29
+ (node.lower ? countAstNodes(node.lower) : 0) +
30
+ (node.upper ? countAstNodes(node.upper) : 0));
31
+ case 'derivative':
32
+ return 1 + countAstNodes(node.of) + countAstNodes(node.wrt);
33
+ case 'variational-derivative':
34
+ return 1 + countAstNodes(node.functional) + countAstNodes(node.field) + countAstNodes(node.over);
35
+ default:
36
+ return 1;
37
+ }
38
+ }
39
+ /** Operator / transcendental count. @internal */
40
+ export function countOperators(node) {
41
+ switch (node.kind) {
42
+ case 'op':
43
+ return 1 + node.args.reduce((n, a) => n + countOperators(a), 0);
44
+ case 'transcendental':
45
+ return 1 + countOperators(node.arg);
46
+ case 'abs':
47
+ case 'dirac-delta':
48
+ return countOperators(node.arg);
49
+ case 'integral':
50
+ return (1 +
51
+ countOperators(node.integrand) +
52
+ countOperators(node.over) +
53
+ (node.lower ? countOperators(node.lower) : 0) +
54
+ (node.upper ? countOperators(node.upper) : 0));
55
+ case 'derivative':
56
+ return 1 + countOperators(node.of) + countOperators(node.wrt);
57
+ default:
58
+ return 0;
59
+ }
60
+ }
61
+ /** Max `^` numeric exponent used as a derivative-order proxy for monomials. @internal */
62
+ export function maxPowerOrder(node) {
63
+ if (node.kind === 'op' && node.op === '^' && node.args[1]?.kind === 'symbol') {
64
+ const e = Math.abs(Number(node.args[1].name));
65
+ return Number.isFinite(e) ? e : 0;
66
+ }
67
+ if (node.kind === 'op')
68
+ return Math.max(0, ...node.args.map(maxPowerOrder));
69
+ if (node.kind === 'transcendental' || node.kind === 'abs')
70
+ return maxPowerOrder(node.arg);
71
+ return 0;
72
+ }
73
+ /** Complexity metrics for an expression. @internal */
74
+ export function complexityOf(node, freeParameters = 1) {
75
+ const astNodes = countAstNodes(node);
76
+ const operators = countOperators(node);
77
+ return {
78
+ astNodes,
79
+ operators,
80
+ freeParameters,
81
+ derivativeOrder: Math.round(maxPowerOrder(node)),
82
+ descriptionLength: astNodes + operators,
83
+ };
84
+ }
85
+ /** Fingerprint an expression under optional regime/assumption signatures. @internal */
86
+ export function fingerprintExpr(node, regimeSignature = '', assumptionSignature = '') {
87
+ const syntaxHash = sha256Hex(hashCanonical(node));
88
+ const canonicalAstHash = sha256Hex(normalForm(node));
89
+ const v = validate(node);
90
+ const dimensionalSignature = v.inferredDimension ? format(v.inferredDimension) : 'invalid';
91
+ return {
92
+ syntaxHash,
93
+ canonicalAstHash,
94
+ dimensionalSignature,
95
+ regimeSignature,
96
+ assumptionSignature: sha256Hex(assumptionSignature),
97
+ };
98
+ }
99
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../src/composition/probe/fingerprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Prefactor fit + holdout evaluation. Generation never sees holdout rows.
3
+ *
4
+ * @module composition/probe/fit
5
+ */
6
+ import type { ExprNode } from '../../dimensional/ast-types.js';
7
+ import type { ProbeDataset } from './types.js';
8
+ export interface FitResult {
9
+ readonly prefactor: number;
10
+ readonly exploratoryRmse: number;
11
+ readonly nExploratory: number;
12
+ readonly holdoutRmse: number | null;
13
+ readonly nHoldout: number;
14
+ readonly holdoutSupported: boolean;
15
+ }
16
+ /**
17
+ * Least-squares prefactor c in y ≈ c · f(x) on exploratory data, then score
18
+ * locked holdout. Holdout must not have been in the generation context.
19
+ *
20
+ * @internal
21
+ */
22
+ export declare function fitPrefactor(expr: ExprNode, exploratory: ProbeDataset, holdout: ProbeDataset | undefined, holdoutTol?: number): FitResult;
23
+ //# sourceMappingURL=fit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fit.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/fit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAmBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,YAAY,EACzB,OAAO,EAAE,YAAY,GAAG,SAAS,EACjC,UAAU,SAAO,GAChB,SAAS,CA8DX"}