@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.
Files changed (64) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +52 -0
  4. package/dist/convert/result.d.ts +45 -0
  5. package/dist/convert/result.d.ts.map +1 -0
  6. package/dist/convert/result.js +122 -0
  7. package/dist/convert/result.js.map +1 -0
  8. package/dist/convert/selection.d.ts +114 -0
  9. package/dist/convert/selection.d.ts.map +1 -0
  10. package/dist/convert/selection.js +383 -0
  11. package/dist/convert/selection.js.map +1 -0
  12. package/dist/convert/triangle.d.ts +49 -0
  13. package/dist/convert/triangle.d.ts.map +1 -0
  14. package/dist/convert/triangle.js +111 -0
  15. package/dist/convert/triangle.js.map +1 -0
  16. package/dist/envelope.d.ts +113 -0
  17. package/dist/envelope.d.ts.map +1 -0
  18. package/dist/envelope.js +139 -0
  19. package/dist/envelope.js.map +1 -0
  20. package/dist/index.d.ts +15 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +15 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/parse.d.ts +38 -0
  25. package/dist/parse.d.ts.map +1 -0
  26. package/dist/parse.js +48 -0
  27. package/dist/parse.js.map +1 -0
  28. package/dist/referee/crosscheck.d.ts +38 -0
  29. package/dist/referee/crosscheck.d.ts.map +1 -0
  30. package/dist/referee/crosscheck.js +212 -0
  31. package/dist/referee/crosscheck.js.map +1 -0
  32. package/dist/referee/profiles.d.ts +36 -0
  33. package/dist/referee/profiles.d.ts.map +1 -0
  34. package/dist/referee/profiles.js +80 -0
  35. package/dist/referee/profiles.js.map +1 -0
  36. package/dist/schemas/bundle.d.ts +45 -0
  37. package/dist/schemas/bundle.d.ts.map +1 -0
  38. package/dist/schemas/bundle.js +20 -0
  39. package/dist/schemas/bundle.js.map +1 -0
  40. package/dist/schemas/crosscheck.d.ts +3567 -0
  41. package/dist/schemas/crosscheck.d.ts.map +1 -0
  42. package/dist/schemas/crosscheck.js +72 -0
  43. package/dist/schemas/crosscheck.js.map +1 -0
  44. package/dist/schemas/manifest.d.ts +43 -0
  45. package/dist/schemas/manifest.d.ts.map +1 -0
  46. package/dist/schemas/manifest.js +39 -0
  47. package/dist/schemas/manifest.js.map +1 -0
  48. package/dist/schemas/result.d.ts +2163 -0
  49. package/dist/schemas/result.d.ts.map +1 -0
  50. package/dist/schemas/result.js +95 -0
  51. package/dist/schemas/result.js.map +1 -0
  52. package/dist/schemas/selection.d.ts +10388 -0
  53. package/dist/schemas/selection.d.ts.map +1 -0
  54. package/dist/schemas/selection.js +138 -0
  55. package/dist/schemas/selection.js.map +1 -0
  56. package/dist/schemas/study.d.ts +62 -0
  57. package/dist/schemas/study.d.ts.map +1 -0
  58. package/dist/schemas/study.js +35 -0
  59. package/dist/schemas/study.js.map +1 -0
  60. package/dist/schemas/triangle.d.ts +1260 -0
  61. package/dist/schemas/triangle.d.ts.map +1 -0
  62. package/dist/schemas/triangle.js +120 -0
  63. package/dist/schemas/triangle.js.map +1 -0
  64. 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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"}