UNPKG

@turnbuckle/aprs-calculator-services

Version:

Anchorpoint Risk Calculator Service.

76 lines (75 loc) 3.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.kmultiply = exports.sumSquareMatrix = exports.calculateHazardRateMatrix = void 0; var mathjs_1 = require("mathjs"); var hazard_rate_helper_module_1 = require("../../common/hazard-rate-helper.module"); var ts_stopwatch_1 = require("ts-stopwatch"); var mathjs_2 = require("mathjs"); var assert_1 = require("../../common/assert"); function calculateHazardRateMatrix(input) { var sw = new ts_stopwatch_1.Stopwatch(); sw.start(); (0, assert_1.assert)(input.absorbingStates === 1 || input.absorbingStates === 2, "absorbingStates can only be 1 or 2"); var ageAnalysis = (0, hazard_rate_helper_module_1.applyAgeAnalysisCalculations)(input.ageAnalysis); var nlambdaMatrix = (0, hazard_rate_helper_module_1.nlambda)(ageAnalysis, input.maxRating, input.absorbingStates); var dlambdaMatrix = (0, hazard_rate_helper_module_1.dlambda)(ageAnalysis, input.maxRating); var lambdaMatrix = (0, hazard_rate_helper_module_1.lambda)(nlambdaMatrix, dlambdaMatrix); var lmax = 0; for (var i = 0; i < lambdaMatrix.length; i++) { for (var j = 0; j < lambdaMatrix[i].length; j++) { if ((0, mathjs_1.abs)(lambdaMatrix[i][j]) > lmax) { lmax = (0, mathjs_1.abs)(lambdaMatrix[i][j]); } } } var lstarMatrix = JSON.parse(JSON.stringify(lambdaMatrix)); for (var i = 0; i < lstarMatrix.length; i++) { lstarMatrix[i][i] += lmax; } var k = 2; var lookingForZero = true; var resolveValue; var maxIterations = 100; var threshold = 0.001; var diagMatrix = (0, hazard_rate_helper_module_1.diagonalMatrix)(input.maxRating, 1); var migrationMatrix = (0, mathjs_1.add)(lstarMatrix, diagMatrix); do { var mpowerk = (0, hazard_rate_helper_module_1.nthPowerMatrix)(lstarMatrix, k); var kmultiplyMatrix = kmultiply(mpowerk, k); migrationMatrix = (0, mathjs_1.add)(migrationMatrix, kmultiplyMatrix); resolveValue = sumSquareMatrix(kmultiplyMatrix); lookingForZero = resolveValue > threshold; k++; } while (lookingForZero && k < maxIterations); if (lookingForZero) { throw new Error("Unable to resolve the hazard rate in ".concat(maxIterations, " tries [").concat(resolveValue, "]")); } else { for (var i = 0; i < migrationMatrix.length; i++) { for (var j = 0; j < migrationMatrix[i].length; j++) { migrationMatrix[i][j] = (0, mathjs_1.exp)(-lmax) * migrationMatrix[i][j]; } } } sw.stop(); var output = { executeDuration: sw.getTime(), matrix: migrationMatrix, }; return output; } exports.calculateHazardRateMatrix = calculateHazardRateMatrix; function sumSquareMatrix(matrix) { return (0, mathjs_2.sum)((0, mathjs_2.map)(matrix, function (value) { return (0, mathjs_2.square)(value); })); } exports.sumSquareMatrix = sumSquareMatrix; function kmultiply(matrix, k) { var kFactorialMatrix = (0, hazard_rate_helper_module_1.createMatrix)(matrix.length, 1 / (0, mathjs_1.factorial)(k)); for (var i = 0; i < matrix.length; i++) { for (var j = 0; j < matrix[i].length; j++) { matrix[i][j] *= kFactorialMatrix[i][j]; } } return matrix; } exports.kmultiply = kmultiply;