@actuarial-ts/core 0.7.1 → 0.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/README.md +15 -4
- package/dist/analysisRecipe.d.ts +55 -0
- package/dist/analysisRecipe.d.ts.map +1 -0
- package/dist/analysisRecipe.js +627 -0
- package/dist/analysisRecipe.js.map +1 -0
- package/dist/classifications.d.ts +30 -0
- package/dist/classifications.d.ts.map +1 -0
- package/dist/classifications.js +207 -0
- package/dist/classifications.js.map +1 -0
- package/dist/customizationContracts.d.ts +749 -0
- package/dist/customizationContracts.d.ts.map +1 -0
- package/dist/customizationContracts.js +19 -0
- package/dist/customizationContracts.js.map +1 -0
- package/dist/descriptiveStatistics.d.ts +8 -0
- package/dist/descriptiveStatistics.d.ts.map +1 -0
- package/dist/descriptiveStatistics.js +283 -0
- package/dist/descriptiveStatistics.js.map +1 -0
- package/dist/diagnosticAggregation.d.ts.map +1 -1
- package/dist/diagnosticAggregation.js +16 -0
- package/dist/diagnosticAggregation.js.map +1 -1
- package/dist/diagnosticFreeze.d.ts +4 -0
- package/dist/diagnosticFreeze.d.ts.map +1 -0
- package/dist/diagnosticFreeze.js +37 -0
- package/dist/diagnosticFreeze.js.map +1 -0
- package/dist/diagnosticIdentityStream.d.ts +4 -0
- package/dist/diagnosticIdentityStream.d.ts.map +1 -1
- package/dist/diagnosticIdentityStream.js +32 -2
- package/dist/diagnosticIdentityStream.js.map +1 -1
- package/dist/diagnosticPreparation.d.ts +21 -0
- package/dist/diagnosticPreparation.d.ts.map +1 -1
- package/dist/diagnosticPreparation.js +231 -19
- package/dist/diagnosticPreparation.js.map +1 -1
- package/dist/diagnosticReview.d.ts.map +1 -1
- package/dist/diagnosticReview.js +43 -25
- package/dist/diagnosticReview.js.map +1 -1
- package/dist/diagnosticReviewSources.d.ts.map +1 -1
- package/dist/diagnosticReviewSources.js +25 -4
- package/dist/diagnosticReviewSources.js.map +1 -1
- package/dist/diagnosticReviewStore.d.ts +2 -0
- package/dist/diagnosticReviewStore.d.ts.map +1 -1
- package/dist/diagnosticReviewStore.js +110 -36
- package/dist/diagnosticReviewStore.js.map +1 -1
- package/dist/diagnosticRunner.d.ts.map +1 -1
- package/dist/diagnosticRunner.js +1 -8
- package/dist/diagnosticRunner.js.map +1 -1
- package/dist/exposureEarning.d.ts +12 -0
- package/dist/exposureEarning.d.ts.map +1 -0
- package/dist/exposureEarning.js +276 -0
- package/dist/exposureEarning.js.map +1 -0
- package/dist/exposureMovements.d.ts +8 -0
- package/dist/exposureMovements.d.ts.map +1 -0
- package/dist/exposureMovements.js +70 -0
- package/dist/exposureMovements.js.map +1 -0
- package/dist/exposureRevisions.d.ts +13 -0
- package/dist/exposureRevisions.d.ts.map +1 -0
- package/dist/exposureRevisions.js +161 -0
- package/dist/exposureRevisions.js.map +1 -0
- package/dist/financialPipeline.d.ts +14 -0
- package/dist/financialPipeline.d.ts.map +1 -0
- package/dist/financialPipeline.js +75 -0
- package/dist/financialPipeline.js.map +1 -0
- package/dist/financialTerms.d.ts +20 -0
- package/dist/financialTerms.d.ts.map +1 -0
- package/dist/financialTerms.js +205 -0
- package/dist/financialTerms.js.map +1 -0
- package/dist/fnvAccumulator.d.ts.map +1 -1
- package/dist/fnvAccumulator.js +11 -5
- package/dist/fnvAccumulator.js.map +1 -1
- package/dist/historyPreparation.d.ts +8 -0
- package/dist/historyPreparation.d.ts.map +1 -0
- package/dist/historyPreparation.js +557 -0
- package/dist/historyPreparation.js.map +1 -0
- package/dist/index.d.ts +15 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/policyPeriods.d.ts +29 -0
- package/dist/policyPeriods.d.ts.map +1 -0
- package/dist/policyPeriods.js +322 -0
- package/dist/policyPeriods.js.map +1 -0
- package/dist/populations.d.ts +11 -0
- package/dist/populations.d.ts.map +1 -0
- package/dist/populations.js +264 -0
- package/dist/populations.js.map +1 -0
- package/dist/reservingAdapter.d.ts +16 -0
- package/dist/reservingAdapter.d.ts.map +1 -0
- package/dist/reservingAdapter.js +74 -0
- package/dist/reservingAdapter.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/src/analysisRecipe.ts +696 -0
- package/src/classifications.ts +231 -0
- package/src/customizationContracts.ts +763 -0
- package/src/descriptiveStatistics.ts +320 -0
- package/src/diagnosticAggregation.ts +16 -0
- package/src/diagnosticFreeze.ts +37 -0
- package/src/diagnosticIdentityStream.ts +37 -2
- package/src/diagnosticPreparation.ts +259 -26
- package/src/diagnosticReview.ts +49 -27
- package/src/diagnosticReviewSources.ts +22 -3
- package/src/diagnosticReviewStore.ts +139 -54
- package/src/diagnosticRunner.ts +1 -11
- package/src/exposureEarning.ts +314 -0
- package/src/exposureMovements.ts +78 -0
- package/src/exposureRevisions.ts +186 -0
- package/src/financialPipeline.ts +93 -0
- package/src/financialTerms.ts +263 -0
- package/src/fnvAccumulator.ts +11 -5
- package/src/historyPreparation.ts +645 -0
- package/src/index.ts +28 -1
- package/src/policyPeriods.ts +375 -0
- package/src/populations.ts +307 -0
- package/src/reservingAdapter.ts +98 -0
- package/src/version.ts +1 -1
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { isRealIsoDate, snapshotDiagnosticJson } from "./diagnosticRuntime.js";
|
|
2
|
+
import { DiagnosticValidationError } from "./types.js";
|
|
3
|
+
const MAX_PREDICATE_DEPTH = 64;
|
|
4
|
+
const MAX_PREDICATE_NODES = 1_000;
|
|
5
|
+
function scalarType(value) {
|
|
6
|
+
if (value === null)
|
|
7
|
+
return "null";
|
|
8
|
+
if (typeof value === "string")
|
|
9
|
+
return "string";
|
|
10
|
+
if (typeof value === "number")
|
|
11
|
+
return "number";
|
|
12
|
+
return "boolean";
|
|
13
|
+
}
|
|
14
|
+
function compatible(value, dimension) {
|
|
15
|
+
if (value === null)
|
|
16
|
+
return true;
|
|
17
|
+
if (dimension.type === "date")
|
|
18
|
+
return typeof value === "string" && isRealIsoDate(value);
|
|
19
|
+
if (dimension.type === "entity-reference")
|
|
20
|
+
return typeof value === "string";
|
|
21
|
+
return typeof value === dimension.type && (typeof value !== "number" || Number.isFinite(value));
|
|
22
|
+
}
|
|
23
|
+
/** Validates the closed predicate vocabulary, references, types, and bounds. */
|
|
24
|
+
export function validateAnalysisPredicate(predicate, dimensions) {
|
|
25
|
+
const byId = new Map(dimensions.map((dimension) => [dimension.id, dimension]));
|
|
26
|
+
const issues = [];
|
|
27
|
+
const stack = [
|
|
28
|
+
{ value: predicate, path: "$", depth: 1 },
|
|
29
|
+
];
|
|
30
|
+
let nodes = 0;
|
|
31
|
+
while (stack.length > 0) {
|
|
32
|
+
const { value, path, depth } = stack.pop();
|
|
33
|
+
nodes += 1;
|
|
34
|
+
if (nodes > MAX_PREDICATE_NODES) {
|
|
35
|
+
issues.push({
|
|
36
|
+
domain: "definition",
|
|
37
|
+
code: "expression-limit",
|
|
38
|
+
path: "$",
|
|
39
|
+
message: `Predicate exceeds ${MAX_PREDICATE_NODES} nodes`,
|
|
40
|
+
});
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
if (depth > MAX_PREDICATE_DEPTH) {
|
|
44
|
+
issues.push({
|
|
45
|
+
domain: "definition",
|
|
46
|
+
code: "expression-limit",
|
|
47
|
+
path,
|
|
48
|
+
message: `Predicate exceeds depth ${MAX_PREDICATE_DEPTH}`,
|
|
49
|
+
});
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if ("terms" in value) {
|
|
53
|
+
if (value.terms.length === 0)
|
|
54
|
+
issues.push({
|
|
55
|
+
domain: "definition",
|
|
56
|
+
code: "invalid-configuration",
|
|
57
|
+
path: `${path}.terms`,
|
|
58
|
+
message: `${value.op} requires at least one term`,
|
|
59
|
+
});
|
|
60
|
+
value.terms.forEach((term, index) => stack.push({ value: term, path: `${path}.terms[${index}]`, depth: depth + 1 }));
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if ("term" in value) {
|
|
64
|
+
stack.push({ value: value.term, path: `${path}.term`, depth: depth + 1 });
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (!("dimensionId" in value))
|
|
68
|
+
continue;
|
|
69
|
+
const dimension = byId.get(value.dimensionId);
|
|
70
|
+
if (dimension === undefined) {
|
|
71
|
+
issues.push({
|
|
72
|
+
domain: "definition",
|
|
73
|
+
code: "unknown-reference",
|
|
74
|
+
path: `${path}.dimensionId`,
|
|
75
|
+
message: `Predicate references unknown dimension ${value.dimensionId}`,
|
|
76
|
+
});
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (value.op === "eq" && !compatible(value.value, dimension))
|
|
80
|
+
issues.push({
|
|
81
|
+
domain: "definition",
|
|
82
|
+
code: "incompatible-semantics",
|
|
83
|
+
path: `${path}.value`,
|
|
84
|
+
message: `Value type ${scalarType(value.value)} is incompatible with ${dimension.type} dimension ${dimension.id}`,
|
|
85
|
+
});
|
|
86
|
+
if (value.op === "in")
|
|
87
|
+
value.values.forEach((item, index) => {
|
|
88
|
+
if (!compatible(item, dimension))
|
|
89
|
+
issues.push({
|
|
90
|
+
domain: "definition",
|
|
91
|
+
code: "incompatible-semantics",
|
|
92
|
+
path: `${path}.values[${index}]`,
|
|
93
|
+
message: `Value type ${scalarType(item)} is incompatible with ${dimension.type} dimension ${dimension.id}`,
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
if (value.op === "range") {
|
|
97
|
+
if (dimension.type !== "number" && dimension.type !== "date")
|
|
98
|
+
issues.push({
|
|
99
|
+
domain: "definition",
|
|
100
|
+
code: "incompatible-semantics",
|
|
101
|
+
path,
|
|
102
|
+
message: `Range requires a number or date dimension; ${dimension.id} is ${dimension.type}`,
|
|
103
|
+
});
|
|
104
|
+
for (const [field, endpoint] of [
|
|
105
|
+
["minimum", value.minimum],
|
|
106
|
+
["maximum", value.maximum],
|
|
107
|
+
])
|
|
108
|
+
if (endpoint !== undefined &&
|
|
109
|
+
!compatible(endpoint, dimension))
|
|
110
|
+
issues.push({
|
|
111
|
+
domain: "definition",
|
|
112
|
+
code: "incompatible-semantics",
|
|
113
|
+
path: `${path}.${field}`,
|
|
114
|
+
message: `Range endpoint is incompatible with ${dimension.type} dimension ${dimension.id}`,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (issues.length > 0)
|
|
119
|
+
throw new DiagnosticValidationError(issues);
|
|
120
|
+
return snapshotDiagnosticJson(predicate);
|
|
121
|
+
}
|
|
122
|
+
function invert(value) {
|
|
123
|
+
return value === "match" ? "no-match" : value === "no-match" ? "match" : "unknown";
|
|
124
|
+
}
|
|
125
|
+
function valuesOf(dimensions, id) {
|
|
126
|
+
const value = dimensions[id];
|
|
127
|
+
return value === undefined ? undefined : Array.isArray(value) ? value : [value];
|
|
128
|
+
}
|
|
129
|
+
function compareRange(value, predicate) {
|
|
130
|
+
if (typeof value !== "number" && typeof value !== "string")
|
|
131
|
+
return false;
|
|
132
|
+
const compare = (left, right) => {
|
|
133
|
+
if (typeof left !== typeof right)
|
|
134
|
+
return Number.NaN;
|
|
135
|
+
if (typeof left === "number" && typeof right === "number")
|
|
136
|
+
return left === right ? 0 : left < right ? -1 : 1;
|
|
137
|
+
if (typeof left === "string" && typeof right === "string")
|
|
138
|
+
return left === right ? 0 : left < right ? -1 : 1;
|
|
139
|
+
return Number.NaN;
|
|
140
|
+
};
|
|
141
|
+
const lower = predicate.minimum === undefined ||
|
|
142
|
+
(predicate.includeMinimum
|
|
143
|
+
? compare(value, predicate.minimum) >= 0
|
|
144
|
+
: compare(value, predicate.minimum) > 0);
|
|
145
|
+
const upper = predicate.maximum === undefined ||
|
|
146
|
+
(predicate.includeMaximum
|
|
147
|
+
? compare(value, predicate.maximum) <= 0
|
|
148
|
+
: compare(value, predicate.maximum) < 0);
|
|
149
|
+
return lower && upper;
|
|
150
|
+
}
|
|
151
|
+
function observationDimensions(observation) {
|
|
152
|
+
return {
|
|
153
|
+
...observation.dimensions,
|
|
154
|
+
sourceNamespace: observation.sourceNamespace,
|
|
155
|
+
claimId: observation.claimId,
|
|
156
|
+
evaluationDate: observation.evaluationDate,
|
|
157
|
+
...(observation.accidentDate === null ? {} : { accidentDate: observation.accidentDate }),
|
|
158
|
+
...(observation.reportDate === null ? {} : { reportDate: observation.reportDate }),
|
|
159
|
+
...(observation.status === null ? {} : { status: observation.status }),
|
|
160
|
+
...(observation.relationships.claimantIds === undefined
|
|
161
|
+
? {}
|
|
162
|
+
: { claimantIds: observation.relationships.claimantIds }),
|
|
163
|
+
...(observation.relationships.occurrenceId === undefined
|
|
164
|
+
? {}
|
|
165
|
+
: { occurrenceId: observation.relationships.occurrenceId }),
|
|
166
|
+
...(observation.relationships.policyIds === undefined
|
|
167
|
+
? {}
|
|
168
|
+
: { policyIds: observation.relationships.policyIds }),
|
|
169
|
+
...(observation.relationships.coverageIds === undefined
|
|
170
|
+
? {}
|
|
171
|
+
: { coverageIds: observation.relationships.coverageIds }),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
export function evaluateAnalysisPredicate(predicateInput, dimensions, catalog) {
|
|
175
|
+
const predicate = validateAnalysisPredicate(predicateInput, catalog);
|
|
176
|
+
const evaluate = (value) => {
|
|
177
|
+
if (!("dimensionId" in value)) {
|
|
178
|
+
if (value.op === "true")
|
|
179
|
+
return "match";
|
|
180
|
+
if (value.op === "not")
|
|
181
|
+
return invert(evaluate(value.term));
|
|
182
|
+
const terms = value.terms.map(evaluate);
|
|
183
|
+
return value.op === "and"
|
|
184
|
+
? terms.includes("no-match")
|
|
185
|
+
? "no-match"
|
|
186
|
+
: terms.includes("unknown")
|
|
187
|
+
? "unknown"
|
|
188
|
+
: "match"
|
|
189
|
+
: terms.includes("match")
|
|
190
|
+
? "match"
|
|
191
|
+
: terms.includes("unknown")
|
|
192
|
+
? "unknown"
|
|
193
|
+
: "no-match";
|
|
194
|
+
}
|
|
195
|
+
const actual = valuesOf(dimensions, value.dimensionId);
|
|
196
|
+
if (value.op === "missing")
|
|
197
|
+
return (actual === undefined || actual.every((item) => item === null)) === value.isMissing
|
|
198
|
+
? "match"
|
|
199
|
+
: "no-match";
|
|
200
|
+
if (actual === undefined || actual.every((item) => item === null))
|
|
201
|
+
return "unknown";
|
|
202
|
+
const observed = actual.filter((item) => item !== null);
|
|
203
|
+
if (value.op === "eq")
|
|
204
|
+
return observed.some((item) => Object.is(item, value.value)) ? "match" : "no-match";
|
|
205
|
+
if (value.op === "in")
|
|
206
|
+
return observed.some((item) => value.values.some((expected) => Object.is(item, expected)))
|
|
207
|
+
? "match"
|
|
208
|
+
: "no-match";
|
|
209
|
+
if (value.op === "range")
|
|
210
|
+
return observed.some((item) => compareRange(item, value)) ? "match" : "no-match";
|
|
211
|
+
return "no-match";
|
|
212
|
+
};
|
|
213
|
+
return evaluate(predicate);
|
|
214
|
+
}
|
|
215
|
+
function latestOnOrBefore(history, asOfDate) {
|
|
216
|
+
return history
|
|
217
|
+
.filter((observation) => observation.evaluationDate <= asOfDate)
|
|
218
|
+
.sort((left, right) => left.evaluationDate === right.evaluationDate
|
|
219
|
+
? 0
|
|
220
|
+
: left.evaluationDate < right.evaluationDate
|
|
221
|
+
? 1
|
|
222
|
+
: -1)[0];
|
|
223
|
+
}
|
|
224
|
+
export function evaluateAnalysisScope(input) {
|
|
225
|
+
const classification = input.scope.classification;
|
|
226
|
+
const asOfDate = classification.kind === "as-observed" ? null : classification.asOfDate;
|
|
227
|
+
const classified = classification.kind === "as-observed"
|
|
228
|
+
? input.observation
|
|
229
|
+
: latestOnOrBefore(input.claimHistory, classification.asOfDate);
|
|
230
|
+
if (classified === undefined)
|
|
231
|
+
return snapshotDiagnosticJson({
|
|
232
|
+
scopeId: input.scope.id,
|
|
233
|
+
sourceNamespace: input.observation.sourceNamespace,
|
|
234
|
+
claimId: input.observation.claimId,
|
|
235
|
+
evaluationDate: input.observation.evaluationDate,
|
|
236
|
+
outcome: "unknown",
|
|
237
|
+
classificationDate: asOfDate,
|
|
238
|
+
finding: {
|
|
239
|
+
code: "missing-prerequisite",
|
|
240
|
+
capability: "typed-populations",
|
|
241
|
+
path: `$.scopes.${input.scope.id}`,
|
|
242
|
+
message: `No classification observation exists on or before ${asOfDate}`,
|
|
243
|
+
requiredFields: ["classification observation"],
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
const outcome = evaluateAnalysisPredicate(input.scope.predicate, observationDimensions(classified), input.dimensions);
|
|
247
|
+
return snapshotDiagnosticJson({
|
|
248
|
+
scopeId: input.scope.id,
|
|
249
|
+
sourceNamespace: input.observation.sourceNamespace,
|
|
250
|
+
claimId: input.observation.claimId,
|
|
251
|
+
evaluationDate: input.observation.evaluationDate,
|
|
252
|
+
outcome,
|
|
253
|
+
classificationDate: classified.evaluationDate,
|
|
254
|
+
finding: outcome !== "unknown"
|
|
255
|
+
? null
|
|
256
|
+
: {
|
|
257
|
+
code: "missing-prerequisite",
|
|
258
|
+
capability: "typed-populations",
|
|
259
|
+
path: `$.scopes.${input.scope.id}.predicate`,
|
|
260
|
+
message: "Predicate result is unknown because a required dimension is missing",
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=populations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"populations.js","sourceRoot":"","sources":["../src/populations.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAkC,MAAM,YAAY,CAAC;AAEvF,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAElC,SAAS,UAAU,CAAC,KAAuB;IACzC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CACjB,KAAuB,EACvB,SAAsC;IAEtC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;IACxF,IAAI,SAAS,CAAC,IAAI,KAAK,kBAAkB;QAAE,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IAC5E,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,yBAAyB,CACvC,SAA4B,EAC5B,UAAkD;IAElD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAgC,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAgE;QACzE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;KAC1C,CAAC;IACF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC5C,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,KAAK,GAAG,mBAAmB,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,kBAAkB;gBACxB,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,qBAAqB,mBAAmB,QAAQ;aAC1D,CAAC,CAAC;YACH,MAAM;QACR,CAAC;QACD,IAAI,KAAK,GAAG,mBAAmB,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,kBAAkB;gBACxB,IAAI;gBACJ,OAAO,EAAE,2BAA2B,mBAAmB,EAAE;aAC1D,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YACrB,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACV,MAAM,EAAE,YAAY;oBACpB,IAAI,EAAE,uBAAuB;oBAC7B,IAAI,EAAE,GAAG,IAAI,QAAQ;oBACrB,OAAO,EAAE,GAAG,KAAK,CAAC,EAAE,6BAA6B;iBAClD,CAAC,CAAC;YACL,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,UAAU,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACrH,SAAS;QACX,CAAC;QACD,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,aAAa,IAAI,KAAK,CAAC;YAAE,SAAS;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,mBAAmB;gBACzB,IAAI,EAAE,GAAG,IAAI,cAAc;gBAC3B,OAAO,EAAE,0CAA0C,KAAK,CAAC,WAAW,EAAE;aACvE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,wBAAwB;gBAC9B,IAAI,EAAE,GAAG,IAAI,QAAQ;gBACrB,OAAO,EAAE,cAAc,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,SAAS,CAAC,IAAI,cAAc,SAAS,CAAC,EAAE,EAAE;aAClH,CAAC,CAAC;QACL,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI;YACnB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACnC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC;oBAC9B,MAAM,CAAC,IAAI,CAAC;wBACV,MAAM,EAAE,YAAY;wBACpB,IAAI,EAAE,wBAAwB;wBAC9B,IAAI,EAAE,GAAG,IAAI,WAAW,KAAK,GAAG;wBAChC,OAAO,EAAE,cAAc,UAAU,CAAC,IAAI,CAAC,yBAAyB,SAAS,CAAC,IAAI,cAAc,SAAS,CAAC,EAAE,EAAE;qBAC3G,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACL,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM;gBAC1D,MAAM,CAAC,IAAI,CAAC;oBACV,MAAM,EAAE,YAAY;oBACpB,IAAI,EAAE,wBAAwB;oBAC9B,IAAI;oBACJ,OAAO,EAAE,8CAA8C,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC,IAAI,EAAE;iBAC3F,CAAC,CAAC;YACL,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI;gBAC9B,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;gBAC1B,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;aAClB;gBACR,IACE,QAAQ,KAAK,SAAS;oBACtB,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;oBAEhC,MAAM,CAAC,IAAI,CAAC;wBACV,MAAM,EAAE,YAAY;wBACpB,IAAI,EAAE,wBAAwB;wBAC9B,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE;wBACxB,OAAO,EAAE,uCAAuC,SAAS,CAAC,IAAI,cAAc,SAAS,CAAC,EAAE,EAAE;qBAC3F,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACnE,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,MAAM,CAAC,KAA+B;IAC7C,OAAO,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACrF,CAAC;AAED,SAAS,QAAQ,CACf,UAAoF,EACpF,EAAU;IAEV,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC7B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAyB,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,YAAY,CACnB,KAAuB,EACvB,SAAsD;IAEtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzE,MAAM,OAAO,GAAG,CAAC,IAAqB,EAAE,KAAsB,EAAU,EAAE;QACxE,IAAI,OAAO,IAAI,KAAK,OAAO,KAAK;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC;QACpD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YACvD,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YACvD,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,GAAG,CAAC;IACpB,CAAC,CAAC;IACF,MAAM,KAAK,GACT,SAAS,CAAC,OAAO,KAAK,SAAS;QAC/B,CAAC,SAAS,CAAC,cAAc;YACvB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;YACxC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,KAAK,GACT,SAAS,CAAC,OAAO,KAAK,SAAS;QAC/B,CAAC,SAAS,CAAC,cAAc;YACvB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;YACxC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,KAAK,IAAI,KAAK,CAAC;AACxB,CAAC;AAED,SAAS,qBAAqB,CAC5B,WAA0C;IAE1C,OAAO;QACL,GAAG,WAAW,CAAC,UAAU;QACzB,eAAe,EAAE,WAAW,CAAC,eAAe;QAC5C,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,cAAc,EAAE,WAAW,CAAC,cAAc;QAC1C,GAAG,CAAC,WAAW,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC;QACxF,GAAG,CAAC,WAAW,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC;QAClF,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;QACtE,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,KAAK,SAAS;YACrD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAC3D,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,YAAY,KAAK,SAAS;YACtD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QAC7D,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,KAAK,SAAS;YACnD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QACvD,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,KAAK,SAAS;YACrD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,cAAiC,EACjC,UAAoF,EACpF,OAA+C;IAE/C,MAAM,SAAS,GAAG,yBAAyB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAC,KAAwB,EAA4B,EAAE;QACtE,IAAI,CAAC,CAAC,aAAa,IAAI,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM;gBAAE,OAAO,OAAO,CAAC;YACxC,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK;gBAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC,EAAE,KAAK,KAAK;gBACvB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAC1B,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;wBACzB,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,OAAO;gBACb,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACvB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;wBACzB,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,UAAU,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;YACxB,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS;gBACxF,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,UAAU,CAAC;QACjB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QACpF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;QAC3G,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI;YACnB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACxF,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,UAAU,CAAC;QACjB,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO;YACtB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;QACnF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;IACF,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAiD,EACjD,QAAgB;IAEhB,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,cAAc,IAAI,QAAQ,CAAC;SAC/D,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,IAAI,CAAC,cAAc,KAAK,KAAK,CAAC,cAAc;QAC1C,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc;YAC1C,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,CAAC,CACT,CAAC,CAAC,CAAC,CAAC;AACT,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAKrC;IACC,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;IAClD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC;IACxF,MAAM,UAAU,GACd,cAAc,CAAC,IAAI,KAAK,aAAa;QACnC,CAAC,CAAC,KAAK,CAAC,WAAW;QACnB,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACpE,IAAI,UAAU,KAAK,SAAS;QAC1B,OAAO,sBAAsB,CAAC;YAC5B,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;YACvB,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC,eAAe;YAClD,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO;YAClC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,cAAc;YAChD,OAAO,EAAE,SAAS;YAClB,kBAAkB,EAAE,QAAS;YAC7B,OAAO,EAAE;gBACP,IAAI,EAAE,sBAAsB;gBAC5B,UAAU,EAAE,mBAAmB;gBAC/B,IAAI,EAAE,YAAY,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE;gBAClC,OAAO,EAAE,qDAAqD,QAAQ,EAAE;gBACxE,cAAc,EAAE,CAAC,4BAA4B,CAAC;aAC/C;SACF,CAAC,CAAC;IACL,MAAM,OAAO,GAAG,yBAAyB,CACvC,KAAK,CAAC,KAAK,CAAC,SAAS,EACrB,qBAAqB,CAAC,UAAU,CAAC,EACjC,KAAK,CAAC,UAAU,CACjB,CAAC;IACF,OAAO,sBAAsB,CAAC;QAC5B,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;QACvB,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC,eAAe;QAClD,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO;QAClC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,cAAc;QAChD,OAAO;QACP,kBAAkB,EAAE,UAAU,CAAC,cAAc;QAC7C,OAAO,EACL,OAAO,KAAK,SAAS;YACnB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC;gBACE,IAAI,EAAE,sBAAsB;gBAC5B,UAAU,EAAE,mBAAmB;gBAC/B,IAAI,EAAE,YAAY,KAAK,CAAC,KAAK,CAAC,EAAE,YAAY;gBAC5C,OAAO,EAAE,qEAAqE;aAC/E;KACR,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AnalysisMeasureDefinitionV1, AnalysisResult, AnalysisTriangleAdapterResult, HistoricalScalar } from "./customizationContracts.js";
|
|
2
|
+
import type { TriangleKind } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Adapts one explicitly selected cumulative result slice to the legacy
|
|
5
|
+
* reserving triangle shape. Every non-axis coordinate must be fixed by the
|
|
6
|
+
* caller, so the adapter never combines or silently discards result cells.
|
|
7
|
+
*/
|
|
8
|
+
export declare function adaptAnalysisResultToTriangle(input: {
|
|
9
|
+
readonly result: AnalysisResult;
|
|
10
|
+
readonly measure: AnalysisMeasureDefinitionV1;
|
|
11
|
+
readonly triangleKind: TriangleKind;
|
|
12
|
+
readonly originCoordinate: string;
|
|
13
|
+
readonly developmentAgeCoordinate: string;
|
|
14
|
+
readonly slice: Readonly<Record<string, HistoricalScalar>>;
|
|
15
|
+
}): AnalysisTriangleAdapterResult;
|
|
16
|
+
//# sourceMappingURL=reservingAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reservingAdapter.d.ts","sourceRoot":"","sources":["../src/reservingAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,cAAc,EACd,6BAA6B,EAE7B,gBAAgB,EACjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAmB/C;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;CAC5D,GAAG,6BAA6B,CA0DhC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { snapshotDiagnosticJson } from "./diagnosticRuntime.js";
|
|
2
|
+
function finding(message, code = "incompatible-semantics") {
|
|
3
|
+
return {
|
|
4
|
+
code,
|
|
5
|
+
capability: "reserving-triangle-adapter",
|
|
6
|
+
path: "$.values.coordinates",
|
|
7
|
+
message,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function unavailable(message, code) {
|
|
11
|
+
return snapshotDiagnosticJson({ status: "unavailable", triangle: null, findings: [finding(message, code)] });
|
|
12
|
+
}
|
|
13
|
+
function scalarEqual(left, right) {
|
|
14
|
+
return left === right || (typeof left === "number" && typeof right === "number" && Object.is(left, right));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Adapts one explicitly selected cumulative result slice to the legacy
|
|
18
|
+
* reserving triangle shape. Every non-axis coordinate must be fixed by the
|
|
19
|
+
* caller, so the adapter never combines or silently discards result cells.
|
|
20
|
+
*/
|
|
21
|
+
export function adaptAnalysisResultToTriangle(input) {
|
|
22
|
+
if (input.measure.developmentSemantics !== "cumulative")
|
|
23
|
+
return unavailable("A reserving triangle requires a cumulative measure");
|
|
24
|
+
if (input.measure.statistic.kind !== "sum")
|
|
25
|
+
return unavailable("The reserving triangle adapter supports direct sum measures only");
|
|
26
|
+
if (input.originCoordinate === input.developmentAgeCoordinate)
|
|
27
|
+
return unavailable("Origin and development-age coordinates must be distinct", "invalid-configuration");
|
|
28
|
+
if (Object.hasOwn(input.slice, input.originCoordinate) || Object.hasOwn(input.slice, input.developmentAgeCoordinate))
|
|
29
|
+
return unavailable("The result slice cannot fix either triangle axis", "invalid-configuration");
|
|
30
|
+
const candidates = input.result.values.filter((value) => value.measureId === input.measure.id &&
|
|
31
|
+
Object.entries(input.slice).every(([key, expected]) => scalarEqual(value.coordinates[key], expected)));
|
|
32
|
+
if (candidates.length === 0)
|
|
33
|
+
return unavailable("No result values match the requested measure and coordinate slice", "missing-prerequisite");
|
|
34
|
+
const allowedCoordinates = new Set([
|
|
35
|
+
input.originCoordinate,
|
|
36
|
+
input.developmentAgeCoordinate,
|
|
37
|
+
...Object.keys(input.slice),
|
|
38
|
+
]);
|
|
39
|
+
for (const value of candidates) {
|
|
40
|
+
const extra = Object.keys(value.coordinates).filter((key) => !allowedCoordinates.has(key));
|
|
41
|
+
if (extra.length > 0)
|
|
42
|
+
return unavailable(`Every non-axis coordinate must be fixed in slice; unresolved: ${extra.join(", ")}`);
|
|
43
|
+
const origin = value.coordinates[input.originCoordinate];
|
|
44
|
+
const age = value.coordinates[input.developmentAgeCoordinate];
|
|
45
|
+
if (typeof origin !== "string" || origin.length === 0)
|
|
46
|
+
return unavailable("Every selected value requires a nonempty string origin coordinate", "missing-prerequisite");
|
|
47
|
+
if (typeof age !== "number" || !Number.isSafeInteger(age) || age < 0)
|
|
48
|
+
return unavailable("Every selected value requires a nonnegative safe-integer development age in months", "missing-prerequisite");
|
|
49
|
+
}
|
|
50
|
+
const origins = [...new Set(candidates.map((value) => value.coordinates[input.originCoordinate]))].sort();
|
|
51
|
+
const ages = [...new Set(candidates.map((value) => value.coordinates[input.developmentAgeCoordinate]))].sort((a, b) => a - b);
|
|
52
|
+
const cells = new Map();
|
|
53
|
+
for (const value of candidates) {
|
|
54
|
+
const origin = value.coordinates[input.originCoordinate];
|
|
55
|
+
const age = value.coordinates[input.developmentAgeCoordinate];
|
|
56
|
+
const key = `${origin}\u0000${age}`;
|
|
57
|
+
if (cells.has(key))
|
|
58
|
+
return unavailable(`Multiple result values map to triangle cell ${origin}/${age}`);
|
|
59
|
+
if (value.status === "available" && (typeof value.value !== "number" || !Number.isFinite(value.value)))
|
|
60
|
+
return unavailable(`Available result value for ${origin}/${age} is not finite`, "invalid-configuration");
|
|
61
|
+
cells.set(key, value.status === "available" ? value.value : null);
|
|
62
|
+
}
|
|
63
|
+
return snapshotDiagnosticJson({
|
|
64
|
+
status: "available",
|
|
65
|
+
triangle: {
|
|
66
|
+
kind: input.triangleKind,
|
|
67
|
+
origins,
|
|
68
|
+
ages,
|
|
69
|
+
values: origins.map((origin) => ages.map((age) => cells.get(`${origin}\u0000${age}`) ?? null)),
|
|
70
|
+
},
|
|
71
|
+
findings: [],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=reservingAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reservingAdapter.js","sourceRoot":"","sources":["../src/reservingAdapter.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actuarial-ts/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Pure, zero-dependency P&C actuarial math for TypeScript: reserving, generalized definition-driven diagnostics, trends, limits, discounting, and seeded stochastic methods with published-value validation.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@types/node": "^22.10.5",
|
|
63
63
|
"typescript": "^5.7.3",
|
|
64
|
-
"vitest": "^
|
|
64
|
+
"vitest": "^5.0.1"
|
|
65
65
|
},
|
|
66
66
|
"publishConfig": {
|
|
67
67
|
"access": "public"
|