finitedomain
Version:
A fast feature rich finite domain solver
75 lines (61 loc) • 2.88 kB
JavaScript
import {
LOG_FLAG_PROPSTEPS,
ASSERT,
ASSERT_LOG,
ASSERT_NORDOM,
} from '../helpers';
import {
domain__debug,
domain_invMul,
domain_intersection,
domain_mul,
} from '../domain';
import domain_plus from '../doms/domain_plus';
import domain_minus from '../doms/domain_minus';
// BODY_START
/**
* @param {$space} space
* @param {$config} config
* @param {number} varIndex1
* @param {number} varIndex2
* @param {number} varIndex3
* @param {string} opName
* @param {Function} opFunc
*/
function propagator_ringStepBare(space, config, varIndex1, varIndex2, varIndex3, opName, opFunc) {
ASSERT(varIndex1 >= 0 && varIndex2 >= 0 && varIndex3 >= 0, 'expecting three vars', varIndex1, varIndex2, varIndex3);
ASSERT(typeof opName === 'string', 'OP_SHOULD_BE_STRING');
let vardoms = space.vardoms;
let domain1 = vardoms[varIndex1];
let domain2 = vardoms[varIndex2];
let domain3 = vardoms[varIndex3];
ASSERT(opName === 'plus' ? opFunc === domain_plus : opName === 'min' ? opFunc === domain_minus : opName === 'mul' ? opFunc === domain_mul : (opName === 'div' && opFunc === domain_invMul), 'should get proper opfunc');
space.vardoms[varIndex3] = _propagator_ringStepBare(domain1, domain2, domain3, opFunc, opName);
ASSERT_LOG(LOG_FLAG_PROPSTEPS, log => log('propagator_ringStepBare; op:', opName, 'indexes:', varIndex3, '=', varIndex1, {u: '+', n: '-', l: '*', v: '/'}[opName[2]], varIndex2, ', names:', config.allVarNames[varIndex3], '=', config.allVarNames[varIndex1], {u: '+', n: '-', l: '*', v: '/'}[opName[2]], config.allVarNames[varIndex2]));
ASSERT_LOG(LOG_FLAG_PROPSTEPS, log => log(' - doms before:', domain__debug(domain3), '=', domain__debug(domain1), {u: '+', n: '-', l: '*', v: '/'}[opName[2]], domain__debug(domain2)));
ASSERT_LOG(LOG_FLAG_PROPSTEPS, log => log(' - doms after :', domain__debug(vardoms[varIndex3]), '=', domain__debug(vardoms[varIndex1]), {u: '+', n: '-', l: '*', v: '/'}[opName[2]], domain__debug(vardoms[varIndex2])));
ASSERT_NORDOM(space.vardoms[varIndex1], true, domain__debug);
ASSERT_NORDOM(space.vardoms[varIndex2], true, domain__debug);
ASSERT_NORDOM(space.vardoms[varIndex3], true, domain__debug);
}
/**
* @param {$domain} domain1
* @param {$domain} domain2
* @param {$domain} domainResult
* @param {Function} opFunc
* @param {string} opName For debugging only, the canonical name of opFunc
* @returns {$domain}
*/
function _propagator_ringStepBare(domain1, domain2, domainResult, opFunc, opName) {
ASSERT(typeof opFunc === 'function', 'EXPECTING_FUNC_TO_BE:', opName);
ASSERT_NORDOM(domain1);
ASSERT_NORDOM(domain2);
ASSERT(domain1 && domain2, 'SHOULD_NOT_BE_REJECTED');
let domain = opFunc(domain1, domain2);
return domain_intersection(domainResult, domain);
}
// BODY_STOP
export default propagator_ringStepBare;
export {
_propagator_ringStepBare, // testing
};