finitedomain
Version:
A fast feature rich finite domain solver
80 lines (69 loc) • 2.44 kB
JavaScript
import {
LOG_FLAG_PROPSTEPS,
NO_SUCH_VALUE,
ASSERT,
ASSERT_LOG,
ASSERT_NORDOM,
} from '../helpers';
import {
domain__debug,
domain_createEmpty,
domain_getValue,
domain_removeValue,
} from '../domain';
// BODY_START
/**
* @param {$space} space
* @param {$config} config
* @param {number} varIndex1
* @param {number} varIndex2
*/
function propagator_neqStepBare(space, config, varIndex1, varIndex2) {
ASSERT(space && space._class === '$space', 'SHOULD_GET_SPACE');
ASSERT(typeof varIndex1 === 'number', 'VAR_INDEX_SHOULD_BE_NUMBER');
ASSERT(typeof varIndex2 === 'number', 'VAR_INDEX_SHOULD_BE_NUMBER');
let vardoms = space.vardoms;
let domain1 = vardoms[varIndex1];
let domain2 = vardoms[varIndex2];
ASSERT_NORDOM(domain1);
ASSERT_NORDOM(domain2);
ASSERT(domain1 && domain2, 'SHOULD_NOT_BE_REJECTED');
// remove solved value from the other domain. confirm neither rejects over it.
let value = domain_getValue(domain1);
if (value !== NO_SUCH_VALUE) {
if (domain1 === domain2) {
vardoms[varIndex1] = domain_createEmpty();
vardoms[varIndex2] = domain_createEmpty();
} else {
vardoms[varIndex2] = domain_removeValue(domain2, value);
}
} else {
// domain1 is not solved, remove domain2 from domain1 if domain2 is solved
value = domain_getValue(domain2);
if (value !== NO_SUCH_VALUE) {
vardoms[varIndex1] = domain_removeValue(domain1, value);
}
}
ASSERT_LOG(LOG_FLAG_PROPSTEPS, log => log('propagator_neqStepBare; indexes:', varIndex1, varIndex2, 'doms:', domain__debug(domain1), 'neq', domain__debug(domain2), '->', domain__debug(vardoms[varIndex1]), domain__debug(vardoms[varIndex2])));
ASSERT_NORDOM(space.vardoms[varIndex1], true, domain__debug);
ASSERT_NORDOM(space.vardoms[varIndex2], true, domain__debug);
}
/**
* neq will only reject if both domains are solved and equal.
* This is a read-only check.
*
* @param {$domain} domain1
* @param {$domain} domain2
* @returns {boolean}
*/
function propagator_neqStepWouldReject(domain1, domain2) {
let value = domain_getValue(domain1);
let result = value !== NO_SUCH_VALUE && value === domain_getValue(domain2);
ASSERT_LOG(LOG_FLAG_PROPSTEPS, log => log('propagator_neqStepWouldReject;', domain__debug(domain1), '===', domain__debug(domain2), '->', result));
return result;
}
// BODY_STOP
export {
propagator_neqStepBare,
propagator_neqStepWouldReject,
};