@actuarial-ts/interchange 0.2.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/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +52 -0
- package/dist/convert/result.d.ts +45 -0
- package/dist/convert/result.d.ts.map +1 -0
- package/dist/convert/result.js +122 -0
- package/dist/convert/result.js.map +1 -0
- package/dist/convert/selection.d.ts +114 -0
- package/dist/convert/selection.d.ts.map +1 -0
- package/dist/convert/selection.js +383 -0
- package/dist/convert/selection.js.map +1 -0
- package/dist/convert/triangle.d.ts +49 -0
- package/dist/convert/triangle.d.ts.map +1 -0
- package/dist/convert/triangle.js +111 -0
- package/dist/convert/triangle.js.map +1 -0
- package/dist/envelope.d.ts +113 -0
- package/dist/envelope.d.ts.map +1 -0
- package/dist/envelope.js +139 -0
- package/dist/envelope.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/parse.d.ts +38 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +48 -0
- package/dist/parse.js.map +1 -0
- package/dist/referee/crosscheck.d.ts +38 -0
- package/dist/referee/crosscheck.d.ts.map +1 -0
- package/dist/referee/crosscheck.js +212 -0
- package/dist/referee/crosscheck.js.map +1 -0
- package/dist/referee/profiles.d.ts +36 -0
- package/dist/referee/profiles.d.ts.map +1 -0
- package/dist/referee/profiles.js +80 -0
- package/dist/referee/profiles.js.map +1 -0
- package/dist/schemas/bundle.d.ts +45 -0
- package/dist/schemas/bundle.d.ts.map +1 -0
- package/dist/schemas/bundle.js +20 -0
- package/dist/schemas/bundle.js.map +1 -0
- package/dist/schemas/crosscheck.d.ts +3567 -0
- package/dist/schemas/crosscheck.d.ts.map +1 -0
- package/dist/schemas/crosscheck.js +72 -0
- package/dist/schemas/crosscheck.js.map +1 -0
- package/dist/schemas/manifest.d.ts +43 -0
- package/dist/schemas/manifest.d.ts.map +1 -0
- package/dist/schemas/manifest.js +39 -0
- package/dist/schemas/manifest.js.map +1 -0
- package/dist/schemas/result.d.ts +2163 -0
- package/dist/schemas/result.d.ts.map +1 -0
- package/dist/schemas/result.js +95 -0
- package/dist/schemas/result.js.map +1 -0
- package/dist/schemas/selection.d.ts +10388 -0
- package/dist/schemas/selection.d.ts.map +1 -0
- package/dist/schemas/selection.js +138 -0
- package/dist/schemas/selection.js.map +1 -0
- package/dist/schemas/study.d.ts +62 -0
- package/dist/schemas/study.d.ts.map +1 -0
- package/dist/schemas/study.js +35 -0
- package/dist/schemas/study.js.map +1 -0
- package/dist/schemas/triangle.d.ts +1260 -0
- package/dist/schemas/triangle.d.ts.map +1 -0
- package/dist/schemas/triangle.js +120 -0
- package/dist/schemas/triangle.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import { ReservingError, computeDevelopmentFactors, fitTail, triangleFromGrid, } from "@actuarial-ts/core";
|
|
2
|
+
import { DEFAULT_GENERATOR, INTERCHANGE_SPEC_VERSION, stampIntegrity, } from "../envelope.js";
|
|
3
|
+
import { VALUE_AUTHORITATIVE_KINDS, selectionDocSchema, } from "../schemas/selection.js";
|
|
4
|
+
import { docToTriangle } from "./triangle.js";
|
|
5
|
+
/**
|
|
6
|
+
* core `LdfSelections` ↔ SelectionDoc, with the coherence rule (spec 3.2).
|
|
7
|
+
*
|
|
8
|
+
* THE COHERENCE RULE (normative): for COMPUTABLE intents (everything
|
|
9
|
+
* except judgmental/external), `value` MUST equal the intent's
|
|
10
|
+
* recomputation on the referenced triangle within 1e-9 relative. Every
|
|
11
|
+
* conforming importer verifies this and, per a strictness flag, warns or
|
|
12
|
+
* refuses (INCOHERENT_SELECTION) on divergence. Intent is authoritative
|
|
13
|
+
* for replay and promotion; values are authoritative only for
|
|
14
|
+
* judgmental/external intents.
|
|
15
|
+
*
|
|
16
|
+
* REPLAY CAPABILITY (spec 3.2 equivalence table): this shore recomputes
|
|
17
|
+
* only the cells the table marks `exact` for actuarial-ts —
|
|
18
|
+
* volume-weighted/simple all-period on any cadence, windowed n ∈ {5, 3}
|
|
19
|
+
* on 12-month cadence, geometric all-period, and medial {5, 1, 1} — via
|
|
20
|
+
* core's computeDevelopmentFactors, plus fitted tails via core's fitTail.
|
|
21
|
+
* Everything else (regression, other windows/trims, and any intent with
|
|
22
|
+
* origin exclusions, which core's menu machinery does not model) is
|
|
23
|
+
* value-only HERE: the value is accepted with a warning naming the
|
|
24
|
+
* limitation, never silently, and never recomputed with semantics the
|
|
25
|
+
* table does not claim. Cross-engine verification of those cells is the
|
|
26
|
+
* conformance suite's and the referee's business.
|
|
27
|
+
*/
|
|
28
|
+
/** Spec coherence tolerance: 1e-9 relative (spec 3.2). */
|
|
29
|
+
export const COHERENCE_TOLERANCE = 1e-9;
|
|
30
|
+
/** Menu key → interchange intent (the DEFAULT_AVERAGES mapping target). */
|
|
31
|
+
const MENU_INTENTS = {
|
|
32
|
+
"all-wtd": { kind: "volume-weighted" },
|
|
33
|
+
"all-str": { kind: "simple" },
|
|
34
|
+
"5-wtd": { kind: "volume-weighted", windowOriginPeriods: 5 },
|
|
35
|
+
"5-str": { kind: "simple", windowOriginPeriods: 5 },
|
|
36
|
+
"3-wtd": { kind: "volume-weighted", windowOriginPeriods: 3 },
|
|
37
|
+
"3-str": { kind: "simple", windowOriginPeriods: 3 },
|
|
38
|
+
"med-5x1": { kind: "medial", windowOriginPeriods: 5, excludeHigh: 1, excludeLow: 1 },
|
|
39
|
+
"geo-all": { kind: "geometric" },
|
|
40
|
+
};
|
|
41
|
+
const MENU_KEYS = Object.keys(MENU_INTENTS);
|
|
42
|
+
/** The interchange intent a standard-menu average key expresses. */
|
|
43
|
+
export function intentFromAverageKey(key) {
|
|
44
|
+
return { ...MENU_INTENTS[key] };
|
|
45
|
+
}
|
|
46
|
+
function hasExclusions(intent) {
|
|
47
|
+
return intent.exclusions !== undefined && intent.exclusions.length > 0;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The standard-menu key that replays this intent EXACTLY on the given
|
|
51
|
+
* cadence per the spec 3.2 equivalence table, or null (value-only here).
|
|
52
|
+
*/
|
|
53
|
+
export function averageKeyForIntent(intent, originLengthMonths) {
|
|
54
|
+
if (hasExclusions(intent))
|
|
55
|
+
return null;
|
|
56
|
+
const window = intent.windowOriginPeriods;
|
|
57
|
+
switch (intent.kind) {
|
|
58
|
+
case "volume-weighted":
|
|
59
|
+
if (window === undefined)
|
|
60
|
+
return "all-wtd";
|
|
61
|
+
if (originLengthMonths === 12 && (window === 5 || window === 3)) {
|
|
62
|
+
return window === 5 ? "5-wtd" : "3-wtd";
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
case "simple":
|
|
66
|
+
if (window === undefined)
|
|
67
|
+
return "all-str";
|
|
68
|
+
if (originLengthMonths === 12 && (window === 5 || window === 3)) {
|
|
69
|
+
return window === 5 ? "5-str" : "3-str";
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
case "geometric":
|
|
73
|
+
return window === undefined ? "geo-all" : null;
|
|
74
|
+
case "medial":
|
|
75
|
+
return originLengthMonths === 12 &&
|
|
76
|
+
window === 5 &&
|
|
77
|
+
intent.excludeHigh === 1 &&
|
|
78
|
+
intent.excludeLow === 1
|
|
79
|
+
? "med-5x1"
|
|
80
|
+
: null;
|
|
81
|
+
default:
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function isValueAuthoritative(kind) {
|
|
86
|
+
return VALUE_AUTHORITATIVE_KINDS.includes(kind);
|
|
87
|
+
}
|
|
88
|
+
/** The AverageSpec core recomputes an exactly-replayable intent with. */
|
|
89
|
+
function specForExactIntent(key) {
|
|
90
|
+
const kindByKey = {
|
|
91
|
+
"all-wtd": "weighted",
|
|
92
|
+
"all-str": "straight",
|
|
93
|
+
"5-wtd": "weighted",
|
|
94
|
+
"5-str": "straight",
|
|
95
|
+
"3-wtd": "weighted",
|
|
96
|
+
"3-str": "straight",
|
|
97
|
+
"med-5x1": "medial",
|
|
98
|
+
"geo-all": "geometric",
|
|
99
|
+
};
|
|
100
|
+
const spec = { key, label: key, kind: kindByKey[key] };
|
|
101
|
+
const years = MENU_INTENTS[key].windowOriginPeriods;
|
|
102
|
+
if (years !== undefined)
|
|
103
|
+
spec.years = years;
|
|
104
|
+
return spec;
|
|
105
|
+
}
|
|
106
|
+
const TAIL_METHOD_BY_FAMILY = {
|
|
107
|
+
"exponential-decay": "exponentialDecay",
|
|
108
|
+
"inverse-power": "inversePower",
|
|
109
|
+
};
|
|
110
|
+
function relativeDeviation(actual, expected) {
|
|
111
|
+
const scale = Math.max(Math.abs(actual), Math.abs(expected));
|
|
112
|
+
return scale === 0 ? 0 : Math.abs(actual - expected) / scale;
|
|
113
|
+
}
|
|
114
|
+
/** Maps development entries to triangle column indexes; refuses unknown or
|
|
115
|
+
* duplicated intervals. */
|
|
116
|
+
function mapEntriesToColumns(development, agesMonths) {
|
|
117
|
+
const seen = new Set();
|
|
118
|
+
return development.map((entry) => {
|
|
119
|
+
const j = agesMonths.findIndex((age, idx) => age === entry.fromAgeMonths && agesMonths[idx + 1] === entry.toAgeMonths);
|
|
120
|
+
if (j < 0) {
|
|
121
|
+
throw new ReservingError("BAD_INTERCHANGE", `Development interval ${entry.fromAgeMonths}→${entry.toAgeMonths} months does not match ` +
|
|
122
|
+
`adjacent triangle ages (agesMonths: ${agesMonths.join(", ")})`);
|
|
123
|
+
}
|
|
124
|
+
if (seen.has(j)) {
|
|
125
|
+
throw new ReservingError("BAD_INTERCHANGE", `Duplicate development entry for ${entry.fromAgeMonths}→${entry.toAgeMonths} months`);
|
|
126
|
+
}
|
|
127
|
+
seen.add(j);
|
|
128
|
+
return j;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/** Two-age sub-triangle for column j: recomputation without cross-column effects. */
|
|
132
|
+
function columnSubTriangle(tri, j) {
|
|
133
|
+
return triangleFromGrid(tri.kind, tri.origins, [tri.ages[j], tri.ages[j + 1]], tri.values.map((row) => [row[j] ?? null, row[j + 1] ?? null]));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Verifies the coherence rule for a selection body against its referenced
|
|
137
|
+
* triangle document. Verifies the appliesTo linkage first (tag + measure);
|
|
138
|
+
* a mismatch is BAD_INTERCHANGE, not incoherence.
|
|
139
|
+
*/
|
|
140
|
+
export function checkSelectionCoherence(selection, triangleDoc, options) {
|
|
141
|
+
if (selection.appliesTo.triangleIntegrity !== triangleDoc.integrity) {
|
|
142
|
+
throw new ReservingError("BAD_INTERCHANGE", `Selection applies to triangle ${selection.appliesTo.triangleIntegrity} but the supplied ` +
|
|
143
|
+
`triangle document's integrity is ${triangleDoc.integrity}`);
|
|
144
|
+
}
|
|
145
|
+
if (selection.appliesTo.measure !== triangleDoc.triangle.measure) {
|
|
146
|
+
throw new ReservingError("BAD_INTERCHANGE", `Selection applies to measure "${selection.appliesTo.measure}" but the triangle's measure ` +
|
|
147
|
+
`is "${triangleDoc.triangle.measure}"`);
|
|
148
|
+
}
|
|
149
|
+
const { triangle } = docToTriangle(triangleDoc);
|
|
150
|
+
const cadence = triangleDoc.triangle.originLengthMonths;
|
|
151
|
+
const agesMonths = triangleDoc.triangle.agesMonths;
|
|
152
|
+
const columns = mapEntriesToColumns(selection.development, agesMonths);
|
|
153
|
+
const findings = [];
|
|
154
|
+
const warnings = [];
|
|
155
|
+
selection.development.forEach((entry, idx) => {
|
|
156
|
+
const target = { fromAgeMonths: entry.fromAgeMonths, toAgeMonths: entry.toAgeMonths };
|
|
157
|
+
const label = `${entry.fromAgeMonths}→${entry.toAgeMonths}`;
|
|
158
|
+
if (isValueAuthoritative(entry.intent.kind)) {
|
|
159
|
+
findings.push({
|
|
160
|
+
target,
|
|
161
|
+
capability: "value-only",
|
|
162
|
+
authoritative: "value",
|
|
163
|
+
expected: null,
|
|
164
|
+
actual: entry.value,
|
|
165
|
+
relativeDeviation: null,
|
|
166
|
+
coherent: null,
|
|
167
|
+
note: `intent "${entry.intent.kind}": the value IS the judgment (rationale carries its justification)`,
|
|
168
|
+
});
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const menuKey = averageKeyForIntent(entry.intent, cadence);
|
|
172
|
+
if (menuKey === null) {
|
|
173
|
+
const reason = hasExclusions(entry.intent)
|
|
174
|
+
? "origin exclusions are beyond this shore's exact replay in Phase A"
|
|
175
|
+
: `intent "${entry.intent.kind}"${entry.intent.windowOriginPeriods !== undefined
|
|
176
|
+
? ` with windowOriginPeriods ${entry.intent.windowOriginPeriods}`
|
|
177
|
+
: ""} on ${cadence}-month cadence is not an exact actuarial-ts replay cell`;
|
|
178
|
+
findings.push({
|
|
179
|
+
target,
|
|
180
|
+
capability: "value-only",
|
|
181
|
+
authoritative: "intent",
|
|
182
|
+
expected: null,
|
|
183
|
+
actual: entry.value,
|
|
184
|
+
relativeDeviation: null,
|
|
185
|
+
coherent: null,
|
|
186
|
+
note: reason,
|
|
187
|
+
});
|
|
188
|
+
warnings.push(`Development ${label}: value accepted without recomputation — ${reason} ` +
|
|
189
|
+
"(spec 3.2 equivalence table)");
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const recomputed = computeDevelopmentFactors(columnSubTriangle(triangle, columns[idx]), [
|
|
193
|
+
specForExactIntent(menuKey),
|
|
194
|
+
]).averages[0].values[0];
|
|
195
|
+
if (recomputed === null) {
|
|
196
|
+
findings.push({
|
|
197
|
+
target,
|
|
198
|
+
capability: "exact",
|
|
199
|
+
authoritative: "intent",
|
|
200
|
+
expected: null,
|
|
201
|
+
actual: entry.value,
|
|
202
|
+
relativeDeviation: null,
|
|
203
|
+
coherent: false,
|
|
204
|
+
note: "the intent produces no factor on this triangle (no usable pairs in the window)",
|
|
205
|
+
});
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const deviation = relativeDeviation(entry.value, recomputed);
|
|
209
|
+
findings.push({
|
|
210
|
+
target,
|
|
211
|
+
capability: "exact",
|
|
212
|
+
authoritative: "intent",
|
|
213
|
+
expected: recomputed,
|
|
214
|
+
actual: entry.value,
|
|
215
|
+
relativeDeviation: deviation,
|
|
216
|
+
coherent: deviation <= COHERENCE_TOLERANCE,
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
if (selection.tail !== undefined) {
|
|
220
|
+
const tail = selection.tail;
|
|
221
|
+
if (isValueAuthoritative(tail.intent.kind)) {
|
|
222
|
+
findings.push({
|
|
223
|
+
target: "tail",
|
|
224
|
+
capability: "value-only",
|
|
225
|
+
authoritative: "value",
|
|
226
|
+
expected: null,
|
|
227
|
+
actual: tail.value,
|
|
228
|
+
relativeDeviation: null,
|
|
229
|
+
coherent: null,
|
|
230
|
+
note: `tail intent "${tail.intent.kind}": the value IS the judgment`,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
// Fitted tail: refit core's curve on the selection's own development
|
|
235
|
+
// factors (the fit runs on SELECTED factors), masking columns below
|
|
236
|
+
// fitFromAgeMonths.
|
|
237
|
+
const selectedLdfs = new Array(agesMonths.length - 1).fill(null);
|
|
238
|
+
selection.development.forEach((entry, idx) => {
|
|
239
|
+
selectedLdfs[columns[idx]] =
|
|
240
|
+
tail.intent.kind === "fitted" &&
|
|
241
|
+
tail.intent.fitFromAgeMonths !== undefined &&
|
|
242
|
+
entry.fromAgeMonths < tail.intent.fitFromAgeMonths
|
|
243
|
+
? null
|
|
244
|
+
: entry.value;
|
|
245
|
+
});
|
|
246
|
+
const fit = fitTail({
|
|
247
|
+
method: TAIL_METHOD_BY_FAMILY[tail.intent.family],
|
|
248
|
+
selectedLdfs,
|
|
249
|
+
});
|
|
250
|
+
if (!fit.valid) {
|
|
251
|
+
findings.push({
|
|
252
|
+
target: "tail",
|
|
253
|
+
capability: "exact",
|
|
254
|
+
authoritative: "intent",
|
|
255
|
+
expected: null,
|
|
256
|
+
actual: tail.value,
|
|
257
|
+
relativeDeviation: null,
|
|
258
|
+
coherent: false,
|
|
259
|
+
note: `the fitted-tail intent does not produce a valid fit on this selection: ${fit.warnings.join("; ")}`,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
const deviation = relativeDeviation(tail.value, fit.tailFactor);
|
|
264
|
+
findings.push({
|
|
265
|
+
target: "tail",
|
|
266
|
+
capability: "exact",
|
|
267
|
+
authoritative: "intent",
|
|
268
|
+
expected: fit.tailFactor,
|
|
269
|
+
actual: tail.value,
|
|
270
|
+
relativeDeviation: deviation,
|
|
271
|
+
coherent: deviation <= COHERENCE_TOLERANCE,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const divergent = findings.filter((f) => f.coherent === false);
|
|
277
|
+
for (const f of divergent) {
|
|
278
|
+
const where = f.target === "tail" ? "tail" : `${f.target.fromAgeMonths}→${f.target.toAgeMonths}`;
|
|
279
|
+
warnings.push(`INCOHERENT at ${where}: stated value ${f.actual}` +
|
|
280
|
+
(f.expected !== null
|
|
281
|
+
? ` but the intent recomputes to ${f.expected} (relative deviation ${f.relativeDeviation?.toExponential(3)}, tolerance ${COHERENCE_TOLERANCE})`
|
|
282
|
+
: ` but the intent is not computable on this triangle${f.note !== undefined ? ` (${f.note})` : ""}`));
|
|
283
|
+
}
|
|
284
|
+
if (divergent.length > 0 && options.strictness === "refuse") {
|
|
285
|
+
throw new ReservingError("INCOHERENT_SELECTION", `Selection violates the coherence rule (spec 3.2) at ${divergent.length} target(s): ` +
|
|
286
|
+
warnings.filter((w) => w.startsWith("INCOHERENT")).join(" | "));
|
|
287
|
+
}
|
|
288
|
+
return { coherent: divergent.length === 0, findings, warnings };
|
|
289
|
+
}
|
|
290
|
+
function resolveIntent(input) {
|
|
291
|
+
return typeof input === "string" && MENU_KEYS.includes(input)
|
|
292
|
+
? intentFromAverageKey(input)
|
|
293
|
+
: input;
|
|
294
|
+
}
|
|
295
|
+
export function selectionsToDoc(selections, options) {
|
|
296
|
+
const agesMonths = options.triangleDoc.triangle.agesMonths;
|
|
297
|
+
const nColumns = agesMonths.length - 1;
|
|
298
|
+
if (selections.selected.length !== nColumns) {
|
|
299
|
+
throw new ReservingError("SELECTION_SHAPE", `Expected ${nColumns} LDF selections (one per development interval), got ${selections.selected.length}`);
|
|
300
|
+
}
|
|
301
|
+
if (options.intents.length !== nColumns) {
|
|
302
|
+
throw new ReservingError("BAD_INTERCHANGE", `Expected ${nColumns} intents (one per development column), got ${options.intents.length}`);
|
|
303
|
+
}
|
|
304
|
+
const development = [];
|
|
305
|
+
for (let j = 0; j < nColumns; j++) {
|
|
306
|
+
const value = selections.selected[j];
|
|
307
|
+
if (value === null || value === undefined)
|
|
308
|
+
continue;
|
|
309
|
+
const intentInput = options.intents[j];
|
|
310
|
+
if (intentInput === null || intentInput === undefined) {
|
|
311
|
+
throw new ReservingError("BAD_INTERCHANGE", `Column ${agesMonths[j]}→${agesMonths[j + 1]} months has a selected factor but no intent; ` +
|
|
312
|
+
'hand-picked values need { kind: "judgmental", rationale: "..." }');
|
|
313
|
+
}
|
|
314
|
+
development.push({
|
|
315
|
+
fromAgeMonths: agesMonths[j],
|
|
316
|
+
toAgeMonths: agesMonths[j + 1],
|
|
317
|
+
value,
|
|
318
|
+
intent: resolveIntent(intentInput),
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
const body = {
|
|
322
|
+
appliesTo: {
|
|
323
|
+
measure: options.triangleDoc.triangle.measure,
|
|
324
|
+
triangleIntegrity: options.triangleDoc.integrity,
|
|
325
|
+
},
|
|
326
|
+
development,
|
|
327
|
+
};
|
|
328
|
+
if (options.tailIntent !== undefined) {
|
|
329
|
+
body.tail = { value: selections.tailFactor, intent: options.tailIntent };
|
|
330
|
+
}
|
|
331
|
+
else if (selections.tailFactor !== 1) {
|
|
332
|
+
throw new ReservingError("BAD_INTERCHANGE", `Tail factor ${selections.tailFactor} needs a tailIntent (fitted, or judgmental/external with rationale); ` +
|
|
333
|
+
"only a tail of exactly 1 may be omitted");
|
|
334
|
+
}
|
|
335
|
+
const coherence = checkSelectionCoherence(body, options.triangleDoc, {
|
|
336
|
+
strictness: options.strictness ?? "refuse",
|
|
337
|
+
});
|
|
338
|
+
const doc = stampIntegrity({
|
|
339
|
+
interchangeVersion: INTERCHANGE_SPEC_VERSION,
|
|
340
|
+
kind: "selection",
|
|
341
|
+
generator: options.generator ?? DEFAULT_GENERATOR,
|
|
342
|
+
createdAt: options.createdAt,
|
|
343
|
+
extensions: options.extensions ?? {},
|
|
344
|
+
selection: body,
|
|
345
|
+
});
|
|
346
|
+
const checked = selectionDocSchema.safeParse(doc);
|
|
347
|
+
if (!checked.success) {
|
|
348
|
+
throw new ReservingError("BAD_INTERCHANGE", `selectionsToDoc produced an invalid document: ${checked.error.issues
|
|
349
|
+
.map((i) => `${i.path.join(".") || "$"}: ${i.message}`)
|
|
350
|
+
.join("; ")}`);
|
|
351
|
+
}
|
|
352
|
+
return { doc: checked.data, coherence, warnings: coherence.warnings };
|
|
353
|
+
}
|
|
354
|
+
export function docToSelections(doc, options) {
|
|
355
|
+
const parsed = selectionDocSchema.safeParse(doc);
|
|
356
|
+
if (!parsed.success) {
|
|
357
|
+
throw new ReservingError("BAD_INTERCHANGE", `Not a valid SelectionDoc: ${parsed.error.issues
|
|
358
|
+
.map((i) => `${i.path.join(".") || "$"}: ${i.message}`)
|
|
359
|
+
.join("; ")}`);
|
|
360
|
+
}
|
|
361
|
+
const body = parsed.data.selection;
|
|
362
|
+
const agesMonths = options.triangleDoc.triangle.agesMonths;
|
|
363
|
+
const cadence = options.triangleDoc.triangle.originLengthMonths;
|
|
364
|
+
const coherence = checkSelectionCoherence(body, options.triangleDoc, {
|
|
365
|
+
strictness: options.strictness ?? "warn",
|
|
366
|
+
});
|
|
367
|
+
const columns = mapEntriesToColumns(body.development, agesMonths);
|
|
368
|
+
const selected = new Array(agesMonths.length - 1).fill(null);
|
|
369
|
+
const averageKeys = new Array(agesMonths.length - 1).fill(null);
|
|
370
|
+
body.development.forEach((entry, idx) => {
|
|
371
|
+
selected[columns[idx]] = entry.value;
|
|
372
|
+
averageKeys[columns[idx]] = isValueAuthoritative(entry.intent.kind)
|
|
373
|
+
? null
|
|
374
|
+
: averageKeyForIntent(entry.intent, cadence);
|
|
375
|
+
});
|
|
376
|
+
return {
|
|
377
|
+
selections: { selected, tailFactor: body.tail?.value ?? 1 },
|
|
378
|
+
averageKeys,
|
|
379
|
+
coherence,
|
|
380
|
+
warnings: coherence.warnings,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/convert/selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type Triangle } from "@actuarial-ts/core";
|
|
2
|
+
import { type GeneratorStamp } from "../envelope.js";
|
|
3
|
+
import { type Measure, type OriginLengthMonths, type TriangleBody, type TriangleDoc } from "../schemas/triangle.js";
|
|
4
|
+
/**
|
|
5
|
+
* core `Triangle` ↔ TriangleDoc.
|
|
6
|
+
*
|
|
7
|
+
* - The seven core TriangleKind values are the interchange measures of the
|
|
8
|
+
* same name, both directions.
|
|
9
|
+
* - Cadence: annual ("2023") and quarterly ("2023Q3") origin labels derive
|
|
10
|
+
* starts and originLengthMonths automatically; anything else needs
|
|
11
|
+
* explicit `originStarts` + `originLengthMonths`. Reading 1- or 6-month
|
|
12
|
+
* cadences parses with a capability warning (spec 3.2).
|
|
13
|
+
* - `createdAt` and `valuationDate` are caller-supplied — this module
|
|
14
|
+
* never reads a clock (purity rule).
|
|
15
|
+
* - Null means unobserved, both directions, always.
|
|
16
|
+
*/
|
|
17
|
+
export interface TriangleToDocOptions {
|
|
18
|
+
/** ISO timestamp for the envelope (caller-supplied; purity rule). */
|
|
19
|
+
createdAt: string;
|
|
20
|
+
/** ISO yyyy-mm-dd valuation date of the triangle. */
|
|
21
|
+
valuationDate: string;
|
|
22
|
+
/** Interchange measure; defaults to the core kind, which maps verbatim. */
|
|
23
|
+
measure?: Measure;
|
|
24
|
+
/** Whether values are cumulative. Core triangles are; defaults true. */
|
|
25
|
+
cumulative?: boolean;
|
|
26
|
+
/** Override when labels are not annual/quarterly (e.g. semiannual). */
|
|
27
|
+
originLengthMonths?: OriginLengthMonths;
|
|
28
|
+
/** Explicit origin period start dates; required when labels do not parse. */
|
|
29
|
+
originStarts?: string[];
|
|
30
|
+
basis?: TriangleBody["basis"];
|
|
31
|
+
units?: TriangleBody["units"];
|
|
32
|
+
segment?: TriangleBody["segment"];
|
|
33
|
+
extensions?: Record<string, unknown>;
|
|
34
|
+
generator?: GeneratorStamp;
|
|
35
|
+
}
|
|
36
|
+
export declare function triangleToDoc(tri: Triangle, options: TriangleToDocOptions): TriangleDoc;
|
|
37
|
+
export interface DocToTriangleResult {
|
|
38
|
+
triangle: Triangle;
|
|
39
|
+
warnings: string[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* TriangleDoc → core `Triangle`. Validates the document SCHEMA (integrity
|
|
43
|
+
* verification is parseDocument's job — pass documents through it first
|
|
44
|
+
* when provenance matters), maps the measure to a core kind, cumulates incremental
|
|
45
|
+
* values through core's `incrementalToCumulative` (with a warning), and
|
|
46
|
+
* channels reader-capability warnings for 1-/6-month cadences.
|
|
47
|
+
*/
|
|
48
|
+
export declare function docToTriangle(doc: unknown): DocToTriangleResult;
|
|
49
|
+
//# sourceMappingURL=triangle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triangle.d.ts","sourceRoot":"","sources":["../../src/convert/triangle.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAId,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,WAAW,EAEjB,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAqBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,GAAG,WAAW,CA6DvF;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAQD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,mBAAmB,CAkD/D"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { ReservingError, incrementalToCumulative, triangleFromGrid, } from "@actuarial-ts/core";
|
|
2
|
+
import { DEFAULT_GENERATOR, INTERCHANGE_SPEC_VERSION, stampIntegrity, } from "../envelope.js";
|
|
3
|
+
import { CORE_MEASURES, triangleDocSchema, } from "../schemas/triangle.js";
|
|
4
|
+
function deriveOrigin(label) {
|
|
5
|
+
const annual = /^(\d{4})$/.exec(label);
|
|
6
|
+
if (annual)
|
|
7
|
+
return { start: `${annual[1]}-01-01`, lengthMonths: 12 };
|
|
8
|
+
const quarterly = /^(\d{4})[Qq]([1-4])$/.exec(label);
|
|
9
|
+
if (quarterly) {
|
|
10
|
+
const month = (Number(quarterly[2]) - 1) * 3 + 1;
|
|
11
|
+
return {
|
|
12
|
+
start: `${quarterly[1]}-${String(month).padStart(2, "0")}-01`,
|
|
13
|
+
lengthMonths: 3,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
export function triangleToDoc(tri, options) {
|
|
19
|
+
let starts = options.originStarts;
|
|
20
|
+
let lengthMonths = options.originLengthMonths;
|
|
21
|
+
if (starts === undefined || lengthMonths === undefined) {
|
|
22
|
+
const derived = tri.origins.map(deriveOrigin);
|
|
23
|
+
const missing = derived.findIndex((d) => d === null);
|
|
24
|
+
if (missing >= 0) {
|
|
25
|
+
throw new ReservingError("BAD_INTERCHANGE", `Origin label "${tri.origins[missing]}" is neither annual ("2023") nor quarterly ` +
|
|
26
|
+
`("2023Q3"); supply originStarts and originLengthMonths explicitly`);
|
|
27
|
+
}
|
|
28
|
+
const lengths = new Set(derived.map((d) => d.lengthMonths));
|
|
29
|
+
if (lengths.size > 1) {
|
|
30
|
+
throw new ReservingError("BAD_INTERCHANGE", "Origin labels mix annual and quarterly forms; supply originStarts and originLengthMonths explicitly");
|
|
31
|
+
}
|
|
32
|
+
starts ??= derived.map((d) => d.start);
|
|
33
|
+
lengthMonths ??= derived[0].lengthMonths;
|
|
34
|
+
}
|
|
35
|
+
if (starts.length !== tri.origins.length) {
|
|
36
|
+
throw new ReservingError("BAD_INTERCHANGE", `originStarts has ${starts.length} entries but the triangle has ${tri.origins.length} origins`);
|
|
37
|
+
}
|
|
38
|
+
const body = {
|
|
39
|
+
measure: options.measure ?? tri.kind,
|
|
40
|
+
cumulative: options.cumulative ?? true,
|
|
41
|
+
originLengthMonths: lengthMonths,
|
|
42
|
+
origins: tri.origins.map((label, i) => ({ label, start: starts[i] })),
|
|
43
|
+
agesMonths: [...tri.ages],
|
|
44
|
+
values: tri.values.map((row) => [...row]),
|
|
45
|
+
valuationDate: options.valuationDate,
|
|
46
|
+
};
|
|
47
|
+
if (options.basis !== undefined)
|
|
48
|
+
body.basis = options.basis;
|
|
49
|
+
if (options.units !== undefined)
|
|
50
|
+
body.units = options.units;
|
|
51
|
+
if (options.segment !== undefined)
|
|
52
|
+
body.segment = options.segment;
|
|
53
|
+
const doc = stampIntegrity({
|
|
54
|
+
interchangeVersion: INTERCHANGE_SPEC_VERSION,
|
|
55
|
+
kind: "triangle",
|
|
56
|
+
generator: options.generator ?? DEFAULT_GENERATOR,
|
|
57
|
+
createdAt: options.createdAt,
|
|
58
|
+
extensions: options.extensions ?? {},
|
|
59
|
+
triangle: body,
|
|
60
|
+
});
|
|
61
|
+
const checked = triangleDocSchema.safeParse(doc);
|
|
62
|
+
if (!checked.success) {
|
|
63
|
+
throw new ReservingError("BAD_INTERCHANGE", `triangleToDoc produced an invalid document: ${checked.error.issues
|
|
64
|
+
.map((i) => i.message)
|
|
65
|
+
.join("; ")}`);
|
|
66
|
+
}
|
|
67
|
+
return checked.data;
|
|
68
|
+
}
|
|
69
|
+
function measureToKind(measure) {
|
|
70
|
+
return CORE_MEASURES.includes(measure)
|
|
71
|
+
? measure
|
|
72
|
+
: null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* TriangleDoc → core `Triangle`. Validates the document SCHEMA (integrity
|
|
76
|
+
* verification is parseDocument's job — pass documents through it first
|
|
77
|
+
* when provenance matters), maps the measure to a core kind, cumulates incremental
|
|
78
|
+
* values through core's `incrementalToCumulative` (with a warning), and
|
|
79
|
+
* channels reader-capability warnings for 1-/6-month cadences.
|
|
80
|
+
*/
|
|
81
|
+
export function docToTriangle(doc) {
|
|
82
|
+
const parsed = triangleDocSchema.safeParse(doc);
|
|
83
|
+
if (!parsed.success) {
|
|
84
|
+
throw new ReservingError("BAD_INTERCHANGE", `Not a valid TriangleDoc: ${parsed.error.issues
|
|
85
|
+
.map((i) => `${i.path.join(".") || "$"}: ${i.message}`)
|
|
86
|
+
.join("; ")}`);
|
|
87
|
+
}
|
|
88
|
+
const triangleDoc = parsed.data;
|
|
89
|
+
const body = triangleDoc.triangle;
|
|
90
|
+
const kind = measureToKind(body.measure);
|
|
91
|
+
if (kind === null) {
|
|
92
|
+
throw new ReservingError("BAD_INTERCHANGE", `Measure "${body.measure}" has no core triangle kind (core kinds: ${CORE_MEASURES.join(", ")}); ` +
|
|
93
|
+
"premium and custom measures are handled as exposure/reference data, not core triangles");
|
|
94
|
+
}
|
|
95
|
+
if (body.values === undefined) {
|
|
96
|
+
throw new ReservingError("BAD_INTERCHANGE", "This triangle carries only a bulk-lane valuesRef; Phase A converters require inline values");
|
|
97
|
+
}
|
|
98
|
+
const warnings = [];
|
|
99
|
+
if (body.originLengthMonths === 1 || body.originLengthMonths === 6) {
|
|
100
|
+
warnings.push(`originLengthMonths ${body.originLengthMonths} parsed successfully, but actuarial-ts ` +
|
|
101
|
+
"computes natively on 12- and 3-month cadences; computation support is limited");
|
|
102
|
+
}
|
|
103
|
+
let triangle = triangleFromGrid(kind, body.origins.map((o) => o.label), body.agesMonths, body.values);
|
|
104
|
+
if (!body.cumulative) {
|
|
105
|
+
triangle = incrementalToCumulative(triangle);
|
|
106
|
+
warnings.push("Incremental values were cumulated via core incrementalToCumulative (a null stops " +
|
|
107
|
+
"accumulation for its row); core methods run on cumulative triangles");
|
|
108
|
+
}
|
|
109
|
+
return { triangle, warnings };
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=triangle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triangle.js","sourceRoot":"","sources":["../../src/convert/triangle.ts"],"names":[],"mappings":"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"}
|