universal-physics-tensor 11.0.0 → 12.0.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.
- package/README.md +36 -34
- package/data/applied-cases.json +1892 -0
- package/data/applied-cases.schema.json +194 -0
- package/data/atlas/atlas.json +21 -21
- package/data/atlas/atlas.jsonld +1 -1
- package/data/atlas/diffusion.json +5 -5
- package/data/atlas/oscillators.json +7 -7
- package/data/atlas/waves.json +11 -11
- package/data/bridge-catalog.json +20 -4
- package/data/units.json +6 -25
- package/dist/atlas/benchmark/stats.d.ts.map +1 -1
- package/dist/atlas/benchmark/stats.js +6 -20
- package/dist/atlas/benchmark/stats.js.map +1 -1
- package/dist/atlas/physjs-entries.generated.d.ts +13 -4
- package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
- package/dist/atlas/physjs-entries.generated.js +15 -4
- package/dist/atlas/physjs-entries.generated.js.map +1 -1
- package/dist/atlas/physjs-reviewed.js +2 -2
- package/dist/atlas/physjs-reviewed.js.map +1 -1
- package/dist/cases/catalog-checks.d.ts +10 -0
- package/dist/cases/catalog-checks.d.ts.map +1 -0
- package/dist/cases/catalog-checks.js +241 -0
- package/dist/cases/catalog-checks.js.map +1 -0
- package/dist/cases/catalog.d.ts +83 -0
- package/dist/cases/catalog.d.ts.map +1 -0
- package/dist/cases/catalog.js +118 -0
- package/dist/cases/catalog.js.map +1 -0
- package/dist/cases/engine.d.ts +13 -0
- package/dist/cases/engine.d.ts.map +1 -0
- package/dist/cases/engine.js +179 -0
- package/dist/cases/engine.js.map +1 -0
- package/dist/cases/index.d.ts.map +1 -1
- package/dist/cases/index.js +5 -7
- package/dist/cases/index.js.map +1 -1
- package/dist/cases/methods.d.ts +215 -0
- package/dist/cases/methods.d.ts.map +1 -0
- package/dist/cases/methods.js +743 -0
- package/dist/cases/methods.js.map +1 -0
- package/dist/cases/types.d.ts +12 -0
- package/dist/cases/types.d.ts.map +1 -1
- package/dist/cases/types.js.map +1 -1
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/command.d.ts +3 -0
- package/dist/cli/command.d.ts.map +1 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/commands/_discovery-opts.d.ts +1 -0
- package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
- package/dist/cli/commands/_discovery-opts.js +1 -0
- package/dist/cli/commands/_discovery-opts.js.map +1 -1
- package/dist/cli/commands/discover.d.ts.map +1 -1
- package/dist/cli/commands/discover.js +116 -71
- package/dist/cli/commands/discover.js.map +1 -1
- package/dist/cli/commands/evaluate.js +2 -2
- package/dist/cli/commands/evaluate.js.map +1 -1
- package/dist/cli/commands/explain.d.ts.map +1 -1
- package/dist/cli/commands/explain.js +22 -2
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/ground.d.ts.map +1 -1
- package/dist/cli/commands/ground.js +6 -1
- package/dist/cli/commands/ground.js.map +1 -1
- package/dist/cli/commands/map.d.ts.map +1 -1
- package/dist/cli/commands/map.js +9 -6
- package/dist/cli/commands/map.js.map +1 -1
- package/dist/cli/determination.d.ts +1 -0
- package/dist/cli/determination.d.ts.map +1 -1
- package/dist/cli/determination.js.map +1 -1
- package/dist/cli/flag-help.d.ts +1 -0
- package/dist/cli/flag-help.d.ts.map +1 -1
- package/dist/cli/flag-help.js +1 -0
- package/dist/cli/flag-help.js.map +1 -1
- package/dist/cli/graphs.d.ts +2 -0
- package/dist/cli/graphs.d.ts.map +1 -1
- package/dist/cli/graphs.js +1 -0
- package/dist/cli/graphs.js.map +1 -1
- package/dist/cli/main.d.ts +1 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +1 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output.d.ts +8 -0
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +8 -0
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/statuses.d.ts.map +1 -1
- package/dist/cli/statuses.js +12 -2
- package/dist/cli/statuses.js.map +1 -1
- package/dist/cli/version.d.ts +1 -0
- package/dist/cli/version.d.ts.map +1 -1
- package/dist/cli/version.js +1 -0
- package/dist/cli/version.js.map +1 -1
- package/dist/cli-api.d.ts +2 -0
- package/dist/cli-api.d.ts.map +1 -1
- package/dist/cli-api.js +2 -0
- package/dist/cli-api.js.map +1 -1
- package/dist/composition/canonical-graph.d.ts +2 -2
- package/dist/composition/canonical-graph.js +2 -2
- package/dist/composition/canonical-graph.js.map +1 -1
- package/dist/composition/consequence.d.ts +15 -5
- package/dist/composition/consequence.d.ts.map +1 -1
- package/dist/composition/consequence.js +6 -4
- package/dist/composition/consequence.js.map +1 -1
- package/dist/composition/discovery.d.ts +78 -14
- package/dist/composition/discovery.d.ts.map +1 -1
- package/dist/composition/discovery.js +73 -23
- package/dist/composition/discovery.js.map +1 -1
- package/dist/composition/expr-eval.d.ts +1 -1
- package/dist/composition/expr-eval.d.ts.map +1 -1
- package/dist/composition/expr-eval.js +4 -4
- package/dist/composition/expr-eval.js.map +1 -1
- package/dist/composition/expr-simplify.d.ts +10 -14
- package/dist/composition/expr-simplify.d.ts.map +1 -1
- package/dist/composition/expr-simplify.js +49 -52
- package/dist/composition/expr-simplify.js.map +1 -1
- package/dist/composition/grounding.d.ts.map +1 -1
- package/dist/composition/grounding.js +19 -7
- package/dist/composition/grounding.js.map +1 -1
- package/dist/composition/mathts-quiet.d.ts +4 -6
- package/dist/composition/mathts-quiet.d.ts.map +1 -1
- package/dist/composition/mathts-quiet.js +4 -14
- package/dist/composition/mathts-quiet.js.map +1 -1
- package/dist/composition/own-equation-magnitude.d.ts +95 -0
- package/dist/composition/own-equation-magnitude.d.ts.map +1 -0
- package/dist/composition/own-equation-magnitude.js +270 -0
- package/dist/composition/own-equation-magnitude.js.map +1 -0
- package/dist/composition/probe/backend-protocol.d.ts +3 -0
- package/dist/composition/probe/backend-protocol.d.ts.map +1 -1
- package/dist/composition/probe/backend-protocol.js.map +1 -1
- package/dist/composition/probe/candidate-store.d.ts +1 -0
- package/dist/composition/probe/candidate-store.d.ts.map +1 -1
- package/dist/composition/probe/candidate-store.js +1 -0
- package/dist/composition/probe/candidate-store.js.map +1 -1
- package/dist/composition/probe/corpus.d.ts +4 -2
- package/dist/composition/probe/corpus.d.ts.map +1 -1
- package/dist/composition/probe/corpus.js +3 -3
- package/dist/composition/probe/corpus.js.map +1 -1
- package/dist/composition/probe/dataset.d.ts +1 -0
- package/dist/composition/probe/dataset.d.ts.map +1 -1
- package/dist/composition/probe/dataset.js.map +1 -1
- package/dist/composition/probe/experiment-design.d.ts +2 -0
- package/dist/composition/probe/experiment-design.d.ts.map +1 -1
- package/dist/composition/probe/experiment-design.js.map +1 -1
- package/dist/composition/probe/falsify.d.ts +2 -0
- package/dist/composition/probe/falsify.d.ts.map +1 -1
- package/dist/composition/probe/falsify.js.map +1 -1
- package/dist/composition/probe/fit.d.ts +1 -0
- package/dist/composition/probe/fit.d.ts.map +1 -1
- package/dist/composition/probe/fit.js.map +1 -1
- package/dist/composition/probe/generator.d.ts +3 -0
- package/dist/composition/probe/generator.d.ts.map +1 -1
- package/dist/composition/probe/generator.js +5 -6
- package/dist/composition/probe/generator.js.map +1 -1
- package/dist/composition/probe/limits.d.ts +1 -0
- package/dist/composition/probe/limits.d.ts.map +1 -1
- package/dist/composition/probe/limits.js.map +1 -1
- package/dist/composition/probe/pipeline.d.ts +5 -0
- package/dist/composition/probe/pipeline.d.ts.map +1 -1
- package/dist/composition/probe/pipeline.js +64 -21
- package/dist/composition/probe/pipeline.js.map +1 -1
- package/dist/composition/probe/power-law.d.ts.map +1 -1
- package/dist/composition/probe/power-law.js +3 -7
- package/dist/composition/probe/power-law.js.map +1 -1
- package/dist/composition/probe/problem.d.ts +1 -0
- package/dist/composition/probe/problem.d.ts.map +1 -1
- package/dist/composition/probe/problem.js.map +1 -1
- package/dist/composition/probe/residual.d.ts +1 -0
- package/dist/composition/probe/residual.d.ts.map +1 -1
- package/dist/composition/probe/residual.js +1 -0
- package/dist/composition/probe/residual.js.map +1 -1
- package/dist/composition/probe/run-manifest.d.ts +1 -0
- package/dist/composition/probe/run-manifest.d.ts.map +1 -1
- package/dist/composition/probe/run-manifest.js.map +1 -1
- package/dist/composition/probe/scalar-search.d.ts +50 -0
- package/dist/composition/probe/scalar-search.d.ts.map +1 -0
- package/dist/composition/probe/scalar-search.js +169 -0
- package/dist/composition/probe/scalar-search.js.map +1 -0
- package/dist/composition/probe/scoring.d.ts +1 -0
- package/dist/composition/probe/scoring.d.ts.map +1 -1
- package/dist/composition/probe/scoring.js.map +1 -1
- package/dist/composition/probe/study.d.ts +2 -2
- package/dist/composition/probe/study.d.ts.map +1 -1
- package/dist/composition/probe/study.js +6 -10
- package/dist/composition/probe/study.js.map +1 -1
- package/dist/composition/probe/t-tail.d.ts +3 -4
- package/dist/composition/probe/t-tail.d.ts.map +1 -1
- package/dist/composition/probe/t-tail.js +7 -10
- package/dist/composition/probe/t-tail.js.map +1 -1
- package/dist/composition/proposed-bridges.d.ts +11 -2
- package/dist/composition/proposed-bridges.d.ts.map +1 -1
- package/dist/composition/proposed-bridges.js +7 -5
- package/dist/composition/proposed-bridges.js.map +1 -1
- package/dist/composition/rational-exponent.d.ts +2 -2
- package/dist/composition/rational-exponent.d.ts.map +1 -1
- package/dist/composition/rational-exponent.js +4 -4
- package/dist/composition/rational-exponent.js.map +1 -1
- package/dist/composition/representative-values.d.ts.map +1 -1
- package/dist/composition/representative-values.js +6 -0
- package/dist/composition/representative-values.js.map +1 -1
- package/dist/composition/retrodiction.d.ts +15 -0
- package/dist/composition/retrodiction.d.ts.map +1 -1
- package/dist/composition/retrodiction.js +10 -3
- package/dist/composition/retrodiction.js.map +1 -1
- package/dist/composition/user-equation.d.ts +1 -0
- package/dist/composition/user-equation.d.ts.map +1 -1
- package/dist/composition/user-equation.js +1 -0
- package/dist/composition/user-equation.js.map +1 -1
- package/dist/core/constants.d.ts +12 -11
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +24 -21
- package/dist/core/constants.js.map +1 -1
- package/dist/diff/bridge-ast-gradient.d.ts +27 -23
- package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
- package/dist/diff/bridge-ast-gradient.js +75 -173
- package/dist/diff/bridge-ast-gradient.js.map +1 -1
- package/dist/dimensional/ast-types.d.ts +15 -0
- package/dist/dimensional/ast-types.d.ts.map +1 -1
- package/dist/dimensional/ast-types.js.map +1 -1
- package/dist/dimensional/curvature-composite.d.ts +1 -1
- package/dist/dimensional/curvature-composite.js.map +1 -1
- package/dist/dimensional/exact-scale.d.ts +41 -11
- package/dist/dimensional/exact-scale.d.ts.map +1 -1
- package/dist/dimensional/exact-scale.js +115 -123
- package/dist/dimensional/exact-scale.js.map +1 -1
- package/dist/dimensional/mathts-unit-delegation.d.ts +29 -0
- package/dist/dimensional/mathts-unit-delegation.d.ts.map +1 -0
- package/dist/dimensional/mathts-unit-delegation.js +187 -0
- package/dist/dimensional/mathts-unit-delegation.js.map +1 -0
- package/dist/dimensional/mathts-unit-wrapper.d.ts +33 -0
- package/dist/dimensional/mathts-unit-wrapper.d.ts.map +1 -0
- package/dist/dimensional/mathts-unit-wrapper.js +190 -0
- package/dist/dimensional/mathts-unit-wrapper.js.map +1 -0
- package/dist/dimensional/scalar-lowering.d.ts +21 -0
- package/dist/dimensional/scalar-lowering.d.ts.map +1 -0
- package/dist/dimensional/scalar-lowering.js +45 -0
- package/dist/dimensional/scalar-lowering.js.map +1 -0
- package/dist/dimensional/unit-data.d.ts +5 -1
- package/dist/dimensional/unit-data.d.ts.map +1 -1
- package/dist/dimensional/unit-data.js +28 -4
- package/dist/dimensional/unit-data.js.map +1 -1
- package/dist/dimensional/units.d.ts +2 -0
- package/dist/dimensional/units.d.ts.map +1 -1
- package/dist/dimensional/units.js +59 -3
- package/dist/dimensional/units.js.map +1 -1
- package/dist/dimensional/validator.d.ts +2 -0
- package/dist/dimensional/validator.d.ts.map +1 -1
- package/dist/dimensional/validator.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/numerical/connection-lowering-helpers.d.ts +3 -1
- package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -1
- package/dist/numerical/connection-lowering-helpers.js +11 -15
- package/dist/numerical/connection-lowering-helpers.js.map +1 -1
- package/dist/numerical/pderiv.d.ts.map +1 -1
- package/dist/numerical/pderiv.js +2 -6
- package/dist/numerical/pderiv.js.map +1 -1
- package/dist/numerical/quadrature.js +3 -3
- package/dist/numerical/quadrature.js.map +1 -1
- package/dist/numerical/statistics.js +1 -1
- package/dist/numerical/statistics.js.map +1 -1
- package/dist/numerical/strides.d.ts +3 -2
- package/dist/numerical/strides.d.ts.map +1 -1
- package/dist/numerical/strides.js +3 -10
- package/dist/numerical/strides.js.map +1 -1
- package/package.json +9 -12
- package/dist/cases/brownian-sphere.d.ts +0 -68
- package/dist/cases/brownian-sphere.d.ts.map +0 -1
- package/dist/cases/brownian-sphere.js +0 -355
- package/dist/cases/brownian-sphere.js.map +0 -1
- package/dist/cases/damped-resonator.d.ts +0 -23
- package/dist/cases/damped-resonator.d.ts.map +0 -1
- package/dist/cases/damped-resonator.js +0 -221
- package/dist/cases/damped-resonator.js.map +0 -1
- package/dist/cases/kepler-rv.d.ts +0 -13
- package/dist/cases/kepler-rv.d.ts.map +0 -1
- package/dist/cases/kepler-rv.js +0 -173
- package/dist/cases/kepler-rv.js.map +0 -1
- package/dist/cases/lumped-cooling.d.ts +0 -51
- package/dist/cases/lumped-cooling.d.ts.map +0 -1
- package/dist/cases/lumped-cooling.js +0 -259
- package/dist/cases/lumped-cooling.js.map +0 -1
- package/dist/cases/resistor-noise.d.ts +0 -14
- package/dist/cases/resistor-noise.d.ts.map +0 -1
- package/dist/cases/resistor-noise.js +0 -215
- package/dist/cases/resistor-noise.js.map +0 -1
- package/dist/cases/skin-depth.d.ts +0 -17
- package/dist/cases/skin-depth.d.ts.map +0 -1
- package/dist/cases/skin-depth.js +0 -170
- package/dist/cases/skin-depth.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../../../src/composition/probe/limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../../../src/composition/probe/limits.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Declared-limit checks for probe candidates.\n *\n * A failed limit is **not automatically fatal**. It is fatal only when the\n * candidate claims the domain in which the limit fails. A limit whose rows\n * the candidate mostly could not be evaluated on is **undecided**, which is\n * neither a pass nor a failure and is never fatal.\n *\n * @internal\n */\n\nimport { norm2 } from '@danielsimonjr/mathts-core';\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport type { DeclaredLimit, ProbeDataset } from './types.js';\nimport { evalExpr } from '../expr-eval.js';\n\n/** What a limit check found: the limit held, failed, or could not be decided on these rows. @internal */\nexport type LimitOutcome = 'held' | 'failed' | 'undecided';\n\n/** The outcome of one declared-limit check, and whether it is fatal. */\nexport interface LimitCheckResult {\n readonly id: string;\n /** `outcome === 'held'`. */\n readonly passed: boolean;\n readonly outcome: LimitOutcome;\n /** Rows the candidate was evaluated on (finite prediction and a finite observation). */\n readonly evaluated: number;\n /** Rows the candidate threw on, or predicted a non-finite value for, or that have no finite observation. */\n readonly skipped: number;\n readonly claimedDomain: boolean;\n readonly fatal: boolean;\n readonly detail: string;\n}\n\n/**\n * Evaluate `prefactor · expr` RMSE on `dataset`. When the candidate does not\n * claim `limit.regime`, a failure is recorded but not fatal.\n *\n * A row the candidate throws on, or predicts a non-finite value for, is\n * skipped and COUNTED. When more rows were skipped than evaluated (or none\n * could be evaluated), the outcome is `undecided`: a candidate that throws on\n * nine rows of ten is not judged on the tenth. That threshold, skipped >\n * evaluated, is a choice stated here, not a measured one.\n *\n * The pass rule is LOOSE by design: the limit holds when the RMSE over the\n * evaluated rows is at most half the largest |observation| of the dataset. It\n * catches a candidate that is wrong by its own scale in a regime, not one that\n * is wrong by a few percent; the holdout tolerance is the quantitative test.\n * The RMSE is core `norm2` of the residuals over √n (overflow-safe), so a\n * residual of 1e200 is a number, not `Infinity`.\n *\n * @internal\n */\nexport function checkDeclaredLimit(\n expr: ExprNode,\n dataset: ProbeDataset,\n prefactor: number,\n limit: DeclaredLimit,\n claimsDomain: boolean,\n): LimitCheckResult {\n if (dataset.rows.length === 0) {\n return {\n id: limit.id,\n passed: true,\n outcome: 'held',\n evaluated: 0,\n skipped: 0,\n claimedDomain: claimsDomain,\n fatal: false,\n detail: `no observations for declared-limit ${limit.id}`,\n };\n }\n const residuals: number[] = [];\n let skipped = 0;\n for (const row of dataset.rows) {\n let predicted: number;\n try {\n predicted = prefactor * evalExpr(expr, row);\n } catch {\n skipped += 1;\n continue;\n }\n const observed = row[dataset.observable];\n if (!Number.isFinite(predicted) || observed === undefined || !Number.isFinite(observed)) {\n skipped += 1;\n continue;\n }\n residuals.push(predicted - observed);\n }\n const evaluated = residuals.length;\n const total = dataset.rows.length;\n if (evaluated === 0 || skipped > evaluated) {\n return {\n id: limit.id,\n passed: false,\n outcome: 'undecided',\n evaluated,\n skipped,\n claimedDomain: claimsDomain,\n fatal: false,\n detail: `limit ${limit.id} undecided: ${skipped} of ${total} rows could not be evaluated (${evaluated} could); not judged on so few`,\n };\n }\n const rmse = norm2(residuals) / Math.sqrt(evaluated);\n // A reduce, not `Math.max(...rows)`: a spread of a large dataset overflows the call stack.\n const scale = dataset.rows.reduce((m, r) => {\n const v = r[dataset.observable];\n return v !== undefined && Number.isFinite(v) ? Math.max(m, Math.abs(v)) : m;\n }, 1e-12);\n const passed = Number.isFinite(rmse) && rmse <= 0.5 * scale;\n const fatal = !passed && claimsDomain;\n const rows = skipped > 0 ? ` on ${evaluated} of ${total} rows (${skipped} skipped)` : '';\n return {\n id: limit.id,\n passed,\n outcome: passed ? 'held' : 'failed',\n evaluated,\n skipped,\n claimedDomain: claimsDomain,\n fatal,\n detail: passed\n ? `limit ${limit.id} held (rmse=${rmse})${rows}`\n : `limit ${limit.id} failed (rmse=${rmse})${rows}${fatal ? ' — fatal because candidate claims this domain' : ' — not fatal (domain not claimed)'}`,\n };\n}\n\n/** Run every declared limit. @internal */\nexport function checkDeclaredLimits(\n expr: ExprNode,\n dataset: ProbeDataset | undefined,\n prefactor: number,\n limits: readonly DeclaredLimit[],\n claimedRegimes: Readonly<Record<string, string>> = {},\n): readonly LimitCheckResult[] {\n const rows = dataset ?? {\n id: 'empty',\n role: 'falsification-only' as const,\n rows: [],\n observable: '',\n schemaVersion: '0',\n };\n return limits.map((limit) => {\n const claimsDomain = Object.entries(limit.regime).every(\n ([k, v]) => claimedRegimes[k] === v,\n );\n return checkDeclaredLimit(expr, rows, prefactor, limit, claimsDomain);\n });\n}\n"]}
|
|
@@ -13,6 +13,7 @@ import { type CorpusComparisonResult } from './corpus.js';
|
|
|
13
13
|
import { type FitResult } from './fit.js';
|
|
14
14
|
import { type FalsifyResult } from './falsify.js';
|
|
15
15
|
import { type RankedCandidate } from './scoring.js';
|
|
16
|
+
import { type ProbeScalarSearchOptions } from './scalar-search.js';
|
|
16
17
|
/** Stop wording when the problem carried no holdout rows. @internal */
|
|
17
18
|
export declare const NO_HOLDOUT_WORDING = "no holdout observations: no candidate was tested on withheld data";
|
|
18
19
|
/**
|
|
@@ -20,15 +21,19 @@ export declare const NO_HOLDOUT_WORDING = "no holdout observations: no candidate
|
|
|
20
21
|
* @internal
|
|
21
22
|
*/
|
|
22
23
|
export declare function nodeWorkerArgv(script: string): readonly string[];
|
|
24
|
+
/** The optional settings of one probe search: budget, run id, backend and corpus version. */
|
|
23
25
|
export interface ProbeSearchOptions {
|
|
24
26
|
readonly budget?: SearchBudget;
|
|
25
27
|
readonly runId?: string;
|
|
26
28
|
readonly repositoryCommit?: string;
|
|
27
29
|
readonly holdoutTol?: number;
|
|
28
30
|
readonly backendArgv?: readonly string[];
|
|
31
|
+
/** Opt-in MathTS scalar-search candidate source (plan task P5). Absent: the search does not run. */
|
|
32
|
+
readonly scalarSearch?: ProbeScalarSearchOptions;
|
|
29
33
|
readonly corpusVersion?: string;
|
|
30
34
|
readonly now?: string;
|
|
31
35
|
}
|
|
36
|
+
/** The outcome of one probe search: its manifest, candidates, rankings and stop reason. */
|
|
32
37
|
export interface ProbeSearchResult {
|
|
33
38
|
readonly manifest: DiscoveryRunManifest;
|
|
34
39
|
readonly candidates: readonly ProbeCandidateRecord[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAEV,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAYpB,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAIpE,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,oBAAoB,CAAC;AAE5B,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,sEAAsE,CAAC;AAEtG;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAEhE;AAED,6FAA6F;AAC7F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,oGAAoG;IACpG,QAAQ,CAAC,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,2FAA2F;AAC3F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAClE;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACrE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;CACvC;AAkJD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAuT5B"}
|
|
@@ -12,7 +12,7 @@ import { validate } from '../../dimensional/validator.js';
|
|
|
12
12
|
import { equals } from '../../dimensional/algebra.js';
|
|
13
13
|
import { DEFAULT_HOLDOUT_TOL, DEFAULT_SEARCH_BUDGET, SCHEMA_VERSION } from './types.js';
|
|
14
14
|
import { openBudget, budgetStopReason } from './search-budget.js';
|
|
15
|
-
import { generateNative, nativeDetermination, powerLawDetermination, powerLawWording } from './generator.js';
|
|
15
|
+
import { generateNative, nativeDetermination, powerLawDetermination, powerLawWording, withinAstCaps, } from './generator.js';
|
|
16
16
|
import { fingerprintExpr, complexityOf, bodyExpression } from './fingerprint.js';
|
|
17
17
|
import { compareToCorpus, corpusPrefactorNotes, corpusRelativeWording, } from './corpus.js';
|
|
18
18
|
import { fitPrefactor } from './fit.js';
|
|
@@ -22,6 +22,7 @@ import { openManifest, closeManifest } from './run-manifest.js';
|
|
|
22
22
|
import { hashCanonical } from './serialize.js';
|
|
23
23
|
import { scoreCandidate, rankPareto } from './scoring.js';
|
|
24
24
|
import { runBackendWorker } from './backend-protocol.js';
|
|
25
|
+
import { SCALAR_SEARCH_ORIGIN, scalarSearchCandidates, UnsupportedScalarFunctionError, } from './scalar-search.js';
|
|
25
26
|
/** Stop wording when the problem carried no holdout rows. @internal */
|
|
26
27
|
export const NO_HOLDOUT_WORDING = 'no holdout observations: no candidate was tested on withheld data';
|
|
27
28
|
/**
|
|
@@ -116,6 +117,42 @@ function makeGenerated(expr, problem, runId, at, origin, seq) {
|
|
|
116
117
|
schemaVersion: SCHEMA_VERSION,
|
|
117
118
|
};
|
|
118
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* The manifest's backend list: the native enumerator, then each opted-in source.
|
|
122
|
+
* `undefined` when no source is opted in, so a default run's manifest is unchanged.
|
|
123
|
+
*/
|
|
124
|
+
function backendDescriptorsFor(opts) {
|
|
125
|
+
if (!opts.backendArgv && !opts.scalarSearch)
|
|
126
|
+
return undefined;
|
|
127
|
+
const list = [
|
|
128
|
+
{
|
|
129
|
+
protocolVersion: '0',
|
|
130
|
+
backendId: 'native',
|
|
131
|
+
backendVersion: SCHEMA_VERSION,
|
|
132
|
+
capabilities: ['grammar-enumerator'],
|
|
133
|
+
deterministic: 'yes',
|
|
134
|
+
},
|
|
135
|
+
];
|
|
136
|
+
if (opts.backendArgv) {
|
|
137
|
+
list.push({
|
|
138
|
+
protocolVersion: '0',
|
|
139
|
+
backendId: opts.backendArgv.join(' '),
|
|
140
|
+
backendVersion: 'external',
|
|
141
|
+
capabilities: ['external-backend'],
|
|
142
|
+
deterministic: 'unknown',
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
if (opts.scalarSearch) {
|
|
146
|
+
list.push({
|
|
147
|
+
protocolVersion: '0',
|
|
148
|
+
backendId: SCALAR_SEARCH_ORIGIN,
|
|
149
|
+
backendVersion: 'mathts-functions',
|
|
150
|
+
capabilities: ['scalar-search'],
|
|
151
|
+
deterministic: 'seeded',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return list;
|
|
155
|
+
}
|
|
119
156
|
/**
|
|
120
157
|
* Run a bounded Product B search. Never mutates Product A catalogs.
|
|
121
158
|
*
|
|
@@ -185,6 +222,27 @@ export async function runProbeSearch(problem, opts = {}) {
|
|
|
185
222
|
}
|
|
186
223
|
}
|
|
187
224
|
}
|
|
225
|
+
if (opts.scalarSearch && !budgetStopReason(state)) {
|
|
226
|
+
const remainingMs = Math.max(1, budget.maxWallClockMs - (performance.now() - state.startedAtMs));
|
|
227
|
+
try {
|
|
228
|
+
const found = await scalarSearchCandidates(problem, opts.scalarSearch, remainingMs);
|
|
229
|
+
if (found.note !== undefined)
|
|
230
|
+
wording.push(found.note);
|
|
231
|
+
for (const raw of found.raws) {
|
|
232
|
+
if (budgetStopReason(state))
|
|
233
|
+
break;
|
|
234
|
+
if (!withinAstCaps(raw.expression, budget))
|
|
235
|
+
continue;
|
|
236
|
+
state.candidates += 1;
|
|
237
|
+
raws.push(raw);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
if (err instanceof UnsupportedScalarFunctionError)
|
|
242
|
+
throw err;
|
|
243
|
+
wording.push(`scalar search abstained: ${err instanceof Error ? err.message : String(err)}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
188
246
|
const open = openManifest({
|
|
189
247
|
runId,
|
|
190
248
|
repositoryCommit: opts.repositoryCommit ?? 'unknown',
|
|
@@ -196,24 +254,7 @@ export async function runProbeSearch(problem, opts = {}) {
|
|
|
196
254
|
tolerances: { holdoutRmse: opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL },
|
|
197
255
|
searchBudget: budget,
|
|
198
256
|
startedAt: at,
|
|
199
|
-
backendDescriptors: opts
|
|
200
|
-
? [
|
|
201
|
-
{
|
|
202
|
-
protocolVersion: '0',
|
|
203
|
-
backendId: 'native',
|
|
204
|
-
backendVersion: SCHEMA_VERSION,
|
|
205
|
-
capabilities: ['grammar-enumerator'],
|
|
206
|
-
deterministic: 'yes',
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
protocolVersion: '0',
|
|
210
|
-
backendId: opts.backendArgv.join(' '),
|
|
211
|
-
backendVersion: 'external',
|
|
212
|
-
capabilities: ['external-backend'],
|
|
213
|
-
deterministic: 'unknown',
|
|
214
|
-
},
|
|
215
|
-
]
|
|
216
|
-
: undefined,
|
|
257
|
+
backendDescriptors: backendDescriptorsFor(opts),
|
|
217
258
|
});
|
|
218
259
|
for (const raw of raws) {
|
|
219
260
|
const stop = budgetStopReason(state);
|
|
@@ -221,7 +262,9 @@ export async function runProbeSearch(problem, opts = {}) {
|
|
|
221
262
|
break;
|
|
222
263
|
const origin = raw.originNote === 'external-backend'
|
|
223
264
|
? { kind: 'external-backend', backendId: 'external', runId }
|
|
224
|
-
:
|
|
265
|
+
: raw.originNote === SCALAR_SEARCH_ORIGIN
|
|
266
|
+
? { kind: 'external-backend', backendId: SCALAR_SEARCH_ORIGIN, runId }
|
|
267
|
+
: { kind: 'grammar-enumerator', runId };
|
|
225
268
|
seq += 1;
|
|
226
269
|
let rec = makeGenerated(raw.expression, problem, runId, at, origin, seq);
|
|
227
270
|
if (seenHash.has(rec.fingerprint.canonicalAstHash))
|
|
@@ -265,7 +308,7 @@ export async function runProbeSearch(problem, opts = {}) {
|
|
|
265
308
|
}
|
|
266
309
|
rec = applyStatus(rec, 'structurally-valid', 'validate() ok', runId, at);
|
|
267
310
|
store.replace(rec);
|
|
268
|
-
const corp = compareToCorpus(bodyExpression(rec.body), corpusVersion);
|
|
311
|
+
const corp = compareToCorpus(bodyExpression(rec.body), corpusVersion, at);
|
|
269
312
|
corpus[rec.id] = corp;
|
|
270
313
|
wording.push(corpusRelativeWording(corp));
|
|
271
314
|
const known = corp.algebraicMatches.length > 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/composition/probe/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Product B search orchestrator.\n *\n * Identifiability gate → native enumerator → fingerprint dedup → corpus\n * comparison → validate → exploratory fit (never holdout) → holdout →\n * falsify → Pareto. Relation-link / regime gaps abstain (`non-identifiable`)\n * and tell the caller to use `upt discover`.\n *\n * @internal\n */\n\nimport { validate } from '../../dimensional/validator.js';\nimport { equals } from '../../dimensional/algebra.js';\nimport type {\n ProbeCandidateRecord,\n ProbeRejectionRecord,\n SearchBudget,\n SearchProblem,\n SearchStopReason,\n DiscoveryRunManifest,\n} from './types.js';\nimport { DEFAULT_HOLDOUT_TOL, DEFAULT_SEARCH_BUDGET, SCHEMA_VERSION } from './types.js';\nimport { openBudget, budgetStopReason, type BudgetState } from './search-budget.js';\nimport { generateNative, nativeDetermination, powerLawDetermination, powerLawWording, type RawCandidate } from './generator.js';\nimport { fingerprintExpr, complexityOf, bodyExpression } from './fingerprint.js';\nimport {\n compareToCorpus,\n corpusPrefactorNotes,\n corpusRelativeWording,\n type CorpusComparisonResult,\n} from './corpus.js';\nimport { fitPrefactor, type FitResult } from './fit.js';\nimport { runFalsification, type FalsifyResult } from './falsify.js';\nimport { applyStatus, ProbeCandidateStore } from './candidate-store.js';\nimport { openManifest, closeManifest } from './run-manifest.js';\nimport { hashCanonical } from './serialize.js';\nimport { scoreCandidate, rankPareto, type RankedCandidate } from './scoring.js';\nimport { runBackendWorker } from './backend-protocol.js';\n\n/** Stop wording when the problem carried no holdout rows. @internal */\nexport const NO_HOLDOUT_WORDING = 'no holdout observations: no candidate was tested on withheld data';\n\n/**\n * The argv that runs a Node script as an NDJSON worker: this process's own Node, then the script.\n * @internal\n */\nexport function nodeWorkerArgv(script: string): readonly string[] {\n return [process.execPath, script];\n}\n\nexport interface ProbeSearchOptions {\n readonly budget?: SearchBudget;\n readonly runId?: string;\n readonly repositoryCommit?: string;\n readonly holdoutTol?: number;\n readonly backendArgv?: readonly string[];\n readonly corpusVersion?: string;\n readonly now?: string;\n}\n\nexport interface ProbeSearchResult {\n readonly manifest: DiscoveryRunManifest;\n readonly candidates: readonly ProbeCandidateRecord[];\n readonly ranked: readonly RankedCandidate[];\n readonly rejections: readonly ProbeRejectionRecord[];\n readonly fits: Readonly<Record<string, FitResult>>;\n readonly falsifications: Readonly<Record<string, FalsifyResult>>;\n readonly corpus: Readonly<Record<string, CorpusComparisonResult>>;\n /**\n * For a candidate equivalent to a corpus relation, the fitted prefactor\n * against that relation's prefactor (see `corpusPrefactorNotes`).\n */\n readonly prefactorNotes: Readonly<Record<string, readonly string[]>>;\n readonly wording: readonly string[];\n readonly stopReason: SearchStopReason;\n}\n\nfunction abstain(\n problem: SearchProblem,\n opts: ProbeSearchOptions,\n reason: SearchStopReason,\n wording: readonly string[],\n): ProbeSearchResult {\n const budget = opts.budget ?? DEFAULT_SEARCH_BUDGET;\n const runId = opts.runId ?? `dr-${hashCanonical(problem.gap.id).slice(0, 12)}`;\n const open = openManifest({\n runId,\n repositoryCommit: opts.repositoryCommit ?? 'unknown',\n problem,\n searchBudget: budget,\n startedAt: opts.now,\n });\n const manifest = closeManifest(open, reason, opts.now);\n return {\n manifest,\n candidates: [],\n ranked: [],\n rejections: [],\n fits: {},\n falsifications: {},\n corpus: {},\n prefactorNotes: {},\n wording,\n stopReason: reason,\n };\n}\n\nfunction gate(problem: SearchProblem): { ok: true } | { ok: false; wording: string } {\n if (problem.gap.kind === 'relation-link' || problem.gap.kind === 'regime-transition') {\n return {\n ok: false,\n wording: `${problem.gap.kind} gaps are Product A — use \\`upt discover\\`, not \\`upt probe run\\``,\n };\n }\n if (!problem.gap.searchability.searchable) {\n return {\n ok: false,\n wording: problem.gap.searchability.reasons.join('; ') || 'gap is not searchable',\n };\n }\n if (problem.gap.identifiability.parametric?.status === 'non-identifiable') {\n return {\n ok: false,\n wording:\n problem.gap.identifiability.parametric.reasons.join('; ') || 'parametrically non-identifiable',\n };\n }\n return { ok: true };\n}\n\nfunction referencesSymbol(expr: RawCandidate['expression'], name: string): boolean {\n switch (expr.kind) {\n case 'symbol':\n return expr.name === name;\n case 'op':\n return expr.args.some((arg) => referencesSymbol(arg, name));\n case 'integral':\n return referencesSymbol(expr.over, name) || referencesSymbol(expr.integrand, name);\n case 'derivative':\n return referencesSymbol(expr.of, name) || referencesSymbol(expr.wrt, name);\n case 'transcendental':\n case 'abs':\n case 'dirac-delta':\n return referencesSymbol(expr.arg, name);\n case 'variational-derivative':\n return (\n referencesSymbol(expr.functional, name) ||\n referencesSymbol(expr.field, name) ||\n referencesSymbol(expr.over, name)\n );\n default:\n return false;\n }\n}\n\nfunction makeGenerated(\n expr: RawCandidate['expression'],\n problem: SearchProblem,\n runId: string,\n at: string,\n origin: ProbeCandidateRecord['origin'],\n seq: number,\n): ProbeCandidateRecord {\n const fp = fingerprintExpr(\n expr,\n problem.regimeSignature ?? '',\n (problem.assumptions ?? []).join('|'),\n );\n return {\n id: `h-${seq}-${fp.canonicalAstHash.slice(0, 10)}`,\n gapId: problem.gap.id,\n body: { kind: 'scalar-expr', expression: expr },\n origin,\n assumptions: problem.assumptions ?? [],\n status: 'generated',\n statusHistory: [\n { at, from: 'none', to: 'generated', reason: 'enumerator', runId },\n ],\n evaluations: [],\n fingerprint: fp,\n complexity: complexityOf(expr),\n schemaVersion: SCHEMA_VERSION,\n };\n}\n\n/**\n * Run a bounded Product B search. Never mutates Product A catalogs.\n *\n * @internal\n */\nexport async function runProbeSearch(\n problem: SearchProblem,\n opts: ProbeSearchOptions = {},\n): Promise<ProbeSearchResult> {\n const blocked = gate(problem);\n if (!blocked.ok) {\n return abstain(problem, opts, 'non-identifiable', [blocked.wording]);\n }\n\n const budget = opts.budget ?? DEFAULT_SEARCH_BUDGET;\n const state: BudgetState = openBudget(budget);\n const runId = opts.runId ?? `dr-${hashCanonical({\n gap: problem.gap.id,\n target: problem.target.name,\n governing: problem.governing.map((g) => g.name),\n }).slice(0, 12)}`;\n const at = opts.now ?? new Date().toISOString();\n const corpusVersion = opts.corpusVersion ?? SCHEMA_VERSION;\n const store = new ProbeCandidateStore();\n const fits: Record<string, FitResult> = {};\n const falsifications: Record<string, FalsifyResult> = {};\n const corpus: Record<string, CorpusComparisonResult> = {};\n const prefactorNotes: Record<string, string[]> = {};\n const wording: string[] = [];\n const seenHash = new Set<string>();\n let seq = 0;\n\n const raws: RawCandidate[] = [];\n const { unsearched } = nativeDetermination(problem);\n if (unsearched.length > 0) {\n wording.push(\n `the monomial is taken from the dimensioned inputs; an unknown function of the ` +\n `dimensionless input(s) {${unsearched.join(', ')}} is not searched as such`,\n );\n }\n // What the power-law fit over the π-groups found on the exploratory rows, or why it abstained\n // (a negative result is a result); the generator ran the same fit to emit its candidate.\n const powerLaw = hasAnyData(problem) ? powerLawDetermination(problem) : null;\n const powerLawNote = powerLaw ? powerLawWording(powerLaw) : null;\n if (powerLawNote !== null) wording.push(powerLawNote);\n for (const raw of generateNative(problem, state)) {\n raws.push(raw);\n const stop = budgetStopReason(state);\n if (stop) break;\n }\n\n if (opts.backendArgv && opts.backendArgv.length > 0 && !budgetStopReason(state)) {\n const remainingMs = Math.max(1, budget.maxWallClockMs - (performance.now() - state.startedAtMs));\n const backend = await runBackendWorker(\n opts.backendArgv,\n {\n problemId: problem.gap.id,\n budgetMs: remainingMs,\n variables: problem.governing.map((g) => g.name),\n target: problem.target.name,\n },\n { timeoutMs: remainingMs },\n );\n if (!backend.ok) {\n wording.push(`backend abstained: ${backend.error ?? 'unknown error'}`);\n } else {\n for (const c of backend.candidates) {\n if (budgetStopReason(state)) break;\n state.candidates += 1;\n raws.push({\n expression: c.expression,\n monomial: null,\n originNote: 'external-backend',\n });\n }\n }\n }\n\n const open = openManifest({\n runId,\n repositoryCommit: opts.repositoryCommit ?? 'unknown',\n problem,\n datasetHashes: [\n ...(problem.exploratory ? [hashCanonical(problem.exploratory)] : []),\n ...(problem.holdout ? [hashCanonical(problem.holdout)] : []),\n ],\n tolerances: { holdoutRmse: opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL },\n searchBudget: budget,\n startedAt: at,\n backendDescriptors: opts.backendArgv\n ? [\n {\n protocolVersion: '0',\n backendId: 'native',\n backendVersion: SCHEMA_VERSION,\n capabilities: ['grammar-enumerator'],\n deterministic: 'yes',\n },\n {\n protocolVersion: '0',\n backendId: opts.backendArgv.join(' '),\n backendVersion: 'external',\n capabilities: ['external-backend'],\n deterministic: 'unknown',\n },\n ]\n : undefined,\n });\n\n for (const raw of raws) {\n const stop = budgetStopReason(state);\n if (stop) break;\n\n const origin: ProbeCandidateRecord['origin'] = raw.originNote === 'external-backend'\n ? { kind: 'external-backend', backendId: 'external', runId }\n : { kind: 'grammar-enumerator', runId };\n seq += 1;\n let rec = makeGenerated(raw.expression, problem, runId, at, origin, seq);\n if (seenHash.has(rec.fingerprint.canonicalAstHash)) continue;\n seenHash.add(rec.fingerprint.canonicalAstHash);\n store.put(rec);\n\n const expr = bodyExpression(rec.body);\n if (referencesSymbol(expr, problem.target.name)) {\n rec = applyStatus(rec, 'rejected', `candidate reads target observable '${problem.target.name}'`, runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: `target-observable self-reference: ${problem.target.name}`,\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n\n const v = validate(expr);\n if (!v.ok || v.inferredDimension === null) {\n rec = applyStatus(rec, 'rejected', 'dimensionally invalid', runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: 'dimensionally invalid',\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n if (!equals(v.inferredDimension, problem.target.dim)) {\n rec = applyStatus(rec, 'rejected', 'candidate dimension does not match target observable', runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: 'target-dimension mismatch',\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n rec = applyStatus(rec, 'structurally-valid', 'validate() ok', runId, at);\n store.replace(rec);\n\n const corp = compareToCorpus(bodyExpression(rec.body), corpusVersion);\n corpus[rec.id] = corp;\n wording.push(corpusRelativeWording(corp));\n const known = corp.algebraicMatches.length > 0;\n const hasData = (problem.exploratory?.rows.length ?? 0) > 0;\n\n if (!hasData) {\n rec = applyStatus(\n rec,\n known ? 'equivalent-known' : 'insufficient-evidence',\n known ? corpusRelativeWording(corp) : 'no exploratory observations',\n runId,\n at,\n );\n store.replace(rec);\n continue;\n }\n\n state.evaluations += 1;\n let fit: FitResult;\n try {\n fit = fitPrefactor(\n bodyExpression(rec.body),\n problem.exploratory!,\n problem.holdout,\n opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL,\n );\n } catch (err) {\n rec = applyStatus(\n rec,\n 'rejected',\n err instanceof Error ? err.message : String(err),\n runId,\n at,\n );\n store.replace(rec);\n continue;\n }\n fits[rec.id] = fit;\n rec = applyStatus(rec, 'empirically-fit', `exploratory RMSE ${fit.exploratoryRmse}`, runId, at);\n store.replace(rec);\n\n if (!problem.holdout || problem.holdout.rows.length === 0) {\n rec = applyStatus(rec, 'insufficient-evidence', 'no holdout observations', runId, at);\n store.replace(rec);\n continue;\n }\n if (!fit.holdoutSupported) {\n rec = applyStatus(rec, 'rejected', `holdout RMSE ${fit.holdoutRmse} exceeds tolerance`, runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: `holdout RMSE ${fit.holdoutRmse}`,\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n\n rec = applyStatus(rec, 'heldout-supported', `holdout RMSE ${fit.holdoutRmse}`, runId, at);\n store.replace(rec);\n\n if (known) {\n // Equivalent up to a constant is not equal: compare the fitted constant\n // with the corpus one where the corpus records it (persona finding L7).\n prefactorNotes[rec.id] = corpusPrefactorNotes(\n corp,\n bodyExpression(rec.body),\n fit.prefactor,\n opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL,\n fit.prefactorStderr,\n );\n rec = applyStatus(rec, 'equivalent-known', corpusRelativeWording(corp), runId, at);\n store.replace(rec);\n continue;\n }\n\n const fal = runFalsification({\n expr: bodyExpression(rec.body),\n dataset: problem.holdout,\n prefactor: fit.prefactor,\n claimedRegimes: problem.claimedRegimes,\n limits: problem.limits,\n });\n falsifications[rec.id] = fal;\n if (!fal.survived) {\n rec = applyStatus(rec, 'falsified', fal.records.filter((r) => r.outcome === 'fail').map((r) => r.detail).join('; '), runId, at);\n store.replace(rec);\n continue;\n }\n rec = applyStatus(rec, 'falsification-survivor', 'all fatal batteries passed', runId, at);\n rec = applyStatus(rec, 'expert-review-required', 'survived batteries; human review required', runId, at);\n store.replace(rec);\n }\n\n const all = store.all();\n const scored = all.map((record) => {\n const fit = fits[record.id];\n const emp = fit\n ? 1 / (1 + fit.exploratoryRmse)\n : record.status === 'equivalent-known'\n ? 0.5\n : 0;\n const corp = corpus[record.id];\n const dist = corp && corp.algebraicMatches.length > 0 ? 0 : 1;\n // Robustness is read from the batteries this record ran, not from its status.\n return { record, scores: scoreCandidate(record, emp, dist, falsifications[record.id]) };\n });\n const ranked = rankPareto(scored);\n\n const budgetStop = budgetStopReason(state);\n let stopReason: SearchStopReason;\n if (budgetStop) {\n stopReason = budgetStop;\n } else if (all.length === 0) {\n stopReason = 'no-credible-candidate';\n // Say WHY (persona finding C2): \"no dimensionally valid candidates\" was\n // printed even when the real reason was a non-unique monomial.\n const { det } = nativeDetermination(problem);\n wording.push(\n det.determined\n ? 'enumerator produced no dimensionally valid candidates'\n : `the target is not a unique monomial of the inputs (${det.reason}); ` +\n 'the native enumerator searches unique monomials and, with exploratory rows, a rational power law of the π-groups',\n );\n } else if (\n hasAnyData(problem) &&\n all.every(\n (c) =>\n c.status === 'rejected' ||\n c.status === 'falsified' ||\n c.status === 'insufficient-evidence',\n )\n ) {\n stopReason = 'no-credible-candidate';\n wording.push(\n (problem.holdout?.rows.length ?? 0) > 0\n ? 'no candidate survived holdout / falsification'\n : NO_HOLDOUT_WORDING,\n );\n } else {\n stopReason = 'exhausted-space';\n }\n\n return {\n manifest: closeManifest(open, stopReason, opts.now ?? new Date().toISOString()),\n candidates: all,\n ranked,\n rejections: store.rejectionList(),\n fits,\n falsifications,\n corpus,\n prefactorNotes,\n wording,\n stopReason,\n };\n}\n\nfunction hasAnyData(problem: SearchProblem): boolean {\n return (problem.exploratory?.rows.length ?? 0) > 0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/composition/probe/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Product B search orchestrator.\n *\n * Identifiability gate → native enumerator → fingerprint dedup → corpus\n * comparison → validate → exploratory fit (never holdout) → holdout →\n * falsify → Pareto. Relation-link / regime gaps abstain (`non-identifiable`)\n * and tell the caller to use `upt discover`.\n *\n * @internal\n */\n\nimport { validate } from '../../dimensional/validator.js';\nimport { equals } from '../../dimensional/algebra.js';\nimport type {\n DiscoveryBackendDescriptor,\n ProbeCandidateRecord,\n ProbeRejectionRecord,\n SearchBudget,\n SearchProblem,\n SearchStopReason,\n DiscoveryRunManifest,\n} from './types.js';\nimport { DEFAULT_HOLDOUT_TOL, DEFAULT_SEARCH_BUDGET, SCHEMA_VERSION } from './types.js';\nimport { openBudget, budgetStopReason, type BudgetState } from './search-budget.js';\nimport {\n generateNative,\n nativeDetermination,\n powerLawDetermination,\n powerLawWording,\n withinAstCaps,\n type RawCandidate,\n} from './generator.js';\nimport { fingerprintExpr, complexityOf, bodyExpression } from './fingerprint.js';\nimport {\n compareToCorpus,\n corpusPrefactorNotes,\n corpusRelativeWording,\n type CorpusComparisonResult,\n} from './corpus.js';\nimport { fitPrefactor, type FitResult } from './fit.js';\nimport { runFalsification, type FalsifyResult } from './falsify.js';\nimport { applyStatus, ProbeCandidateStore } from './candidate-store.js';\nimport { openManifest, closeManifest } from './run-manifest.js';\nimport { hashCanonical } from './serialize.js';\nimport { scoreCandidate, rankPareto, type RankedCandidate } from './scoring.js';\nimport { runBackendWorker } from './backend-protocol.js';\nimport {\n SCALAR_SEARCH_ORIGIN,\n scalarSearchCandidates,\n UnsupportedScalarFunctionError,\n type ProbeScalarSearchOptions,\n} from './scalar-search.js';\n\n/** Stop wording when the problem carried no holdout rows. @internal */\nexport const NO_HOLDOUT_WORDING = 'no holdout observations: no candidate was tested on withheld data';\n\n/**\n * The argv that runs a Node script as an NDJSON worker: this process's own Node, then the script.\n * @internal\n */\nexport function nodeWorkerArgv(script: string): readonly string[] {\n return [process.execPath, script];\n}\n\n/** The optional settings of one probe search: budget, run id, backend and corpus version. */\nexport interface ProbeSearchOptions {\n readonly budget?: SearchBudget;\n readonly runId?: string;\n readonly repositoryCommit?: string;\n readonly holdoutTol?: number;\n readonly backendArgv?: readonly string[];\n /** Opt-in MathTS scalar-search candidate source (plan task P5). Absent: the search does not run. */\n readonly scalarSearch?: ProbeScalarSearchOptions;\n readonly corpusVersion?: string;\n readonly now?: string;\n}\n\n/** The outcome of one probe search: its manifest, candidates, rankings and stop reason. */\nexport interface ProbeSearchResult {\n readonly manifest: DiscoveryRunManifest;\n readonly candidates: readonly ProbeCandidateRecord[];\n readonly ranked: readonly RankedCandidate[];\n readonly rejections: readonly ProbeRejectionRecord[];\n readonly fits: Readonly<Record<string, FitResult>>;\n readonly falsifications: Readonly<Record<string, FalsifyResult>>;\n readonly corpus: Readonly<Record<string, CorpusComparisonResult>>;\n /**\n * For a candidate equivalent to a corpus relation, the fitted prefactor\n * against that relation's prefactor (see `corpusPrefactorNotes`).\n */\n readonly prefactorNotes: Readonly<Record<string, readonly string[]>>;\n readonly wording: readonly string[];\n readonly stopReason: SearchStopReason;\n}\n\nfunction abstain(\n problem: SearchProblem,\n opts: ProbeSearchOptions,\n reason: SearchStopReason,\n wording: readonly string[],\n): ProbeSearchResult {\n const budget = opts.budget ?? DEFAULT_SEARCH_BUDGET;\n const runId = opts.runId ?? `dr-${hashCanonical(problem.gap.id).slice(0, 12)}`;\n const open = openManifest({\n runId,\n repositoryCommit: opts.repositoryCommit ?? 'unknown',\n problem,\n searchBudget: budget,\n startedAt: opts.now,\n });\n const manifest = closeManifest(open, reason, opts.now);\n return {\n manifest,\n candidates: [],\n ranked: [],\n rejections: [],\n fits: {},\n falsifications: {},\n corpus: {},\n prefactorNotes: {},\n wording,\n stopReason: reason,\n };\n}\n\nfunction gate(problem: SearchProblem): { ok: true } | { ok: false; wording: string } {\n if (problem.gap.kind === 'relation-link' || problem.gap.kind === 'regime-transition') {\n return {\n ok: false,\n wording: `${problem.gap.kind} gaps are Product A — use \\`upt discover\\`, not \\`upt probe run\\``,\n };\n }\n if (!problem.gap.searchability.searchable) {\n return {\n ok: false,\n wording: problem.gap.searchability.reasons.join('; ') || 'gap is not searchable',\n };\n }\n if (problem.gap.identifiability.parametric?.status === 'non-identifiable') {\n return {\n ok: false,\n wording:\n problem.gap.identifiability.parametric.reasons.join('; ') || 'parametrically non-identifiable',\n };\n }\n return { ok: true };\n}\n\nfunction referencesSymbol(expr: RawCandidate['expression'], name: string): boolean {\n switch (expr.kind) {\n case 'symbol':\n return expr.name === name;\n case 'op':\n return expr.args.some((arg) => referencesSymbol(arg, name));\n case 'integral':\n return referencesSymbol(expr.over, name) || referencesSymbol(expr.integrand, name);\n case 'derivative':\n return referencesSymbol(expr.of, name) || referencesSymbol(expr.wrt, name);\n case 'transcendental':\n case 'abs':\n case 'dirac-delta':\n return referencesSymbol(expr.arg, name);\n case 'variational-derivative':\n return (\n referencesSymbol(expr.functional, name) ||\n referencesSymbol(expr.field, name) ||\n referencesSymbol(expr.over, name)\n );\n default:\n return false;\n }\n}\n\nfunction makeGenerated(\n expr: RawCandidate['expression'],\n problem: SearchProblem,\n runId: string,\n at: string,\n origin: ProbeCandidateRecord['origin'],\n seq: number,\n): ProbeCandidateRecord {\n const fp = fingerprintExpr(\n expr,\n problem.regimeSignature ?? '',\n (problem.assumptions ?? []).join('|'),\n );\n return {\n id: `h-${seq}-${fp.canonicalAstHash.slice(0, 10)}`,\n gapId: problem.gap.id,\n body: { kind: 'scalar-expr', expression: expr },\n origin,\n assumptions: problem.assumptions ?? [],\n status: 'generated',\n statusHistory: [\n { at, from: 'none', to: 'generated', reason: 'enumerator', runId },\n ],\n evaluations: [],\n fingerprint: fp,\n complexity: complexityOf(expr),\n schemaVersion: SCHEMA_VERSION,\n };\n}\n\n/**\n * The manifest's backend list: the native enumerator, then each opted-in source.\n * `undefined` when no source is opted in, so a default run's manifest is unchanged.\n */\nfunction backendDescriptorsFor(opts: ProbeSearchOptions): readonly DiscoveryBackendDescriptor[] | undefined {\n if (!opts.backendArgv && !opts.scalarSearch) return undefined;\n const list: DiscoveryBackendDescriptor[] = [\n {\n protocolVersion: '0',\n backendId: 'native',\n backendVersion: SCHEMA_VERSION,\n capabilities: ['grammar-enumerator'],\n deterministic: 'yes',\n },\n ];\n if (opts.backendArgv) {\n list.push({\n protocolVersion: '0',\n backendId: opts.backendArgv.join(' '),\n backendVersion: 'external',\n capabilities: ['external-backend'],\n deterministic: 'unknown',\n });\n }\n if (opts.scalarSearch) {\n list.push({\n protocolVersion: '0',\n backendId: SCALAR_SEARCH_ORIGIN,\n backendVersion: 'mathts-functions',\n capabilities: ['scalar-search'],\n deterministic: 'seeded',\n });\n }\n return list;\n}\n\n/**\n * Run a bounded Product B search. Never mutates Product A catalogs.\n *\n * @internal\n */\nexport async function runProbeSearch(\n problem: SearchProblem,\n opts: ProbeSearchOptions = {},\n): Promise<ProbeSearchResult> {\n const blocked = gate(problem);\n if (!blocked.ok) {\n return abstain(problem, opts, 'non-identifiable', [blocked.wording]);\n }\n\n const budget = opts.budget ?? DEFAULT_SEARCH_BUDGET;\n const state: BudgetState = openBudget(budget);\n const runId = opts.runId ?? `dr-${hashCanonical({\n gap: problem.gap.id,\n target: problem.target.name,\n governing: problem.governing.map((g) => g.name),\n }).slice(0, 12)}`;\n const at = opts.now ?? new Date().toISOString();\n const corpusVersion = opts.corpusVersion ?? SCHEMA_VERSION;\n const store = new ProbeCandidateStore();\n const fits: Record<string, FitResult> = {};\n const falsifications: Record<string, FalsifyResult> = {};\n const corpus: Record<string, CorpusComparisonResult> = {};\n const prefactorNotes: Record<string, string[]> = {};\n const wording: string[] = [];\n const seenHash = new Set<string>();\n let seq = 0;\n\n const raws: RawCandidate[] = [];\n const { unsearched } = nativeDetermination(problem);\n if (unsearched.length > 0) {\n wording.push(\n `the monomial is taken from the dimensioned inputs; an unknown function of the ` +\n `dimensionless input(s) {${unsearched.join(', ')}} is not searched as such`,\n );\n }\n // What the power-law fit over the π-groups found on the exploratory rows, or why it abstained\n // (a negative result is a result); the generator ran the same fit to emit its candidate.\n const powerLaw = hasAnyData(problem) ? powerLawDetermination(problem) : null;\n const powerLawNote = powerLaw ? powerLawWording(powerLaw) : null;\n if (powerLawNote !== null) wording.push(powerLawNote);\n for (const raw of generateNative(problem, state)) {\n raws.push(raw);\n const stop = budgetStopReason(state);\n if (stop) break;\n }\n\n if (opts.backendArgv && opts.backendArgv.length > 0 && !budgetStopReason(state)) {\n const remainingMs = Math.max(1, budget.maxWallClockMs - (performance.now() - state.startedAtMs));\n const backend = await runBackendWorker(\n opts.backendArgv,\n {\n problemId: problem.gap.id,\n budgetMs: remainingMs,\n variables: problem.governing.map((g) => g.name),\n target: problem.target.name,\n },\n { timeoutMs: remainingMs },\n );\n if (!backend.ok) {\n wording.push(`backend abstained: ${backend.error ?? 'unknown error'}`);\n } else {\n for (const c of backend.candidates) {\n if (budgetStopReason(state)) break;\n state.candidates += 1;\n raws.push({\n expression: c.expression,\n monomial: null,\n originNote: 'external-backend',\n });\n }\n }\n }\n\n if (opts.scalarSearch && !budgetStopReason(state)) {\n const remainingMs = Math.max(1, budget.maxWallClockMs - (performance.now() - state.startedAtMs));\n try {\n const found = await scalarSearchCandidates(problem, opts.scalarSearch, remainingMs);\n if (found.note !== undefined) wording.push(found.note);\n for (const raw of found.raws) {\n if (budgetStopReason(state)) break;\n if (!withinAstCaps(raw.expression, budget)) continue;\n state.candidates += 1;\n raws.push(raw);\n }\n } catch (err) {\n if (err instanceof UnsupportedScalarFunctionError) throw err;\n wording.push(`scalar search abstained: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n const open = openManifest({\n runId,\n repositoryCommit: opts.repositoryCommit ?? 'unknown',\n problem,\n datasetHashes: [\n ...(problem.exploratory ? [hashCanonical(problem.exploratory)] : []),\n ...(problem.holdout ? [hashCanonical(problem.holdout)] : []),\n ],\n tolerances: { holdoutRmse: opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL },\n searchBudget: budget,\n startedAt: at,\n backendDescriptors: backendDescriptorsFor(opts),\n });\n\n for (const raw of raws) {\n const stop = budgetStopReason(state);\n if (stop) break;\n\n const origin: ProbeCandidateRecord['origin'] = raw.originNote === 'external-backend'\n ? { kind: 'external-backend', backendId: 'external', runId }\n : raw.originNote === SCALAR_SEARCH_ORIGIN\n ? { kind: 'external-backend', backendId: SCALAR_SEARCH_ORIGIN, runId }\n : { kind: 'grammar-enumerator', runId };\n seq += 1;\n let rec = makeGenerated(raw.expression, problem, runId, at, origin, seq);\n if (seenHash.has(rec.fingerprint.canonicalAstHash)) continue;\n seenHash.add(rec.fingerprint.canonicalAstHash);\n store.put(rec);\n\n const expr = bodyExpression(rec.body);\n if (referencesSymbol(expr, problem.target.name)) {\n rec = applyStatus(rec, 'rejected', `candidate reads target observable '${problem.target.name}'`, runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: `target-observable self-reference: ${problem.target.name}`,\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n\n const v = validate(expr);\n if (!v.ok || v.inferredDimension === null) {\n rec = applyStatus(rec, 'rejected', 'dimensionally invalid', runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: 'dimensionally invalid',\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n if (!equals(v.inferredDimension, problem.target.dim)) {\n rec = applyStatus(rec, 'rejected', 'candidate dimension does not match target observable', runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: 'target-dimension mismatch',\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n rec = applyStatus(rec, 'structurally-valid', 'validate() ok', runId, at);\n store.replace(rec);\n\n const corp = compareToCorpus(bodyExpression(rec.body), corpusVersion, at);\n corpus[rec.id] = corp;\n wording.push(corpusRelativeWording(corp));\n const known = corp.algebraicMatches.length > 0;\n const hasData = (problem.exploratory?.rows.length ?? 0) > 0;\n\n if (!hasData) {\n rec = applyStatus(\n rec,\n known ? 'equivalent-known' : 'insufficient-evidence',\n known ? corpusRelativeWording(corp) : 'no exploratory observations',\n runId,\n at,\n );\n store.replace(rec);\n continue;\n }\n\n state.evaluations += 1;\n let fit: FitResult;\n try {\n fit = fitPrefactor(\n bodyExpression(rec.body),\n problem.exploratory!,\n problem.holdout,\n opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL,\n );\n } catch (err) {\n rec = applyStatus(\n rec,\n 'rejected',\n err instanceof Error ? err.message : String(err),\n runId,\n at,\n );\n store.replace(rec);\n continue;\n }\n fits[rec.id] = fit;\n rec = applyStatus(rec, 'empirically-fit', `exploratory RMSE ${fit.exploratoryRmse}`, runId, at);\n store.replace(rec);\n\n if (!problem.holdout || problem.holdout.rows.length === 0) {\n rec = applyStatus(rec, 'insufficient-evidence', 'no holdout observations', runId, at);\n store.replace(rec);\n continue;\n }\n if (!fit.holdoutSupported) {\n rec = applyStatus(rec, 'rejected', `holdout RMSE ${fit.holdoutRmse} exceeds tolerance`, runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: `holdout RMSE ${fit.holdoutRmse}`,\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n\n rec = applyStatus(rec, 'heldout-supported', `holdout RMSE ${fit.holdoutRmse}`, runId, at);\n store.replace(rec);\n\n if (known) {\n // Equivalent up to a constant is not equal: compare the fitted constant\n // with the corpus one where the corpus records it (persona finding L7).\n prefactorNotes[rec.id] = corpusPrefactorNotes(\n corp,\n bodyExpression(rec.body),\n fit.prefactor,\n opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL,\n fit.prefactorStderr,\n );\n rec = applyStatus(rec, 'equivalent-known', corpusRelativeWording(corp), runId, at);\n store.replace(rec);\n continue;\n }\n\n const fal = runFalsification({\n expr: bodyExpression(rec.body),\n dataset: problem.holdout,\n prefactor: fit.prefactor,\n claimedRegimes: problem.claimedRegimes,\n limits: problem.limits,\n });\n falsifications[rec.id] = fal;\n if (!fal.survived) {\n rec = applyStatus(rec, 'falsified', fal.records.filter((r) => r.outcome === 'fail').map((r) => r.detail).join('; '), runId, at);\n store.replace(rec);\n continue;\n }\n rec = applyStatus(rec, 'falsification-survivor', 'all fatal batteries passed', runId, at);\n rec = applyStatus(rec, 'expert-review-required', 'survived batteries; human review required', runId, at);\n store.replace(rec);\n }\n\n const all = store.all();\n const scored = all.map((record) => {\n const fit = fits[record.id];\n const emp = fit\n ? 1 / (1 + fit.exploratoryRmse)\n : record.status === 'equivalent-known'\n ? 0.5\n : 0;\n const corp = corpus[record.id];\n const dist = corp && corp.algebraicMatches.length > 0 ? 0 : 1;\n // Robustness is read from the batteries this record ran, not from its status.\n return { record, scores: scoreCandidate(record, emp, dist, falsifications[record.id]) };\n });\n const ranked = rankPareto(scored);\n\n const budgetStop = budgetStopReason(state);\n let stopReason: SearchStopReason;\n if (budgetStop) {\n stopReason = budgetStop;\n } else if (all.length === 0) {\n stopReason = 'no-credible-candidate';\n // Say WHY (persona finding C2): \"no dimensionally valid candidates\" was\n // printed even when the real reason was a non-unique monomial.\n const { det } = nativeDetermination(problem);\n wording.push(\n det.determined\n ? 'enumerator produced no dimensionally valid candidates'\n : `the target is not a unique monomial of the inputs (${det.reason}); ` +\n 'the native enumerator searches unique monomials and, with exploratory rows, a rational power law of the π-groups',\n );\n } else if (\n hasAnyData(problem) &&\n all.every(\n (c) =>\n c.status === 'rejected' ||\n c.status === 'falsified' ||\n c.status === 'insufficient-evidence',\n )\n ) {\n stopReason = 'no-credible-candidate';\n wording.push(\n (problem.holdout?.rows.length ?? 0) > 0\n ? 'no candidate survived holdout / falsification'\n : NO_HOLDOUT_WORDING,\n );\n } else {\n stopReason = 'exhausted-space';\n }\n\n return {\n manifest: closeManifest(open, stopReason, opts.now ?? new Date().toISOString()),\n candidates: all,\n ranked,\n rejections: store.rejectionList(),\n fits,\n falsifications,\n corpus,\n prefactorNotes,\n wording,\n stopReason,\n };\n}\n\nfunction hasAnyData(problem: SearchProblem): boolean {\n return (problem.exploratory?.rows.length ?? 0) > 0;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-law.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/power-law.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"power-law.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/power-law.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
*
|
|
18
18
|
* @internal
|
|
19
19
|
*/
|
|
20
|
-
import { matrixRank, ols } from '@danielsimonjr/mathts-functions';
|
|
20
|
+
import { gcd, matrixRank, ols } from '@danielsimonjr/mathts-functions';
|
|
21
|
+
import { numberFrom } from '../../core/mathts-read.js';
|
|
21
22
|
import { buckinghamPi, dimensionallyDetermines } from '../../dimensional/buckingham.js';
|
|
22
23
|
/** The largest denominator the exponent scan admits. @internal */
|
|
23
24
|
export const MAX_EXPONENT_DENOMINATOR = 6;
|
|
@@ -34,7 +35,7 @@ export function rationalCandidates(x, tol, maxDen = MAX_EXPONENT_DENOMINATOR) {
|
|
|
34
35
|
const lo = Math.ceil((x - tol) * d);
|
|
35
36
|
const hi = Math.floor((x + tol) * d);
|
|
36
37
|
for (let n = lo; n <= hi; n++) {
|
|
37
|
-
const g = gcd(Math.abs(n), d);
|
|
38
|
+
const g = numberFrom('gcd', gcd(Math.abs(n), d));
|
|
38
39
|
const r = { numerator: n / g, denominator: d / g };
|
|
39
40
|
if (!out.some((o) => o.numerator === r.numerator && o.denominator === r.denominator))
|
|
40
41
|
out.push(r);
|
|
@@ -51,11 +52,6 @@ export function rationalizeExponent(x, tol, maxDen = MAX_EXPONENT_DENOMINATOR) {
|
|
|
51
52
|
const all = rationalCandidates(x, tol, maxDen);
|
|
52
53
|
return all.length === 1 ? all[0] : null;
|
|
53
54
|
}
|
|
54
|
-
function gcd(a, b) {
|
|
55
|
-
while (b !== 0)
|
|
56
|
-
[a, b] = [b, a % b];
|
|
57
|
-
return a === 0 ? 1 : a;
|
|
58
|
-
}
|
|
59
55
|
/**
|
|
60
56
|
* The π-groups among the governing variables (MathTS `rationalNullspace`
|
|
61
57
|
* through {@link buckinghamPi}) and the base monomial: the unique monomial of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-law.js","sourceRoot":"","sources":["../../../src/composition/probe/power-law.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Power-law discovery over the Buckingham π-groups (proposal 8 of\n * docs/planning/2026-10-15-map-maker-discoverer-proposals.md).\n *\n * When the governing variables leave k ≥ 1 dimensionless groups, dimensional\n * analysis fixes the target only as `base · F(π₁, …, πₖ)` for an unknown F.\n * This module fits the one family a monomial search can state, F = C Π πₖ^{aₖ}:\n * `log(y/base) = log C + Σ aₖ log πₖ` by MathTS `ols` on the exploratory rows,\n * reads the coefficients and their standard errors back, and rationalises each\n * aₖ that lies within 2·stderr of a fraction with denominator ≤ 6 (a bounded\n * scan, not `Fraction.fromNumber`, whose continued fraction can exceed its\n * cap). An exponent that is not such a fraction is a NEGATIVE RESULT stated in\n * the abstention, not a candidate with a decimal exponent.\n *\n * The fit reads `problem.exploratory` only: the holdout rows are never seen\n * here, exactly as `fit.ts` never fits them.\n *\n * @internal\n */\n\nimport { matrixRank, ols } from '@danielsimonjr/mathts-functions';\nimport { buckinghamPi, dimensionallyDetermines, type PiGroup } from '../../dimensional/buckingham.js';\nimport type { DimensionalVariableRef, ObservationRow, SearchProblem } from './types.js';\n\n/** One fitted π-group exponent: the estimate, its standard error, the 2σ interval and the fraction chosen in it. @internal */\nexport interface PowerLawExponent {\n /** The π-group's display form, e.g. `a · b^-1`. */\n readonly group: string;\n /** The π-group's integer exponent per variable. */\n readonly exponents: Readonly<Record<string, number>>;\n readonly estimate: number;\n readonly stderr: number;\n /** estimate ± 2·stderr. */\n readonly interval: readonly [number, number];\n /** The fraction with the smallest denominator ≤ 6 inside the interval; null when there is none. */\n readonly rational: { readonly numerator: number; readonly denominator: number } | null;\n}\n\n/** A recovered rational power law: `monomial` is base + Σ (pₖ/qₖ)·πₖ per variable. @internal */\nexport interface PowerLawFit {\n readonly kind: 'fit';\n /** The base monomial of the target over a maximal dimensionally independent subset of the governing set. */\n readonly base: Readonly<Record<string, number>>;\n readonly exponents: readonly PowerLawExponent[];\n /** log C of the fit (the prefactor is refit on the linear scale by the pipeline, like any candidate's). */\n readonly logPrefactor: number;\n readonly r2: number;\n /** Rows the fit used: a positive finite observation, base and every π. */\n readonly nRows: number;\n readonly skippedRows: number;\n /** The combined exponent per governing variable, rational values as numbers. */\n readonly monomial: Readonly<Record<string, number>>;\n}\n\n/** The outcome of {@link powerLawDetermination}. @internal */\nexport type PowerLawDetermination =\n | PowerLawFit\n | { readonly kind: 'not-applicable'; readonly reason: string }\n | { readonly kind: 'abstained'; readonly reason: string; readonly nRows: number; readonly skippedRows: number };\n\n/** The largest denominator the exponent scan admits. @internal */\nexport const MAX_EXPONENT_DENOMINATOR = 6;\n\n/** A reduced fraction. @internal */\nexport interface Rational {\n readonly numerator: number;\n readonly denominator: number;\n}\n\n/**\n * Every distinct reduced fraction p/q with q ≤ `maxDen` within `tol` of `x`,\n * in order of denominator (so 1/2 comes before 2/3). Empty when none is near;\n * more than one when the tolerance is too wide to tell them apart. @internal\n */\nexport function rationalCandidates(x: number, tol: number, maxDen = MAX_EXPONENT_DENOMINATOR): Rational[] {\n if (!Number.isFinite(x) || !(tol >= 0)) return [];\n const out: Rational[] = [];\n for (let d = 1; d <= maxDen; d++) {\n const lo = Math.ceil((x - tol) * d);\n const hi = Math.floor((x + tol) * d);\n for (let n = lo; n <= hi; n++) {\n const g = gcd(Math.abs(n), d);\n const r = { numerator: n / g, denominator: d / g };\n if (!out.some((o) => o.numerator === r.numerator && o.denominator === r.denominator)) out.push(r);\n }\n }\n return out;\n}\n\n/**\n * The one fraction p/q with q ≤ `maxDen` within `tol` of `x`, or null when\n * there is none or more than one (an estimate whose interval holds two\n * admissible fractions does not determine either). @internal\n */\nexport function rationalizeExponent(x: number, tol: number, maxDen = MAX_EXPONENT_DENOMINATOR): Rational | null {\n const all = rationalCandidates(x, tol, maxDen);\n return all.length === 1 ? all[0]! : null;\n}\n\nfunction gcd(a: number, b: number): number {\n while (b !== 0) [a, b] = [b, a % b];\n return a === 0 ? 1 : a;\n}\n\n/** The π-groups of the governing set and the target's base monomial over a maximal dimensionally independent subset. @internal */\nexport interface PiStructure {\n readonly groups: readonly PiGroup[];\n /** Null when the target's dimension is not in the span of the governing variables. */\n readonly base: Readonly<Record<string, number>> | null;\n}\n\n/**\n * The π-groups among the governing variables (MathTS `rationalNullspace`\n * through {@link buckinghamPi}) and the base monomial: the unique monomial of\n * the target over the first maximal dimensionally independent subset of the\n * governing set, in declared order. @internal\n */\nexport function piStructure(target: DimensionalVariableRef, governing: readonly DimensionalVariableRef[]): PiStructure {\n if (governing.length === 0) return { groups: [], base: null };\n const groups = buckinghamPi(governing).piGroups;\n const independent: DimensionalVariableRef[] = [];\n for (const g of governing) {\n if (buckinghamPi([...independent, g]).piGroupCount === 0) independent.push(g);\n }\n const det = dimensionallyDetermines(target, independent);\n const base: Record<string, number> = {};\n if (det.determined && det.monomial) {\n for (const g of governing) base[g.name] = det.monomial[g.name] ?? 0;\n return { groups, base };\n }\n return { groups, base: null };\n}\n\n/** `Π row[name]^exp` over the non-zero exponents; NaN when a name is missing. */\nfunction monomialValue(exponents: Readonly<Record<string, number>>, row: ObservationRow): number {\n let v = 1;\n for (const [name, e] of Object.entries(exponents)) {\n if (e === 0) continue;\n const x = row[name];\n if (x === undefined) return NaN;\n v *= x ** e;\n }\n return v;\n}\n\n/** The log-design of a set of rows: `[1, log π₁, …, log πₖ]` per usable row. @internal */\nexport interface LogDesign {\n readonly rows: readonly (readonly number[])[];\n /** Rows where every π-group is positive and finite. */\n readonly used: number;\n readonly skipped: number;\n}\n\n/** The log-design matrix over the rows where every π-group is positive and finite. @internal */\nexport function logDesign(groups: readonly PiGroup[], rows: readonly ObservationRow[]): LogDesign {\n const out: number[][] = [];\n let skipped = 0;\n for (const row of rows) {\n const pis = groups.map((g) => monomialValue(g.exponents, row));\n if (!pis.every((p) => Number.isFinite(p) && p > 0)) {\n skipped += 1;\n continue;\n }\n out.push([1, ...pis.map((p) => Math.log(p))]);\n }\n return { rows: out, used: out.length, skipped };\n}\n\n/** Each column divided by its largest magnitude (a zero column stays zero): order one, as `ols` and `matrixRank` need. */\nfunction scaleColumns(rows: readonly (readonly number[])[]): { scaled: number[][]; scales: number[] } {\n const k = rows[0]?.length ?? 0;\n const scales = Array.from({ length: k }, (_, j) => rows.reduce((m, r) => Math.max(m, Math.abs(r[j]!)), 0));\n const scaled = rows.map((r) => r.map((v, j) => (scales[j]! > 0 ? v / scales[j]! : 0)));\n return { scaled, scales };\n}\n\n/**\n * The rank of a log-design (MathTS `matrixRank`, whose tolerance is an absolute\n * 1e-10, so the columns are scaled to order one first). 0 for no rows. @internal\n */\nexport function logDesignRank(design: LogDesign): number {\n if (design.rows.length === 0) return 0;\n const { scaled } = scaleColumns(design.rows);\n const r: unknown = matrixRank(scaled);\n if (typeof r !== 'number' || !Number.isInteger(r)) throw new TypeError('matrixRank did not return an integer');\n return r;\n}\n\n/** A finite number read back from a MathTS result array, or null. */\nfunction numberAt(arr: unknown, i: number): number | null {\n if (!Array.isArray(arr)) return null;\n const v: unknown = arr[i];\n return typeof v === 'number' && Number.isFinite(v) ? v : null;\n}\n\n/**\n * Fit `log(y/base) = log C + Σ aₖ log πₖ` on the exploratory rows and\n * rationalise the exponents (module docs). Not applicable when the governing\n * set already fixes the target (the unique-monomial path searches that), when\n * it leaves no π-group, or when the target is outside its span. Abstains, with\n * the reason, without exploratory rows, below k + 2 usable rows, when a\n * π-group does not vary, when the log-design is collinear, or when an exponent\n * is not within 2σ of a fraction with denominator ≤ 6. @internal\n */\nexport function powerLawDetermination(problem: SearchProblem): PowerLawDetermination {\n const full = dimensionallyDetermines(problem.target, problem.governing);\n if (full.determined) {\n return { kind: 'not-applicable', reason: 'the governing set fixes the target up to a constant; the unique-monomial path searches it' };\n }\n const { groups, base } = piStructure(problem.target, problem.governing);\n if (groups.length === 0) {\n return { kind: 'not-applicable', reason: 'the governing set leaves no dimensionless group to raise to a power' };\n }\n if (base === null) {\n return { kind: 'not-applicable', reason: \"the target's dimension is not in the span of the governing variables\" };\n }\n const rows = problem.exploratory?.rows ?? [];\n if (rows.length === 0) {\n return { kind: 'abstained', reason: 'no exploratory rows: the power-law fit needs data', nRows: 0, skippedRows: 0 };\n }\n const k = groups.length;\n const X: number[][] = [];\n const ylog: number[] = [];\n let skipped = 0;\n for (const row of rows) {\n const y = row[problem.target.name];\n const b = monomialValue(base, row);\n const pis = groups.map((g) => monomialValue(g.exponents, row));\n if (!(y !== undefined && Number.isFinite(y) && y > 0 && Number.isFinite(b) && b > 0) || !pis.every((p) => Number.isFinite(p) && p > 0)) {\n skipped += 1;\n continue;\n }\n X.push(pis.map((p) => Math.log(p)));\n ylog.push(Math.log(y / b));\n }\n const used = X.length;\n const abstain = (reason: string): PowerLawDetermination => ({ kind: 'abstained', reason, nRows: used, skippedRows: skipped });\n if (used < k + 2) {\n return abstain(`only ${used} usable row(s) (positive observation, base and π-groups) for ${k} exponent(s) and a prefactor; the fit needs at least ${k + 2}`);\n }\n // A π-group whose log spreads by no more than round-off (1e-12 of its magnitude, or absolute)\n // does not vary: a/b with b = a is 1 up to an ulp, and that ulp is not an exponent's evidence.\n for (let j = 0; j < k; j++) {\n // Reductions, not spreads: a spread of a large row set overflows the call stack.\n const lo = X.reduce((m, r) => Math.min(m, r[j]!), Number.POSITIVE_INFINITY);\n const hi = X.reduce((m, r) => Math.max(m, r[j]!), Number.NEGATIVE_INFINITY);\n if (hi - lo <= 1e-12 * Math.max(1, Math.abs(hi), Math.abs(lo))) {\n return abstain(`π-group ${groups[j]!.formula} does not vary over the usable rows, so its exponent is not identifiable`);\n }\n }\n // Columns scaled to order one. History: before @danielsimonjr/mathts-functions 0.68.4, `ols`\n // tested singularity with an absolute 1e-15, so a column of log π of magnitude 1e-9 read as\n // collinear unscaled. From 0.68.4 (installed) `ols` equilibrates the design itself, and an\n // unscaled 1e-9 column fits without throwing. The scaling stays, because it also conditions\n // `matrixRank` (logDesignRank, which scales the same way). Coefficients and errors are unscaled after.\n const { scaled, scales } = scaleColumns(X);\n let fit;\n try {\n fit = ols(scaled, ylog, { intercept: true });\n } catch (e) {\n return abstain(`the log-design is collinear over the rows (${(e as Error).message}); the exponents are not identifiable`);\n }\n const logPrefactor = numberAt(fit.coefficients, 0);\n const r2 = typeof fit.r2 === 'number' && Number.isFinite(fit.r2) ? fit.r2 : null;\n if (logPrefactor === null || r2 === null) return abstain('ols did not return a finite intercept and R²');\n const exponents: PowerLawExponent[] = [];\n for (let j = 0; j < k; j++) {\n const c = numberAt(fit.coefficients, j + 1);\n const se = numberAt(fit.stderr, j + 1);\n if (c === null || se === null) return abstain(`ols did not return a finite coefficient and standard error for π-group ${groups[j]!.formula}`);\n const estimate = c / scales[j]!;\n const stderr = se / scales[j]!;\n // Noise-free rows give stderr 0; a representation tolerance keeps 0.5000000000000001 at 1/2.\n const tol = Math.max(2 * stderr, 1e-9 * Math.max(1, Math.abs(estimate)));\n const near = rationalCandidates(estimate, tol);\n const rational = near.length === 1 ? near[0]! : null;\n const group = groups[j]!;\n exponents.push({ group: group.formula, exponents: group.exponents, estimate, stderr, interval: [estimate - 2 * stderr, estimate + 2 * stderr], rational });\n const value = `${estimate.toPrecision(4)} ± ${stderr.toPrecision(2)}`;\n if (near.length === 0) {\n return abstain(`the exponent of ${group.formula} is ${value}, not within 2σ of a fraction with denominator ≤ ${MAX_EXPONENT_DENOMINATOR}`);\n }\n if (near.length > 1) {\n const list = near.slice(0, 4).map((r) => (r.denominator === 1 ? `${r.numerator}` : `${r.numerator}/${r.denominator}`)).join(', ');\n return abstain(\n `the exponent of ${group.formula} is ${value}: its 2σ interval holds ${near.length} fractions with denominator ≤ ${MAX_EXPONENT_DENOMINATOR} (${list}${near.length > 4 ? ', …' : ''}), so the rows do not determine it`,\n );\n }\n }\n const monomial: Record<string, number> = { ...base };\n for (const e of exponents) {\n const a = e.rational!.numerator / e.rational!.denominator;\n for (const [name, p] of Object.entries(e.exponents)) monomial[name] = (monomial[name] ?? 0) + a * p;\n }\n return { kind: 'fit', base, exponents, logPrefactor, r2, nRows: used, skippedRows: skipped, monomial };\n}\n\n/** One line for a run's wording: what the power-law fit found or why it abstained. @internal */\nexport function powerLawWording(pl: PowerLawDetermination): string | null {\n if (pl.kind === 'not-applicable') return null;\n if (pl.kind === 'abstained') return `no power law from the exploratory rows: ${pl.reason}`;\n const terms = pl.exponents\n .map((e) => {\n const { numerator: p, denominator: q } = e.rational!;\n const frac = q === 1 ? `${p}` : `${p}/${q}`;\n return `(${e.group})^(${frac}) [a = ${e.estimate.toPrecision(3)} ± ${e.stderr.toPrecision(2)}]`;\n })\n .join(' · ');\n return `power law from the exploratory rows: base · ${terms}; R² = ${pl.r2.toPrecision(4)} on ${pl.nRows} row(s)${pl.skippedRows > 0 ? ` (${pl.skippedRows} skipped: non-positive)` : ''}; each exponent is the fraction with denominator ≤ ${MAX_EXPONENT_DENOMINATOR} within 2σ of the fit`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"power-law.js","sourceRoot":"","sources":["../../../src/composition/probe/power-law.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAgB,MAAM,iCAAiC,CAAC;AAuCtG,kEAAkE;AAClE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAQ1C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAS,EAAE,GAAW,EAAE,MAAM,GAAG,wBAAwB;IAC1F,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClD,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,GAAW,EAAE,MAAM,GAAG,wBAAwB;IAC3F,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,MAA8B,EAAE,SAA4C;IACtG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC;IAChD,MAAM,WAAW,GAA6B,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,YAAY,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,GAAG,GAAG,uBAAuB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,iFAAiF;AACjF,SAAS,aAAa,CAAC,SAA2C,EAAE,GAAmB;IACrF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAUD,gGAAgG;AAChG,MAAM,UAAU,SAAS,CAAC,MAA0B,EAAE,IAA+B;IACnF,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC,CAAC;YACb,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC;AAED,0HAA0H;AAC1H,SAAS,YAAY,CAAC,IAAoC;IACxD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3G,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAY,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IAC/G,OAAO,CAAC,CAAC;AACX,CAAC;AAED,qEAAqE;AACrE,SAAS,QAAQ,CAAC,GAAY,EAAE,CAAS;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,CAAC,GAAY,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAsB;IAC1D,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,2FAA2F,EAAE,CAAC;IACzI,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,qEAAqE,EAAE,CAAC;IACnH,CAAC;IACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,sEAAsE,EAAE,CAAC;IACpH,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;IAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,mDAAmD,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACtH,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,CAAC,GAAe,EAAE,CAAC;IACzB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACvI,OAAO,IAAI,CAAC,CAAC;YACb,SAAS;QACX,CAAC;QACD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,MAAM,OAAO,GAAG,CAAC,MAAc,EAAyB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9H,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC,QAAQ,IAAI,gEAAgE,CAAC,wDAAwD,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/J,CAAC;IACD,8FAA8F;IAC9F,+FAA+F;IAC/F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,iFAAiF;QACjF,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC5E,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC5E,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/D,OAAO,OAAO,CAAC,WAAW,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,0EAA0E,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC;IACD,6FAA6F;IAC7F,4FAA4F;IAC5F,2FAA2F;IAC3F,4FAA4F;IAC5F,uGAAuG;IACvG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,OAAO,CAAC,8CAA+C,CAAW,CAAC,OAAO,uCAAuC,CAAC,CAAC;IAC5H,CAAC;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjF,IAAI,YAAY,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC,8CAA8C,CAAC,CAAC;IACzG,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC,0EAA0E,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9I,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QAChC,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QAC/B,6FAA6F;QAC7F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACzB,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,QAAQ,GAAG,CAAC,GAAG,MAAM,EAAE,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3J,MAAM,KAAK,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC,mBAAmB,KAAK,CAAC,OAAO,OAAO,KAAK,oDAAoD,wBAAwB,EAAE,CAAC,CAAC;QAC7I,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClI,OAAO,OAAO,CACZ,mBAAmB,KAAK,CAAC,OAAO,OAAO,KAAK,2BAA2B,IAAI,CAAC,MAAM,iCAAiC,wBAAwB,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,oCAAoC,CACxN,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAA2B,EAAE,GAAG,IAAI,EAAE,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,QAAS,CAAC,SAAS,GAAG,CAAC,CAAC,QAAS,CAAC,WAAW,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACzG,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,eAAe,CAAC,EAAyB;IACvD,IAAI,EAAE,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,2CAA2C,EAAE,CAAC,MAAM,EAAE,CAAC;IAC3F,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,QAAS,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,CAAC,KAAK,MAAM,IAAI,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;IAClG,CAAC,CAAC;SACD,IAAI,CAAC,KAAK,CAAC,CAAC;IACf,OAAO,+CAA+C,KAAK,UAAU,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,UAAU,EAAE,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,WAAW,yBAAyB,CAAC,CAAC,CAAC,EAAE,sDAAsD,wBAAwB,uBAAuB,CAAC;AAChS,CAAC","sourcesContent":["/**\n * Power-law discovery over the Buckingham π-groups (proposal 8 of\n * docs/planning/2026-10-15-map-maker-discoverer-proposals.md).\n *\n * When the governing variables leave k ≥ 1 dimensionless groups, dimensional\n * analysis fixes the target only as `base · F(π₁, …, πₖ)` for an unknown F.\n * This module fits the one family a monomial search can state, F = C Π πₖ^{aₖ}:\n * `log(y/base) = log C + Σ aₖ log πₖ` by MathTS `ols` on the exploratory rows,\n * reads the coefficients and their standard errors back, and rationalises each\n * aₖ that lies within 2·stderr of a fraction with denominator ≤ 6 (a bounded\n * scan, not `Fraction.fromNumber`, whose continued fraction can exceed its\n * cap). An exponent that is not such a fraction is a NEGATIVE RESULT stated in\n * the abstention, not a candidate with a decimal exponent.\n *\n * The fit reads `problem.exploratory` only: the holdout rows are never seen\n * here, exactly as `fit.ts` never fits them.\n *\n * @internal\n */\n\nimport { gcd, matrixRank, ols } from '@danielsimonjr/mathts-functions';\nimport { numberFrom } from '../../core/mathts-read.js';\nimport { buckinghamPi, dimensionallyDetermines, type PiGroup } from '../../dimensional/buckingham.js';\nimport type { DimensionalVariableRef, ObservationRow, SearchProblem } from './types.js';\n\n/** One fitted π-group exponent: the estimate, its standard error, the 2σ interval and the fraction chosen in it. @internal */\nexport interface PowerLawExponent {\n /** The π-group's display form, e.g. `a · b^-1`. */\n readonly group: string;\n /** The π-group's integer exponent per variable. */\n readonly exponents: Readonly<Record<string, number>>;\n readonly estimate: number;\n readonly stderr: number;\n /** estimate ± 2·stderr. */\n readonly interval: readonly [number, number];\n /** The fraction with the smallest denominator ≤ 6 inside the interval; null when there is none. */\n readonly rational: { readonly numerator: number; readonly denominator: number } | null;\n}\n\n/** A recovered rational power law: `monomial` is base + Σ (pₖ/qₖ)·πₖ per variable. @internal */\nexport interface PowerLawFit {\n readonly kind: 'fit';\n /** The base monomial of the target over a maximal dimensionally independent subset of the governing set. */\n readonly base: Readonly<Record<string, number>>;\n readonly exponents: readonly PowerLawExponent[];\n /** log C of the fit (the prefactor is refit on the linear scale by the pipeline, like any candidate's). */\n readonly logPrefactor: number;\n readonly r2: number;\n /** Rows the fit used: a positive finite observation, base and every π. */\n readonly nRows: number;\n readonly skippedRows: number;\n /** The combined exponent per governing variable, rational values as numbers. */\n readonly monomial: Readonly<Record<string, number>>;\n}\n\n/** The outcome of {@link powerLawDetermination}. @internal */\nexport type PowerLawDetermination =\n | PowerLawFit\n | { readonly kind: 'not-applicable'; readonly reason: string }\n | { readonly kind: 'abstained'; readonly reason: string; readonly nRows: number; readonly skippedRows: number };\n\n/** The largest denominator the exponent scan admits. @internal */\nexport const MAX_EXPONENT_DENOMINATOR = 6;\n\n/** A reduced fraction. @internal */\nexport interface Rational {\n readonly numerator: number;\n readonly denominator: number;\n}\n\n/**\n * Every distinct reduced fraction p/q with q ≤ `maxDen` within `tol` of `x`,\n * in order of denominator (so 1/2 comes before 2/3). Empty when none is near;\n * more than one when the tolerance is too wide to tell them apart. @internal\n */\nexport function rationalCandidates(x: number, tol: number, maxDen = MAX_EXPONENT_DENOMINATOR): Rational[] {\n if (!Number.isFinite(x) || !(tol >= 0)) return [];\n const out: Rational[] = [];\n for (let d = 1; d <= maxDen; d++) {\n const lo = Math.ceil((x - tol) * d);\n const hi = Math.floor((x + tol) * d);\n for (let n = lo; n <= hi; n++) {\n const g = numberFrom('gcd', gcd(Math.abs(n), d));\n const r = { numerator: n / g, denominator: d / g };\n if (!out.some((o) => o.numerator === r.numerator && o.denominator === r.denominator)) out.push(r);\n }\n }\n return out;\n}\n\n/**\n * The one fraction p/q with q ≤ `maxDen` within `tol` of `x`, or null when\n * there is none or more than one (an estimate whose interval holds two\n * admissible fractions does not determine either). @internal\n */\nexport function rationalizeExponent(x: number, tol: number, maxDen = MAX_EXPONENT_DENOMINATOR): Rational | null {\n const all = rationalCandidates(x, tol, maxDen);\n return all.length === 1 ? all[0]! : null;\n}\n\n/** The π-groups of the governing set and the target's base monomial over a maximal dimensionally independent subset. @internal */\nexport interface PiStructure {\n readonly groups: readonly PiGroup[];\n /** Null when the target's dimension is not in the span of the governing variables. */\n readonly base: Readonly<Record<string, number>> | null;\n}\n\n/**\n * The π-groups among the governing variables (MathTS `rationalNullspace`\n * through {@link buckinghamPi}) and the base monomial: the unique monomial of\n * the target over the first maximal dimensionally independent subset of the\n * governing set, in declared order. @internal\n */\nexport function piStructure(target: DimensionalVariableRef, governing: readonly DimensionalVariableRef[]): PiStructure {\n if (governing.length === 0) return { groups: [], base: null };\n const groups = buckinghamPi(governing).piGroups;\n const independent: DimensionalVariableRef[] = [];\n for (const g of governing) {\n if (buckinghamPi([...independent, g]).piGroupCount === 0) independent.push(g);\n }\n const det = dimensionallyDetermines(target, independent);\n const base: Record<string, number> = {};\n if (det.determined && det.monomial) {\n for (const g of governing) base[g.name] = det.monomial[g.name] ?? 0;\n return { groups, base };\n }\n return { groups, base: null };\n}\n\n/** `Π row[name]^exp` over the non-zero exponents; NaN when a name is missing. */\nfunction monomialValue(exponents: Readonly<Record<string, number>>, row: ObservationRow): number {\n let v = 1;\n for (const [name, e] of Object.entries(exponents)) {\n if (e === 0) continue;\n const x = row[name];\n if (x === undefined) return NaN;\n v *= x ** e;\n }\n return v;\n}\n\n/** The log-design of a set of rows: `[1, log π₁, …, log πₖ]` per usable row. @internal */\nexport interface LogDesign {\n readonly rows: readonly (readonly number[])[];\n /** Rows where every π-group is positive and finite. */\n readonly used: number;\n readonly skipped: number;\n}\n\n/** The log-design matrix over the rows where every π-group is positive and finite. @internal */\nexport function logDesign(groups: readonly PiGroup[], rows: readonly ObservationRow[]): LogDesign {\n const out: number[][] = [];\n let skipped = 0;\n for (const row of rows) {\n const pis = groups.map((g) => monomialValue(g.exponents, row));\n if (!pis.every((p) => Number.isFinite(p) && p > 0)) {\n skipped += 1;\n continue;\n }\n out.push([1, ...pis.map((p) => Math.log(p))]);\n }\n return { rows: out, used: out.length, skipped };\n}\n\n/** Each column divided by its largest magnitude (a zero column stays zero): order one, as `ols` and `matrixRank` need. */\nfunction scaleColumns(rows: readonly (readonly number[])[]): { scaled: number[][]; scales: number[] } {\n const k = rows[0]?.length ?? 0;\n const scales = Array.from({ length: k }, (_, j) => rows.reduce((m, r) => Math.max(m, Math.abs(r[j]!)), 0));\n const scaled = rows.map((r) => r.map((v, j) => (scales[j]! > 0 ? v / scales[j]! : 0)));\n return { scaled, scales };\n}\n\n/**\n * The rank of a log-design (MathTS `matrixRank`, whose tolerance is an absolute\n * 1e-10, so the columns are scaled to order one first). 0 for no rows. @internal\n */\nexport function logDesignRank(design: LogDesign): number {\n if (design.rows.length === 0) return 0;\n const { scaled } = scaleColumns(design.rows);\n const r: unknown = matrixRank(scaled);\n if (typeof r !== 'number' || !Number.isInteger(r)) throw new TypeError('matrixRank did not return an integer');\n return r;\n}\n\n/** A finite number read back from a MathTS result array, or null. */\nfunction numberAt(arr: unknown, i: number): number | null {\n if (!Array.isArray(arr)) return null;\n const v: unknown = arr[i];\n return typeof v === 'number' && Number.isFinite(v) ? v : null;\n}\n\n/**\n * Fit `log(y/base) = log C + Σ aₖ log πₖ` on the exploratory rows and\n * rationalise the exponents (module docs). Not applicable when the governing\n * set already fixes the target (the unique-monomial path searches that), when\n * it leaves no π-group, or when the target is outside its span. Abstains, with\n * the reason, without exploratory rows, below k + 2 usable rows, when a\n * π-group does not vary, when the log-design is collinear, or when an exponent\n * is not within 2σ of a fraction with denominator ≤ 6. @internal\n */\nexport function powerLawDetermination(problem: SearchProblem): PowerLawDetermination {\n const full = dimensionallyDetermines(problem.target, problem.governing);\n if (full.determined) {\n return { kind: 'not-applicable', reason: 'the governing set fixes the target up to a constant; the unique-monomial path searches it' };\n }\n const { groups, base } = piStructure(problem.target, problem.governing);\n if (groups.length === 0) {\n return { kind: 'not-applicable', reason: 'the governing set leaves no dimensionless group to raise to a power' };\n }\n if (base === null) {\n return { kind: 'not-applicable', reason: \"the target's dimension is not in the span of the governing variables\" };\n }\n const rows = problem.exploratory?.rows ?? [];\n if (rows.length === 0) {\n return { kind: 'abstained', reason: 'no exploratory rows: the power-law fit needs data', nRows: 0, skippedRows: 0 };\n }\n const k = groups.length;\n const X: number[][] = [];\n const ylog: number[] = [];\n let skipped = 0;\n for (const row of rows) {\n const y = row[problem.target.name];\n const b = monomialValue(base, row);\n const pis = groups.map((g) => monomialValue(g.exponents, row));\n if (!(y !== undefined && Number.isFinite(y) && y > 0 && Number.isFinite(b) && b > 0) || !pis.every((p) => Number.isFinite(p) && p > 0)) {\n skipped += 1;\n continue;\n }\n X.push(pis.map((p) => Math.log(p)));\n ylog.push(Math.log(y / b));\n }\n const used = X.length;\n const abstain = (reason: string): PowerLawDetermination => ({ kind: 'abstained', reason, nRows: used, skippedRows: skipped });\n if (used < k + 2) {\n return abstain(`only ${used} usable row(s) (positive observation, base and π-groups) for ${k} exponent(s) and a prefactor; the fit needs at least ${k + 2}`);\n }\n // A π-group whose log spreads by no more than round-off (1e-12 of its magnitude, or absolute)\n // does not vary: a/b with b = a is 1 up to an ulp, and that ulp is not an exponent's evidence.\n for (let j = 0; j < k; j++) {\n // Reductions, not spreads: a spread of a large row set overflows the call stack.\n const lo = X.reduce((m, r) => Math.min(m, r[j]!), Number.POSITIVE_INFINITY);\n const hi = X.reduce((m, r) => Math.max(m, r[j]!), Number.NEGATIVE_INFINITY);\n if (hi - lo <= 1e-12 * Math.max(1, Math.abs(hi), Math.abs(lo))) {\n return abstain(`π-group ${groups[j]!.formula} does not vary over the usable rows, so its exponent is not identifiable`);\n }\n }\n // Columns scaled to order one. History: before @danielsimonjr/mathts-functions 0.68.4, `ols`\n // tested singularity with an absolute 1e-15, so a column of log π of magnitude 1e-9 read as\n // collinear unscaled. From 0.68.4 (installed) `ols` equilibrates the design itself, and an\n // unscaled 1e-9 column fits without throwing. The scaling stays, because it also conditions\n // `matrixRank` (logDesignRank, which scales the same way). Coefficients and errors are unscaled after.\n const { scaled, scales } = scaleColumns(X);\n let fit;\n try {\n fit = ols(scaled, ylog, { intercept: true });\n } catch (e) {\n return abstain(`the log-design is collinear over the rows (${(e as Error).message}); the exponents are not identifiable`);\n }\n const logPrefactor = numberAt(fit.coefficients, 0);\n const r2 = typeof fit.r2 === 'number' && Number.isFinite(fit.r2) ? fit.r2 : null;\n if (logPrefactor === null || r2 === null) return abstain('ols did not return a finite intercept and R²');\n const exponents: PowerLawExponent[] = [];\n for (let j = 0; j < k; j++) {\n const c = numberAt(fit.coefficients, j + 1);\n const se = numberAt(fit.stderr, j + 1);\n if (c === null || se === null) return abstain(`ols did not return a finite coefficient and standard error for π-group ${groups[j]!.formula}`);\n const estimate = c / scales[j]!;\n const stderr = se / scales[j]!;\n // Noise-free rows give stderr 0; a representation tolerance keeps 0.5000000000000001 at 1/2.\n const tol = Math.max(2 * stderr, 1e-9 * Math.max(1, Math.abs(estimate)));\n const near = rationalCandidates(estimate, tol);\n const rational = near.length === 1 ? near[0]! : null;\n const group = groups[j]!;\n exponents.push({ group: group.formula, exponents: group.exponents, estimate, stderr, interval: [estimate - 2 * stderr, estimate + 2 * stderr], rational });\n const value = `${estimate.toPrecision(4)} ± ${stderr.toPrecision(2)}`;\n if (near.length === 0) {\n return abstain(`the exponent of ${group.formula} is ${value}, not within 2σ of a fraction with denominator ≤ ${MAX_EXPONENT_DENOMINATOR}`);\n }\n if (near.length > 1) {\n const list = near.slice(0, 4).map((r) => (r.denominator === 1 ? `${r.numerator}` : `${r.numerator}/${r.denominator}`)).join(', ');\n return abstain(\n `the exponent of ${group.formula} is ${value}: its 2σ interval holds ${near.length} fractions with denominator ≤ ${MAX_EXPONENT_DENOMINATOR} (${list}${near.length > 4 ? ', …' : ''}), so the rows do not determine it`,\n );\n }\n }\n const monomial: Record<string, number> = { ...base };\n for (const e of exponents) {\n const a = e.rational!.numerator / e.rational!.denominator;\n for (const [name, p] of Object.entries(e.exponents)) monomial[name] = (monomial[name] ?? 0) + a * p;\n }\n return { kind: 'fit', base, exponents, logPrefactor, r2, nRows: used, skippedRows: skipped, monomial };\n}\n\n/** One line for a run's wording: what the power-law fit found or why it abstained. @internal */\nexport function powerLawWording(pl: PowerLawDetermination): string | null {\n if (pl.kind === 'not-applicable') return null;\n if (pl.kind === 'abstained') return `no power law from the exploratory rows: ${pl.reason}`;\n const terms = pl.exponents\n .map((e) => {\n const { numerator: p, denominator: q } = e.rational!;\n const frac = q === 1 ? `${p}` : `${p}/${q}`;\n return `(${e.group})^(${frac}) [a = ${e.estimate.toPrecision(3)} ± ${e.stderr.toPrecision(2)}]`;\n })\n .join(' · ');\n return `power law from the exploratory rows: base · ${terms}; R² = ${pl.r2.toPrecision(4)} on ${pl.nRows} row(s)${pl.skippedRows > 0 ? ` (${pl.skippedRows} skipped: non-positive)` : ''}; each exponent is the fraction with denominator ≤ ${MAX_EXPONENT_DENOMINATOR} within 2σ of the fit`;\n}\n"]}
|
|
@@ -17,6 +17,7 @@ export declare function makeResidualGap(id: string, summary: string, kind?: Fron
|
|
|
17
17
|
export declare class ProblemFileError extends Error {
|
|
18
18
|
constructor(message: string);
|
|
19
19
|
}
|
|
20
|
+
/** The JSON shape of a probe problem file, as read before validation. */
|
|
20
21
|
export interface ProblemFile {
|
|
21
22
|
readonly gap?: {
|
|
22
23
|
readonly id?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"problem.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/problem.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAEV,qBAAqB,EACrB,WAAW,EACX,eAAe,EAEf,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,eAAe,CAazD;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,eAA2C,GAChD,WAAW,CAuBb;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAiCD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,QAAQ,CAAC,SAAS,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpD;AAED,yFAAyF;AACzF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAGrE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,MAAM,SAAW,GAAG,MAAM,GAAG,IAAI,CAKpH;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,SAAW,GAAG,aAAa,CAiExF;AA+ID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAOpD"}
|
|
1
|
+
{"version":3,"file":"problem.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/problem.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAEV,qBAAqB,EACrB,WAAW,EACX,eAAe,EAEf,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,eAAe,CAazD;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,eAA2C,GAChD,WAAW,CAuBb;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAiCD,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,QAAQ,CAAC,SAAS,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpD;AAED,yFAAyF;AACzF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAGrE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,MAAM,SAAW,GAAG,MAAM,GAAG,IAAI,CAKpH;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,SAAW,GAAG,aAAa,CAiExF;AA+ID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAOpD"}
|