UNPKG

baskin-lib

Version:
82 lines (81 loc) 3.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getFullLoseProbMat = exports.getLoseVecRev = exports.getLoseVec = exports.getLookupMatRev = exports.getLookupMat = exports.getChooseProb = void 0; const linarg_1 = require("./linarg"); const modifier_1 = require("./modifier"); /** * * @param loseVec Lose rate of available choices. Act as a minimization objective. * - ex. [.1, .2, .7] : lose rate .1 after calling 1 number, * lose rate .2 after calling 2 number, * lose rate .7 after calling 3 number. * Thus, AI will call 3 numbers. * @param options Optional settings * @param options.absTol Arithematic error tolerance on comparison. * @returns Optimal choose rate for each choice. */ function getChooseProb(loseVec, { absTol = 10e-5 } = {}) { const lowest = (0, linarg_1.vecFindMin)(loseVec); const check = loseVec.map((x) => Math.abs(x - lowest) < absTol ? 1 : 0); const result = (0, linarg_1.vecNormalize)(check); return result; } exports.getChooseProb = getChooseProb; function getLookupMat(loseMat, maxCall, currentNum) { const startRow = currentNum + 1; const endRow = currentNum + maxCall + 1; const lookupMat = loseMat.slice(startRow, endRow); return lookupMat; } exports.getLookupMat = getLookupMat; function getLookupMatRev(loseMat, maxCall, currentNum, numEnd) { const currentIdx = numEnd - currentNum; const endRow = Math.max(currentIdx, 0); const startRow = Math.max(currentIdx - maxCall, 0); const lookupMat = loseMat.slice(startRow, endRow); return lookupMat; } exports.getLookupMatRev = getLookupMatRev; /** * * @param loseMat * @param maxCall * @param currentNum * @param options * @param options.vecModifier Apply modifier to lose rate vector. For setting kill target, improving player win rate, etc. * @returns (Modified) Lose rate vector regarding `loseMat`. */ function getLoseVec(loseMat, maxCall, currentNum, { vecModifier = modifier_1.defaultLoseRate } = {}) { const lookupMat = getLookupMat(loseMat, maxCall, currentNum); const loseVec = lookupMat.map((loseMatRow) => vecModifier(loseMatRow)); return loseVec; } exports.getLoseVec = getLoseVec; function getLoseVecRev(loseMat, maxCall, currentNum, numEnd, { vecModifier = modifier_1.defaultLoseRate } = {}) { const lookupMat = getLookupMatRev(loseMat, maxCall, currentNum, numEnd); const loseVec = lookupMat.map((loseMatRow) => vecModifier(loseMatRow)); return loseVec; } exports.getLoseVecRev = getLoseVecRev; /** * * @param numPlayer Number of players * @param maxCount Maximam number of numbers player can call on his turn. * @param numEnd Final number of the game. * @returns ((`numEnd` + 1) x (`numPlayer`)) lose probability matrix. */ function getFullLoseProbMat(numPlayer, maxCall, numEnd) { const loseMat = []; const initial = (0, linarg_1.getUnitVec)(numPlayer); loseMat.push(initial); for (var currentNum = numEnd - 1; currentNum >= 0; currentNum--) { const lookupMat = getLookupMatRev(loseMat, maxCall, currentNum, numEnd); const loseVec = lookupMat.map((lookupMatRow) => lookupMatRow[0]); const chooseProb = getChooseProb(loseVec); const lookupMatShifted = (0, linarg_1.matShiftToLast)(lookupMat); const nextLoseVec = (0, linarg_1.vecMatDot)(chooseProb, lookupMatShifted); loseMat.push(nextLoseVec); } return loseMat.reverse(); } exports.getFullLoseProbMat = getFullLoseProbMat;