@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.
Files changed (115) hide show
  1. package/README.md +15 -4
  2. package/dist/analysisRecipe.d.ts +55 -0
  3. package/dist/analysisRecipe.d.ts.map +1 -0
  4. package/dist/analysisRecipe.js +627 -0
  5. package/dist/analysisRecipe.js.map +1 -0
  6. package/dist/classifications.d.ts +30 -0
  7. package/dist/classifications.d.ts.map +1 -0
  8. package/dist/classifications.js +207 -0
  9. package/dist/classifications.js.map +1 -0
  10. package/dist/customizationContracts.d.ts +749 -0
  11. package/dist/customizationContracts.d.ts.map +1 -0
  12. package/dist/customizationContracts.js +19 -0
  13. package/dist/customizationContracts.js.map +1 -0
  14. package/dist/descriptiveStatistics.d.ts +8 -0
  15. package/dist/descriptiveStatistics.d.ts.map +1 -0
  16. package/dist/descriptiveStatistics.js +283 -0
  17. package/dist/descriptiveStatistics.js.map +1 -0
  18. package/dist/diagnosticAggregation.d.ts.map +1 -1
  19. package/dist/diagnosticAggregation.js +16 -0
  20. package/dist/diagnosticAggregation.js.map +1 -1
  21. package/dist/diagnosticFreeze.d.ts +4 -0
  22. package/dist/diagnosticFreeze.d.ts.map +1 -0
  23. package/dist/diagnosticFreeze.js +37 -0
  24. package/dist/diagnosticFreeze.js.map +1 -0
  25. package/dist/diagnosticIdentityStream.d.ts +4 -0
  26. package/dist/diagnosticIdentityStream.d.ts.map +1 -1
  27. package/dist/diagnosticIdentityStream.js +32 -2
  28. package/dist/diagnosticIdentityStream.js.map +1 -1
  29. package/dist/diagnosticPreparation.d.ts +21 -0
  30. package/dist/diagnosticPreparation.d.ts.map +1 -1
  31. package/dist/diagnosticPreparation.js +231 -19
  32. package/dist/diagnosticPreparation.js.map +1 -1
  33. package/dist/diagnosticReview.d.ts.map +1 -1
  34. package/dist/diagnosticReview.js +43 -25
  35. package/dist/diagnosticReview.js.map +1 -1
  36. package/dist/diagnosticReviewSources.d.ts.map +1 -1
  37. package/dist/diagnosticReviewSources.js +25 -4
  38. package/dist/diagnosticReviewSources.js.map +1 -1
  39. package/dist/diagnosticReviewStore.d.ts +2 -0
  40. package/dist/diagnosticReviewStore.d.ts.map +1 -1
  41. package/dist/diagnosticReviewStore.js +110 -36
  42. package/dist/diagnosticReviewStore.js.map +1 -1
  43. package/dist/diagnosticRunner.d.ts.map +1 -1
  44. package/dist/diagnosticRunner.js +1 -8
  45. package/dist/diagnosticRunner.js.map +1 -1
  46. package/dist/exposureEarning.d.ts +12 -0
  47. package/dist/exposureEarning.d.ts.map +1 -0
  48. package/dist/exposureEarning.js +276 -0
  49. package/dist/exposureEarning.js.map +1 -0
  50. package/dist/exposureMovements.d.ts +8 -0
  51. package/dist/exposureMovements.d.ts.map +1 -0
  52. package/dist/exposureMovements.js +70 -0
  53. package/dist/exposureMovements.js.map +1 -0
  54. package/dist/exposureRevisions.d.ts +13 -0
  55. package/dist/exposureRevisions.d.ts.map +1 -0
  56. package/dist/exposureRevisions.js +161 -0
  57. package/dist/exposureRevisions.js.map +1 -0
  58. package/dist/financialPipeline.d.ts +14 -0
  59. package/dist/financialPipeline.d.ts.map +1 -0
  60. package/dist/financialPipeline.js +75 -0
  61. package/dist/financialPipeline.js.map +1 -0
  62. package/dist/financialTerms.d.ts +20 -0
  63. package/dist/financialTerms.d.ts.map +1 -0
  64. package/dist/financialTerms.js +205 -0
  65. package/dist/financialTerms.js.map +1 -0
  66. package/dist/fnvAccumulator.d.ts.map +1 -1
  67. package/dist/fnvAccumulator.js +11 -5
  68. package/dist/fnvAccumulator.js.map +1 -1
  69. package/dist/historyPreparation.d.ts +8 -0
  70. package/dist/historyPreparation.d.ts.map +1 -0
  71. package/dist/historyPreparation.js +557 -0
  72. package/dist/historyPreparation.js.map +1 -0
  73. package/dist/index.d.ts +15 -2
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +15 -2
  76. package/dist/index.js.map +1 -1
  77. package/dist/policyPeriods.d.ts +29 -0
  78. package/dist/policyPeriods.d.ts.map +1 -0
  79. package/dist/policyPeriods.js +322 -0
  80. package/dist/policyPeriods.js.map +1 -0
  81. package/dist/populations.d.ts +11 -0
  82. package/dist/populations.d.ts.map +1 -0
  83. package/dist/populations.js +264 -0
  84. package/dist/populations.js.map +1 -0
  85. package/dist/reservingAdapter.d.ts +16 -0
  86. package/dist/reservingAdapter.d.ts.map +1 -0
  87. package/dist/reservingAdapter.js +74 -0
  88. package/dist/reservingAdapter.js.map +1 -0
  89. package/dist/version.d.ts +1 -1
  90. package/dist/version.js +1 -1
  91. package/package.json +2 -2
  92. package/src/analysisRecipe.ts +696 -0
  93. package/src/classifications.ts +231 -0
  94. package/src/customizationContracts.ts +763 -0
  95. package/src/descriptiveStatistics.ts +320 -0
  96. package/src/diagnosticAggregation.ts +16 -0
  97. package/src/diagnosticFreeze.ts +37 -0
  98. package/src/diagnosticIdentityStream.ts +37 -2
  99. package/src/diagnosticPreparation.ts +259 -26
  100. package/src/diagnosticReview.ts +49 -27
  101. package/src/diagnosticReviewSources.ts +22 -3
  102. package/src/diagnosticReviewStore.ts +139 -54
  103. package/src/diagnosticRunner.ts +1 -11
  104. package/src/exposureEarning.ts +314 -0
  105. package/src/exposureMovements.ts +78 -0
  106. package/src/exposureRevisions.ts +186 -0
  107. package/src/financialPipeline.ts +93 -0
  108. package/src/financialTerms.ts +263 -0
  109. package/src/fnvAccumulator.ts +11 -5
  110. package/src/historyPreparation.ts +645 -0
  111. package/src/index.ts +28 -1
  112. package/src/policyPeriods.ts +375 -0
  113. package/src/populations.ts +307 -0
  114. package/src/reservingAdapter.ts +98 -0
  115. package/src/version.ts +1 -1
