fdo
Version:
A brute force Finite Domain Solver
1 lines • 48 kB
JavaScript
;function _classCallCheck(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,r){for(var n=0;n<r.length;n++){var a=r[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(r,n,a){return n&&e(r.prototype,n),a&&e(r,a),r}}(),_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},FDO=function(){function e(){return{_class:"$config",allVarNames:[],_varNamesTrie:trie_create(),varStratConfig:l(),valueStratName:"min",targetedVars:"all",varDistOptions:{},beforeSpace:void 0,afterSpace:void 0,rngCode:"",_defaultRng:void 0,allConstraints:[],constantCache:{},initialDomains:[],_propagators:[],_varToPropagators:[],_constrainedAway:[],_constraintHash:{}}}function r(e,r){var n=e.varStratConfig,a=e.valueStratName,t=e.targetedVars,i=e.varDistOptions,o=e.constantCache,s=e.allVarNames,u=e.allConstraints,c=e.initialDomains,l=e._propagators,f=e._varToPropagators,d=e._constrainedAway;return{_class:"$config",_varNamesTrie:trie_create(s),varStratConfig:n,valueStratName:a,targetedVars:t instanceof Array?t.slice(0):t,varDistOptions:JSON.parse(JSON.stringify(i)),rngCode:e.rngCode,_defaultRng:e.rngCode?void 0:e._defaultRng,constantCache:o,allVarNames:s.slice(0),allConstraints:u.slice(0),initialDomains:r?r.map(domain_toSmallest):c,_propagators:l&&l.slice(0),_varToPropagators:f&&f.slice(0),_constrainedAway:d&&d.slice(0),_constraintHash:{}}}function n(e){return a(e,!0)}function a(e,r){return c(e,r,domain_createRange(SUB,SUP))}function t(e,r,n){return r===n?s(e,r):i(e,!0,r,n)}function i(e,r,n,a){return c(e,r,domain_createRange(n,a))}function o(e,r,n,a,t){return c(e,r,domain_anyToSmallest(n),a,t)}function s(e,r){return void 0!==e.constantCache[r]?e.constantCache[r]:u(e,!0,r)}function u(e,r,n){return c(e,r,domain_createRange(n,n))}function c(e,r,n,a){if(!(arguments.length>4&&void 0!==arguments[4]&&arguments[4])){var t=e.allVarNames.length;!0===r?r="__"+String(t)+"__":("string"!=typeof r&&THROW("Var names should be a string or anonymous, was: "+JSON.stringify(r)),r||THROW("Var name cannot be empty string"),String(parseInt(r,10))===r&&THROW("Don't use numbers as var names ("+r+")")),t<100&&trie_has(e._varNamesTrie,r)&&THROW("Var name already part of this config. Probably a bug?",r);var i=domain_getValue(n);return i===NOT_FOUND||e.constantCache[i]||(e.constantCache[i]=t),e.initialDomains[t]=n,e.allVarNames.push(r),trie_add(e._varNamesTrie,r,t),t}var o=trie_get(e._varNamesTrie,r);e.initialDomains[o]=n}function l(e){return{_class:"$var_strat_config",type:e&&e.type||"naive",priorityByName:e&&e.priorityByName,_priorityByIndex:void 0,inverted:!(!e||!e.inverted),fallback:e&&e.fallback}}function f(e,r,n,a){"varStratOverride"===r&&THROW("deprecated, should be wiped internally");var t=!1;switch(r){case"varStrategyFallback":t=!0;case"varStrategy":"function"==typeof n&&THROW("functions no longer supported",n),"string"==typeof n&&THROW("strings should be passed on as {type:value}",n),"object"!==(void 0===n?"undefined":_typeof(n))&&THROW("varStrategy should be object",n),n.name&&THROW("name should be type"),n.dist_name&&THROW("dist_name should be type");var i=l(n);if(t){for(var o=e.varStratConfig;o.fallback;)o=o.fallback;o.fallback=i}else for(e.varStratConfig=i;i.fallback;)i.fallback=l(i.fallback),i=i.fallback;break;case"valueStrategy":e.valueStratName=n;break;case"targeted_var_names":n&&n.length||THROW("ONLY_USE_WITH_SOME_TARGET_VARS"),e.targetedVars=n;break;case"varStratOverrides":for(var s in n)f(e,"varValueStrat",n[s],s);break;case"varValueStrat":if(e.varDistOptions||(e.varDistOptions={}),e.varDistOptions[a]=n,"markov"===n.valtype){var u=n.matrix;u||(n.expandVectorsWith?u=n.matrix=[{vector:[]}]:THROW("FDO: markov var missing distribution (needs matrix or expandVectorsWith)"));for(var c=0,d=u.length;c<d;++c){var v=u[c];v.boolean&&THROW("row.boolean was deprecated in favor of row.boolVarName"),void 0!==v.booleanId&&THROW("row.booleanId is no longer used, please use row.boolVarName");var m=v.boolVarName;"function"==typeof m&&(m=m(n)),m&&("string"!=typeof m&&THROW("row.boolVarName, if it exists, should be the name of a var or a func that returns that name, was/got: "+m+" ("+(void 0===m?"undefined":_typeof(m))+")"),v._boolVarIndex=trie_get(e._varNamesTrie,m))}}break;case"beforeSpace":e.beforeSpace=n;break;case"afterSpace":e.afterSpace=n;break;case"var":return THROW("REMOVED. Replace `var` with `varStrategy`");case"val":return THROW("REMOVED. Replace `var` with `valueStrategy`");case"rng":"string"==typeof n?e.rngCode=n:"number"==typeof n?e.rngCode="return "+n+";":e._defaultRng=n;break;default:THROW("unknown option")}}function d(e,r){e._propagators.push(r)}function v(e){for(var r=new Array(e.allVarNames.length),n=e._propagators,a=e.initialDomains,t=0,i=n.length;t<i;++t){var o=n[t];m(o.index1,a,r,t),o.index2>=0&&m(o.index2,a,r,t),o.index3>=0&&m(o.index3,a,r,t)}e._varToPropagators=r}function m(e,r,n,a){var t=r[e];domain_isSolved(t)||(n[e]?n[e].indexOf(a)<0&&n[e].push(a):n[e]=[a])}function g(e,r,a,i){var o=r,u=void 0,c=!1;switch(r){case"reifier":c=!0,o=i;case"plus":case"min":case"ring-mul":case"ring-div":case"mul":case"sum":case"product":var l="product"===r||"sum"===r,f=void 0;void 0===(u=l?i:a[2])?(f=c?t(e,0,1):n(e),u=e.allVarNames[f]):"number"==typeof u?(f=s(e,u),u=e.allVarNames[f]):"string"!=typeof u?THROW("expecting result var name to be absent or a number or string: `"+u+"`"):(f=trie_get(e._varNamesTrie,u))<0&&THROW("Vars must be defined before using them ("+u+")"),l?i=f:a[2]=u;break;case"distinct":case"eq":case"neq":case"lt":case"lte":case"gt":case"gte":break;default:THROW("UNKNOWN_PROPAGATOR "+r)}if(p(e,a),h(e,o+"|"+a.join(","),u))return u;var d=x(r,_(e,a),i);return e.allConstraints.push(d),u}function p(e,r){for(var n=0,a=r.length;n<a;++n)if("number"==typeof r[n]){var t=s(e,r[n]);r[n]=e.allVarNames[t]}}function _(e,r){for(var n=[],a=0,t=r.length;a<t;++a){var i=r[a],o=trie_get(e._varNamesTrie,i);o===TRIE_KEY_NOT_FOUND&&THROW("CONSTRAINT_VARS_SHOULD_BE_DECLARED","name=",i,"index=",a,"names=",r),n[a]=o}return n}function h(e,r,n){e._constraintHash||(e._constraintHash={});var a=e._constraintHash[r];if(!0===a){if(void 0!==n)throw new Error("How is this possible?");return!0}return void 0!==a?(g(e,"eq",[n,a]),!0):(e._constraintHash[r]=n||!0,!1)}function b(e){var r=e.allConstraints;e._propagators=[];for(var n=0,a=r.length;n<a;++n){var t=r[n];if(t.varNames){getTerm().warn("saw constraint.varNames, converting to varIndexes, log out result and update test accordingly"),t.varIndexes=t.varNames.map(function(r){return trie_get(e._varNamesTrie,r)});var i=t.param;delete t.param,delete t.varNames,t.param=i}if(-1===t.varIndexes[1])throw new Error("nope? "+INSPECT(t));y(e,t.name,t.varIndexes,t.param,t)}}function y(e,r,n,a,t){switch(r){case"plus":return be(e,n[0],n[1],n[2]);case"min":return ye(e,n[0],n[1],n[2]);case"ring-mul":return ke(e,n[0],n[1],n[2]);case"ring-div":return ve(e,n[0],n[1],n[2]);case"mul":return de(e,n[0],n[1],n[2]);case"sum":return Te(e,n.slice(0),a);case"product":return Se(e,n.slice(0),a);case"distinct":return pe(e,n.slice(0));case"reifier":return se(e,a,n[0],n[1],n[2]);case"neq":return ge(e,n[0],n[1]);case"eq":return ue(e,n[0],n[1]);case"gte":return me(e,n[0],n[1]);case"lte":return fe(e,n[0],n[1]);case"gt":return le(e,n[0],n[1]);case"lt":return ce(e,n[0],n[1]);default:THROW("UNEXPECTED_NAME: "+r)}}function k(e){var r=e.varDistOptions;for(var n in r){var a=trie_get(e._varNamesTrie,n);a<0&&THROW("Found markov var options for an unknown var name (name="+n+")");var t=r[n];if(t&&"markov"===t.valtype)return xe(e,a)}}function T(e){for(var r=e.varStratConfig;r;){if(r.priorityByName){for(var n={},a=r.priorityByName,t=0,i=a.length;t<i;++t)n[trie_get(e._varNamesTrie,a[t])]=i-t;r._priorityByIndex=n}r=r.fallback}}function S(e){e._varNamesTrie||(e._varNamesTrie=trie_create(e.allVarNames)),e._defaultRng||(e._defaultRng=e.rngCode?Function(e.rngCode):Math.random),b(e),k(e),v(e),T(e)}function x(e,r,n){return{_class:"$constraint",name:e,varIndexes:r,param:n}}function O(e,r,n,a){for(var t=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=[],o=[],s=0,u=0;u<r.length;u++){var c=r[u];if(c>0){var l=n[u];domain_containsValue(e,l)&&(s+=c,o.push(s),i.push(l))}}if(0!==o.length)return 1===o.length?i[0]:V(a,s,o,i,t)}function V(e,r,n,a,t){var i=e(),o=i;t&&(o=i*r);for(var s=0;s<n.length&&!(n[s]>o);s++);return a[s]}function N(e,r,n,a){var t=r.valueStratName,i=r.varDistOptions,o=r.allVarNames[n],s=i[o]&&i[o].valtype;return s&&(t=s),"function"==typeof t?t(e,n,a):E(t,e,r,n,a)}function E(e,r,n,a,t){switch(e){case"max":return C(r,a,t);case"markov":return A(r,n,a,t);case"mid":return D(r,a,t);case"min":case"naive":return R(r,a,t);case"minMaxCycle":return W(r,a,t);case"list":return w(r,n,a,t);case"splitMax":return H(r,a,t);case"splitMin":return q(r,a,t);case"throw":return THROW("Throwing an error because val-strat requests it")}THROW("unknown next var func",e)}function w(e,r,n,a){var t=e.vardoms[n],i=r.allVarNames[n],o=r.varDistOptions[i],s=o.list,u="";o.fallback&&(u=o.fallback.valtype);var c=s;switch("function"==typeof s&&(c=s(e,i,a)),a){case br:var l=domain_getFirstIntersectingValue(t,c);return l===NO_SUCH_VALUE?E(u||"naive",e,r,n,br):(e._lastChosenValue=l,domain_createValue(l));case yr:return e._lastChosenValue>=0?domain_removeValue(t,e._lastChosenValue):E(u||"naive",e,r,n,yr)}return kr}function R(e,r,n){var a=e.vardoms[r];switch(n){case br:var t=domain_min(a);return e._lastChosenValue=t,domain_createValue(t);case yr:return domain_removeValue(a,e._lastChosenValue)}return kr}function C(e,r,n){var a=e.vardoms[r];switch(n){case br:var t=domain_max(a);return e._lastChosenValue=t,domain_createValue(t);case yr:return domain_removeValue(a,e._lastChosenValue)}return kr}function D(e,r,n){var a=e.vardoms[r];switch(n){case br:var t=domain_middleElement(a);return e._lastChosenValue=t,domain_createValue(t);case yr:return domain_removeValue(a,e._lastChosenValue)}return kr}function q(e,r,n){var a=e.vardoms[r],t=domain_max(a);switch(n){case br:var i=domain_min(a),o=i+Math.floor((t-i)/2);return e._lastChosenValue=o,domain_intersection(a,domain_createRange(i,o));case yr:return domain_intersection(a,domain_createRange(e._lastChosenValue+1,t))}return kr}function H(e,r,n){var a=e.vardoms[r],t=domain_min(a);switch(n){case br:var i=domain_max(a),o=t+Math.floor((i-t)/2);return e._lastChosenValue=o,domain_intersection(a,domain_createRange(o+1,i));case yr:return domain_intersection(a,domain_createRange(t,e._lastChosenValue))}return kr}function W(e,r,n){return I(r)?R(e,r,n):C(e,r,n)}function I(e){return e%2==0}function A(e,r,n,a){var t=e.vardoms[n];switch(a){case br:var i=r.allVarNames[n],o=r.varDistOptions[i],s=o.expandVectorsWith,u=o.random||r._defaultRng,c=ae("number"==typeof s,o.legend,t),l=c.length;if(!l)return kr;var f=O(t,ie(e,o.matrix,s,l),c,u);return null==f?kr:(e._lastChosenValue=f,domain_createValue(f));case yr:var d=e._lastChosenValue;return domain_removeValue(t,d)}return kr}function U(e,r){var n=r.varStratConfig;return L(e,r,F(n.type),n)}function F(e){switch(e){case"naive":return null;case"size":return P;case"min":return M;case"max":return j;case"markov":return G;case"list":return B;case"throw":return THROW("Throwing an error because var-strat requests it")}return THROW("unknown next var func",e)}function L(e,r,n,a){var t=0,i=e._unsolved,o=i[t++];if(n)for(var s=i.length;t<s;t++){var u=i[t];Tr===n(e,r,u,o,a)&&(o=u)}return o}function P(e,r,n,a){var t=domain_size(e.vardoms[n])-domain_size(e.vardoms[a]);return t<0?Tr:t>0?xr:Sr}function M(e,r,n,a){var t=domain_min(e.vardoms[n])-domain_min(e.vardoms[a]);return t<0?Tr:t>0?xr:Sr}function j(e,r,n,a){var t=domain_max(e.vardoms[n])-domain_max(e.vardoms[a]);return t>0?Tr:t<0?xr:Sr}function G(e,r,n,a,t){var i=r.varDistOptions,o=r.allVarNames[n];if(i[o]&&"markov"===i[o].valtype)return Tr;var s=r.allVarNames[a];return i[s]&&"markov"===i[s].valtype?xr:J(e,r,n,a,t.fallback)}function B(e,r,n,a,t){var i=t._priorityByIndex,o=i[n],s=i[a];if(!o&&!s)return J(e,r,n,a,t.fallback);var u=t.inverted;return s?o&&o>s?u?xr:Tr:u?Tr:xr:u?xr:Tr}function J(e,r,n,a,t){if(!t)return Sr;var i=t.type;switch(i){case"size":return P(e,r,n,a);case"min":return M(e,r,n,a);case"max":return j(e,r,n,a);case"markov":return G(e,r,n,a,t);case"list":return B(e,r,n,a,t);case"throw":return THROW("nope")}return THROW("Unknown var dist fallback name: "+i)}function $(e,r,n,a,t,i){i=!0;var o=e.varDistOptions,s=r||e.initialDomains,u=e.allVarNames,c=i?function(e){return z(u[e])}:a?K:Y,l=u.map(function(e,r){var n=Q(s[r]),a=": "+c(r)+" = "+n,t=o[e];if(t&&("list"!==t.valtype||t.list&&t.list.length))switch(a+=" @"+t.valtype,t.valtype){case"markov":"expandVectorsWith"in t&&(a+="expand("+(t.expandVectorsWith||0)+")"),"legend"in t&&(a+=" legend("+t.legend.join(" ")+")"),"matrix"in t&&(a+=" matrix("+JSON.stringify(t.matrix).replace(/"/g,"")+")");break;case"list":"function"==typeof t.list?a+=" prio(???func???)":a+=" prio("+t.list.join(" ")+")";break;case"max":case"mid":case"min":case"minMaxCycle":case"naive":case"splitMax":case"splitMin":break;default:getTerm().warn("Unknown value strategy override: "+t.valtype),a+=" @? "+JSON.stringify(t)}return i||e===String(r)||(a+=" # "+z(e)),a}),f=n?[]:e.allConstraints.map(function(e){var r=e.varIndexes,n=r.map(c);r.forEach(function(e,r){var a=domain_getValue(s[e]);a>=0&&(n[r]=a)});var o="";if("number"==typeof e.param){var u=domain_getValue(s[e.param]);o=u>=0?u:c(e.param)}var l="",f="";switch(e.name){case"reifier":var d=void 0;switch(e.param){case"eq":d="==";break;case"neq":d="!=";break;case"lt":d="<";break;case"lte":d="<=";break;case"gt":d=">";break;case"gte":d=">=";break;default:THROW("what dis param: "+d)}l+=n[2]+" = "+n[0]+" "+d+"? "+n[1];break;case"plus":l+=n[2]+" = "+n[0]+" + "+n[1];break;case"min":l+=n[2]+" = "+n[0]+" - "+n[1];break;case"ring-mul":l+=n[2]+" = "+n[0]+" * "+n[1];break;case"ring-div":l+=n[2]+" = "+n[0]+" / "+n[1];break;case"mul":l+=n[2]+" = "+n[0]+" * "+n[1];break;case"sum":l+=o+" = sum("+n.join(" ")+")";break;case"product":l+=o+" = product("+n.join(" ")+")";break;case"markov":l+="# markov("+n+")";break;case"distinct":l+="distinct("+n+")";break;case"eq":l+=n[0]+" == "+n[1];break;case"neq":l+=n[0]+" != "+n[1];break;case"lt":l+=n[0]+" < "+n[1];break;case"lte":l+=n[0]+" <= "+n[1];break;case"gt":l+=n[0]+" > "+n[1];break;case"gte":l+=n[0]+" >= "+n[1];break;default:getTerm().warn("unknown constraint: "+e.name),l+="unknown = "+JSON.stringify(e)}var v=l;if((l.indexOf(i?"'":"$")<0||"distinct"===e.name&&n.length<=1||("product"===e.name||"sum"===e.name)&&0===n.length)&&(a||(f+=(f?", ":" # ")+"dropped; constraint already solved ("+l+") ("+r.map(c)+", "+c(e.param)+")"),l=""),!a||t){if(n.forEach(function(e,n){"string"==typeof e&&(v=v.replace(e,Q(s[r[n]])))}),"number"==typeof e.param&&"string"==typeof o&&(v=v.replace(o,Q(s[e.param]))),l||!a){for(var m=Math.max(0,30-l.length);m>=0;--m)l+=" ";l+=" # "+v}l+=f}return l}).filter(function(e){return!!e}),d=n?e._propagators.map(function(e){var r=e.index1,n=e.index2,t=e.index3,i=r>=0?domain_getValue(s[r]):-1,o=i>=0?i:r<0?void 0:c(r),u=n>=0?domain_getValue(s[n]):-1,l=u>=0?u:n<0?void 0:c(n),f=t>=0?domain_getValue(s[t]):-1,d=f>=0?f:t<0?void 0:c(t),v="",m="";switch(e.name){case"reified":var g=void 0;switch(e.arg3){case"eq":g="==";break;case"neq":g="!=";break;case"lt":g="<";break;case"lte":g="<=";break;case"gt":g=">";break;case"gte":g=">=";break;default:THROW("what dis param: "+g)}v+=d+" = "+o+" "+g+"? "+l;break;case"eq":v+=o+" == "+l;break;case"lt":v+=o+" < "+l;break;case"lte":v+=o+" <= "+l;break;case"mul":v+=d+" = "+o+" * "+l;break;case"div":v+=d+" = "+o+" / "+l;break;case"neq":v+=o+" != "+l;break;case"min":v+=d+" = "+o+" - "+l;break;case"ring":switch(e.arg1){case"plus":v+=d+" = "+o+" + "+l;break;case"min":v+=d+" = "+o+" - "+l;break;case"ring-mul":v+=d+" = "+o+" * "+l;break;case"ring-div":v+=d+" = "+o+" / "+l;break;default:throw new Error("Unexpected ring op:"+e.arg1)}break;case"markov":return"";default:getTerm().warn("unknown propagator: "+e.name),v+="unknown = "+JSON.stringify(e)}var p=v;return v.indexOf("$")<0&&(a||(m+=(m?", ":" # ")+"dropped; constraint already solved ("+v+")"),v=""),a||("string"==typeof o&&(p=p.replace(o,Q(s[r]))),"string"==typeof l&&(p=p.replace(l,Q(s[n]))),"string"==typeof d&&(p=p.replace(d,Q(s[t]))),v+=" ".repeat(Math.max(0,30-v.length))+" # initial: "+p,v+=m),v}).filter(function(e){return!!e}):[];return["## constraint problem export","@custom var-strat = "+JSON.stringify(e.varStratConfig),"@custom val-strat = "+e.valueStratName,l.join("\n")||"# no vars",f.join("\n")||d.join("\n")||"# no constraints","@custom targets "+("all"===e.targetedVars?" = all":"("+e.targetedVars.map(function(r){return c(trie_get(e._varNamesTrie,r))}).join(" ")+")"),"## end of export"].join("\n\n")}function z(e){return"number"==typeof e?e:"'"+e+"'"}function Y(e){return"$"+e+"$"}function K(e){var r=e.toString(36);return r[0]<"a"&&(r="$"+r),r}function Q(e){var r=domain_toArr(e);if(2===r.length&&r[0]===r[1])return String(r[0]);if(r.length>2){for(var n=[],a=0,t=r.length;a<t;a+=2)n.push("["+r[a]+" "+r[a+1]+"]");r=n}return"["+r.join(" ")+"]"}function Z(e){switch(void 0===e?"undefined":_typeof(e)){case"object":if(!e)return null;if(e instanceof Array)return e.map(function(e){return Z(e)});var r={};for(var n in e)r[n]=Z(e[n]);return r;case"function":var a={__THIS_IS_A_FUNCTION:1,__source:e.toString()};for(var t in e)a[t]=Z(e[t]);return a;case"string":case"number":case"boolean":case"undefined":return e}THROW("config value what?",e)}function X(e,r,n,a){for(var t=[];e.more&&t.length<n;)$e(e,r,a),"end"!==e.status&&t.push(e.space);return t}function ee(e,r,n,a){a>=LOG_STATS&&getTerm().time(" - FD Solution Construction Time");for(var t=0;t<e.length;++t){var i=pr(e[t],r);n.push(i),a>=LOG_SOLVES&&(getTerm().log(" - FD solution() ::::::::::::::::::::::::::::"),getTerm().log(JSON.stringify(i)),getTerm().log(" ::::::::::::::::::::::::::::"))}a>=LOG_STATS&&getTerm().timeEnd(" - FD Solution Construction Time")}function re(e,r,n){function a(){return e[de]}function t(r){return e[de+r]}function i(){++de}function o(e,r){a()!==e&&fe("Expected "+(r?r+" ":"")+"`"+e+"`, found `"+a()+"`"),i()}function s(){for(;de<ve&&c(a());)i()}function u(){for(;!p();){var e=a();if(v(e))i();else{if(!d(e))break;V()}}}function c(e){return" "===e||"\t"===e}function l(e){return"\n"===e||"\r"===e}function d(e){return"#"===e}function v(e){return c(e)||l(e)}function m(){if(s(),de<ve){var e=a();"#"===e?V():l(e)?i():fe("Expected EOL but got `"+a()+"`")}}function g(){if(de>=ve)return!0;var e=a();return"#"===e||l(e)}function p(){return de>=ve}function _(){i(),s();var e=h();if(s(),","===a()){e=[e];do{i(),s(),e.push(h()),s()}while(!p()&&","===a())}"="===a()&&(i(),s());var n=T();s();var t=S();m(),"string"==typeof e?r.decl(e,n,t,!0):e.forEach(function(e){return r.decl(e,n,t,!0)})}function h(){return"'"===a()?b():y()}function b(){o("'","start of Quoted identifier");for(var r=de,n=a();!p()&&!l(n)&&"'"!==n;)i(),n=a();return p()&&fe("Quoted identifier must be closed"),r===de&&fe("Expected to parse identifier, found none"),o("'","end of Quoted identifier"),e.slice(r,de-1)}function y(){var r=de;for(a()>="0"&&a()<="9"&&fe("Unquoted ident cant start with number");!p()&&k(a());)i();return r===de&&fe("Expected to parse identifier, found none ["+a()+"]"),e.slice(r,de)}function k(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||"_"===e||"$"===e||"-"===e||e>"~"}function T(){var e=a(),r=void 0;switch(e){case"[":if(o("[","domain start"),s(),r=[],"["===a())do{i(),s();var n=I();s(),","===a()&&(i(),s());var t=I();s(),o("]","range-end"),s(),r.push(n,t),","===a()&&(i(),s())}while("["===a());else if("]"!==a())do{s();var u=I();s(),","===a()&&(i(),s());var c=I();s(),r.push(u,c),","===a()&&(i(),s())}while("]"!==a());return o("]","domain-end"),0===r.length&&fe("Empty domain [] in dsl, this problem will always reject"),r;case"*":return i(),[SUB,SUP];case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":var l=I();return s(),[l,l]}fe("Expecting valid domain start, found `"+e+"`")}function S(){if("@"===a()){i();for(var r={},n=de;a()>="a"&&a()<="z";)i();var t=e.slice(n,de);switch(t){case"list":x(r);break;case"markov":O(r);break;case"max":case"mid":case"min":case"naive":break;case"minMaxCycle":case"splitMax":case"splitMin":default:fe("implement me (var mod) [`"+t+"`]")}return r.valtype=t,r}}function x(r){s(),"prio("!==e.slice(de,de+5)&&fe("Expecting the priorities to follow the `@list`"),de+=5,r.list=ae(),o(")","list end")}function O(r){for(;;){if(s(),"matrix("===e.slice(de,de+7)){var n="return "+e.slice(de+7,de=e.indexOf(")",de)),a=Function(n);r.matrix=a(),-1===de&&fe("The matrix must be closed by a `)` but did not find any")}else if("legend("===e.slice(de,de+7))de+=7,r.legend=ae(),s(),o(")","legend closer");else{if("expand("!==e.slice(de,de+7))break;de+=7,r.expandVectorsWith=I(),s(),o(")","expand closer")}i()}}function V(){for(o("#","comment start");!p()&&!l(a());)i();p()||i()}function N(){if(!D()){var e=H();s();var n=R();switch(s(),n){case"=":E(e);break;case"==":r.eq(e,H());break;case"!=":r.neq(e,H());break;case"<":r.lt(e,H());break;case"<=":r.lte(e,H());break;case">":r.gt(e,H());break;case">=":r.gte(e,H());break;case"&":r.neq(r.mul(e,H()),r.num(0));break;case"!&":r.mul(e,H(),r.num(0));break;case"|":r.neq(r.plus(e,H()),r.num(0));break;case"!|":r.eq(e,r.num(0)),r.eq(H(),r.num(0));break;case"^":r.eq(r.plus(r.isEq(e,0),r.isEq(H(),0)),1);break;case"!^":r.eq(r.isEq(e,r.num(0)),r.isEq(H(),r.num(0)));break;case"->":var a=H();r.lte(r.isNeq(e,r.num(0)),r.isNeq(a,r.num(0))),r.lte(r.isEq(a,r.num(0)),r.isEq(e,r.num(0)));break;case"!->":r.gt(e,r.num(0)),r.eq(H(),r.num(0));break;default:n&&fe("Unknown cop that starts with: ["+n+"]")}m()}}function E(e){var n="string"==typeof e&&!r.hasVar(e);n&&(e=r.decl(e));var t=H(e,n);s();var i=a();return p()||l(i)||d(i)?(r.eq(t,e),t):w(t,e,n)}function w(e,n,a){var t=C();switch(s(),t){case"==?":return a&&r.decl(n,[0,1],void 0,!1,!0),r.isEq(e,H(),n);case"!=?":return a&&r.decl(n,[0,1],void 0,!1,!0),r.isNeq(e,H(),n);case"<?":return a&&r.decl(n,[0,1],void 0,!1,!0),r.isLt(e,H(),n);case"<=?":return a&&r.decl(n,[0,1],void 0,!1,!0),r.isLte(e,H(),n);case">?":return a&&r.decl(n,[0,1],void 0,!1,!0),r.isGt(e,H(),n);case">=?":return a&&r.decl(n,[0,1],void 0,!1,!0),r.isGte(e,H(),n);case"|?":return a&&r.decl(n,[0,1],void 0,!1,!0),K(n,[e,H()]);case"!|?":return a&&r.decl(n,[0,1],void 0,!1,!0),$(n,[e,H()]);case"&?":return a&&r.decl(n,[0,1],void 0,!1,!0),M(n,[e,H()]);case"!&?":return a&&r.decl(n,[0,1],void 0,!1,!0),B(n,[e,H()]);case"+":return r.plus(e,H(),n);case"-":return r.minus(e,H(),n);case"*":return r.mul(e,H(),n);case"/":return r.div(e,H(),n);default:return void 0!==t&&fe("Expecting right paren or rop, got: `"+t+"`"),e}}function R(){var e=a();switch(e){case"=":return i(),"="===a()?(i(),"=="):"=";case"!":return i(),"="===(e=a())?(i(),"!="):"&"===e?(i(),"!&"):"^"===e?(i(),"!^"):"|"===e?(i(),"!|"):"-"===e&&">"===t(1)?(i(),i(),"!->"):"!";case"<":return i(),"="===a()?(i(),"<="):"<";case">":return i(),"="===a()?(i(),">="):">";case"&":case"|":case"^":return i(),e;case"#":fe("Expected to parse a cop but found a comment instead");break;case"-":if(">"===t(1))return i(),i(),"->"}p()&&fe("Expected to parse a cop but reached eof instead"),fe("Unknown cop char: `"+e+"`")}function C(){var e=a();switch(e){case"=":return i(),"="===a()?(i(),o("?","reifier suffix"),"==?"):"=";case"!":if(i(),"="===a())return o("=","middle part of !=? op"),o("?","reifier suffix"),"!=?";if("|"===a())return o("|","middle part of !|? op"),o("?","reifier suffix"),"!|?";if("&"===a())return o("&","middle part of !&? op"),o("?","reifier suffix"),"!&?";fe("invalid rop char after ! ["+a()+"]");break;case"<":return i(),"="===a()?(i(),o("?","reifier suffix"),"<=?"):(o("?","reifier suffix"),"<?");case">":return i(),"="===a()?(i(),o("?","reifier suffix"),">=?"):(o("?","reifier suffix"),">?");case"|":return i(),o("?","reifier suffix"),"|?";case"&":return i(),o("?","reifier suffix"),"&?";case"+":case"-":case"*":case"/":return i(),e;default:fe("Expecting right paren or rop, got: `"+e+"`")}}function D(){if("all("===e.slice(de,de+4))A();else if("distinct("===e.slice(de,de+9))U(9);else if("diff("===e.slice(de,de+5))U(5);else if("nall("===e.slice(de,de+5))Q();else if("none("===e.slice(de,de+5))Z();else if("same("===e.slice(de,de+5))X();else if("some("===e.slice(de,de+5))ee();else{if("xnor("!==e.slice(de,de+5))return!1;re()}return!0}function q(){var e=[];for(s();!p()&&")"!==a();){var r=H();e.push(r),s(),","===a()&&(i(),s())}return e}function H(e,n){var t=a(),o=void 0;if("("===t)o=W();else if("["===t){var s=T();o=s[0]===s[1]&&2===s.length?s[0]:r.decl(void 0,s)}else if(t>="0"&&t<="9")o=I();else{var u=h(),c=a();"sum"===u&&"("===c?o=F(e):"product"===u&&"("===c?o=L(e):"all"===u&&"?"===c&&(i(),"("===a())?(n&&r.decl(e,[0,1],void 0,!1,!0),o=P(e)):"diff"===u&&"?"===c&&(i(),"("===a())?(n&&r.decl(e,[0,1],void 0,!1,!0),o=j(e)):"nall"===u&&"?"===c&&(i(),"("===a())?(n&&r.decl(e,[0,1],void 0,!1,!0),o=G(e)):"none"===u&&"?"===c&&(i(),"("===a())?(n&&r.decl(e,[0,1],void 0,!1,!0),o=J(e)):"same"===u&&"?"===c&&(i(),"("===a())?(n&&r.decl(e,[0,1],void 0,!1,!0),o=z(e)):"some"===u&&"?"===c&&(i(),"("===a())?(n&&r.decl(e,[0,1],void 0,!1,!0),o=Y(e)):"?"===c?fe("Unknown reifier constraint func: ["+u+"]"):o=u}return o}function W(){o("(","group open"),s();var e=H();if(s(),"="===a()&&"="!==a())return E(e),s(),o(")","group closer"),e;if(")"===a())return i(),e;var r=w(e);return s(),o(")","group closer"),r}function I(){for(var r=de;a()>="0"&&a()<="9";)i();return r===de&&fe("Expecting to parse a number but did not find any digits ["+r+","+de+"]["+a()+"]"),parseInt(e.slice(r,de),10)}function A(){de+=4,s();var e=q(),n=r.product(e,r.decl(void 0,[1,SUP]));return s(),o(")","ALL closer"),n}function U(e){de+=e,s();var n=q();n.length||fe("Expecting at least one expression"),r.distinct(n),s(),o(")","distinct call closer"),m()}function F(e){o("(","sum call opener"),s();var n=q(),a=r.sum(n,e);return s(),o(")","sum closer"),a}function L(e){o("(","product call opener"),s();var n=q(),a=r.product(n,e);return s(),o(")","product closer"),a}function P(e){o("(","isall call opener"),s();var r=M(e,q());return s(),o(")","isall closer"),r}function M(e,n){var a=r.decl();return r.product(n,a),r.isNeq(a,r.num(0),e)}function j(e){o("(","isdiff call opener"),s();for(var n=q(),a=[],t=0;t<n.length;++t)for(var i=n[t],u=t+1;u<n.length;++u){var c=n[u];a.push(r.isNeq(i,c))}return r.isEq(r.sum(a),r.num(a.length),e),s(),o(")","isdiff closer"),e}function G(e){o("(","isnall call opener"),s();var r=B(e,q());return s(),o(")","isnall closer"),r}function B(e,n){var a=r.decl();return r.product(n,a),r.isEq(a,r.num(0),e)}function J(e){o("(","isnone call opener"),s();var r=$(e,q());return s(),o(")","isnone closer"),r}function $(e,n){var a=r.decl();return r.sum(n,a),r.isEq(a,r.num(0),e)}function z(e){o("(","issame call opener"),s();for(var n=q(),a=[],t=1;t<n.length;++t){var i=r.decl(void 0,[0,1]);r.isEq(n[t-1],n[t],i),a.push(i)}var u=r.decl();r.sum(a,u);var c=r.isEq(u,r.num(a.length),e);return s(),o(")","issame closer"),c}function Y(e){o("(","issome call opener"),s();var r=K(e,q());return s(),o(")","issome closer"),r}function K(e,n){var a=r.decl();return r.sum(n,a),r.isNeq(a,r.num(0),e)}function Q(){de+=5,s();var e=q();r.product(e,r.num(0)),s(),o(")","nall closer"),m()}function Z(){de+=5,s();var e=q();r.sum(e,r.num(0)),s(),o(")","none closer"),m()}function X(){de+=5,s();for(var e=q(),n=1;n<e.length;++n)r.eq(e[n-1],e[n]);s(),o(")","same closer"),m()}function ee(){de+=5,s();var e=q();r.sum(e,r.decl(void 0,[1,SUP])),s(),o(")","some closer"),m()}function re(){de+=5,s();var e=q();s(),o(")","xnor() closer"),m();var n=r.decl(),a=r.decl();r.sum(e,n),r.product(e,a),r.plus(r.isEq(n,0),r.isNeq(a,0),1)}function ne(){for(var r=de;a()>="0"&&a()<="9";)i();return e.slice(r,de)}function ae(){var e=[];s();for(var r=ne();r;)e.push(parseInt(r,10)),s(),","===a()&&(++de,s()),r=ne();return e.length||fe("Expected to parse a list of at least some numbers but found none"),e}function te(){for(var e=[];;){if(s(),g()&&fe("Missing target char at eol/eof"),")"===a())break;","===a()&&(i(),s(),g()&&fe("Trailing comma not supported")),","===a()&&fe("Double comma not supported");var r=h();e.push(r)}return e.length||fe("Expected to parse a list of at least some identifiers but found none"),e}function ie(){for(var e="";!p()&&!l(a());)e+=a(),i();return e}function oe(){if(o("@"),"custom"===e.slice(de,de+6)){de+=6,s();var n=h();switch(s(),"="===a()&&(i(),s(),"="===a()&&fe("Unexpected double eq sign")),n){case"var-strat":se();break;case"val-strat":ue();break;case"set-valdist":s();var t=h(),u=ce();r.setValueDistributionFor(t,JSON.parse(u));break;case"targets":le();break;case"nobool":case"noleaf":case"free":s(),","===a()&&fe("Leading comma not supported"),g()&&fe("Expected to parse some var values"),ie();break;default:fe("Unsupported custom rule: "+n)}}else fe("Unknown atrule");m()}function se(){s();var e=!1;"f"===a()&&("fallback"!==h()&&fe("Expecting `fallback` here"),e=!0,s());var n=!1;if("i"===a()&&("inverted"!==h()&&fe("Expecting `inverted` here"),n=!0,s()),"l"===a()||"("===a()){"l"===a()&&("list"!==h()&&fe("Unexpected ident after `inverted` (only expecting `list` or the list)"),s()),o("(");var t=te();t.length?f(r.config,e?"varStrategyFallback":"varStrategy",{type:"list",inverted:n,priorityByName:t}):f(r.config,e?"varStrategyFallback":"varStrategy",{type:"naive"}),s(),o(")")}else{"="===a()&&(i(),s()),n&&fe("The `inverted` keyword is only valid for a prio list");var u=h();"list"===u&&fe("Use a grouped list of idents for vardist=list"),"naive"!==u&&"size"!==u&&"min"!==u&&"max"!==u&&"throw"!==u&&fe("Unknown var dist ["+u+"]"),f(r.config,e?"varStrategyFallback":"varStrategy",{type:u})}}function ue(){var e=h();m(),r.config.valueStratName=e}function ce(){return s(),"="===a()&&(i(),s()),ie()}function le(){if(s(),"all"===e.slice(de,de+3))de+=3,r.config.targetedVars="all";else{o("(","ONLY_USE_WITH_SOME_TARGET_VARS"),s(),","===a()&&fe("Leading comma not supported");var n=te();n.length&&(r.config.targetedVars=n),o(")")}}function fe(r){throw n&&getTerm().log(e.slice(0,de)+"##|PARSER_IS_HERE["+r+"]|##"+e.slice(de)),r="Importer parser error: "+r+", source at #|#: `"+e.slice(Math.max(0,de-70),de)+"#|#"+e.slice(de,Math.min(e.length,de+70))+"`",new Error(r)}r||(r=new Or);for(var de=0,ve=e.length;!p();)!function(){switch(u(),a()){case":":return _();case"#":return V();case"@":return oe();default:if(!p())N()}}();return r}function ne(e,r){for(var n=e.vardoms,a=0;a<r.length;a++){var t=r[a],i=n[t._boolVarIndex];if(void 0===i||1===domain_getValue(i))break}return t}function ae(e,r,n){return e?te(r,n):r}function te(e,r){var n=void 0;n=e?e.slice(0):[];for(var a=domain_toList(r),t=0;t<a.length;++t){var i=a[t];n.indexOf(i)<0&&n.push(i)}return n}function ie(e,r,n,a){var t=ne(e,r).vector;if(null!=n){var i=a-(t=t?t.slice(0):[]).length;if(i>0)for(var o=0;o<i;++o)t.push(n);return t}return t&&t.length===a||THROW("E_EACH_MARKOV_VAR_MUST_HAVE_PROB_VECTOR_OR_ENABLE_EXPAND_VECTORS"),t}function oe(e,r,n,a,t,i,o,s,u,c,l){return{_class:"$propagator",name:e,stepper:r,index1:void 0===n?-1:n,index2:void 0===a?-1:a,index3:void 0===t?-1:t,arg1:void 0===i?"":i,arg2:void 0===o?"":o,arg3:void 0===s?"":s,arg4:void 0===u?"":u,arg5:void 0===c?"":c,arg6:void 0===l?"":l}}function se(e,r,n,a,t){var i=void 0,o=void 0,s=void 0,u=void 0,c=void 0;switch(r){case"eq":i="neq",o=Ne,s=Me,u=Ee,c=je;break;case"neq":i="eq",o=Me,s=Ne,u=je,c=Ee;break;case"lt":o=we,u=Ce,i="gte",s=He,c=Ie;break;case"lte":o=qe,u=We,i="gt",s=Re,c=De;break;case"gt":return se(e,"lt",a,n,t);case"gte":return se(e,"lte",a,n,t);default:THROW("UNKNOWN_REIFIED_OP")}d(e,oe("reified",Ge,n,a,t,o,s,r,i,u,c))}function ue(e,r,n){d(e,oe("eq",Ne,r,n))}function ce(e,r,n){d(e,oe("lt",we,r,n))}function le(e,r,n){ce(e,n,r)}function fe(e,r,n){d(e,oe("lte",qe,r,n))}function de(e,r,n,a){d(e,oe("mul",Le,r,n,a))}function ve(e,r,n,a){d(e,oe("div",Oe,r,n,a))}function me(e,r,n){fe(e,n,r)}function ge(e,r,n){d(e,oe("neq",Me,r,n))}function pe(e,r){for(var n=0;n<r.length;n++)for(var a=r[n],t=0;t<n;++t)ge(e,a,r[t])}function _e(e,r,n,a,t,i,o,s){he(e,i,o,s,r,a),he(e,s,o,i,n,t),he(e,s,i,o,n,t)}function he(e,r,n,a,t,i){d(e,oe("ring",Be,r,n,a,t,i))}function be(e,r,n,a){_e(e,"plus","min",domain_plus,domain_minus,r,n,a)}function ye(e,r,n,a){d(e,oe("min",Ue,r,n,a))}function ke(e,r,n,a){_e(e,"mul","div",domain_mul,domain_invMul,r,n,a)}function Te(e,r,a){switch(r.length){case 0:return void THROW("SUM_REQUIRES_VARS");case 1:return void ue(e,a,r[0]);case 2:return void be(e,r[0],r[1],a)}var t=void 0,i=Math.floor(r.length/2);i>1?(t=n(e),Te(e,r.slice(0,i),t)):t=r[0];var o=n(e);Te(e,r.slice(i),o),be(e,t,o,a)}function Se(e,r,a){switch(r.length){case 0:return void THROW("PRODUCT_REQUIRES_VARS");case 1:return void ue(e,a,r[0]);case 2:return void ke(e,r[0],r[1],a)}var t=Math.floor(r.length/2),i=void 0;t>1?(i=n(e),Se(e,r.slice(0,t),i)):i=r[0];var o=n(e);Se(e,r.slice(t),o),ke(e,i,o,a)}function xe(e,r){d(e,oe("markov",Ae,r))}function Oe(e,r,n,a,t){var i=e.vardoms[n],o=e.vardoms[a],s=e.vardoms[t];e.vardoms[t]=Ve(i,o,s)}function Ve(e,r,n){var a=domain_divby(e,r);return domain_intersection(n,a)}function Ne(e,r,n,a){var t=e.vardoms,i=t[n],o=t[a],s=domain_intersection(i,o);t[n]=s,t[a]=s}function Ee(e,r){return domain_sharesNoElements(e,r)}function we(e,r,n,a){var t=e.vardoms[n],i=e.vardoms[a],o=domain_min(t),s=domain_max(i);e.vardoms[n]=domain_removeGte(t,s),e.vardoms[a]=domain_removeLte(i,o)}function Re(e,r,n,a){return we(e,r,a,n)}function Ce(e,r){return domain_min(e)>=domain_max(r)}function De(e,r){return Ce(r,e)}function qe(e,r,n,a){var t=e.vardoms[n],i=e.vardoms[a],o=domain_min(t),s=domain_max(i);e.vardoms[n]=domain_removeGte(t,s+1),e.vardoms[a]=domain_removeLte(i,o-1)}function He(e,r,n,a){return qe(e,r,a,n)}function We(e,r){return domain_min(e)>domain_max(r)}function Ie(e,r){return We(r,e)}function Ae(e,r,n){var a=e.vardoms[n];if(domain_isSolved(a)){var t=domain_min(a),i=r.varDistOptions[r.allVarNames[n]],o=i.expandVectorsWith,s=ae(null!=o,i.legend,a),u=ie(e,i.matrix,o,s.length),c=s.indexOf(t);(c<0||c>=u.length||0===u[c])&&(e.vardoms[n]=domain_createEmpty())}}function Ue(e,r,n,a,t){var i=Fe(e.vardoms[n],e.vardoms[a],e.vardoms[t]);e.vardoms[t]=i}function Fe(e,r,n){var a=domain_minus(e,r);return a?domain_intersection(n,a):a}function Le(e,r,n,a,t){var i=e.vardoms,o=i[n],s=i[a],u=i[t];e.vardoms[t]=Pe(o,s,u)}function Pe(e,r,n){var a=domain_mul(e,r);return domain_intersection(n,a)}function Me(e,r,n,a){var t=e.vardoms,i=t[n],o=t[a],s=domain_getValue(i);s!==NO_SUCH_VALUE?i===o?(t[n]=domain_createEmpty(),t[a]=domain_createEmpty()):t[a]=domain_removeValue(o,s):(s=domain_getValue(o))!==NO_SUCH_VALUE&&(t[n]=domain_removeValue(i,s))}function je(e,r){var n=domain_getValue(e);return n!==NO_SUCH_VALUE&&n===domain_getValue(r)}function Ge(e,r,n,a,t,i,o,s,u,c,l){var f=e.vardoms,d=f[t];if(domain_isZero(d))o(e,r,n,a);else if(domain_hasNoZero(d))i(e,r,n,a);else{var v=f[n],m=f[a];l(v,m)?(f[t]=domain_removeValue(d,0),i(e,r,n,a)):c(v,m)&&(f[t]=domain_removeGtUnsafe(d,0),o(e,r,n,a))}}function Be(e,r,n,a,t,i,o){var s=e.vardoms,u=s[n],c=s[a],l=s[t];e.vardoms[t]=Je(u,c,l,o,i)}function Je(e,r,n,a,t){var i=a(e,r);return domain_intersection(n,i)}function $e(e,r,n){var a=e.stack,t=0;if(!a||0===a.length){a||(a=e.stack=[]);var i=ze(e.space,r,a,e);if(n&&n(++t)&&(n=void 0),i)return}for(;a.length>0&&!r.aborted;){var o=Ke(a[a.length-1],r);if(o){var s=ze(o,r,a,e);if(n&&n(++t)&&(n=void 0),s)return}else a.pop()}e.status="end",e.more=!1}function ze(e,r,n,a){var t=sr(e,r);return t&&r.aborted,Ye(t,e,r,n,a)}function Ye(e,r,n,a,t){return e?(Qe(t,r,a),!1):gr(r,n)?(Ze(t,r,a),!0):void a.push(r)}function Ke(e,r){var n=U(e,r);if(n!==NO_SUCH_VALUE){var a=e.vardoms[n];if(!domain_isSolved(a)){var t=e.next_distribution_choice++,i=N(e,r,n,t);if(i){var o=rr(e);return o.updatedVarIndex=n,o.vardoms[n]=i,o}}}}function Qe(e,r,n){r.failed=!0}function Ze(e,r,n){e.status="solved",e.space=r,e.more=n.length>0}function Xe(){return ar([],void 0,0,0,"")}function er(e){var r=Xe();return tr(r,e),r}function rr(e){return ar(e.vardoms.slice(0),e._unsolved.slice(0),void 0,void 0,void 0)}function nr(e,n){for(var a=e.vardoms,t=[],i=0,o=n.allVarNames.length;i<o;i++){var s=a[i];t[i]=domain_toStr(s)}return r(n,void 0,t)}function ar(e,r,n,a,t){return{_class:"$space",vardoms:e,_unsolved:r,next_distribution_choice:0,updatedVarIndex:-1,_lastChosenValue:-1}}function tr(e,r){hr(e,r),ir(e,r)}function ir(e,r){var n=r.targetedVars,a=e.vardoms,t=[];if(e._unsolved=t,"all"===n)for(var i=0,o=a.length;i<o;++i)domain_isSolved(a[i])||(r._varToPropagators[i]||r._constrainedAway&&r._constrainedAway.indexOf(i)>=0)&&t.push(i);else for(var s=r._varNamesTrie,u=0,c=n.length;u<c;++u)or(n[u],s,a,t)}function or(e,r,n,a){var t=trie_get(r,e);t===TRIE_KEY_NOT_FOUND&&THROW("E_VARS_SHOULD_EXIST_NOW ["+e+"]"),domain_isSolved(n[t])||a.push(t)}function sr(e,r){if(vr(e,r))return!0;var n=r._propagators,a=Math.ceil(e._unsolved.length*TRIE_NODE_SIZE*.3),t=trie_create(TRIE_EMPTY,a),i=0,o=[],s=1;if(e.updatedVarIndex>=0)o.push(e.updatedVarIndex);else if(ur(e,r,n,o,t,++i))return!0;for(var u=!1;o.length;){var c=[];if(dr(e,r,n,s,o,c,t,++i)){u=!0;break}o=c,s=2}return mr(e,r)&&(u=!0),u}function ur(e,r,n,a,t,i){for(var o=0,s=n.length;o<s;o++)if(lr(e,r,n[o],a,t,i))return!0;return!1}function cr(e,r,n,a,t,i,o){for(var s=0,u=a.length;s<u;s++)if(lr(e,r,n[a[s]],t,i,o))return!0;return!1}function lr(e,r,n,a,t,i){var o=e.vardoms,s=n.index1,u=n.index2,c=n.index3,l=o[s],f=void 0!==u&&o[u],d=void 0!==c&&o[c];if((0,n.stepper)(e,r,s,u,c,n.arg1,n.arg2,n.arg3,n.arg4,n.arg5,n.arg6),l!==o[s]){if(domain_isEmpty(o[s]))return!0;fr(s,t,a,i)}if(void 0!==u&&f!==o[u]){if(domain_isEmpty(o[u]))return!0;fr(u,t,a,i)}if(void 0!==c&&d!==o[c]){if(domain_isEmpty(o[c]))return!0;fr(c,t,a,i)}return!1}function fr(e,r,n,a){if("number"==typeof e)trie_getNum(r,e)!==a&&(n.push(e),trie_addNum(r,e,a));else for(var t=0,i=e.length;t<i;++t)fr(e[t],r,n,a)}function dr(e,r,n,a,t,i,o,s){for(var u=r._varToPropagators,c=0,l=t.length;c<l;c++){var f=u[t[c]];if(f&&f.length>=a&&cr(e,r,n,f,i,o,s))return!0}return!1}function vr(e,r){var n=r.beforeSpace;return!(!n||!n(e))&&(r.aborted=!0,!0)}function mr(e,r){var n=r.afterSpace;return!(!n||!n(e))&&(r.aborted=!0,!0)}function gr(e,r){for(var n=e.vardoms,a=e._unsolved,t=0,i=0,o=a.length;i<o;++i){var s=a[i],u=n[s];domain_isSolved(u)||(a[t++]=s)}return a.length=t,0===t}function pr(e,r){for(var n=r.allVarNames,a={},t=0,i=n.length;t<i;t++)a[n[t]]=_r(e,t);return a}function _r(e,r){var n=e.vardoms[r];if(domain_isEmpty(n))return!1;var a=domain_getValue(n);return a!==NO_SUCH_VALUE?a:domain_toArr(n)}function hr(e,r){for(var n=e.vardoms,a=r.initialDomains,t=0,i=r.allVarNames.length;t<i;t++){var o=a[t];n[t]=domain_toSmallest(o)}}var br=0,yr=1,kr=void 0,Tr=1,Sr=2,xr=3,Or=function(){function r(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(_classCallCheck(this,r),this._class="fdo",n.logger&&setTerm(n.logger),this.logging=n.log||LOG_NONE,this.distribute=n.distribute||"naive",n.config){var a=this.config=n.config;if(a.initialDomains)for(var t=a.initialDomains,i=0,o=t.length;i<o;++i){var s=t[i];0===s.length&&(s=domain_createEmpty()),t[i]=domain_anyToSmallest(s)}a._propagators&&(a._propagators=void 0),a._varToPropagators&&(a._varToPropagators=void 0)}else this.config=e();this.solutions=[],this.state={space:null,more:!1},this._prepared=!1}return _createClass(r,[{key:"num",value:function(e){"number"!=typeof e&&THROW("FDO#num: expecting a number, got "+e+" (a "+(void 0===e?"undefined":_typeof(e))+")"),isNaN(e)&&THROW("FDO#num: expecting a number, got NaN");var r=s(this.config,e);return this.config.allVarNames[r]}},{key:"decl",value:function(e,r,n,a,t){""===e&&THROW("Var name can not be the empty string");var i=void 0;(i="number"==typeof r?[r,r]:r||[SUB,SUP]).length||a||THROW("EMPTY_DOMAIN_NOT_ALLOWED");var s=o(this.config,e||!0,i,a,t);return e=this.config.allVarNames[s],n&&(n.distribute&&THROW("Use `valtype` to set the value distribution strategy"),f(this.config,"varValueStrat",n,e)),e}},{key:"decls",value:function(e,r,n){for(var a=0,t=e.length;a<t;++a)this.decl(e[a],r,n)}},{key:"declRange",value:function(e,r,n,a){return this.decl(e,[r,n],a)}},{key:"plus",value:function(e,r,n){return g(this.config,"plus",[e,r,n])}},{key:"minus",value:function(e,r,n){return g(this.config,"min",[e,r,n])}},{key:"mul",value:function(e,r,n){return g(this.config,"ring-mul",[e,r,n])}},{key:"div",value:function(e,r,n){return g(this.config,"ring-div",[e,r,n])}},{key:"sum",value:function(e,r){return g(this.config,"sum",e,r)}},{key:"product",value:function(e,r){return g(this.config,"product",e,r)}},{key:"distinct",value:function(e){g(this.config,"distinct",e)}},{key:"eq",value:function(e,r){if(e instanceof Array)for(var n=0,a=e.length;n<a;++n)this.eq(e[n],r);else if(r instanceof Array)for(var t=0,i=r.length;t<i;++t)this.eq(e,r[t]);else g(this.config,"eq",[e,r])}},{key:"neq",value:function(e,r){if(e instanceof Array)for(var n=0,a=e.length;n<a;++n)this.neq(e[n],r);else if(r instanceof Array)for(var t=0,i=r.length;t<i;++t)this.neq(e,r[t]);else g(this.config,"neq",[e,r])}},{key:"gte",value:function(e,r){g(this.config,"gte",[e,r])}},{key:"lte",value:function(e,r){g(this.config,"lte",[e,r])}},{key:"gt",value:function(e,r){g(this.config,"gt",[e,r])}},{key:"lt",value:function(e,r){g(this.config,"lt",[e,r])}},{key:"isNeq",value:function(e,r,n){return g(this.config,"reifier",[e,r,n],"neq")}},{key:"isEq",value:function(e,r,n){return g(this.config,"reifier",[e,r,n],"eq")}},{key:"isGte",value:function(e,r,n){return g(this.config,"reifier",[e,r,n],"gte")}},{key:"isLte",value:function(e,r,n){return g(this.config,"reifier",[e,r,n],"lte")}},{key:"isGt",value:function(e,r,n){return g(this.config,"reifier",[e,r,n],"gt")}},{key:"isLt",value:function(e,r,n){return g(this.config,"reifier",[e,r,n],"lt")}},{key:"solve",value:function(){var e=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=this.logging=void 0===r.log?this.logging:r.log,a=r.max||1e3;this._prepare(r,n);var t=void 0;if((r._tostring||r._debug||r._debugConfig||r._debugSpace||r._debugSolver)&&(t=function(n){return(0|r._debugDelay)>=n&&(r._tostring&&getTerm().log($(e.config)),r._debug&&e._debugLegible(),r._debugConfig&&e._debugConfig(),r._debugSolver&&e._debugSolver(),!0)})(0)&&(t=void 0),!r._nosolve)return this._run(a,n,t),this.solutions}},{key:"_prepare",value:function(e,r){r>=LOG_STATS&&(getTerm().log(" - FD Preparing..."),getTerm().time(" - FD Prepare Time")),this._prepareConfig(e,r);var n=er(this.config);this.state.space=n,this.state.more=!0,this.state.stack=[],this._prepared=!0,r>=LOG_STATS&&getTerm().timeEnd(" - FD Prepare Time")}},{key:"_prepareConfig",value:function(e,r){var n=this.config;e.vars&&"all"!==e.vars&&f(n,"targeted_var_names",e.vars),e.beforeSpace&&f(n,"beforeSpace",e.beforeSpace),e.afterSpace&&f(n,"afterSpace",e.afterSpace),S(n)}},{key:"_run",value:function(e,r,n){this._prepared=!1;var a=this.state,t=void 0;r>=LOG_STATS&&((t=getTerm()).log(" - FD Var Count: "+this.config.allVarNames.length),t.log(" - FD Targeted: "+("all"===this.config.targetedVars?"all":this.config.targetedVars.length)),t.log(" - FD Constraint Count: "+this.config.allConstraints.length),t.log(" - FD Propagator Count: "+this.config._propagators.length),t.log(" - FD Solving..."),t.time(" - FD Solving Time"));for(var i=!1,o=a.space.vardoms,s=0,u=o.length;s<u;++s)if(domain_isEmpty(o[s])){i=!0,r>=LOG_STATS&&t.log(" - FD: rejected without propagation ("+this.config.allVarNames[s]+" is empty)");break}var c=void 0;i?(r>=LOG_STATS&&t.log(" - FD Input Problem Rejected Immediately"),c=[]):c=X(a,this.config,e,n),r>=LOG_STATS&&(t.timeEnd(" - FD Solving Time"),t.log(" - FD Solutions: "+c.length)),ee(c,this.config,this.solutions,r)}},{key:"hasVar",value:function(e){return trie_get(this.config._varNamesTrie,e)>=0}},{key:"setValueDistributionFor",value:function(e,r){f(this.config,"varValueStrat",r,e)}},{key:"branch_from_current_solution",value:function(){return new r({config:nr(this.state.space,this.config)})}},{key:"_debugLegible",value:function(){var e=JSON.parse(JSON.stringify(this.config)),r=e.allVarNames,n=e.targetedVars,a=e.allConstraints,t=e.initialDomains,i=e._propagators;for(var o in e)"_"===o[0]&&"object"===_typeof(e[o])&&(e[o]="<removed>");e.allVarNames="<removed>",e.allConstraints="<removed>",e.initialDomains="<removed>",e.varDistOptions="<removed>","all"!==n&&(e.targetedVars="<removed>");var s=getTerm();s.log("\n## _debug:\n"),s.log("- config:"),s.log(INSPECT(e)),s.log("- vars ("+r.length+"):"),s.log(r.map(function(e,r){return r+": "+domain__debug(t[r])+" "+(e===String(r)?"":" // "+e)}).join("\n")),"all"!==n&&s.log("- targeted vars ("+n.length+"): "+n.join(", ")),s.log("- constraints ("+a.length+" -> "+i.length+"):"),s.log(a.map(function(e,r){return void 0===e.param?r+": "+e.name+"("+e.varIndexes+") ---\x3e "+e.varIndexes.map(function(e){return domain__debug(t[e])}).join(", "):"reifier"===e.name?r+": "+e.name+"["+e.param+"]("+e.varIndexes+") ---\x3e "+domain__debug(t[e.varIndexes[0]])+" "+e.param+" "+domain__debug(t[e.varIndexes[1]])+" = "+domain__debug(t[e.varIndexes[2]]):r+": "+e.name+"("+e.varIndexes+") = "+e.param+" ---\x3e "+e.varIndexes.map(function(e){return domain__debug(t[e])}).join(", ")+" -> "+domain__debug(t[e.param])}).join("\n")),s.log("##/\n")}},{key:"_debugSolver",value:function(){var e=getTerm();e.log("## _debugSolver:\n");var r=this.config,n=r.allVarNames;e.log("# Variables ("+n.length+"x):"),e.log(" index name domain toArr");for(var a=0;a<n.length;++a)e.log(" ",a,":",n[a],":",domain__debug(r.initialDomains[a]));var t=r.allConstraints;e.log("# Constraints ("+t.length+"x):"),e.log(" index name vars param");for(var i=0;i<t.length;++i)e.log(" ",i,":",t[i].name,":",t[i].varIndexes.join(","),":",t[i].param);var o=r._propagators;e.log("# Propagators ("+o.length+"x):"),e.log(" index name vars args");for(var s=0;s<o.length;++s)e.log(" ",s,":",o[s].name+("reified"===o[s].name?"("+o[s].arg3+")":""),":",o[s].index1,o[s].index2,o[s].index3,"->",domain__debug(r.initialDomains[o[s].index1]),domain__debug(r.initialDomains[o[s].index2]),domain__debug(r.initialDomains[o[s].index3]));e.log("##")}},{key:"_debugConfig",value:function(){var e=Z(this.config);e.initialDomains=e.initialDomains.map(domain__debug),getTerm().log("## _debugConfig:\n",INSPECT(e))}},{key:"imp",value:function(e,r){this.logging&&(getTerm().log(" - FD Importing DSL; "+e.length+" bytes"),getTerm().time(" - FD Import Time:"));var n=re(e,this,r);return this.logging&&getTerm().timeEnd(" - FD Import Time:"),n}},{key:"exp",value:function(e,r,n,a){return $(this.config,e.vardoms,r,n,a)}}],[{key:"domainFromList",value:function(e){return domain_fromListToArrdom(e)}},{key:"getTerm",value:function(e){function r(){return e.apply(this,arguments)}return r.toString=function(){return e.toString()},r}(function(){return getTerm()})},{key:"setTerm",value:function(e){function r(r){return e.apply(this,arguments)}return r.toString=function(){return e.toString()},r}(function(e){return setTerm(e)})},{key:"dsl",value:function(){THROW("FDO.dsl: use FDO.solve()")}},{key:"imp",value:function(){THROW("FDO.imp: use FDO.solve()")}},{key:"solve",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments[2];n.max||(n.max=1);var t=new r(n).imp(e,a),i=t.solve(n);return n.returnFdo?t:t.config.aborted?"aborted":0===i.length?"rejected":1!==n.max?i:i[0]}}]),r}();return Or}();exports.default=FDO;