universal-physics-tensor 8.0.0 → 9.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 +8 -6
- 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 +490 -338
- package/data/bridge-catalog.schema.json +566 -40
- package/data/quantities.json +230 -218
- package/data/quantities.schema.json +52 -0
- package/data/units.json +1149 -0
- package/data/units.schema.json +124 -0
- package/dist/atlas/association.d.ts +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.js +2 -5
- package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
- package/dist/atlas/physjs-entries.generated.d.ts +1601 -220
- package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
- package/dist/atlas/physjs-entries.generated.js +1854 -345
- package/dist/atlas/physjs-entries.generated.js.map +1 -1
- package/dist/atlas/physjs-ref.d.ts +89 -89
- package/dist/atlas/physjs-ref.d.ts.map +1 -1
- package/dist/atlas/physjs-ref.js +128 -176
- package/dist/atlas/physjs-ref.js.map +1 -1
- package/dist/atlas/proof-target.d.ts +16 -8
- package/dist/atlas/proof-target.d.ts.map +1 -1
- package/dist/atlas/proof-target.js +34 -31
- package/dist/atlas/proof-target.js.map +1 -1
- package/dist/bridges/catalog-adapter.d.ts.map +1 -1
- package/dist/bridges/catalog-adapter.js +5 -5
- package/dist/bridges/catalog-adapter.js.map +1 -1
- package/dist/bridges/catalog-load.d.ts +7 -0
- package/dist/bridges/catalog-load.d.ts.map +1 -1
- package/dist/bridges/catalog-load.js +69 -13
- package/dist/bridges/catalog-load.js.map +1 -1
- package/dist/bridges/catalog-types.d.ts +51 -6
- package/dist/bridges/catalog-types.d.ts.map +1 -1
- package/dist/bridges/evaluation-errors.d.ts +76 -0
- package/dist/bridges/evaluation-errors.d.ts.map +1 -0
- package/dist/bridges/evaluation-errors.js +118 -0
- package/dist/bridges/evaluation-errors.js.map +1 -0
- package/dist/bridges/evaluator-inputs.d.ts +5 -3
- package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
- package/dist/bridges/evaluator-inputs.js +24 -24
- package/dist/bridges/evaluator-inputs.js.map +1 -1
- package/dist/bridges/evaluators.d.ts +32 -7
- package/dist/bridges/evaluators.d.ts.map +1 -1
- package/dist/bridges/evaluators.js +131 -29
- package/dist/bridges/evaluators.js.map +1 -1
- package/dist/bridges/expr-parse.d.ts +11 -3
- package/dist/bridges/expr-parse.d.ts.map +1 -1
- package/dist/bridges/expr-parse.js +46 -153
- package/dist/bridges/expr-parse.js.map +1 -1
- package/dist/bridges/holds.d.ts +11 -7
- package/dist/bridges/holds.d.ts.map +1 -1
- package/dist/bridges/holds.js +113 -234
- package/dist/bridges/holds.js.map +1 -1
- package/dist/bridges/input-contract.d.ts +65 -0
- package/dist/bridges/input-contract.d.ts.map +1 -0
- package/dist/bridges/input-contract.js +97 -0
- package/dist/bridges/input-contract.js.map +1 -0
- package/dist/bridges/notices.d.ts +11 -0
- package/dist/bridges/notices.d.ts.map +1 -0
- package/dist/bridges/notices.js +22 -0
- package/dist/bridges/notices.js.map +1 -0
- package/dist/canonical/canonical-equation.d.ts +31 -0
- package/dist/canonical/canonical-equation.d.ts.map +1 -1
- package/dist/canonical/entries/atomic.d.ts.map +1 -1
- package/dist/canonical/entries/atomic.js +11 -1
- package/dist/canonical/entries/atomic.js.map +1 -1
- package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
- package/dist/canonical/entries/condensed-matter.js +3 -0
- package/dist/canonical/entries/condensed-matter.js.map +1 -1
- package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
- package/dist/canonical/entries/dimensional-classics.js +48 -0
- package/dist/canonical/entries/dimensional-classics.js.map +1 -1
- package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
- package/dist/canonical/entries/electromagnetism.js +30 -0
- package/dist/canonical/entries/electromagnetism.js.map +1 -1
- package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
- package/dist/canonical/entries/fluids-waves.js +34 -0
- package/dist/canonical/entries/fluids-waves.js.map +1 -1
- package/dist/canonical/entries/mechanics.d.ts.map +1 -1
- package/dist/canonical/entries/mechanics.js +24 -0
- package/dist/canonical/entries/mechanics.js.map +1 -1
- package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
- package/dist/canonical/entries/nonmonomial.js +15 -4
- package/dist/canonical/entries/nonmonomial.js.map +1 -1
- package/dist/canonical/entries/relativity.d.ts.map +1 -1
- package/dist/canonical/entries/relativity.js +6 -0
- package/dist/canonical/entries/relativity.js.map +1 -1
- package/dist/canonical/entries/statistical-mechanics.d.ts.map +1 -1
- package/dist/canonical/entries/statistical-mechanics.js +19 -0
- package/dist/canonical/entries/statistical-mechanics.js.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.js +15 -0
- package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
- package/dist/cases/index.d.ts +9 -2
- package/dist/cases/index.d.ts.map +1 -1
- package/dist/cases/index.js +26 -7
- package/dist/cases/index.js.map +1 -1
- package/dist/cases/kepler-rv.js +6 -6
- package/dist/cases/kepler-rv.js.map +1 -1
- package/dist/cli/commands/_discovery-opts.d.ts +2 -1
- package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
- package/dist/cli/commands/_discovery-opts.js +7 -12
- package/dist/cli/commands/_discovery-opts.js.map +1 -1
- package/dist/cli/commands/atlas.d.ts.map +1 -1
- package/dist/cli/commands/atlas.js +6 -9
- package/dist/cli/commands/atlas.js.map +1 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +1 -2
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/connectors.d.ts.map +1 -1
- package/dist/cli/commands/connectors.js +8 -9
- package/dist/cli/commands/connectors.js.map +1 -1
- package/dist/cli/commands/derive.js +9 -10
- package/dist/cli/commands/derive.js.map +1 -1
- package/dist/cli/commands/discover.d.ts.map +1 -1
- package/dist/cli/commands/discover.js +3 -4
- package/dist/cli/commands/discover.js.map +1 -1
- package/dist/cli/commands/eval.d.ts.map +1 -1
- package/dist/cli/commands/eval.js +17 -17
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/evaluate.d.ts +1 -35
- package/dist/cli/commands/evaluate.d.ts.map +1 -1
- package/dist/cli/commands/evaluate.js +56 -187
- 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 +43 -38
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/ground.js +1 -1
- package/dist/cli/commands/ground.js.map +1 -1
- package/dist/cli/commands/map.js +3 -4
- package/dist/cli/commands/map.js.map +1 -1
- package/dist/cli/commands/metric.d.ts.map +1 -1
- package/dist/cli/commands/metric.js +3 -0
- package/dist/cli/commands/metric.js.map +1 -1
- package/dist/cli/commands/regime.js +1 -1
- package/dist/cli/commands/regime.js.map +1 -1
- package/dist/cli/commands/symbolic.d.ts.map +1 -1
- package/dist/cli/commands/symbolic.js +5 -2
- package/dist/cli/commands/symbolic.js.map +1 -1
- package/dist/cli/commands/testplan.js +3 -3
- package/dist/cli/commands/testplan.js.map +1 -1
- package/dist/cli/conventions.d.ts +6 -7
- package/dist/cli/conventions.d.ts.map +1 -1
- package/dist/cli/conventions.js +19 -28
- package/dist/cli/conventions.js.map +1 -1
- package/dist/cli/euler-guard.d.ts +13 -2
- package/dist/cli/euler-guard.d.ts.map +1 -1
- package/dist/cli/euler-guard.js +17 -3
- package/dist/cli/euler-guard.js.map +1 -1
- package/dist/cli/eval-numbers.d.ts +4 -9
- package/dist/cli/eval-numbers.d.ts.map +1 -1
- package/dist/cli/eval-numbers.js +11 -41
- package/dist/cli/eval-numbers.js.map +1 -1
- package/dist/cli/published-url.d.ts +2 -0
- package/dist/cli/published-url.d.ts.map +1 -1
- package/dist/cli/published-url.js +5 -0
- package/dist/cli/published-url.js.map +1 -1
- package/dist/cli/record-tables.d.ts +2 -1
- package/dist/cli/record-tables.d.ts.map +1 -1
- package/dist/cli/record-tables.js +8 -3
- package/dist/cli/record-tables.js.map +1 -1
- package/dist/cli-api.d.ts +45 -12
- package/dist/cli-api.d.ts.map +1 -1
- package/dist/cli-api.js +38 -11
- package/dist/cli-api.js.map +1 -1
- package/dist/composition/adjudication.d.ts +8 -30
- package/dist/composition/adjudication.d.ts.map +1 -1
- package/dist/composition/adjudication.js +15 -67
- package/dist/composition/adjudication.js.map +1 -1
- package/dist/composition/aliases.d.ts +1 -1
- package/dist/composition/aliases.d.ts.map +1 -1
- package/dist/composition/aliases.js +10 -20
- package/dist/composition/aliases.js.map +1 -1
- package/dist/composition/bridge-analysis.d.ts +4 -0
- package/dist/composition/bridge-analysis.d.ts.map +1 -1
- package/dist/composition/bridge-analysis.js +13 -14
- package/dist/composition/bridge-analysis.js.map +1 -1
- package/dist/composition/canonical-graph.d.ts +7 -9
- package/dist/composition/canonical-graph.d.ts.map +1 -1
- package/dist/composition/canonical-graph.js +35 -19
- package/dist/composition/canonical-graph.js.map +1 -1
- package/dist/composition/canonical-prefactors.d.ts +10 -29
- package/dist/composition/canonical-prefactors.d.ts.map +1 -1
- package/dist/composition/canonical-prefactors.js +15 -202
- package/dist/composition/canonical-prefactors.js.map +1 -1
- package/dist/composition/compose.js +2 -1
- package/dist/composition/compose.js.map +1 -1
- package/dist/composition/discovery.d.ts +50 -0
- package/dist/composition/discovery.d.ts.map +1 -1
- package/dist/composition/discovery.js +2 -2
- package/dist/composition/discovery.js.map +1 -1
- package/dist/composition/edge.d.ts +0 -14
- package/dist/composition/edge.d.ts.map +1 -1
- package/dist/composition/edge.js +1 -17
- package/dist/composition/edge.js.map +1 -1
- package/dist/composition/evaluate-relation.d.ts +29 -5
- package/dist/composition/evaluate-relation.d.ts.map +1 -1
- package/dist/composition/evaluate-relation.js +100 -72
- package/dist/composition/evaluate-relation.js.map +1 -1
- package/dist/composition/explain.d.ts +5 -0
- package/dist/composition/explain.d.ts.map +1 -1
- package/dist/composition/explain.js +9 -8
- package/dist/composition/explain.js.map +1 -1
- package/dist/composition/expr-eval.d.ts.map +1 -1
- package/dist/composition/expr-eval.js +2 -1
- package/dist/composition/expr-eval.js.map +1 -1
- package/dist/composition/index.d.ts +3 -1
- package/dist/composition/index.d.ts.map +1 -1
- package/dist/composition/index.js +3 -1
- package/dist/composition/index.js.map +1 -1
- package/dist/composition/proposed-bridges.d.ts.map +1 -1
- package/dist/composition/proposed-bridges.js +3 -2
- package/dist/composition/proposed-bridges.js.map +1 -1
- package/dist/composition/retrodiction.d.ts +8 -0
- package/dist/composition/retrodiction.d.ts.map +1 -1
- package/dist/composition/retrodiction.js +5 -0
- package/dist/composition/retrodiction.js.map +1 -1
- package/dist/composition/user-equation.d.ts +11 -7
- package/dist/composition/user-equation.d.ts.map +1 -1
- package/dist/composition/user-equation.js +24 -26
- package/dist/composition/user-equation.js.map +1 -1
- package/dist/core/constants.d.ts +27 -4
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +38 -5
- package/dist/core/constants.js.map +1 -1
- package/dist/core/data-file.d.ts +27 -0
- package/dist/core/data-file.d.ts.map +1 -0
- package/dist/core/data-file.js +48 -0
- package/dist/core/data-file.js.map +1 -0
- package/dist/core/json-schema.d.ts +27 -0
- package/dist/core/json-schema.d.ts.map +1 -0
- package/dist/core/json-schema.js +153 -0
- package/dist/core/json-schema.js.map +1 -0
- package/dist/core/types.d.ts +3 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +16 -14
- package/dist/core/types.js.map +1 -1
- package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
- package/dist/diff/bridge-ast-gradient.js +6 -17
- package/dist/diff/bridge-ast-gradient.js.map +1 -1
- package/dist/diff/bridge-specs.d.ts +2 -1
- package/dist/diff/bridge-specs.d.ts.map +1 -1
- package/dist/diff/bridge-specs.js +1 -1
- package/dist/diff/bridge-specs.js.map +1 -1
- package/dist/dimensional/bridge-check.d.ts.map +1 -1
- package/dist/dimensional/bridge-check.js +3 -5
- package/dist/dimensional/bridge-check.js.map +1 -1
- package/dist/dimensional/constant-rows.d.ts +54 -0
- package/dist/dimensional/constant-rows.d.ts.map +1 -0
- package/dist/dimensional/constant-rows.js +111 -0
- package/dist/dimensional/constant-rows.js.map +1 -0
- package/dist/dimensional/constants.d.ts +4 -13
- package/dist/dimensional/constants.d.ts.map +1 -1
- package/dist/dimensional/constants.js +11 -19
- package/dist/dimensional/constants.js.map +1 -1
- package/dist/dimensional/dimension-spec.d.ts +12 -3
- package/dist/dimensional/dimension-spec.d.ts.map +1 -1
- package/dist/dimensional/dimension-spec.js +114 -150
- package/dist/dimensional/dimension-spec.js.map +1 -1
- package/dist/dimensional/exact-scale.d.ts +79 -0
- package/dist/dimensional/exact-scale.d.ts.map +1 -0
- package/dist/dimensional/exact-scale.js +222 -0
- package/dist/dimensional/exact-scale.js.map +1 -0
- package/dist/dimensional/formula-names.d.ts +13 -12
- package/dist/dimensional/formula-names.d.ts.map +1 -1
- package/dist/dimensional/formula-names.js +28 -51
- package/dist/dimensional/formula-names.js.map +1 -1
- package/dist/dimensional/quantity-registry.d.ts +10 -1
- package/dist/dimensional/quantity-registry.d.ts.map +1 -1
- package/dist/dimensional/quantity-registry.js +45 -16
- package/dist/dimensional/quantity-registry.js.map +1 -1
- package/dist/dimensional/symbolic-constants.d.ts +63 -19
- package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
- package/dist/dimensional/symbolic-constants.js +109 -92
- package/dist/dimensional/symbolic-constants.js.map +1 -1
- package/dist/dimensional/unit-data.d.ts +70 -0
- package/dist/dimensional/unit-data.d.ts.map +1 -0
- package/dist/dimensional/unit-data.js +135 -0
- package/dist/dimensional/unit-data.js.map +1 -0
- package/dist/dimensional/units.d.ts +87 -24
- package/dist/dimensional/units.d.ts.map +1 -1
- package/dist/dimensional/units.js +253 -276
- package/dist/dimensional/units.js.map +1 -1
- package/dist/index.d.ts +15 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/numerical/binding-value.d.ts +21 -1
- package/dist/numerical/binding-value.d.ts.map +1 -1
- package/dist/numerical/binding-value.js +123 -118
- package/dist/numerical/binding-value.js.map +1 -1
- package/dist/numerical/evaluator-uncertainty.d.ts +34 -0
- package/dist/numerical/evaluator-uncertainty.d.ts.map +1 -0
- package/dist/numerical/evaluator-uncertainty.js +117 -0
- package/dist/numerical/evaluator-uncertainty.js.map +1 -0
- package/dist/numerical/formula-contract.d.ts +4 -0
- package/dist/numerical/formula-contract.d.ts.map +1 -1
- package/dist/numerical/formula-contract.js +7 -0
- package/dist/numerical/formula-contract.js.map +1 -1
- package/dist/numerical/formula-dimension.d.ts +9 -0
- package/dist/numerical/formula-dimension.d.ts.map +1 -1
- package/dist/numerical/formula-dimension.js +64 -10
- package/dist/numerical/formula-dimension.js.map +1 -1
- package/dist/numerical/formula-mathts.d.ts.map +1 -1
- package/dist/numerical/formula-mathts.js +6 -2
- package/dist/numerical/formula-mathts.js.map +1 -1
- package/dist/numerical/gl4-integrator.d.ts.map +1 -1
- package/dist/numerical/gl4-integrator.js +3 -3
- package/dist/numerical/gl4-integrator.js.map +1 -1
- package/dist/numerical/spacetime-metrics.d.ts +4 -0
- package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
- package/dist/numerical/spacetime-metrics.js +34 -4
- package/dist/numerical/spacetime-metrics.js.map +1 -1
- package/dist/relations/types.d.ts +8 -1
- package/dist/relations/types.d.ts.map +1 -1
- package/dist/relations/types.js +10 -0
- package/dist/relations/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The errors one evaluation throws, in the order it checks: the bindings
|
|
3
|
+
* against the declared inputs first (an unknown key, a non-number, a number
|
|
4
|
+
* that is not finite, a key given twice, an absent input), then the validity
|
|
5
|
+
* domain. An input error says what the caller left out or misspelled; a
|
|
6
|
+
* domain error says the physics refuses the values. The library throws these classes so a caller can tell them
|
|
7
|
+
* apart by type, never by message text.
|
|
8
|
+
*
|
|
9
|
+
* @module bridges/evaluation-errors
|
|
10
|
+
*/
|
|
11
|
+
/** A required input is absent. It is not a physically bad value. @public */
|
|
12
|
+
export class MissingInputError extends Error {
|
|
13
|
+
id;
|
|
14
|
+
missing;
|
|
15
|
+
inputs;
|
|
16
|
+
/** The id evaluated, the absent keys, and every declared key. */
|
|
17
|
+
constructor(id, missing, inputs) {
|
|
18
|
+
super(`${id}: missing input ${missing.map((key) => `'${key}'`).join(', ')}; the inputs are: ${inputs.join(', ')}`);
|
|
19
|
+
this.id = id;
|
|
20
|
+
this.missing = missing;
|
|
21
|
+
this.inputs = inputs;
|
|
22
|
+
this.name = 'MissingInputError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const prefix = (id) => (id === undefined ? '' : `${id}: `);
|
|
26
|
+
/** A binding names no declared input, alias or alternate of the id. @public */
|
|
27
|
+
export class UnknownInputError extends Error {
|
|
28
|
+
id;
|
|
29
|
+
key;
|
|
30
|
+
inputs;
|
|
31
|
+
/** The id evaluated (absent when the reader was not told it), the unknown key, and every declared key. */
|
|
32
|
+
constructor(id, key, inputs) {
|
|
33
|
+
super(`${prefix(id)}'${key}' is not an input here; the inputs are: ${inputs.join(', ')}`);
|
|
34
|
+
this.id = id;
|
|
35
|
+
this.key = key;
|
|
36
|
+
this.inputs = inputs;
|
|
37
|
+
this.name = 'UnknownInputError';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** A binding's value is not a number. A `TypeError`, as before it was typed. @public */
|
|
41
|
+
export class InputTypeError extends TypeError {
|
|
42
|
+
id;
|
|
43
|
+
key;
|
|
44
|
+
got;
|
|
45
|
+
/** The id evaluated, the key, and the JavaScript type that was given. */
|
|
46
|
+
constructor(id, key, got) {
|
|
47
|
+
super(`${id}: ${key} must be a number, got ${got}`);
|
|
48
|
+
this.id = id;
|
|
49
|
+
this.key = key;
|
|
50
|
+
this.got = got;
|
|
51
|
+
this.name = 'InputTypeError';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A binding's value is a number that is not finite (`NaN`, `Infinity`,
|
|
56
|
+
* `-Infinity`). It is refused before the domain, so a validity predicate never
|
|
57
|
+
* sees it and a closed form never turns it into an unset result. @public
|
|
58
|
+
*/
|
|
59
|
+
export class NonFiniteInputError extends Error {
|
|
60
|
+
id;
|
|
61
|
+
key;
|
|
62
|
+
value;
|
|
63
|
+
/** The id evaluated, the key, and the value that was given. */
|
|
64
|
+
constructor(id, key, value) {
|
|
65
|
+
super(`${id}: ${key} must be a finite number, got ${value}`);
|
|
66
|
+
this.id = id;
|
|
67
|
+
this.key = key;
|
|
68
|
+
this.value = value;
|
|
69
|
+
this.name = 'NonFiniteInputError';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** One input is given twice, under two of its spellings (its key, an alias, or an alternate). @public */
|
|
73
|
+
export class DuplicateInputError extends Error {
|
|
74
|
+
id;
|
|
75
|
+
key;
|
|
76
|
+
spellings;
|
|
77
|
+
/** The id evaluated (absent when the reader was not told it), the input, and the two spellings it was given under. */
|
|
78
|
+
constructor(id, key, spellings) {
|
|
79
|
+
super(spellings[0] === spellings[1]
|
|
80
|
+
? `${prefix(id)}'${key}' is given twice`
|
|
81
|
+
: `${prefix(id)}'${key}' is given twice (once through an alternate): ${spellings[0]} and ${spellings[1]}`);
|
|
82
|
+
this.id = id;
|
|
83
|
+
this.key = key;
|
|
84
|
+
this.spellings = spellings;
|
|
85
|
+
this.name = 'DuplicateInputError';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* True for an error the input contract throws: an absent, unknown, non-number,
|
|
90
|
+
* non-finite or twice-given input. A caller that reports input errors one way
|
|
91
|
+
* and domain errors another asks this, not the message.
|
|
92
|
+
* @internal
|
|
93
|
+
*/
|
|
94
|
+
export function isInputContractError(error) {
|
|
95
|
+
return (error instanceof MissingInputError ||
|
|
96
|
+
error instanceof UnknownInputError ||
|
|
97
|
+
error instanceof InputTypeError ||
|
|
98
|
+
error instanceof NonFiniteInputError ||
|
|
99
|
+
error instanceof DuplicateInputError);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Evaluation refused: the inputs fall outside the relation's validity domain.
|
|
103
|
+
*
|
|
104
|
+
* Honest deviation from design D-3's "domain-incompatible at compose
|
|
105
|
+
* time": domain predicates are opaque functions, so incompatibility is
|
|
106
|
+
* detectable only at evaluation. This error is thrown by `evaluateEdge`, by
|
|
107
|
+
* a catalog evaluator, and by composed edges internally, not by
|
|
108
|
+
* `composeEdges`.
|
|
109
|
+
*
|
|
110
|
+
* @public
|
|
111
|
+
*/
|
|
112
|
+
export class DomainViolationError extends Error {
|
|
113
|
+
constructor(message) {
|
|
114
|
+
super(message);
|
|
115
|
+
this.name = 'DomainViolationError';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=evaluation-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation-errors.js","sourceRoot":"","sources":["../../src/bridges/evaluation-errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,11 +10,13 @@ export interface ResolvedInput {
|
|
|
10
10
|
readonly note?: string;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* Resolve `args` against `parameters`.
|
|
14
|
-
* @throws
|
|
13
|
+
* Resolve `args` against `parameters`. `id` names the evaluated id in an input error.
|
|
14
|
+
* @throws UnknownInputError on an unknown key.
|
|
15
|
+
* @throws DuplicateInputError on an input given twice.
|
|
16
|
+
* @throws UnitError on a unit that does not fit.
|
|
15
17
|
* @internal
|
|
16
18
|
*/
|
|
17
|
-
export declare function resolveEvaluatorInputs(parameters: readonly EvaluatorParameter[], args: readonly string[]): {
|
|
19
|
+
export declare function resolveEvaluatorInputs(parameters: readonly EvaluatorParameter[], args: readonly string[], id?: string): {
|
|
18
20
|
inputs: Record<string, number>;
|
|
19
21
|
resolved: ResolvedInput[];
|
|
20
22
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator-inputs.d.ts","sourceRoot":"","sources":["../../src/bridges/evaluator-inputs.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluator-inputs.d.ts","sourceRoot":"","sources":["../../src/bridges/evaluator-inputs.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAuCD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,SAAS,kBAAkB,EAAE,EACzC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,CAAC,EAAE,MAAM,GACV;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,CAgD/D"}
|
|
@@ -10,9 +10,10 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @module bridges/evaluator-inputs
|
|
12
12
|
*/
|
|
13
|
-
import { unitConventionNotes, UnitError } from '../dimensional/units.js';
|
|
14
|
-
import { resolveQuantityName, synonymGroup,
|
|
13
|
+
import { affineReadingNote, unitConventionNotes, UnitError } from '../dimensional/units.js';
|
|
14
|
+
import { resolveQuantityName, synonymGroup, synonymDisagreement, temperatureQuantityRole, } from '../dimensional/formula-names.js';
|
|
15
15
|
import { readNamedBinding } from '../numerical/binding-value.js';
|
|
16
|
+
import { DuplicateInputError, UnknownInputError } from './evaluation-errors.js';
|
|
16
17
|
/** 15 significant digits: the value itself is passed unrounded. */
|
|
17
18
|
const show = (v) => Number(v.toPrecision(15));
|
|
18
19
|
/** Disclosures that a unit symbol does not carry by itself. */
|
|
@@ -30,27 +31,26 @@ function convert(p, raw, reading, siblings, givenName) {
|
|
|
30
31
|
const read = readNamedBinding(givenName, raw, { reading, siblings, declaredUnit: p.unit });
|
|
31
32
|
if (!read.dimensioned)
|
|
32
33
|
return { value: read.value };
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const base = `${raw.trim()} → ${show(read.value)} ${p.unit || '(dimensionless)'}${offset}${unitAside(raw)}`;
|
|
45
|
-
const temperature = read.notes.find((note) => note.includes('k_B T'));
|
|
46
|
-
return { value: read.value, note: temperature === undefined ? base : `${base}. ${temperature}` };
|
|
34
|
+
// How an affine reading was applied comes from the unit table's own row (scale and ice point).
|
|
35
|
+
const offset = read.affine === undefined ? '' : ` (${affineReadingNote(read.affine, reading)})`;
|
|
36
|
+
// An angular input counts radians; a cycle-counting unit (the `cycles` flag on its row) takes 2π per cycle.
|
|
37
|
+
const turns = p.angular === true ? read.cycles : 0;
|
|
38
|
+
if (Number.isNaN(turns)) {
|
|
39
|
+
throw new UnitError(`'${raw.trim()}' adds a cycle rate to a plain rate, so its radians per second are not defined`);
|
|
40
|
+
}
|
|
41
|
+
const value = turns === 0 ? read.value : read.value * (2 * Math.PI) ** turns;
|
|
42
|
+
const turnsNote = turns === 0 ? '' : turns === 1 ? ' (cycles: × 2π)' : ` (cycles: × (2π)^${turns})`;
|
|
43
|
+
const base = `${raw.trim()} → ${show(value)} ${p.unit || '(dimensionless)'}${offset}${turnsNote}${unitAside(raw)}`;
|
|
44
|
+
return { value, note: read.temperatureNote === undefined ? base : `${base}. ${read.temperatureNote}` };
|
|
47
45
|
}
|
|
48
46
|
/**
|
|
49
|
-
* Resolve `args` against `parameters`.
|
|
50
|
-
* @throws
|
|
47
|
+
* Resolve `args` against `parameters`. `id` names the evaluated id in an input error.
|
|
48
|
+
* @throws UnknownInputError on an unknown key.
|
|
49
|
+
* @throws DuplicateInputError on an input given twice.
|
|
50
|
+
* @throws UnitError on a unit that does not fit.
|
|
51
51
|
* @internal
|
|
52
52
|
*/
|
|
53
|
-
export function resolveEvaluatorInputs(parameters, args) {
|
|
53
|
+
export function resolveEvaluatorInputs(parameters, args, id) {
|
|
54
54
|
const inputs = {};
|
|
55
55
|
const resolved = [];
|
|
56
56
|
const known = parameters.flatMap((p) => [p.key, ...(p.alternates ?? []).map((a) => a.key)]);
|
|
@@ -67,9 +67,10 @@ export function resolveEvaluatorInputs(parameters, args) {
|
|
|
67
67
|
const viaSynonym = viaName === null ? undefined : parameters.find((p) => p.key === viaName);
|
|
68
68
|
const p = direct ?? viaAlt ?? viaSynonym;
|
|
69
69
|
if (p === undefined)
|
|
70
|
-
throw new
|
|
70
|
+
throw new UnknownInputError(id, key, known);
|
|
71
71
|
const earlier = resolved.find((r) => r.key === p.key);
|
|
72
|
-
const
|
|
72
|
+
const role = temperatureQuantityRole(p.quantity) === 'difference' ? 'difference' : temperatureQuantityRole(key);
|
|
73
|
+
const c = convert(p, raw, role, siblings, key);
|
|
73
74
|
const alt = direct === undefined && viaAlt !== undefined ? p.alternates.find((a) => a.key === key) : undefined;
|
|
74
75
|
const value = alt === undefined ? c.value : c.value * alt.toKey;
|
|
75
76
|
if (earlier !== undefined) {
|
|
@@ -79,10 +80,9 @@ export function resolveEvaluatorInputs(parameters, args) {
|
|
|
79
80
|
if (synonymRepeat && earlier.value === value)
|
|
80
81
|
continue;
|
|
81
82
|
if (synonymRepeat) {
|
|
82
|
-
throw
|
|
83
|
+
throw synonymDisagreement([earlierName, key], { [earlierName]: earlier.value, [key]: value });
|
|
83
84
|
}
|
|
84
|
-
|
|
85
|
-
throw new UnitError(`'${p.key}' is given twice${throughAlternate ? ' (once through an alternate)' : ''}`);
|
|
85
|
+
throw new DuplicateInputError(id, p.key, [earlierName, key]);
|
|
86
86
|
}
|
|
87
87
|
inputs[p.key] = value;
|
|
88
88
|
resolved.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator-inputs.js","sourceRoot":"","sources":["../../src/bridges/evaluator-inputs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAA2B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluator-inputs.js","sourceRoot":"","sources":["../../src/bridges/evaluator-inputs.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,15 @@
|
|
|
2
2
|
* Closed-form evaluators projected from the catalog. `run` evaluates the
|
|
3
3
|
* relation expression. It does not switch on a catalog id.
|
|
4
4
|
*
|
|
5
|
+
* `run` is the one evaluation of a catalog closed form: `evaluateRelation`,
|
|
6
|
+
* the CLI and the uncertainty probes all call it. It checks the bindings
|
|
7
|
+
* against the evaluator's {@link InputContract} before the validity domain,
|
|
8
|
+
* so an absent input is a {@link MissingInputError}, never a domain failure.
|
|
9
|
+
*
|
|
5
10
|
* @module bridges/evaluators
|
|
6
11
|
*/
|
|
7
|
-
import type {
|
|
12
|
+
import type { CatalogEvaluatorOutput } from './catalog-types.js';
|
|
13
|
+
import { type EvaluationWant, type InputContract } from './input-contract.js';
|
|
8
14
|
/** How a length input is read: radius, diameter, separation, impact parameter, or semi-major axis. @public */
|
|
9
15
|
export type GeometryRole = 'radius' | 'diameter' | 'separation' | 'impact-parameter' | 'semi-major-axis';
|
|
10
16
|
/** A second key that converts into the parameter's key. @public */
|
|
@@ -22,6 +28,10 @@ export interface EvaluatorParameter {
|
|
|
22
28
|
readonly meaning: string;
|
|
23
29
|
readonly geometry?: GeometryRole;
|
|
24
30
|
readonly temperature?: 'absolute';
|
|
31
|
+
/** The sign this input must have; the catalog loader turns it into a validity clause. */
|
|
32
|
+
readonly sign?: 'positive' | 'nonnegative' | 'any';
|
|
33
|
+
/** An angular frequency in rad/s. A cycle unit (Hz, rpm) given to it is multiplied by 2π. */
|
|
34
|
+
readonly angular?: true;
|
|
25
35
|
readonly alternates?: readonly ParameterAlternate[];
|
|
26
36
|
readonly optional?: true;
|
|
27
37
|
}
|
|
@@ -31,19 +41,34 @@ export interface EvaluatorSpec {
|
|
|
31
41
|
readonly name: string;
|
|
32
42
|
readonly inputKeys: readonly string[];
|
|
33
43
|
readonly parameters: readonly EvaluatorParameter[];
|
|
34
|
-
run
|
|
44
|
+
/** Further numbers `run` returns beside `value`, keyed by `name`. */
|
|
45
|
+
readonly outputs: readonly CatalogEvaluatorOutput[];
|
|
46
|
+
/** Every spelling that binds an input, and which inputs are required. `run` checks it first. */
|
|
47
|
+
readonly contract: InputContract;
|
|
48
|
+
/**
|
|
49
|
+
* Evaluate at `inputs`, keyed by parameter key, quantity, relation source,
|
|
50
|
+
* alias or alternate. Throws `UnknownInputError`, `InputTypeError`,
|
|
51
|
+
* `DuplicateInputError` or `MissingInputError` before any
|
|
52
|
+
* `DomainViolationError`. With `want` `'value'` it returns `{ value }`
|
|
53
|
+
* alone, and an input only an extra output reads is not required.
|
|
54
|
+
*/
|
|
55
|
+
run(inputs: Readonly<Record<string, number>>, want?: EvaluationWant): Record<string, number>;
|
|
35
56
|
}
|
|
36
|
-
/**
|
|
37
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Keys of the parameters whose source does not appear in the relation's
|
|
59
|
+
* expression. They are checked against the validity domain and do not change
|
|
60
|
+
* the value, so a caller who varies one sees no effect.
|
|
61
|
+
*/
|
|
62
|
+
export declare function unusedInputKeys(spec: EvaluatorSpec): string[];
|
|
38
63
|
/** Bridge id → evaluator. @internal */
|
|
39
64
|
export declare const BRIDGE_EVALUATORS: ReadonlyMap<number, EvaluatorSpec>;
|
|
40
65
|
/** What to say when an id is not in {@link BRIDGE_EVALUATORS}. @internal */
|
|
41
66
|
export declare function missingEvaluatorMessage(bridgeId: number): string;
|
|
42
67
|
/**
|
|
43
|
-
* Evaluate a catalog id with a numeric input record
|
|
44
|
-
*
|
|
68
|
+
* Evaluate a catalog id with a numeric input record: the evaluator's `run`,
|
|
69
|
+
* which checks the inputs first. Throws on an unknown id.
|
|
45
70
|
*
|
|
46
71
|
* @internal
|
|
47
72
|
*/
|
|
48
|
-
export declare function evaluateBridge(bridgeId: number, inputs: Readonly<Record<string, number>>):
|
|
73
|
+
export declare function evaluateBridge(bridgeId: number, inputs: Readonly<Record<string, number>>): Record<string, number>;
|
|
49
74
|
//# sourceMappingURL=evaluators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluators.d.ts","sourceRoot":"","sources":["../../src/bridges/evaluators.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evaluators.d.ts","sourceRoot":"","sources":["../../src/bridges/evaluators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAA8C,MAAM,oBAAoB,CAAC;AAK7G,OAAO,EAA8B,KAAK,cAAc,EAAE,KAAK,aAAa,EAAkB,MAAM,qBAAqB,CAAC;AAE1H,8GAA8G;AAC9G,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAEzG,mEAAmE;AACnE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IAClC,yFAAyF;IACzF,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,KAAK,CAAC;IACnD,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;CAC1B;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACnD,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACpD,gGAAgG;IAChG,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC;;;;;;OAMG;IACH,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9F;AAoCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE,CAc7D;AA8GD,uCAAuC;AACvC,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAKhE,CAAC;AAEF,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACvC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxB"}
|
|
@@ -2,12 +2,20 @@
|
|
|
2
2
|
* Closed-form evaluators projected from the catalog. `run` evaluates the
|
|
3
3
|
* relation expression. It does not switch on a catalog id.
|
|
4
4
|
*
|
|
5
|
+
* `run` is the one evaluation of a catalog closed form: `evaluateRelation`,
|
|
6
|
+
* the CLI and the uncertainty probes all call it. It checks the bindings
|
|
7
|
+
* against the evaluator's {@link InputContract} before the validity domain,
|
|
8
|
+
* so an absent input is a {@link MissingInputError}, never a domain failure.
|
|
9
|
+
*
|
|
5
10
|
* @module bridges/evaluators
|
|
6
11
|
*/
|
|
7
12
|
import { FORMULA_NAMED } from '../dimensional/formula-names.js';
|
|
8
13
|
import { primaryRelation } from './catalog-load.js';
|
|
9
14
|
import { catalogEvaluators } from './catalog-load.js';
|
|
15
|
+
import { evaluateFormula, formulaVariables, parseCatalogExpression } from './expr-parse.js';
|
|
10
16
|
import { evaluateCatalogRelation, relationHolds } from './relation-eval.js';
|
|
17
|
+
import { DomainViolationError } from './evaluation-errors.js';
|
|
18
|
+
import { checkInputs, inputContract } from './input-contract.js';
|
|
11
19
|
function toParameter(row) {
|
|
12
20
|
return {
|
|
13
21
|
key: row.key,
|
|
@@ -17,72 +25,170 @@ function toParameter(row) {
|
|
|
17
25
|
meaning: row.meaning,
|
|
18
26
|
...(row.geometry !== undefined ? { geometry: row.geometry } : {}),
|
|
19
27
|
...(row.temperature !== undefined ? { temperature: row.temperature } : {}),
|
|
28
|
+
...(row.sign !== undefined ? { sign: row.sign } : {}),
|
|
29
|
+
...(row.angular === true ? { angular: true } : {}),
|
|
20
30
|
...(row.alternates !== undefined ? { alternates: row.alternates } : {}),
|
|
21
31
|
...(row.optional === true ? { optional: true } : {}),
|
|
22
32
|
};
|
|
23
33
|
}
|
|
24
34
|
const NAMED_DEFAULT = new Map(FORMULA_NAMED.map((named) => [named.name, named.value]));
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
const
|
|
35
|
+
/** The relation source a parameter is the input for, or undefined when it owns none. */
|
|
36
|
+
function sourceOfParameter(relation, parameter) {
|
|
37
|
+
for (const source of relation.sources) {
|
|
38
|
+
if (source === parameter.key || (relation.aliases[source] ?? []).includes(parameter.key))
|
|
39
|
+
return source;
|
|
40
|
+
}
|
|
41
|
+
return relation.sources.includes(parameter.quantity) ? parameter.quantity : undefined;
|
|
42
|
+
}
|
|
43
|
+
/** Every symbol name in an expression tree. */
|
|
44
|
+
function symbolNames(node) {
|
|
45
|
+
if (node.kind === 'symbol')
|
|
46
|
+
return [node.name];
|
|
47
|
+
if (node.kind === 'op')
|
|
48
|
+
return node.args.flatMap(symbolNames);
|
|
49
|
+
if (node.kind === 'abs' || node.kind === 'transcendental')
|
|
50
|
+
return symbolNames(node.arg);
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Keys of the parameters whose source does not appear in the relation's
|
|
55
|
+
* expression. They are checked against the validity domain and do not change
|
|
56
|
+
* the value, so a caller who varies one sees no effect.
|
|
57
|
+
*/
|
|
58
|
+
export function unusedInputKeys(spec) {
|
|
59
|
+
const relation = primaryRelation(spec.bridgeId);
|
|
60
|
+
if (relation === undefined)
|
|
61
|
+
return [];
|
|
62
|
+
const used = new Set(symbolNames(parseCatalogExpression(relation.expression)));
|
|
63
|
+
// An output reads the scope names its parsed expression names, the same parse `run` evaluates.
|
|
64
|
+
const outputReads = new Set(spec.outputs.flatMap((output) => formulaVariables(output.expression)));
|
|
65
|
+
const readByOutput = (key) => outputReads.has(key.replaceAll('-', '_'));
|
|
66
|
+
return spec.parameters
|
|
67
|
+
.filter((parameter) => {
|
|
68
|
+
const source = sourceOfParameter(relation, parameter);
|
|
69
|
+
// A parameter that owns no relation source is read only by an extra output.
|
|
70
|
+
return (source === undefined || !used.has(source)) && !readByOutput(parameter.key);
|
|
71
|
+
})
|
|
72
|
+
.map((parameter) => parameter.key);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The declared inputs of a catalog evaluator: one slot per parameter, spelled
|
|
76
|
+
* by its key, its relation source and that source's aliases, and its quantity
|
|
77
|
+
* when no other slot shares it; then one optional, unlisted slot per relation
|
|
78
|
+
* source no parameter owns, which a named constant fills when not given.
|
|
79
|
+
* Building it throws when one spelling would bind two slots.
|
|
80
|
+
*/
|
|
81
|
+
function evaluatorContract(catalogId, relation, parameters) {
|
|
82
|
+
const quantityCount = new Map();
|
|
83
|
+
for (const p of parameters)
|
|
84
|
+
quantityCount.set(p.quantity, (quantityCount.get(p.quantity) ?? 0) + 1);
|
|
85
|
+
const owned = new Set();
|
|
86
|
+
const slots = parameters.map((p) => {
|
|
87
|
+
const source = sourceOfParameter(relation, p);
|
|
88
|
+
if (source !== undefined)
|
|
89
|
+
owned.add(source);
|
|
90
|
+
const spellings = [
|
|
91
|
+
p.key,
|
|
92
|
+
...(source === undefined ? [] : [source, ...(relation.aliases[source] ?? [])]),
|
|
93
|
+
...(quantityCount.get(p.quantity) === 1 ? [p.quantity] : []),
|
|
94
|
+
];
|
|
95
|
+
return {
|
|
96
|
+
key: p.key,
|
|
97
|
+
spellings: [...new Set(spellings)],
|
|
98
|
+
alternates: (p.alternates ?? []).map((alt) => ({ key: alt.key, toKey: alt.toKey })),
|
|
99
|
+
optional: p.optional === true,
|
|
100
|
+
readBy: source === undefined ? 'outputs' : 'value',
|
|
101
|
+
listed: true,
|
|
102
|
+
};
|
|
103
|
+
});
|
|
28
104
|
for (const source of relation.sources) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
105
|
+
if (owned.has(source))
|
|
106
|
+
continue;
|
|
107
|
+
slots.push({
|
|
108
|
+
key: source,
|
|
109
|
+
spellings: [source, ...(relation.aliases[source] ?? [])],
|
|
110
|
+
alternates: [],
|
|
111
|
+
optional: NAMED_DEFAULT.has(source.replaceAll('-', '_')),
|
|
112
|
+
readBy: 'value',
|
|
113
|
+
listed: false,
|
|
114
|
+
});
|
|
32
115
|
}
|
|
116
|
+
return inputContract(`be-${catalogId}`, slots);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Checked inputs (keyed by slot key) onto catalog source names. A source no
|
|
120
|
+
* parameter owns takes its given value, else its named constant.
|
|
121
|
+
*/
|
|
122
|
+
function bindRelationInputs(relation, parameters, inputs) {
|
|
33
123
|
const bound = {};
|
|
34
124
|
const owned = new Set();
|
|
35
125
|
for (const parameter of parameters) {
|
|
36
|
-
const source =
|
|
37
|
-
(relation.sources.includes(parameter.quantity) ? parameter.quantity : undefined);
|
|
126
|
+
const source = sourceOfParameter(relation, parameter);
|
|
38
127
|
if (source === undefined)
|
|
39
128
|
continue;
|
|
40
129
|
owned.add(source);
|
|
41
130
|
const value = inputs[parameter.key];
|
|
42
|
-
if (value
|
|
43
|
-
|
|
44
|
-
bound[source] = value;
|
|
131
|
+
if (value !== undefined)
|
|
132
|
+
bound[source] = value;
|
|
45
133
|
}
|
|
46
134
|
for (const source of relation.sources) {
|
|
47
|
-
if (
|
|
135
|
+
if (owned.has(source))
|
|
48
136
|
continue;
|
|
49
|
-
const value = NAMED_DEFAULT.get(source.replaceAll('-', '_'));
|
|
137
|
+
const value = inputs[source] ?? NAMED_DEFAULT.get(source.replaceAll('-', '_'));
|
|
50
138
|
if (value !== undefined)
|
|
51
139
|
bound[source] = value;
|
|
52
140
|
}
|
|
53
141
|
return bound;
|
|
54
142
|
}
|
|
55
|
-
function buildSpec(catalogId, name, parameters) {
|
|
143
|
+
function buildSpec(catalogId, name, parameters, outputs) {
|
|
144
|
+
const relation = primaryRelation(catalogId);
|
|
145
|
+
if (relation === undefined)
|
|
146
|
+
throw new Error(missingEvaluatorMessage(catalogId));
|
|
147
|
+
const contract = evaluatorContract(catalogId, relation, parameters);
|
|
56
148
|
return {
|
|
57
149
|
bridgeId: catalogId,
|
|
58
150
|
name,
|
|
59
151
|
inputKeys: parameters.filter((parameter) => parameter.optional !== true).map((parameter) => parameter.key),
|
|
60
152
|
parameters,
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const bound = bindRelationInputs(relation, parameters, inputs);
|
|
153
|
+
outputs,
|
|
154
|
+
contract,
|
|
155
|
+
run(inputs, want = 'all') {
|
|
156
|
+
const given = checkInputs(contract, inputs, want);
|
|
157
|
+
const bound = bindRelationInputs(relation, parameters, given);
|
|
67
158
|
if (!relationHolds(relation, bound)) {
|
|
68
|
-
throw new
|
|
159
|
+
throw new DomainViolationError(`${relation.id}: inputs violate validity domain (${relation.domain})`);
|
|
160
|
+
}
|
|
161
|
+
for (const parameter of parameters) {
|
|
162
|
+
const value = given[parameter.key];
|
|
163
|
+
if (parameter.optional === true && parameter.sign === 'positive' && value !== undefined && !(value > 0)) {
|
|
164
|
+
throw new DomainViolationError(`${relation.id}: ${parameter.key} must be > 0`);
|
|
165
|
+
}
|
|
69
166
|
}
|
|
70
|
-
|
|
167
|
+
const value = evaluateCatalogRelation(relation, bound);
|
|
168
|
+
const result = { value };
|
|
169
|
+
if (want === 'value')
|
|
170
|
+
return result;
|
|
171
|
+
for (const output of outputs) {
|
|
172
|
+
if ((output.requires ?? []).some((key) => given[key] === undefined))
|
|
173
|
+
continue;
|
|
174
|
+
result[output.name] = evaluateFormula(output.expression, { ...given, value });
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
71
177
|
},
|
|
72
178
|
};
|
|
73
179
|
}
|
|
74
180
|
/** Bridge id → evaluator. @internal */
|
|
75
181
|
export const BRIDGE_EVALUATORS = new Map(catalogEvaluators().map((row) => {
|
|
76
182
|
const parameters = row.parameters.map(toParameter);
|
|
77
|
-
return [row.catalogId, buildSpec(row.catalogId, row.name, parameters)];
|
|
183
|
+
return [row.catalogId, buildSpec(row.catalogId, row.name, parameters, row.outputs ?? [])];
|
|
78
184
|
}));
|
|
79
185
|
/** What to say when an id is not in {@link BRIDGE_EVALUATORS}. @internal */
|
|
80
186
|
export function missingEvaluatorMessage(bridgeId) {
|
|
81
187
|
return `evaluateBridge: catalog id ${bridgeId} has no evaluator`;
|
|
82
188
|
}
|
|
83
189
|
/**
|
|
84
|
-
* Evaluate a catalog id with a numeric input record
|
|
85
|
-
*
|
|
190
|
+
* Evaluate a catalog id with a numeric input record: the evaluator's `run`,
|
|
191
|
+
* which checks the inputs first. Throws on an unknown id.
|
|
86
192
|
*
|
|
87
193
|
* @internal
|
|
88
194
|
*/
|
|
@@ -90,10 +196,6 @@ export function evaluateBridge(bridgeId, inputs) {
|
|
|
90
196
|
const spec = BRIDGE_EVALUATORS.get(bridgeId);
|
|
91
197
|
if (spec === undefined)
|
|
92
198
|
throw new Error(missingEvaluatorMessage(bridgeId));
|
|
93
|
-
const missing = spec.inputKeys.filter((key) => !(key in inputs) || !Number.isFinite(inputs[key]));
|
|
94
|
-
if (missing.length > 0) {
|
|
95
|
-
throw new Error(`evaluateBridge: catalog id ${bridgeId} (${spec.name}) needs {${spec.inputKeys.join(', ')}}; missing/non-finite: ${missing.join(', ')}`);
|
|
96
|
-
}
|
|
97
199
|
return spec.run(inputs);
|
|
98
200
|
}
|
|
99
201
|
//# sourceMappingURL=evaluators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluators.js","sourceRoot":"","sources":["../../src/bridges/evaluators.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evaluators.js","sourceRoot":"","sources":["../../src/bridges/evaluators.ts"],"names":[],"mappings":"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"}
|