@uwmd/core 1.6.0 → 1.8.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/dist/agents/bancroft.js +4 -1
- package/dist/agents/bancroft.js.map +1 -1
- package/dist/asset-class.d.ts +98 -0
- package/dist/asset-class.d.ts.map +1 -0
- package/dist/asset-class.js +226 -0
- package/dist/asset-class.js.map +1 -0
- package/dist/browser.d.ts +23 -9
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +25 -5
- package/dist/browser.js.map +1 -1
- package/dist/calc/errors.d.ts +1 -1
- package/dist/calc/errors.d.ts.map +1 -1
- package/dist/calc/errors.js.map +1 -1
- package/dist/calc/evaluator.js +25 -1
- package/dist/calc/evaluator.js.map +1 -1
- package/dist/calc/prng.d.ts +59 -0
- package/dist/calc/prng.d.ts.map +1 -0
- package/dist/calc/prng.js +181 -0
- package/dist/calc/prng.js.map +1 -0
- package/dist/calc/sensitivity.d.ts +76 -0
- package/dist/calc/sensitivity.d.ts.map +1 -0
- package/dist/calc/sensitivity.js +160 -0
- package/dist/calc/sensitivity.js.map +1 -0
- package/dist/calc/stochastic.d.ts +97 -0
- package/dist/calc/stochastic.d.ts.map +1 -0
- package/dist/calc/stochastic.js +265 -0
- package/dist/calc/stochastic.js.map +1 -0
- package/dist/cascade.d.ts.map +1 -1
- package/dist/cascade.js +8 -4
- package/dist/cascade.js.map +1 -1
- package/dist/cli-args.d.ts +37 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +93 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli.js +119 -72
- package/dist/cli.js.map +1 -1
- package/dist/editor.js +25 -6
- package/dist/editor.js.map +1 -1
- package/dist/index.d.ts +24 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -5
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +16 -4
- package/dist/init.js.map +1 -1
- package/dist/integrity-canonical.d.ts.map +1 -1
- package/dist/integrity-canonical.js +10 -2
- package/dist/integrity-canonical.js.map +1 -1
- package/dist/integrity.d.ts +92 -4
- package/dist/integrity.d.ts.map +1 -1
- package/dist/integrity.js +195 -9
- package/dist/integrity.js.map +1 -1
- package/dist/lite-bridge.d.ts.map +1 -1
- package/dist/lite-bridge.js +47 -0
- package/dist/lite-bridge.js.map +1 -1
- package/dist/migrate-source-tags.d.ts +34 -0
- package/dist/migrate-source-tags.d.ts.map +1 -0
- package/dist/migrate-source-tags.js +179 -0
- package/dist/migrate-source-tags.js.map +1 -0
- package/dist/module-runtime.d.ts +57 -0
- package/dist/module-runtime.d.ts.map +1 -0
- package/dist/module-runtime.js +167 -0
- package/dist/module-runtime.js.map +1 -0
- package/dist/module-signing.d.ts +85 -0
- package/dist/module-signing.d.ts.map +1 -0
- package/dist/module-signing.js +136 -0
- package/dist/module-signing.js.map +1 -0
- package/dist/modules.d.ts +42 -0
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +124 -1
- package/dist/modules.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +27 -1
- package/dist/parser.js.map +1 -1
- package/dist/protocol.d.ts +234 -21
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +352 -32
- package/dist/protocol.js.map +1 -1
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +22 -2
- package/dist/renderer.js.map +1 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +17 -0
- package/dist/report.js.map +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +9 -3
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +118 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +44 -0
- package/dist/types.js.map +1 -1
- package/dist/validator.d.ts +26 -2
- package/dist/validator.d.ts.map +1 -1
- package/dist/validator.js +256 -19
- package/dist/validator.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { PRNG_ALGORITHM } from './prng.js';
|
|
2
|
+
import type { CalcEvaluationContext, ProtocolError } from '../protocol.js';
|
|
3
|
+
/** Hard ceiling on draws for one declaration. RFC 0005's proposed bound. */
|
|
4
|
+
export declare const MAX_STOCHASTIC_SAMPLES = 100000;
|
|
5
|
+
/** Minimum that produces a summary worth reporting. */
|
|
6
|
+
export declare const MIN_STOCHASTIC_SAMPLES = 2;
|
|
7
|
+
export type DistributionSpec = {
|
|
8
|
+
kind: 'uniform';
|
|
9
|
+
min: number;
|
|
10
|
+
max: number;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'normal';
|
|
13
|
+
mean: number;
|
|
14
|
+
stddev: number;
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'triangular';
|
|
17
|
+
min: number;
|
|
18
|
+
mode: number;
|
|
19
|
+
max: number;
|
|
20
|
+
};
|
|
21
|
+
export interface StochasticInput {
|
|
22
|
+
/** The dotted path this input replaces, exactly as an expression writes it. */
|
|
23
|
+
variable: string;
|
|
24
|
+
distribution: DistributionSpec;
|
|
25
|
+
}
|
|
26
|
+
export type SummaryStat = 'mean' | 'median' | 'p10' | 'p25' | 'p75' | 'p90' | 'min' | 'max' | 'stddev';
|
|
27
|
+
export declare const SUMMARY_STATS: readonly SummaryStat[];
|
|
28
|
+
export interface StochasticDecl {
|
|
29
|
+
id: string;
|
|
30
|
+
label: string;
|
|
31
|
+
/** An ordinary §VIII.1 safe expression. */
|
|
32
|
+
base_formula: string;
|
|
33
|
+
/**
|
|
34
|
+
* Inputs to draw. **Order is part of the contract**: one PRNG stream feeds
|
|
35
|
+
* them in declared order, so reordering the list changes every sample. That
|
|
36
|
+
* is a real constraint and the alternative — a stream per input — makes a
|
|
37
|
+
* declaration's output depend on a hidden per-input keying rule instead.
|
|
38
|
+
*/
|
|
39
|
+
inputs: StochasticInput[];
|
|
40
|
+
samples: number;
|
|
41
|
+
/** Required. A stochastic calc without one is not reproducible. */
|
|
42
|
+
seed: number;
|
|
43
|
+
summarize: SummaryStat[];
|
|
44
|
+
/** Off by default; 100,000 samples inline would make a document unreadable. */
|
|
45
|
+
return_samples?: boolean;
|
|
46
|
+
unit?: string;
|
|
47
|
+
round_to?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface StochasticSummary {
|
|
50
|
+
mean?: number | null;
|
|
51
|
+
median?: number | null;
|
|
52
|
+
p10?: number | null;
|
|
53
|
+
p25?: number | null;
|
|
54
|
+
p75?: number | null;
|
|
55
|
+
p90?: number | null;
|
|
56
|
+
min?: number | null;
|
|
57
|
+
max?: number | null;
|
|
58
|
+
stddev?: number | null;
|
|
59
|
+
}
|
|
60
|
+
export interface StochasticResult {
|
|
61
|
+
calc_id: string;
|
|
62
|
+
ok: boolean;
|
|
63
|
+
error?: ProtocolError;
|
|
64
|
+
summary?: StochasticSummary;
|
|
65
|
+
/** Present only when `return_samples` was set. */
|
|
66
|
+
samples?: number[];
|
|
67
|
+
/** Run parameters, echoed so a reader can tell what produced the numbers. */
|
|
68
|
+
sampled?: {
|
|
69
|
+
count: number;
|
|
70
|
+
seed: number;
|
|
71
|
+
algorithm: typeof PRNG_ALGORITHM;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Draws whose formula did not evaluate to a number. Excluded from the
|
|
75
|
+
* summary rather than counted as zero — a rate path that divides by zero
|
|
76
|
+
* says nothing about the distribution, and folding it in as 0 would drag
|
|
77
|
+
* every statistic toward it.
|
|
78
|
+
*/
|
|
79
|
+
failed_samples?: number;
|
|
80
|
+
unit?: string;
|
|
81
|
+
round_to?: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Evaluate a stochastic declaration into a distribution summary.
|
|
85
|
+
*
|
|
86
|
+
* Total: a malformed declaration returns `ok: false` with a typed error rather
|
|
87
|
+
* than throwing, matching `evaluateCalc` and `evaluateSensitivity`.
|
|
88
|
+
*/
|
|
89
|
+
export declare function evaluateStochastic(decl: StochasticDecl, ctx: CalcEvaluationContext): StochasticResult;
|
|
90
|
+
/**
|
|
91
|
+
* Narrow an unknown declaration, for hosts reading `custom_calculations`.
|
|
92
|
+
*
|
|
93
|
+
* Structural, like `isSensitivityDecl`: a block carrying `inputs` and `seed`
|
|
94
|
+
* alongside `base_formula` is a stochastic declaration.
|
|
95
|
+
*/
|
|
96
|
+
export declare function isStochasticDecl(value: unknown): value is StochasticDecl;
|
|
97
|
+
//# sourceMappingURL=stochastic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stochastic.d.ts","sourceRoot":"","sources":["../../src/calc/stochastic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
// Stochastic calculations (protocol §VIII.8, RFC 0005).
|
|
2
|
+
//
|
|
3
|
+
// CRE underwriting reasons about ranges: "DSCR is 1.45 base case but 1.20-1.65
|
|
4
|
+
// across rate paths". Today those numbers are computed in Excel and pasted in
|
|
5
|
+
// as plain values, losing the model behind them, or approximated as
|
|
6
|
+
// best/base/worst — which renders nicely and cannot answer "what is the
|
|
7
|
+
// probability this underwrites above our minimum DSCR?"
|
|
8
|
+
//
|
|
9
|
+
// **A declaration, like sensitivity, and for the same reason.** RFC 0005
|
|
10
|
+
// proposed `uniform()`, `normal()`, `triangular()`, and `monte_carlo(expr, n)`
|
|
11
|
+
// as grammar built-ins. Three problems, any one of which is disqualifying:
|
|
12
|
+
//
|
|
13
|
+
// 1. Every builtin in this engine is a pure `(CalcValue[]) => CalcValue`. A
|
|
14
|
+
// sampling builtin needs PRNG state, so it is not a function of its
|
|
15
|
+
// arguments — and "the calc engine is pure" is what makes a formula
|
|
16
|
+
// auditable.
|
|
17
|
+
// 2. `monte_carlo(expr, n)` takes an *expression*, but the evaluator
|
|
18
|
+
// evaluates arguments eagerly. Making it lazy means either a special-cased
|
|
19
|
+
// builtin or a string argument executed as a program.
|
|
20
|
+
// 3. The grammar would have to admit a call whose legality depends on the
|
|
21
|
+
// enclosing declaration's `deterministic` flag — a context-sensitive
|
|
22
|
+
// grammar, checked in a parser that is deliberately context-free.
|
|
23
|
+
//
|
|
24
|
+
// So the inputs are declared in JSON and each sample is an ordinary evaluation
|
|
25
|
+
// with `overrides` (§VIII.7.2) — the mechanism sensitivity tables already use.
|
|
26
|
+
// The grammar and the builtins are untouched, and `monte_carlo` is not a
|
|
27
|
+
// function but the shape of the whole declaration.
|
|
28
|
+
//
|
|
29
|
+
// **Determinism is the entire point.** A stochastic calc that two hosts
|
|
30
|
+
// evaluate differently is not a model, it is a rumor. The seed plus the
|
|
31
|
+
// normative PRNG (§VIII.8.2) plus a normative percentile rule (§VIII.8.3) is
|
|
32
|
+
// what makes the distribution reproducible.
|
|
33
|
+
import { evaluateCalc } from './index.js';
|
|
34
|
+
import { MAX_ROUND_TO, resolveRoundTo } from './quantize.js';
|
|
35
|
+
import { PRNG_ALGORITHM, Pcg64, sampleNormal, sampleTriangular, sampleUniform } from './prng.js';
|
|
36
|
+
/** Hard ceiling on draws for one declaration. RFC 0005's proposed bound. */
|
|
37
|
+
export const MAX_STOCHASTIC_SAMPLES = 100_000;
|
|
38
|
+
/** Minimum that produces a summary worth reporting. */
|
|
39
|
+
export const MIN_STOCHASTIC_SAMPLES = 2;
|
|
40
|
+
export const SUMMARY_STATS = Object.freeze([
|
|
41
|
+
'mean', 'median', 'p10', 'p25', 'p75', 'p90', 'min', 'max', 'stddev',
|
|
42
|
+
]);
|
|
43
|
+
function declError(id, code, message, pointer) {
|
|
44
|
+
return { calc_id: id, ok: false, error: { category: 'calc', code, message, pointer } };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Evaluate a stochastic declaration into a distribution summary.
|
|
48
|
+
*
|
|
49
|
+
* Total: a malformed declaration returns `ok: false` with a typed error rather
|
|
50
|
+
* than throwing, matching `evaluateCalc` and `evaluateSensitivity`.
|
|
51
|
+
*/
|
|
52
|
+
export function evaluateStochastic(decl, ctx) {
|
|
53
|
+
const problem = checkDecl(decl);
|
|
54
|
+
if (problem)
|
|
55
|
+
return problem;
|
|
56
|
+
const roundTo = resolveRoundTo({
|
|
57
|
+
...(decl.unit !== undefined ? { unit: decl.unit } : {}),
|
|
58
|
+
...(decl.round_to !== undefined ? { round_to: decl.round_to } : {}),
|
|
59
|
+
});
|
|
60
|
+
const rng = new Pcg64(decl.seed);
|
|
61
|
+
const values = [];
|
|
62
|
+
let failed = 0;
|
|
63
|
+
for (let i = 0; i < decl.samples; i++) {
|
|
64
|
+
const overrides = {};
|
|
65
|
+
// One stream, drawn in declared input order — see `StochasticDecl.inputs`.
|
|
66
|
+
for (const input of decl.inputs) {
|
|
67
|
+
overrides[input.variable] = draw(rng.nextDouble(), input.distribution);
|
|
68
|
+
}
|
|
69
|
+
const result = evaluateCalc({
|
|
70
|
+
id: decl.id,
|
|
71
|
+
label: decl.label,
|
|
72
|
+
formula: decl.base_formula,
|
|
73
|
+
deterministic: true,
|
|
74
|
+
...(decl.unit !== undefined ? { unit: decl.unit } : {}),
|
|
75
|
+
round_to: roundTo,
|
|
76
|
+
}, { ...ctx, overrides: { ...ctx.overrides, ...overrides } });
|
|
77
|
+
if (result.ok && typeof result.value === 'number' && Number.isFinite(result.value)) {
|
|
78
|
+
values.push(result.value);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
failed++;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
calc_id: decl.id,
|
|
86
|
+
ok: true,
|
|
87
|
+
summary: summarize(values, decl.summarize),
|
|
88
|
+
...(decl.return_samples ? { samples: values } : {}),
|
|
89
|
+
sampled: { count: decl.samples, seed: decl.seed, algorithm: PRNG_ALGORITHM },
|
|
90
|
+
failed_samples: failed,
|
|
91
|
+
...(decl.unit !== undefined ? { unit: decl.unit } : {}),
|
|
92
|
+
round_to: roundTo,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function draw(u, spec) {
|
|
96
|
+
switch (spec.kind) {
|
|
97
|
+
case 'uniform':
|
|
98
|
+
return sampleUniform(u, spec.min, spec.max);
|
|
99
|
+
case 'normal':
|
|
100
|
+
// Clamped away from the open interval's endpoints: `nextDouble` can
|
|
101
|
+
// return exactly 0, and the inverse CDF is unbounded there.
|
|
102
|
+
return sampleNormal(u === 0 ? Number.MIN_VALUE : u, spec.mean, spec.stddev);
|
|
103
|
+
case 'triangular':
|
|
104
|
+
return sampleTriangular(u, spec.min, spec.mode, spec.max);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Summary statistics.
|
|
109
|
+
*
|
|
110
|
+
* **Percentiles use nearest-rank, not interpolation** (§VIII.8.3). A percentile
|
|
111
|
+
* is therefore an actual observed sample, which makes it exactly reproducible
|
|
112
|
+
* whenever the samples are; interpolating between two neighbours introduces an
|
|
113
|
+
* arithmetic step whose result two hosts can round differently, for a number
|
|
114
|
+
* nobody reads to that precision anyway.
|
|
115
|
+
*/
|
|
116
|
+
function summarize(values, wanted) {
|
|
117
|
+
const summary = {};
|
|
118
|
+
// Every requested key is present even with no data, set to null. An absent
|
|
119
|
+
// key would be indistinguishable from one the declaration never asked for.
|
|
120
|
+
if (values.length === 0) {
|
|
121
|
+
for (const stat of wanted)
|
|
122
|
+
summary[stat] = null;
|
|
123
|
+
return summary;
|
|
124
|
+
}
|
|
125
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
126
|
+
const n = sorted.length;
|
|
127
|
+
const at = (fraction) => sorted[Math.max(0, Math.ceil(fraction * n) - 1)];
|
|
128
|
+
let sum = 0;
|
|
129
|
+
for (const v of values)
|
|
130
|
+
sum += v;
|
|
131
|
+
const mean = sum / n;
|
|
132
|
+
for (const stat of wanted) {
|
|
133
|
+
switch (stat) {
|
|
134
|
+
case 'mean':
|
|
135
|
+
summary.mean = mean;
|
|
136
|
+
break;
|
|
137
|
+
case 'median':
|
|
138
|
+
summary.median = at(0.5);
|
|
139
|
+
break;
|
|
140
|
+
case 'p10':
|
|
141
|
+
summary.p10 = at(0.1);
|
|
142
|
+
break;
|
|
143
|
+
case 'p25':
|
|
144
|
+
summary.p25 = at(0.25);
|
|
145
|
+
break;
|
|
146
|
+
case 'p75':
|
|
147
|
+
summary.p75 = at(0.75);
|
|
148
|
+
break;
|
|
149
|
+
case 'p90':
|
|
150
|
+
summary.p90 = at(0.9);
|
|
151
|
+
break;
|
|
152
|
+
case 'min':
|
|
153
|
+
summary.min = sorted[0];
|
|
154
|
+
break;
|
|
155
|
+
case 'max':
|
|
156
|
+
summary.max = sorted[n - 1];
|
|
157
|
+
break;
|
|
158
|
+
case 'stddev': {
|
|
159
|
+
if (n < 2) {
|
|
160
|
+
summary.stddev = null;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
// Sample standard deviation (n-1). A single draw has no spread, and
|
|
164
|
+
// reporting 0 would claim certainty the run does not have.
|
|
165
|
+
let acc = 0;
|
|
166
|
+
for (const v of values)
|
|
167
|
+
acc += (v - mean) * (v - mean);
|
|
168
|
+
summary.stddev = Math.sqrt(acc / (n - 1));
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return summary;
|
|
174
|
+
}
|
|
175
|
+
function checkDecl(decl) {
|
|
176
|
+
if (!Number.isInteger(decl.seed)) {
|
|
177
|
+
// The one refusal that is about reproducibility rather than shape: without
|
|
178
|
+
// a seed the calc produces a different answer every run, which is the exact
|
|
179
|
+
// opposite of what this format is for.
|
|
180
|
+
return declError(decl.id, 'CALC-STOCH-001', 'seed is required and must be an integer; a stochastic calc without one is not reproducible.', 'seed');
|
|
181
|
+
}
|
|
182
|
+
if (!Number.isInteger(decl.samples) ||
|
|
183
|
+
decl.samples < MIN_STOCHASTIC_SAMPLES ||
|
|
184
|
+
decl.samples > MAX_STOCHASTIC_SAMPLES) {
|
|
185
|
+
return declError(decl.id, 'CALC-STOCH-002', `samples must be an integer in [${MIN_STOCHASTIC_SAMPLES}, ${MAX_STOCHASTIC_SAMPLES}].`, 'samples');
|
|
186
|
+
}
|
|
187
|
+
if (!Array.isArray(decl.inputs) || decl.inputs.length === 0) {
|
|
188
|
+
// With no random inputs every draw is the same number, and the "summary" is
|
|
189
|
+
// a point estimate wearing a distribution's clothes.
|
|
190
|
+
return declError(decl.id, 'CALC-STOCH-005', 'inputs must list at least one random variable.', 'inputs');
|
|
191
|
+
}
|
|
192
|
+
const seenVariables = new Set();
|
|
193
|
+
for (const [idx, input] of decl.inputs.entries()) {
|
|
194
|
+
const pointer = `inputs[${idx}]`;
|
|
195
|
+
if (!input || typeof input.variable !== 'string' || input.variable.length === 0) {
|
|
196
|
+
return declError(decl.id, 'CALC-STOCH-003', `${pointer}.variable must be a non-empty path.`, `${pointer}.variable`);
|
|
197
|
+
}
|
|
198
|
+
if (seenVariables.has(input.variable)) {
|
|
199
|
+
// The later draw silently wins for every sample, and the earlier one is
|
|
200
|
+
// still consuming the stream — so the distribution is wrong in a way no
|
|
201
|
+
// output reveals.
|
|
202
|
+
return declError(decl.id, 'CALC-STOCH-003', `${pointer}.variable '${input.variable}' is drawn more than once.`, `${pointer}.variable`);
|
|
203
|
+
}
|
|
204
|
+
seenVariables.add(input.variable);
|
|
205
|
+
const bad = checkDistribution(input.distribution);
|
|
206
|
+
if (bad)
|
|
207
|
+
return declError(decl.id, 'CALC-STOCH-003', `${pointer}.distribution: ${bad}`, `${pointer}.distribution`);
|
|
208
|
+
}
|
|
209
|
+
if (!Array.isArray(decl.summarize) || decl.summarize.length === 0) {
|
|
210
|
+
return declError(decl.id, 'CALC-STOCH-004', 'summarize must name at least one statistic.', 'summarize');
|
|
211
|
+
}
|
|
212
|
+
for (const stat of decl.summarize) {
|
|
213
|
+
if (!SUMMARY_STATS.includes(stat)) {
|
|
214
|
+
return declError(decl.id, 'CALC-STOCH-004', `Unknown summary statistic '${stat}'; expected one of ${SUMMARY_STATS.join(', ')}.`, 'summarize');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (decl.round_to !== undefined &&
|
|
218
|
+
(!Number.isInteger(decl.round_to) || decl.round_to < 0 || decl.round_to > MAX_ROUND_TO)) {
|
|
219
|
+
return declError(decl.id, 'CALC-STOCH-006', `round_to must be an integer in [0, ${MAX_ROUND_TO}].`, 'round_to');
|
|
220
|
+
}
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
function checkDistribution(spec) {
|
|
224
|
+
if (!spec || typeof spec !== 'object')
|
|
225
|
+
return 'missing.';
|
|
226
|
+
const finite = (n) => typeof n === 'number' && Number.isFinite(n);
|
|
227
|
+
switch (spec.kind) {
|
|
228
|
+
case 'uniform':
|
|
229
|
+
if (!finite(spec.min) || !finite(spec.max))
|
|
230
|
+
return 'uniform needs finite min and max.';
|
|
231
|
+
if (spec.min >= spec.max)
|
|
232
|
+
return 'uniform needs min < max.';
|
|
233
|
+
return null;
|
|
234
|
+
case 'normal':
|
|
235
|
+
if (!finite(spec.mean) || !finite(spec.stddev))
|
|
236
|
+
return 'normal needs finite mean and stddev.';
|
|
237
|
+
if (spec.stddev <= 0)
|
|
238
|
+
return 'normal needs stddev > 0.';
|
|
239
|
+
return null;
|
|
240
|
+
case 'triangular':
|
|
241
|
+
if (!finite(spec.min) || !finite(spec.mode) || !finite(spec.max)) {
|
|
242
|
+
return 'triangular needs finite min, mode and max.';
|
|
243
|
+
}
|
|
244
|
+
if (!(spec.min <= spec.mode && spec.mode <= spec.max) || spec.min >= spec.max) {
|
|
245
|
+
return 'triangular needs min <= mode <= max and min < max.';
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
default:
|
|
249
|
+
return `unknown distribution kind '${spec.kind}'.`;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Narrow an unknown declaration, for hosts reading `custom_calculations`.
|
|
254
|
+
*
|
|
255
|
+
* Structural, like `isSensitivityDecl`: a block carrying `inputs` and `seed`
|
|
256
|
+
* alongside `base_formula` is a stochastic declaration.
|
|
257
|
+
*/
|
|
258
|
+
export function isStochasticDecl(value) {
|
|
259
|
+
return (typeof value === 'object' &&
|
|
260
|
+
value !== null &&
|
|
261
|
+
'base_formula' in value &&
|
|
262
|
+
'inputs' in value &&
|
|
263
|
+
'seed' in value);
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=stochastic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stochastic.js","sourceRoot":"","sources":["../../src/calc/stochastic.ts"],"names":[],"mappings":"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"}
|
package/dist/cascade.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade.d.ts","sourceRoot":"","sources":["../src/cascade.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAA4B,MAAM,YAAY,CAAC;AAIpF,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,OAAO,CACL,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7C;QACD,KAAK,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QACvD;;;;;;WAMG;QACH,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,+EAA+E;IAC/E,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;;;GAKG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,EAAG,wBAAwB,CAAU;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;gBAEjB,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;CAUpD;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,oBAAoB,GAAG,IAAI,CAmB7B;AAED,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,qFAAqF;IACrF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B;yDACqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC5C,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAID,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,kFAAkF;IAClF,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"cascade.d.ts","sourceRoot":"","sources":["../src/cascade.ts"],"names":[],"mappings":"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"}
|
package/dist/cascade.js
CHANGED
|
@@ -86,8 +86,12 @@ function findFieldOverride(block, rest) {
|
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
88
|
* Walk the parsed sections looking for a value at `field_path` whose effective
|
|
89
|
-
*
|
|
90
|
-
*
|
|
89
|
+
* resolution tag matches one of the wanted tags. Effective tag, per RFC 0031:
|
|
90
|
+
* field_override.resolution → field_override.source → block.meta.resolution →
|
|
91
|
+
* block.meta.source, most specific first. The two `source` fallbacks carry the
|
|
92
|
+
* pre-split spelling (a tag in the actor field), which §2.6 read-time
|
|
93
|
+
* interpretation keeps meaningful; a properly-split file matches on
|
|
94
|
+
* `resolution` and its actor never collides with a tag.
|
|
91
95
|
*
|
|
92
96
|
* Used to detect user_override / user_input / market_data values already
|
|
93
97
|
* recorded in the file. Returns the first match; multi-variant sections check
|
|
@@ -108,8 +112,8 @@ function findBySource(parsed, field_path, wanted) {
|
|
|
108
112
|
if (value === undefined)
|
|
109
113
|
continue;
|
|
110
114
|
const override = findFieldOverride(block, split.rest);
|
|
111
|
-
const effective = override?.source ?? block.meta.source;
|
|
112
|
-
if (wanted.includes(effective)) {
|
|
115
|
+
const effective = override?.resolution ?? override?.source ?? block.meta.resolution ?? block.meta.source;
|
|
116
|
+
if (effective !== undefined && wanted.includes(effective)) {
|
|
113
117
|
return { block, value, source: effective };
|
|
114
118
|
}
|
|
115
119
|
}
|
package/dist/cascade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade.js","sourceRoot":"","sources":["../src/cascade.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cascade.js","sourceRoot":"","sources":["../src/cascade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ViewerTier } from './protocol.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse `--flag`, `--flag value`, and `--flag=value` forms. A bare `--flag`
|
|
4
|
+
* whose next token is another flag (or nothing) is boolean `true`; otherwise
|
|
5
|
+
* it consumes the next token as its value. The `=` form never consumes the
|
|
6
|
+
* next token.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseFlags(rawArgs: string[]): Record<string, string | boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* The non-flag tokens, excluding any token `parseFlags` consumed as a flag's
|
|
11
|
+
* value. Mirrors `parseFlags`' consumption rule exactly: a `--flag=value`
|
|
12
|
+
* token is self-contained and a boolean `--flag` consumes nothing, so in both
|
|
13
|
+
* cases the following token stays positional. (An earlier inline version
|
|
14
|
+
* skipped the next token after *any* `--` token, so
|
|
15
|
+
* `uwmd parse --compact=true file.uwx.md` silently dropped the filename and
|
|
16
|
+
* died with a usage error.)
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractPositionals(rawArgs: string[]): string[];
|
|
19
|
+
/**
|
|
20
|
+
* Swap a UW-family extension for another, matching the longest known suffix
|
|
21
|
+
* case-insensitively while preserving the original casing of the stem. A path
|
|
22
|
+
* with no known suffix gets the extension appended.
|
|
23
|
+
*/
|
|
24
|
+
export declare function replaceUWExtension(file: string, extension: string): string;
|
|
25
|
+
/** The `--tier` flag as a ViewerTier, or undefined for absent/boolean forms. */
|
|
26
|
+
export declare function hostTierFlag(flags: Record<string, string | boolean>): ViewerTier | undefined;
|
|
27
|
+
/** Where fragments live for a record, unless told otherwise. */
|
|
28
|
+
export declare function defaultPartsDir(file: string): string;
|
|
29
|
+
/** Read and parse a JSON manifest, returning a result union instead of exiting. */
|
|
30
|
+
export declare function readManifestFile(path: string): {
|
|
31
|
+
ok: true;
|
|
32
|
+
manifest: unknown;
|
|
33
|
+
} | {
|
|
34
|
+
ok: false;
|
|
35
|
+
message: string;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=cli-args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAsB9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAa9D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAM1E;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,UAAU,GAAG,SAAS,CAG5F;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GACX;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAMlE"}
|
package/dist/cli-args.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Pure argument/path plumbing for the uwmd CLI, extracted from cli.ts so it
|
|
2
|
+
// can carry a sibling unit test — cli.ts itself is a top-level script (it
|
|
3
|
+
// reads process.argv and runs at import time), which is why it never had one.
|
|
4
|
+
// Nothing here touches stdout, process.exit, or the filesystem except
|
|
5
|
+
// readManifestFile, which returns a result union instead of exiting.
|
|
6
|
+
import { readFileSync } from 'node:fs';
|
|
7
|
+
import { resolve, dirname } from 'node:path';
|
|
8
|
+
import { UWX_EXTENSION } from './source-representation.js';
|
|
9
|
+
/**
|
|
10
|
+
* Parse `--flag`, `--flag value`, and `--flag=value` forms. A bare `--flag`
|
|
11
|
+
* whose next token is another flag (or nothing) is boolean `true`; otherwise
|
|
12
|
+
* it consumes the next token as its value. The `=` form never consumes the
|
|
13
|
+
* next token.
|
|
14
|
+
*/
|
|
15
|
+
export function parseFlags(rawArgs) {
|
|
16
|
+
const flags = {};
|
|
17
|
+
for (let i = 0; i < rawArgs.length; i++) {
|
|
18
|
+
const arg = rawArgs[i];
|
|
19
|
+
if (arg.startsWith('--')) {
|
|
20
|
+
const body = arg.slice(2);
|
|
21
|
+
const eqIdx = body.indexOf('=');
|
|
22
|
+
if (eqIdx >= 0) {
|
|
23
|
+
flags[body.slice(0, eqIdx)] = body.slice(eqIdx + 1);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const key = body;
|
|
27
|
+
const next = rawArgs[i + 1];
|
|
28
|
+
if (next && !next.startsWith('--')) {
|
|
29
|
+
flags[key] = next;
|
|
30
|
+
i++;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
flags[key] = true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return flags;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The non-flag tokens, excluding any token `parseFlags` consumed as a flag's
|
|
41
|
+
* value. Mirrors `parseFlags`' consumption rule exactly: a `--flag=value`
|
|
42
|
+
* token is self-contained and a boolean `--flag` consumes nothing, so in both
|
|
43
|
+
* cases the following token stays positional. (An earlier inline version
|
|
44
|
+
* skipped the next token after *any* `--` token, so
|
|
45
|
+
* `uwmd parse --compact=true file.uwx.md` silently dropped the filename and
|
|
46
|
+
* died with a usage error.)
|
|
47
|
+
*/
|
|
48
|
+
export function extractPositionals(rawArgs) {
|
|
49
|
+
const positional = [];
|
|
50
|
+
for (let i = 0; i < rawArgs.length; i++) {
|
|
51
|
+
const arg = rawArgs[i];
|
|
52
|
+
if (arg.startsWith('--')) {
|
|
53
|
+
const consumesNext = !arg.includes('=') && !!rawArgs[i + 1] && !rawArgs[i + 1].startsWith('--');
|
|
54
|
+
if (consumesNext)
|
|
55
|
+
i++;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
positional.push(arg);
|
|
59
|
+
}
|
|
60
|
+
return positional;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Swap a UW-family extension for another, matching the longest known suffix
|
|
64
|
+
* case-insensitively while preserving the original casing of the stem. A path
|
|
65
|
+
* with no known suffix gets the extension appended.
|
|
66
|
+
*/
|
|
67
|
+
export function replaceUWExtension(file, extension) {
|
|
68
|
+
const lower = file.toLowerCase();
|
|
69
|
+
for (const suffix of [UWX_EXTENSION, '.uw.csv.zip', '.uw.md', '.uw.json', '.uw.xml']) {
|
|
70
|
+
if (lower.endsWith(suffix))
|
|
71
|
+
return `${file.slice(0, -suffix.length)}${extension}`;
|
|
72
|
+
}
|
|
73
|
+
return `${file}${extension}`;
|
|
74
|
+
}
|
|
75
|
+
/** The `--tier` flag as a ViewerTier, or undefined for absent/boolean forms. */
|
|
76
|
+
export function hostTierFlag(flags) {
|
|
77
|
+
const tier = flags['tier'];
|
|
78
|
+
return typeof tier === 'string' ? tier : undefined;
|
|
79
|
+
}
|
|
80
|
+
/** Where fragments live for a record, unless told otherwise. */
|
|
81
|
+
export function defaultPartsDir(file) {
|
|
82
|
+
return resolve(dirname(resolve(file)), 'parts');
|
|
83
|
+
}
|
|
84
|
+
/** Read and parse a JSON manifest, returning a result union instead of exiting. */
|
|
85
|
+
export function readManifestFile(path) {
|
|
86
|
+
try {
|
|
87
|
+
return { ok: true, manifest: JSON.parse(readFileSync(resolve(path), 'utf-8')) };
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
return { ok: false, message: e instanceof Error ? e.message : String(e) };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=cli-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"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"}
|