<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Linear optimization solution in QlikView</title>
    <link>https://community.qlik.com/t5/QlikView/Linear-optimization-solution/m-p/873217#M305075</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P style="margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt;Dear All&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt;I am looking for solution to add linear optimization functionality to Qlikview (similar solution like Solver in Excel).&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt;Do you know any extension or macro which provides such functionality for Qlikview ?&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt;Best regards&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt;Zoltan&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sat, 16 May 2015 11:31:01 GMT</pubDate>
    <dc:creator>Anonymous</dc:creator>
    <dc:date>2015-05-16T11:31:01Z</dc:date>
    <item>
      <title>Linear optimization solution</title>
      <link>https://community.qlik.com/t5/QlikView/Linear-optimization-solution/m-p/873217#M305075</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P style="margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt;Dear All&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt;I am looking for solution to add linear optimization functionality to Qlikview (similar solution like Solver in Excel).&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt;Do you know any extension or macro which provides such functionality for Qlikview ?&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt;Best regards&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white;"&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Helvetica','sans-serif'; color: #3d3d3d;"&gt;Zoltan&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 16 May 2015 11:31:01 GMT</pubDate>
      <guid>https://community.qlik.com/t5/QlikView/Linear-optimization-solution/m-p/873217#M305075</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2015-05-16T11:31:01Z</dc:date>
    </item>
    <item>
      <title>Re: Linear optimization solution</title>
      <link>https://community.qlik.com/t5/QlikView/Linear-optimization-solution/m-p/873218#M305076</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;This might be worth having a look at:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://opensolver.org/" title="http://opensolver.org/"&gt;OpenSolver for Excel&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;or even this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="https://github.com/IainNZ/SimplexJS" title="https://github.com/IainNZ/SimplexJS"&gt;IainNZ/SimplexJS · GitHub&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This last one is Simplex implemented in JavaScript and it works perfectly well in the Module Macro in QlikView if you turn on JScript:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You can copy and paste this into the Macro Module editor:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//-------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;// SimplexJS&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;// &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://github.com/IainNZ/SimplexJS" rel="nofollow"&gt;https://github.com/IainNZ/SimplexJS&lt;/A&gt;&lt;/P&gt;&lt;P&gt;// A linear and mixed-integer linear programming solver.&lt;/P&gt;&lt;P&gt;//&lt;/P&gt;&lt;P&gt;// By Iain Dunning (c)&lt;/P&gt;&lt;P&gt;// Licensed under the MIT License.&lt;/P&gt;&lt;P&gt;//-------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Place everything under the SimplexJS namespace&lt;/P&gt;&lt;P&gt;var SimplexJS = {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Solver status constants&lt;/P&gt;&lt;P&gt;&amp;nbsp; INFEASIBLE : 0,&lt;/P&gt;&lt;P&gt;&amp;nbsp; OPTIMAL&amp;nbsp;&amp;nbsp;&amp;nbsp; : 1,&lt;/P&gt;&lt;P&gt;&amp;nbsp; UNBOUNDED&amp;nbsp; : 2,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Parameters&lt;/P&gt;&lt;P&gt;&amp;nbsp; MAXITERATIONS: Infinity,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; // ModelCopy&lt;/P&gt;&lt;P&gt;&amp;nbsp; // 'Deep copies' a model by creating a copy of all children&lt;/P&gt;&lt;P&gt;&amp;nbsp; // (e.g. A, b, c, ...).&amp;nbsp; By default, copying an ojbect just &lt;/P&gt;&lt;P&gt;&amp;nbsp; // creates a 'shallow' copy, where the two objects would both&lt;/P&gt;&lt;P&gt;&amp;nbsp; // refer to the same matrices.&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Variations of this code can be found everywhere with a quick&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Google search - I'm not sure exactly where I got it.&lt;/P&gt;&lt;P&gt;&amp;nbsp; ModelCopy : function(model) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (model == null || typeof(model) != 'object') return model;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var newModel = new model.constructor();&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (var key in model) newModel[key] = SimplexJS.ModelCopy(model[key]);&lt;/P&gt;&lt;P&gt;&amp;nbsp; return newModel;&lt;/P&gt;&lt;P&gt;&amp;nbsp; },&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; // SolveMILP&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Uses branch-and-bound to solve a (mixed-integer) linear&lt;/P&gt;&lt;P&gt;&amp;nbsp; // program. This implementation is about as basic as it gets!&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Assumes the root model is in the form&lt;/P&gt;&lt;P&gt;&amp;nbsp; // min c.x&lt;/P&gt;&lt;P&gt;&amp;nbsp; //&amp;nbsp; st&amp;nbsp; A.x = b&lt;/P&gt;&lt;P&gt;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l &amp;lt;= x &amp;lt;= u&lt;/P&gt;&lt;P&gt;&amp;nbsp; //&amp;nbsp; Some x are integer, and b &amp;gt;= 0&lt;/P&gt;&lt;P&gt;&amp;nbsp; SolveMILP : function(rootModel, maxNodes, log) {&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (maxNodes === undefined) maxNodes = Infinity;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (log === undefined) log = [];&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Track the best integer solution found&lt;/P&gt;&lt;P&gt;&amp;nbsp; var bestFeasible = Infinity;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var bestFeasibleX = new Array(rootModel.n);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Branch on most fractional variable&lt;/P&gt;&lt;P&gt;&amp;nbsp; var mostFracIndex, mostFracValue, fracValue;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Create and start branch-and-bound tree&lt;/P&gt;&lt;P&gt;&amp;nbsp; var unsolvedLPs = new Array();&lt;/P&gt;&lt;P&gt;&amp;nbsp; rootModel.solved = false;&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsolvedLPs.push(rootModel);&lt;/P&gt;&lt;P&gt;&amp;nbsp; var nodeCount = 0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Process unsolved nodes on the b-and-b tree&lt;/P&gt;&lt;P&gt;&amp;nbsp; while (unsolvedLPs.length &amp;gt;= 1) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; nodeCount += 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; model = unsolvedLPs.shift();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Stop if we reached max node count&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (nodeCount &amp;gt;= maxNodes) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("Tried to solve node #"+nodeCount.toString()+" which is &amp;gt;= max = "+maxNodes.toString());&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsolvedLPs = [];&lt;/P&gt;&lt;P&gt;&amp;nbsp; rootModel.status = SimplexJS.INFEASIBLE;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Solve the LP at this node&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("Solving node #"+nodeCount.toString()+", nodes on tree: "+(unsolvedLPs.length+1).toString());&lt;/P&gt;&lt;P&gt;&amp;nbsp; SimplexJS.PrimalSimplex(model, log);&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (model.status == SimplexJS.INFEASIBLE) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // LP is infeasible, fathom it&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("Node infeasible, fathoming.");&lt;/P&gt;&lt;P&gt;&amp;nbsp; continue;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("LP solution at node = "+model.z.toString());&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log(model.x);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Is this worse than the best integer solution?&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (model.z &amp;gt; bestFeasible) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Fathom&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("LP solution worse than best integer feasible, fathoming.");&lt;/P&gt;&lt;P&gt;&amp;nbsp; continue;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Check integrality of LP solution&lt;/P&gt;&lt;P&gt;&amp;nbsp; mostFracIndex = -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; mostFracValue = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; model.n; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Is this variable integer?&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (model.xINT&lt;I&gt;) {&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Is it fractional?&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (Math.abs(Math.floor(model.x&lt;I&gt;) - model.x&lt;I&gt;) &amp;gt; 0.0001) {&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Does not satisfy integrality - will need to branch&lt;/P&gt;&lt;P&gt;&amp;nbsp; fracValue = Math.min( Math.abs(Math.floor(model.x&lt;I&gt;) - model.x&lt;I&gt;), &lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Math.abs(Math.ceil (model.x&lt;I&gt;) - model.x&lt;I&gt;)&amp;nbsp;&amp;nbsp; );&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (fracValue &amp;gt; mostFracValue) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; mostFracIndex = i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; mostFracValue = fracValue;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Did we find any fractional ints?&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (mostFracIndex == -1) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // No fractional ints - update best feasible?&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("Node is integer feasible.");&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (model.z &amp;lt; bestFeasible) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("Best integer feasible was "+bestFeasible.toString()+", is now = "+model.z.toString());&lt;/P&gt;&lt;P&gt;&amp;nbsp; bestFeasible = model.z;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; model.n; i++) bestFeasibleX&lt;I&gt; = model.x&lt;I&gt;;&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Some fractional - create two new LPs to solve&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("Node is fractional, branching on most fractional variable, "+mostFracIndex.toString());&lt;/P&gt;&lt;P&gt;&amp;nbsp; downBranchModel = SimplexJS.ModelCopy(model);&lt;/P&gt;&lt;P&gt;&amp;nbsp; downBranchModel.xUB[mostFracIndex] = Math.floor(downBranchModel.x[mostFracIndex])&lt;/P&gt;&lt;P&gt;&amp;nbsp; downBranchModel.z = model.z;&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsolvedLPs.push(downBranchModel);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; upBranchModel = SimplexJS.ModelCopy(model);&lt;/P&gt;&lt;P&gt;&amp;nbsp; upBranchModel.xLB[mostFracIndex] = Math.ceil(upBranchModel.x[mostFracIndex])&lt;/P&gt;&lt;P&gt;&amp;nbsp; upBranchModel.z = model.z;&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsolvedLPs.push(upBranchModel);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // How did it go?&lt;/P&gt;&lt;P&gt;&amp;nbsp; rootModel.nodeCount = nodeCount;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (bestFeasible &amp;lt; Infinity) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Done!&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("All nodes solved or fathomed - integer solution found");&lt;/P&gt;&lt;P&gt;&amp;nbsp; rootModel.x = bestFeasibleX;&lt;/P&gt;&lt;P&gt;&amp;nbsp; rootModel.z = bestFeasible;&lt;/P&gt;&lt;P&gt;&amp;nbsp; rootModel.status = SimplexJS.OPTIMAL;&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("All nodes solved or fathomed - NO integer solution found");&lt;/P&gt;&lt;P&gt;&amp;nbsp; rootModel.status = SimplexJS.INFEASIBLE;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; },&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; // PrimalSimplex&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Uses the revised simplex method with bounds to solve the&lt;/P&gt;&lt;P&gt;&amp;nbsp; // primal of a linear program. Assumes the model is in the form:&lt;/P&gt;&lt;P&gt;&amp;nbsp; // min c.x&lt;/P&gt;&lt;P&gt;&amp;nbsp; //&amp;nbsp; st&amp;nbsp; A.x = b&lt;/P&gt;&lt;P&gt;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l &amp;lt;= x &amp;lt;= u&lt;/P&gt;&lt;P&gt;&amp;nbsp; //&amp;nbsp; Some x are integer, and b &amp;gt;= 0&lt;/P&gt;&lt;P&gt;&amp;nbsp; PrimalSimplex : function(model, log) {&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (log === undefined) log = [];&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Get shorter names&lt;/P&gt;&lt;P&gt;&amp;nbsp; A=model.A; b=model.b; c=model.c;&lt;/P&gt;&lt;P&gt;&amp;nbsp; m=model.m; n=model.n;&lt;/P&gt;&lt;P&gt;&amp;nbsp; xLB=model.xLB; xUB=model.xUB;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Define some temporary variables we will need for RSM&lt;/P&gt;&lt;P&gt;&amp;nbsp; var i, j;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var varStatus = new Array(n + m);&lt;/P&gt;&lt;P&gt;&amp;nbsp; var basicVars = new Array(m);&lt;/P&gt;&lt;P&gt;&amp;nbsp; var Binv&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = new Array(m); &lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) { Binv&lt;I&gt; = new Array(m); }&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var cBT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = new Array(m);&lt;/P&gt;&lt;P&gt;&amp;nbsp; var pi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = new Array(m);&lt;/P&gt;&lt;P&gt;&amp;nbsp; var rc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = new Array(n);&lt;/P&gt;&lt;P&gt;&amp;nbsp; var BinvAs&amp;nbsp;&amp;nbsp;&amp;nbsp; = new Array(m);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Some useful constants&lt;/P&gt;&lt;P&gt;&amp;nbsp; var BASIC = 0, NONBASIC_L = +1, NONBASIC_U = -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var TOL = 0.000001;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // The solution&lt;/P&gt;&lt;P&gt;&amp;nbsp; var x = new Array(n + m), z, status;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Create the initial solution to Phase 1&lt;/P&gt;&lt;P&gt;&amp;nbsp; // - Real variables&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; n; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; var absLB = Math.abs(xLB&lt;I&gt;);&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var absUB = Math.abs(xUB&lt;I&gt;);&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; x&lt;I&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (absLB &amp;lt; absUB) ? xLB&lt;I&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : xUB&lt;I&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; varStatus&lt;I&gt; = (absLB &amp;lt; absUB) ? NONBASIC_L : NONBASIC_U;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; // - Artificial variables&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; x[i+n] = b&lt;I&gt;;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Some of the real variables might be non-zero, so need&lt;/P&gt;&lt;P&gt;&amp;nbsp; // to reduce x[artificials] accordingly&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (j = 0; j &amp;lt; n; j++) { x[i+n] -= A&lt;I&gt;&lt;J&gt; * x&lt;J&gt;; }&lt;/J&gt;&lt;/J&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; varStatus[i+n] = BASIC;&lt;/P&gt;&lt;P&gt;&amp;nbsp; basicVars&lt;I&gt; = i+n;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; // - Basis&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) { cBT&lt;I&gt; = +1.0; }&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (j = 0; j &amp;lt; m; j++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Binv&lt;I&gt;&lt;J&gt; = (i == j) ? 1.0 : 0.0;&lt;/J&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Being simplex iterations&lt;/P&gt;&lt;P&gt;&amp;nbsp; var phaseOne = true, iter = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; while (true) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; iter++;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (iter &amp;gt;= SimplexJS.MAXITERATIONS) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("PrimalSimplex: Reached MAXITERATIONS="+iter.toString());&lt;/P&gt;&lt;P&gt;&amp;nbsp; z = 0.0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; n; i++) z += c&lt;I&gt; * x&lt;I&gt;;&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; model.z = z; //Infinity;&lt;/P&gt;&lt;P&gt;&amp;nbsp; model.x = x;&lt;/P&gt;&lt;P&gt;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Step 1. Duals and reduced Costs&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log(Binv)&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; pi&lt;I&gt; = 0.0;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (j = 0; j &amp;lt; m; j++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; pi&lt;I&gt; += cBT&lt;J&gt; * Binv&lt;J&gt;&lt;I&gt;&lt;/I&gt;&lt;/J&gt;&lt;/J&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log(pi);&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (j = 0; j &amp;lt; n; j++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; rc&lt;J&gt; = phaseOne ? 0.0 : c&lt;J&gt;;&lt;/J&gt;&lt;/J&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; rc&lt;J&gt; -= pi&lt;I&gt; * A&lt;I&gt;&lt;J&gt;;&lt;/J&gt;&lt;/I&gt;&lt;/I&gt;&lt;/J&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log(rc);&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Step 2. Check optimality and pick entering variable&lt;/P&gt;&lt;P&gt;&amp;nbsp; var minRC = -TOL, s = -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; n; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // If NONBASIC_L (= +1), rc&lt;I&gt; must be negative (&amp;lt; 0) -&amp;gt; +rc&lt;I&gt; &amp;lt; -TOL&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // If NONBASIC_U (= -1), rc&lt;I&gt; must be positive (&amp;gt; 0) -&amp;gt; -rc&lt;I&gt; &amp;lt; -TOL&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt; +rc&lt;I&gt; &amp;gt; +TOL&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // If BASIC&amp;nbsp;&amp;nbsp;&amp;nbsp; (= 0), can't use this rc -&amp;gt; 0 * rc&lt;I&gt; &amp;lt; -LPG_TOL -&amp;gt; alway FALSE&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Then, by setting initial value of minRC to -TOL, can collapse this&lt;/P&gt;&lt;P&gt;&amp;nbsp; // check and the check for a better RC into 1 IF statement!&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (varStatus&lt;I&gt; * rc&lt;I&gt; &amp;lt; minRC) { &lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; minRC = varStatus&lt;I&gt; * rc&lt;I&gt;;&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; s = i; &lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log(minRC, s);&lt;/P&gt;&lt;P&gt;&amp;nbsp; // If no entering variable&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (s == -1) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (phaseOne) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log("Phase one optimal")&lt;/P&gt;&lt;P&gt;&amp;nbsp; z = 0.0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) z += cBT&lt;I&gt; * x[basicVars&lt;I&gt;];&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (z &amp;gt; TOL) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log("Phase 1 objective: z = ", z, " &amp;gt; 0 -&amp;gt; infeasible!");&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("PrimalSimplex: Phase 1 objective: z = "+z.toString()+" &amp;gt; 0 -&amp;gt; infeasible!");&lt;/P&gt;&lt;P&gt;&amp;nbsp; model.status = SimplexJS.INFEASIBLE;&lt;/P&gt;&lt;P&gt;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; //log.push("Transitioning to phase 2");&lt;/P&gt;&lt;P&gt;&amp;nbsp; phaseOne = false;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; cBT&lt;I&gt; = (basicVars&lt;I&gt; &amp;lt; n) ? (c[basicVars&lt;I&gt;]) : (0.0);&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; continue;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; model.status = SimplexJS.OPTIMAL;&lt;/P&gt;&lt;P&gt;&amp;nbsp; z = 0.0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; n; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; z += c&lt;I&gt; * x&lt;I&gt;;&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; model.z = z;&lt;/P&gt;&lt;P&gt;&amp;nbsp; model.x = x;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log("Optimality in Phase 2!",z);&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("PrimalSimplex: Optimality in Phase 2: z = "+z.toString());&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log(x);&lt;/P&gt;&lt;P&gt;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Step 3. Calculate BinvAs&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; BinvAs&lt;I&gt; = 0.0;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (k = 0; k &amp;lt; m; k++) BinvAs&lt;I&gt; += Binv&lt;I&gt;&lt;K&gt; * A&lt;K&gt;&lt;S&gt;;&lt;/S&gt;&lt;/K&gt;&lt;/K&gt;&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log(BinvAs);&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Step 4. Ratio test&lt;/P&gt;&lt;P&gt;&amp;nbsp; var minRatio = Infinity, ratio = 0.0, r = -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var rIsEV = false;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // If EV is...&lt;/P&gt;&lt;P&gt;&amp;nbsp; // NBL, -&amp;gt; rc&lt;S&gt; &amp;lt; 0 -&amp;gt; want to INCREASE x&lt;S&gt;&lt;/S&gt;&lt;/S&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // NBU, -&amp;gt; rc&lt;S&gt; &amp;gt; 0 -&amp;gt; want to DECREASE x&lt;S&gt;&lt;/S&gt;&lt;/S&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Option 1: Degenerate iteration&lt;/P&gt;&lt;P&gt;&amp;nbsp; ratio = xUB&lt;S&gt; - xLB&lt;S&gt;;&lt;/S&gt;&lt;/S&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (ratio &amp;lt;= minRatio) { minRatio = ratio; r = -1; rIsEV = true; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Option 2: Basic variables leaving basis&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; j = basicVars&lt;I&gt;;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var jLB = (j &amp;gt;= n) ? 0.0 : xLB&lt;J&gt;;&lt;/J&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var jUB = (j &amp;gt;= n) ? Infinity : xUB&lt;J&gt;;&lt;/J&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-1*varStatus&lt;S&gt;*BinvAs&lt;I&gt; &amp;gt; +TOL) { // NBL: BinvAs&lt;I&gt; &amp;lt; 0, NBU: BinvAs&lt;I&gt; &amp;gt; 0&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/S&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ratio = (x&lt;J&gt; - jUB) / (varStatus&lt;S&gt;*BinvAs&lt;I&gt;);&lt;/I&gt;&lt;/S&gt;&lt;/J&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (ratio &amp;lt;= minRatio) { minRatio = ratio; r = i; rIsEV = false; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (+1*varStatus&lt;S&gt;*BinvAs&lt;I&gt; &amp;gt; +TOL) { // NBL: BinvAs&lt;I&gt; &amp;gt; 0, NBU: BinvAs&lt;I&gt; &amp;lt; 0&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/S&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ratio = (x&lt;J&gt; - jLB) / (varStatus&lt;S&gt;*BinvAs&lt;I&gt;);&lt;/I&gt;&lt;/S&gt;&lt;/J&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (ratio &amp;lt;= minRatio) { minRatio = ratio; r = i; rIsEV = false; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Check ratio&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (minRatio &amp;gt;= Infinity) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (phaseOne) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Not sure what this means - nothing good!&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log("Something bad happened");&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("PrimalSimplex: Something bad happened in Phase 1...");&lt;/P&gt;&lt;P&gt;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // PHASE 2: Unbounded!&lt;/P&gt;&lt;P&gt;&amp;nbsp; model.status = SimplexJS.UNBOUNDED;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log("Unbounded in Phase 2!");&lt;/P&gt;&lt;P&gt;&amp;nbsp; log.push("PrimalSimplex: Unbounded in Phase 2!");&lt;/P&gt;&lt;P&gt;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Step 5. Update solution and basis&lt;/P&gt;&lt;P&gt;&amp;nbsp; x&lt;S&gt; += varStatus&lt;S&gt; * minRatio;&lt;/S&gt;&lt;/S&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) x[basicVars&lt;I&gt;] -= varStatus&lt;/I&gt;&lt;S&gt;&lt;I&gt; * minRatio * BinvAs&lt;I&gt;;&lt;/I&gt;&lt;/I&gt;&lt;/S&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (!rIsEV) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Basis change! Update Binv, flags&lt;/P&gt;&lt;P&gt;&amp;nbsp; // RSM tableau: [Binv B | Binv | Binv As]&lt;/P&gt;&lt;P&gt;&amp;nbsp; // -&amp;gt; GJ pivot on the BinvAs column, rth row&lt;/P&gt;&lt;P&gt;&amp;nbsp; var erBinvAs = BinvAs&lt;R&gt;;&lt;/R&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // All non-r rows&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0; i &amp;lt; m; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (i != r) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; var eiBinvAsOvererBinvAs = BinvAs&lt;I&gt; / erBinvAs;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (j = 0; j &amp;lt; m; j++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Binv&lt;I&gt;&lt;J&gt; -= eiBinvAsOvererBinvAs * Binv&lt;R&gt;&lt;J&gt;&lt;/J&gt;&lt;/R&gt;&lt;/J&gt;&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; // rth row&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (j = 0; j &amp;lt; m; j++) Binv&lt;R&gt;&lt;J&gt; /= erBinvAs;&lt;/J&gt;&lt;/R&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Update status flags&lt;/P&gt;&lt;P&gt;&amp;nbsp; varStatus&lt;S&gt; = BASIC;&lt;/S&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (basicVars&lt;R&gt; &amp;lt; n) {&lt;/R&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (Math.abs(x[basicVars&lt;R&gt;] - xLB[basicVars&lt;R&gt;]) &amp;lt; TOL) varStatus[basicVars&lt;R&gt;] = NONBASIC_L;&lt;/R&gt;&lt;/R&gt;&lt;/R&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (Math.abs(x[basicVars&lt;R&gt;] - xUB[basicVars&lt;R&gt;]) &amp;lt; TOL) varStatus[basicVars&lt;R&gt;] = NONBASIC_U;&lt;/R&gt;&lt;/R&gt;&lt;/R&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (Math.abs(x[basicVars&lt;R&gt;] - 0.00000) &amp;lt; TOL) varStatus[basicVars&lt;R&gt;] = NONBASIC_L;&lt;/R&gt;&lt;/R&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (Math.abs(x[basicVars&lt;R&gt;] - Infinity) &amp;lt; TOL) varStatus[basicVars&lt;R&gt;] = NONBASIC_U;&lt;/R&gt;&lt;/R&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; cBT&lt;R&gt; = phaseOne ? 0.0 : c&lt;S&gt;;&lt;/S&gt;&lt;/R&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; basicVars&lt;R&gt; = s;&lt;/R&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Degenerate iteration&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (varStatus&lt;S&gt; == NONBASIC_L) { varStatus&lt;S&gt; = NONBASIC_U; }&lt;/S&gt;&lt;/S&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; else { varStatus&lt;S&gt; = NONBASIC_L; }&lt;/S&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; //---------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; //console.log(x);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;function TestPrimalSimplex() {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var test = new Object();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.A = [[ 2, 1, 1, 0],&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [20, 1, 0, 1]];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.b = [40, 100];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.c = [-10, -1, 0, 0];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.m = 2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.n = 4;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.xLB = [2, 0, 0, 0];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.xUB = [3, Infinity, Infinity, Infinity];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SimplexJS.PrimalSimplex(test);&lt;/P&gt;&lt;P&gt;&amp;nbsp; qvlib.MsgBox(test.x, test.z);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Should be 3, 34, 0, 6&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;function TestBandB() {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var test = new Object();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.A = [[ 1, 1, 0, 1, 0, 0],&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ 0, 1, 1, 0, 1, 0],&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; [.5,.5, 1, 1, 0, 1]];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.b =&amp;nbsp; [ 1, 1, 1];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.c =&amp;nbsp; [-1,-1,-1, 0, 0, 0];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.m = 3;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.n = 6;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.xLB = [0, 0, 0, 0, 0, 0];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test.xUB = [Infinity, Infinity, Infinity, Infinity, Infinity, Infinity];&lt;/P&gt;&lt;P&gt;&amp;nbsp; test.xINT = [true, true, true, false, false, false];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SimplexJS.SolveMILP(test);&lt;/P&gt;&lt;P&gt;&amp;nbsp; qvlib.MsgBox(test.x, test.z);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Should be 1, 0, 0, 0, 1, 0.5, z=-1&lt;/P&gt;&lt;P&gt;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; or 0, 1, 0, 0, 0, 0.5, z=-1&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;function BothTests() {&lt;/P&gt;&lt;P&gt;&amp;nbsp; qvlib.MsgBox("Testing Primal");&lt;/P&gt;&lt;P&gt;&amp;nbsp; TestPrimalSimplex();&lt;/P&gt;&lt;P&gt;&amp;nbsp; qvlib.MsgBox("Should be 3, 34, 0, 6");&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; qvlib.MsgBox("Testing Branch and Bound");&lt;/P&gt;&lt;P&gt;&amp;nbsp; TestBandB();&lt;/P&gt;&lt;P&gt;&amp;nbsp; qvlib.MsgBox(" Should be 1, 0, 0, 0, 1, 0.5, z=-1");&lt;/P&gt;&lt;P&gt;&amp;nbsp; qvlib.MsgBox("&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; or 0, 1, 0, 0, 0, 0.5, z=-1");&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 16 May 2015 20:44:51 GMT</pubDate>
      <guid>https://community.qlik.com/t5/QlikView/Linear-optimization-solution/m-p/873218#M305076</guid>
      <dc:creator>petter</dc:creator>
      <dc:date>2015-05-16T20:44:51Z</dc:date>
    </item>
    <item>
      <title>Re: Linear optimization solution</title>
      <link>https://community.qlik.com/t5/QlikView/Linear-optimization-solution/m-p/873219#M305077</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Zoltan,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;A great question, and one that another customer just asked me yesterday. The easiest way to visualize linear optimization in Qlik is to keep using the Excel Solver and simply uploading the column you're solving for as data into Qlik. In the example screenshot below, I'm trying to minimize the number of clinicians I need to hire given the respective output (RVUs) of each physician type and the patient demand in multiple scenarios. As you can see, I simply load the new column from Excel (Num_Clinicians) and can quickly visualize it.&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;IMG alt="2015_06_17_Linear_Optimization.JPG" class="jive-image image-1" src="https://community.qlik.com/legacyfs/online/89796_2015_06_17_Linear_Optimization.JPG" style="height: 354px; width: 620px;" /&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The next option would be to use R, an open source application that can solve statistical/linear optimization problems as an API call from your QlikView application as explained here: &lt;A href="https://community.qlik.com/docs/DOC-3981"&gt;QlikView and R Integration for Predictive Analytics Example&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Lastly, I have no doubt that @PeterSkjolden and the JavaScript he invokes from the Macro Module in the response above will work, but Java is beyond me so I'll take his word for it. Hope that helps!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 17 Jun 2015 16:18:45 GMT</pubDate>
      <guid>https://community.qlik.com/t5/QlikView/Linear-optimization-solution/m-p/873219#M305077</guid>
      <dc:creator />
      <dc:date>2015-06-17T16:18:45Z</dc:date>
    </item>
    <item>
      <title>Re: Linear optimization solution</title>
      <link>https://community.qlik.com/t5/QlikView/Linear-optimization-solution/m-p/2524247#M1226597</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;
&lt;P&gt;It's been over 8 years. Is it possible to do this linear optimization using the simplex algorithm only in Qlik Cloud (without Excel)?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Best regards,&lt;/P&gt;
&lt;P&gt;MVP&lt;/P&gt;</description>
      <pubDate>Tue, 15 Jul 2025 09:18:50 GMT</pubDate>
      <guid>https://community.qlik.com/t5/QlikView/Linear-optimization-solution/m-p/2524247#M1226597</guid>
      <dc:creator>mvpetre</dc:creator>
      <dc:date>2025-07-15T09:18:50Z</dc:date>
    </item>
  </channel>
</rss>