@@ -0,0 +1,98 @@
1
+ import type {
2
+ AnalysisMeasureDefinitionV1,
3
+ AnalysisResult,
4
+ AnalysisTriangleAdapterResult,
5
+ CustomizationCapabilityFinding,
6
+ HistoricalScalar,
7
+ } from "./customizationContracts.js";
8
+ import { snapshotDiagnosticJson } from "./diagnosticRuntime.js";
9
+ import type { TriangleKind } from "./types.js";
10
+
11
+ function finding(message: string, code: CustomizationCapabilityFinding["code"] = "incompatible-semantics"): CustomizationCapabilityFinding {
12
+ return {
13
+ code,
14
+ capability: "reserving-triangle-adapter",
15
+ path: "$.values.coordinates",
16
+ message,
17
+ };
18
+ }
19
+
20
+ function unavailable(message: string, code?: CustomizationCapabilityFinding["code"]): AnalysisTriangleAdapterResult {
21
+ return snapshotDiagnosticJson({ status: "unavailable", triangle: null, findings: [finding(message, code)] });
22
+ }
23
+
24
+ function scalarEqual(left: HistoricalScalar | undefined, right: HistoricalScalar): boolean {
25
+ return left === right || (typeof left === "number" && typeof right === "number" && Object.is(left, right));
26
+ }
27
+
28
+ /**
29
+ * Adapts one explicitly selected cumulative result slice to the legacy
30
+ * reserving triangle shape. Every non-axis coordinate must be fixed by the
31
+ * caller, so the adapter never combines or silently discards result cells.
32
+ */
33
+ export function adaptAnalysisResultToTriangle(input: {
34
+ readonly result: AnalysisResult;
35
+ readonly measure: AnalysisMeasureDefinitionV1;
36
+ readonly triangleKind: TriangleKind;
37
+ readonly originCoordinate: string;
38
+ readonly developmentAgeCoordinate: string;
39
+ readonly slice: Readonly<Record<string, HistoricalScalar>>;
40
+ }): AnalysisTriangleAdapterResult {
41
+ if (input.measure.developmentSemantics !== "cumulative")
42
+ return unavailable("A reserving triangle requires a cumulative measure");
43
+ if (input.measure.statistic.kind !== "sum")
44
+ return unavailable("The reserving triangle adapter supports direct sum measures only");
45
+ if (input.originCoordinate === input.developmentAgeCoordinate)
46
+ return unavailable("Origin and development-age coordinates must be distinct", "invalid-configuration");
47
+ if (Object.hasOwn(input.slice, input.originCoordinate) || Object.hasOwn(input.slice, input.developmentAgeCoordinate))
48
+ return unavailable("The result slice cannot fix either triangle axis", "invalid-configuration");
49
+
50
+ const candidates = input.result.values.filter((value) =>
51
+ value.measureId === input.measure.id &&
52
+ Object.entries(input.slice).every(([key, expected]) => scalarEqual(value.coordinates[key], expected)),
53
+ );
54
+ if (candidates.length === 0)
55
+ return unavailable("No result values match the requested measure and coordinate slice", "missing-prerequisite");
56
+
57
+ const allowedCoordinates = new Set([
58
+ input.originCoordinate,
59
+ input.developmentAgeCoordinate,
60
+ ...Object.keys(input.slice),
61
+ ]);
62
+ for (const value of candidates) {
63
+ const extra = Object.keys(value.coordinates).filter((key) => !allowedCoordinates.has(key));
64
+ if (extra.length > 0)
65
+ return unavailable(`Every non-axis coordinate must be fixed in slice; unresolved: ${extra.join(", ")}`);
66
+ const origin = value.coordinates[input.originCoordinate];
67
+ const age = value.coordinates[input.developmentAgeCoordinate];
68
+ if (typeof origin !== "string" || origin.length === 0)
69
+ return unavailable("Every selected value requires a nonempty string origin coordinate", "missing-prerequisite");
70
+ if (typeof age !== "number" || !Number.isSafeInteger(age) || age < 0)
71
+ return unavailable("Every selected value requires a nonnegative safe-integer development age in months", "missing-prerequisite");
72
+ }
73
+
74
+ const origins = [...new Set(candidates.map((value) => value.coordinates[input.originCoordinate] as string))].sort();
75
+ const ages = [...new Set(candidates.map((value) => value.coordinates[input.developmentAgeCoordinate] as number))].sort((a, b) => a - b);
76
+ const cells = new Map<string, number | null>();
77
+ for (const value of candidates) {
78
+ const origin = value.coordinates[input.originCoordinate] as string;
79
+ const age = value.coordinates[input.developmentAgeCoordinate] as number;
80
+ const key = `${origin}\u0000${age}`;
81
+ if (cells.has(key))
82
+ return unavailable(`Multiple result values map to triangle cell ${origin}/${age}`);
83
+ if (value.status === "available" && (typeof value.value !== "number" || !Number.isFinite(value.value)))
84
+ return unavailable(`Available result value for ${origin}/${age} is not finite`, "invalid-configuration");
85
+ cells.set(key, value.status === "available" ? value.value : null);
86
+ }
87
+
88
+ return snapshotDiagnosticJson({
89
+ status: "available",
90
+ triangle: {
91
+ kind: input.triangleKind,
92
+ origins,
93
+ ages,
94
+ values: origins.map((origin) => ages.map((age) => cells.get(`${origin}\u0000${age}`) ?? null)),
95
+ },
96
+ findings: [],
97
+ });
98
+ }
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** This package's runtime version. A test pins it to package.json. */
2
- export const CORE_PACKAGE_VERSION = "0.7.1";
2
+ export const CORE_PACKAGE_VERSION = "0.8.0";