UNPKG

finitedomain

Version:

A fast feature rich finite domain solver

89 lines (74 loc) 1.93 kB
// markov helper functions import { THROW, } from './helpers'; import { domain_toList, domain_getValue, } from './domain'; // BODY_START /** * If a row has no boolean condition, return it. * If the boolean condition of a row is 1, return it. * If no row meets these conditions, return the last row. * * @param {$space} space * @param {?} matrix * @returns {*} */ function markov_getNextRowToSolve(space, matrix) { let vardoms = space.vardoms; for (let i = 0; i < matrix.length; i++) { var row = matrix[i]; let boolDomain = vardoms[row._boolVarIndex]; if (boolDomain === undefined || domain_getValue(boolDomain) === 1) { break; } } return row; } function markov_createLegend(merge, inputLegend, domain) { if (merge) { return markov_mergeDomainAndLegend(inputLegend, domain); } return inputLegend; } function markov_mergeDomainAndLegend(inputLegend, domain) { let legend; if (inputLegend) { legend = inputLegend.slice(0); } else { legend = []; } let listed = domain_toList(domain); for (let i = 0; i < listed.length; ++i) { let val = listed[i]; if (legend.indexOf(val) < 0) { legend.push(val); } } return legend; } function markov_createProbVector(space, matrix, expandVectorsWith, valueCount) { let row = markov_getNextRowToSolve(space, matrix); let probVector = row.vector; if (expandVectorsWith != null) { // could be 0 probVector = probVector ? probVector.slice(0) : []; let delta = valueCount - probVector.length; if (delta > 0) { for (let i = 0; i < delta; ++i) { probVector.push(expandVectorsWith); } } return probVector; } if (!probVector || probVector.length !== valueCount) { THROW('E_EACH_MARKOV_VAR_MUST_HAVE_PROB_VECTOR_OR_ENABLE_EXPAND_VECTORS'); } return probVector; } // BODY_STOP export { markov_createLegend, markov_createProbVector, };