baskin-lib
Version:
baskin robbins 31 web game library
82 lines (81 loc) • 3.5 kB
JavaScript
;
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;