UNPKG

yalps

Version:

Yet another linear programming solver. (A rewrite of javascript-lp-solver.) Aims to be decently fast.

2 lines 6.01 kB
var ae=e=>({max:e}),le=e=>({min:e}),ue=e=>({equal:e}),ce=(e,t)=>({min:e,max:t});var g=(e,t,i)=>e.matrix[Math.imul(t,e.width)+i],v=(e,t,i,s)=>{e.matrix[Math.imul(t,e.width)+i]=s},H=e=>Symbol.iterator in e&&typeof e[Symbol.iterator]=="function"?e:Object.entries(e),L=e=>e===!0?!0:e===!1?new Set:e instanceof Set?e:new Set(e),j=e=>{let{direction:t,objective:i,integers:s,binaries:c}=e,l=t==="minimize"?-1:1,f=H(e.constraints),n=H(e.variables),r=Array.isArray(n)?n:Array.from(n),u=[],p=[];if(s!=null||c!=null){let o=L(c),d=o===!0?!0:L(s);for(let b=1;b<=r.length;b++){let[h]=r[b-1];o===!0||o.has(h)?(u.push(b),p.push(b)):(d===!0||d.has(h))&&p.push(b)}}let a=new Map;for(let[o,d]of f){let b=a.get(o)??{row:NaN,lower:-1/0,upper:1/0};b.lower=Math.max(b.lower,d.equal??d.min??-1/0),b.upper=Math.min(b.upper,d.equal??d.max??1/0),a.has(o)||a.set(o,b)}let m=1;for(let o of a.values())o.row=m,m+=(Number.isFinite(o.lower)?1:0)+(Number.isFinite(o.upper)?1:0);let y=r.length+1,w=m+u.length,x=y+w,A=new Float64Array(y*w),C=new Int32Array(x),T=new Int32Array(x),V={matrix:A,width:y,height:w,positionOfVariable:C,variableAtPosition:T};for(let o=0;o<x;o++)C[o]=o,T[o]=o;for(let o=1;o<y;o++)for(let[d,b]of H(r[o-1][1])){d===i&&v(V,0,o,l*b);let h=a.get(d);h!=null&&(Number.isFinite(h.upper)?(v(V,h.row,o,b),Number.isFinite(h.lower)&&v(V,h.row+1,o,-b)):Number.isFinite(h.lower)&&v(V,h.row,o,-b))}for(let o of a.values())Number.isFinite(o.upper)?(v(V,o.row,0,o.upper),Number.isFinite(o.lower)&&v(V,o.row+1,0,-o.lower)):Number.isFinite(o.lower)&&v(V,o.row,0,-o.lower);for(let o=0;o<u.length;o++){let d=m+o;v(V,d,0,1),v(V,d,u[o],1)}return{tableau:V,sign:l,variables:r,integers:p}};var O=(e,t)=>{let i=Math.round(1/t);return Math.round((e+Number.EPSILON)*i)/i};var Z=(e,t,i)=>{let s=g(e,t,i),c=e.variableAtPosition[e.width+t],l=e.variableAtPosition[i];e.variableAtPosition[e.width+t]=l,e.variableAtPosition[i]=c,e.positionOfVariable[c]=i,e.positionOfVariable[l]=e.width+t;let f=[];for(let n=0;n<e.width;n++){let r=g(e,t,n);Math.abs(r)>1e-16?(v(e,t,n,r/s),f.push(n)):v(e,t,n,0)}v(e,t,i,1/s);for(let n=0;n<e.height;n++){if(n===t)continue;let r=g(e,n,i);if(Math.abs(r)>1e-16){for(let u=0;u<f.length;u++){let p=f[u];v(e,n,p,g(e,n,p)-r*g(e,t,p))}v(e,n,i,-r/s)}}},z=(e,t,i,s)=>{e.push([t.variableAtPosition[t.width+i],t.variableAtPosition[s]]);for(let c=6;c<=Math.trunc(e.length/2);c++){let l=!0;for(let f=0;f<c;f++){let n=e.length-1-f,[r,u]=e[n],[p,a]=e[n-c];if(r!==p||u!==a){l=!1;break}}if(l)return!0}return!1},te=(e,t)=>{let i=[],{precision:s,maxPivots:c,checkCycles:l}=t;for(let f=0;f<c;f++){let n=0,r=s;for(let a=1;a<e.width;a++){let m=g(e,0,a);m>r&&(r=m,n=a)}if(n===0)return["optimal",O(g(e,0,0),s)];let u=0,p=1/0;for(let a=1;a<e.height;a++){let m=g(e,a,n);if(m<=s)continue;let w=g(e,a,0)/m;if(w<p&&(u=a,p=w,w<=s))break}if(u===0)return["unbounded",n];if(l&&z(i,e,u,n))return["cycled",NaN];Z(e,u,n)}return["cycled",NaN]},P=(e,t)=>{let i=[],{precision:s,maxPivots:c,checkCycles:l}=t;for(let f=0;f<c;f++){let n=0,r=-s;for(let a=1;a<e.height;a++){let m=g(e,a,0);m<r&&(r=m,n=a)}if(n===0)return te(e,t);let u=0,p=-1/0;for(let a=1;a<e.width;a++){let m=g(e,n,a);if(m<-s){let y=-g(e,0,a)/m;y>p&&(p=y,u=a)}}if(u===0)return["infeasible",NaN];if(l&&z(i,e,n,u))return["cycled",NaN];Z(e,n,u)}return["cycled",NaN]};import ne from"heap";var U=(e,t)=>({matrix:new Float64Array(e),positionOfVariable:new Int32Array(t),variableAtPosition:new Int32Array(t)}),re=(e,{matrix:t,positionOfVariable:i,variableAtPosition:s},c)=>{let{width:l,height:f}=e;t.set(e.matrix);for(let r=0;r<c.length;r++){let[u,p,a]=c[r],m=(f+r)*l,y=e.positionOfVariable[p];if(y<l)t[m]=u*a,t.fill(0,m+1,m+l),t[m+y]=u;else{let w=(y-l)*l;t[m]=u*(a-t[w]);for(let x=1;x<l;x++)t[m+x]=-u*t[w+x]}}i.set(e.positionOfVariable),s.set(e.variableAtPosition);let n=l+f+c.length;for(let r=l+f;r<n;r++)i[r]=r,s[r]=r;return{matrix:t.subarray(0,e.matrix.length+l*c.length),width:l,height:f+c.length,positionOfVariable:i.subarray(0,n),variableAtPosition:s.subarray(0,n)}},G=(e,t)=>{let i=0,s=0,c=0;for(let l=0;l<t.length;l++){let f=t[l],n=e.positionOfVariable[f]-e.width;if(n<0)continue;let r=g(e,n,0),u=Math.abs(r-Math.round(r));u>i&&(i=u,s=f,c=r)}return[s,c,i]},J=(e,t,i)=>{let{tableau:s,sign:c,integers:l}=e,{precision:f,maxIterations:n,tolerance:r,timeout:u}=i,[p,a,m]=G(s,l);if(m<=f)return[e,"optimal",t];let y=new ne((q,M)=>q[0]-M[0]);y.push([t,[[-1,p,Math.ceil(a)]]]),y.push([t,[[1,p,Math.floor(a)]]]);let w=l.length*2,x=s.matrix.length+w*s.width,A=s.positionOfVariable.length+w,C=U(x,A),T=U(x,A),V=t*(1-c*r),o=u+Date.now(),d=Date.now()>=o,b=!1,h=1/0,E=s,F=0;for(;F<n&&!y.empty()&&h>=V&&!d;){let[q,M]=y.pop();if(q>h)break;let R=re(s,C,M),[Y,I]=P(R,i);if(Y==="optimal"&&I<h){let[k,D,_]=G(R,l);if(_<=f){b=!0,h=I,E=R;let K=T;T=C,C=K}else{let K=[],S=[];for(let B=0;B<M.length;B++){let N=M[B],[$,ee]=N;ee===k?$<0?S.push(N):K.push(N):(K.push(N),S.push(N))}S.push([1,k,Math.floor(D)]),K.push([-1,k,Math.ceil(D)]),y.push([I,K]),y.push([I,S])}}d=Date.now()>=o,F++}let X=(d||F>=n)&&!y.empty()&&h>=V?"timedout":b?"optimal":"infeasible";return[{...e,tableau:E},X,b?h:NaN]};var Q=({tableau:e,sign:t,variables:i},s,c,{precision:l,includeZeroVariables:f})=>{if(s==="optimal"||s==="timedout"&&!Number.isNaN(c)){let n=[];for(let r=0;r<i.length;r++){let[u]=i[r],p=e.positionOfVariable[r+1]-e.width,a=p>=0?g(e,p,0):0;a>l?n.push([u,O(a,l)]):f&&n.push([u,0])}return{status:s,result:-t*c,variables:n}}else if(s==="unbounded"){let n=e.variableAtPosition[c]-1;return{status:"unbounded",result:t*(1/0),variables:0<=n&&n<i.length?[[i[n][0],1/0]]:[]}}else return{status:s,result:NaN,variables:[]}},W={precision:1e-8,checkCycles:!1,maxPivots:8192,tolerance:0,timeout:1/0,maxIterations:32768,includeZeroVariables:!1},oe={...W},ie=(e,t)=>{let i=j(e),s={...W,...t},[c,l]=P(i.tableau,s);if(i.integers.length===0||c!=="optimal")return Q(i,c,l,s);{let[f,n,r]=J(i,l,s);return Q(f,n,r,s)}};export{oe as defaultOptions,ue as equalTo,le as greaterEq,ce as inRange,ae as lessEq,ie as solve}; //# sourceMappingURL=index.min.module.js.map