@turnbuckle/aprs-calculator-services
Version:
Anchorpoint Risk Calculator Service.
76 lines (75 loc) • 3.43 kB
JavaScript
"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;