Applied

Two numbers that have to meet

Every linear program has a shadow — a second program built from the same numbers read the other way, whose minimum can never fall below the first's maximum. That much is a one-line calculation; the theorem is that the two numbers are always exactly equal.

Worth reading first: A matrix is a picture of what happens to the grid · The plane, divided by whoever is nearest.

A linear program in two variables is a small object. There is a linear form to be made as large as possible, and there are some inequalities saying where the point is allowed to sit. Maximise 3x1+4x23x_1 + 4x_2 subject to 3x1+2x2123x_1 + 2x_2 \le 12 and x1+4x210x_1 + 4x_2 \le 10, with neither variable negative. The answer is a corner and a number, and the number is 785\frac{78}{5}.

Eight whole numbers were used to ask that: two in the objective, four in the constraint matrix, two on the right-hand side. Read the same matrix down its columns rather than across its rows, exchange the objective with the right-hand side, and turn every \le into a \ge. Out comes a different question — minimise 12y1+10y212y_1 + 10y_2 subject to 3y1+y233y_1 + y_2 \ge 3 and 2y1+4y242y_1 + 4y_2 \ge 4, with neither variable negative. Different sense, different region, different shape, different corner.

Same number.

Two polytopes, two optima, one numberThe feasible regions of a linear program and of its dual, side by side, each with its optimal vertex, and a number line on which the gap between the two optima closes to nothing.primal: max 3x₁ + 4x₂dual: min 12y₁ + 10y₂3x₁ + 2x₂ ≤ 12x₁ + 4x₂ ≤ 103y₁ + y₂ ≥ 32y₁ + 4y₂ ≥ 401234501234x₁x₂78/512100(14/5, 9/5)00.511.522.5301234y₁y₂78/53024(4/5, 3/5)05101520253078/51210078/53024they meet at 78/5primal vertex values, from belowdual vertex values, from aboveweak duality checked on all 12 pairs — each of the 4 feasible primal vertices against each of the 3 feasible dual vertices — andcᵀx ≤ bᵀy held every timestrong duality is the equality of the two optima: max 3x₁ + 4x₂ = 78/5 = min 12y₁ + 10y₂, one number reached from below andfrom abovethe dual region is unbounded upward and the drawing cuts it at the box; the enumeration ignores the cut
Fig. 1 The feasible region of a linear program and the feasible region of its dual, side by side, with the gap between the two optima drawn as a number line. Weak duality was checked on all 12 pairs — each of the 4 feasible primal vertices against each of the 3 feasible dual vertices — and the two optima are the same rational number, 78/5.

The second program, built by transposition

The recipe has no cleverness in it, which is part of what makes the result strange. Write the first program as maxcTx\max c^\mathsf{T}x subject to AxbAx \le b and x0x \ge 0. Then its dual is minbTy\min b^\mathsf{T}y subject to ATycA^\mathsf{T}y \ge c and y0y \ge 0, and nothing has been supplied that was not already present. The matrix is transposed, the two vectors trade places, and the inequalities reverse.

Applied to the program above, the constraint matrix (3214)\begin{pmatrix} 3 & 2 \\ 1 & 4\end{pmatrix} transposes to (3124)\begin{pmatrix} 3 & 1 \\ 2 & 4\end{pmatrix}, so the dual’s two constraints are 3y1+y233y_1 + y_2 \ge 3 and 2y1+4y242y_1 + 4y_2 \ge 4 — one dual constraint for each variable of the original, one dual variable for each constraint. A program with two constraints and two variables happens to dualise into another with two of each, which is why both can be drawn; that coincidence is an accident of size and not a feature of the construction.

The two pictures do not resemble each other. The first region hugs the origin, because the origin satisfies every \le constraint when the right-hand side is non-negative. The second is a wedge opening away from the origin, because the origin satisfies no \ge constraint with a positive right-hand side. One is bounded and the other runs off for ever upward. One is asked for its largest value and the other for its smallest. The optimum of the first sits at (145,95)\left(\frac{14}{5}, \frac{9}{5}\right) and the optimum of the second at (45,35)\left(\frac{4}{5}, \frac{3}{5}\right), and those are points in different planes with different meanings, not two names for one place.

What they share is a number: 12×45+10×35=78512 \times \frac{4}{5} + 10 \times \frac{3}{5} = \frac{78}{5}, and 3×145+4×95=7853 \times \frac{14}{5} + 4 \times \frac{9}{5} = \frac{78}{5}.

Neither number can overtake the other

Half of that is easy, and the easy half deserves stating first because it is what makes the hard half look impossible.

Take any xx feasible for the first program and any yy feasible for the second. Since ATycA^\mathsf{T}y \ge c and x0x \ge 0, multiplying the first inequality through by the non-negative numbers in xx preserves it, so

cTx    (ATy)Tx  =  yT(Ax)    yTb  =  bTy,c^\mathsf{T}x \;\le\; (A^\mathsf{T}y)^\mathsf{T}x \;=\; y^\mathsf{T}(Ax) \;\le\; y^\mathsf{T}b \;=\; b^\mathsf{T}y,

the last step because AxbAx \le b and y0y \ge 0. That is the whole calculation. It is called weak duality, it holds for every feasible pair whatever, and it says that every value the maximising program can reach lies below every value the minimising program can reach. The two families of numbers are separated: one set entirely to the left, one set entirely to the right, and a gap in between.

Nothing in that argument suggests the gap is small, let alone absent. Two sets of numbers with one wholly below the other is the ordinary situation, and the ordinary expectation is that they stop short of each other. The number line under the figure above is drawn to make the point: the primal vertex values 00, 1010, 1212 and 785\frac{78}{5} are marked below it, the dual vertex values 785\frac{78}{5}, 2424 and 3030 above it, and the two lists creep towards each other from opposite directions. The theorem is that they touch.

Where the regions come from

Before the meeting can be believed it has to be established that the numbers are right, and this site’s habit is that a picture of a decision is the decision performed rather than a drawing checked afterwards.

The vertex that maximises 3x₁ + 4x₂A two-variable linear program's feasible region, drawn from the exact intersection of every pair of its constraints, with the objective's contour lines and the optimal vertex marked.01234501234x₁x₂3x₁ + 4x₂ = 53x₁ + 4x₂ = 103x₁ + 4x₂ = 78/578/512100(14/5, 9/5)1: 3x₁ + 2x₂ ≤ 122: x₁ + 4x₂ ≤ 103: x₁ ≥ 04: x₂ ≥ 0rowsthey meet atfeasible?1 , 2(14/5, 9/5)yes · best1 , 3(0, 6)no1 , 4(4, 0)yes2 , 3(0, 5/2)yes2 , 4(10, 0)no3 , 4(0, 0)yes6 pairs of the 4 constraints were formed and 0 of them are parallel; 4 of the intersections satisfy every constraint exactly, and those are the4 verticesthe largest value of 3x₁ + 4x₂ over those 4 vertices is 78/5, at (14/5, 9/5) — and none of the 130 feasible points of a quarter-unit latticebeats it
Fig. 2 The feasible region as what survived. All 6 pairs of the 4 constraints — the two stated inequalities and the two non-negativity conditions — were formed and solved exactly; 0 were parallel, 4 of the intersections satisfy every constraint, and those 4 are the vertices. Of the 130 feasible points of a quarter-unit lattice, none beats the best vertex.

A vertex of a polygon cut out by inequalities is a point where two of them hold with equality. So the vertex enumeration forms every pair of constraints, solves each pair as a two-by-two system, and keeps the resulting point exactly when it satisfies all the others. Six pairs are formed here from four constraints — the two written inequalities and the two non-negativity conditions, which are constraints like any other. Two of the six points fail: (0,6)(0, 6) violates the second constraint and (10,0)(10, 0) violates the first. Four survive, and the largest objective value over those four is 785=15.6\frac{78}{5} = 15.6.

That arithmetic is done in exact rationals throughout, and the reason is visible in the table. The winning point lies exactly on two of the constraints it is being tested against. The test 3×145+2×95123 \times \frac{14}{5} + 2 \times \frac{9}{5} \le 12 is a true statement about rational numbers; the same test in floating point asks whether 11.99999999999999811.999999999999998 is at most 1212 and gets the right answer by luck. A count of feasible vertices that depends on which of those the machine happened to compute is not a report of a decision.

The enumeration is a way of deciding the question by exhaustion, not a proposal about how to solve linear programs. It forms every pair of constraints and throws away the ones that do not work; on a program with fifty variables there would be nothing to form and no way to form it. What it can do is settle a small program completely, and settling a small program completely is what this essay needs. How much work a solver does, and how that work grows, is a question about cost, and cost belongs to another site in this collection; nothing here states a running time.

The same vertex enumeration is run on the dual region, with the sense of the inequalities reversed and the objective minimised instead, and it is the identical piece of machinery: form every pair, solve exactly, keep what satisfies the rest. Both halves of every figure below come out of it.

The vertex list is also checked against something coarser, in the manner of an exhaustive sweep over a finite space: a quarter-unit lattice is laid over the whole box, every feasible point of it is evaluated, and none of the 130 that survive does better than the best corner. That the optimum of a linear form over a convex region is attained at a corner is a theorem; the lattice is there so that the picture is not simply asserting it.

Three more programs, and the same coincidence

One example proves nothing about a coincidence, so here are three more, chosen to look as different from each other as two-variable programs can.

Two polytopes, two optima, one numberThe feasible regions of a linear program and of its dual, side by side, each with its optimal vertex, and a number line on which the gap between the two optima closes to nothing.primal: max 5x₁ + 3x₂dual: min 4y₁ + 20y₂x₁ + x₂ ≤ 4x₁ + 4x₂ ≤ 20y₁ + y₂ ≥ 5y₁ + 4y₂ ≥ 3012345012345x₁x₂12200(4, 0)01234560123456y₁y₂10020(5, 0)0204060801001220010020they meet at 20primal vertex values, from belowdual vertex values, from aboveweak duality checked on all 6 pairs — each of the 3 feasible primal vertices against each of the 2 feasible dual vertices — andcᵀx ≤ bᵀy held every timestrong duality is the equality of the two optima: max 5x₁ + 3x₂ = 20 = min 4y₁ + 20y₂, one number reached from below and fromabovethe dual region is unbounded upward and the drawing cuts it at the box; the enumeration ignores the cut
Fig. 3 A program whose second constraint is redundant: the primal region is a triangle with 3 vertices rather than a quadrilateral. Weak duality was checked on all 6 pairs, and both optima are 20 — the primal at (4, 0) and the dual at (5, 0), where the price on the redundant constraint is 0.

Here x1+4x220x_1 + 4x_2 \le 20 never bites: anything satisfying x1+x24x_1 + x_2 \le 4 satisfies it already. The primal region loses a corner and becomes a triangle, and the dual answers by putting its optimum on an axis, at (5,0)(5, 0), giving the redundant constraint a price of zero. The two optima are both 2020. A constraint that does nothing is worth nothing, which is a sentence about the dual that could not have been read off the primal picture at all.

Two polytopes, two optima, one numberThe feasible regions of a linear program and of its dual, side by side, each with its optimal vertex, and a number line on which the gap between the two optima closes to nothing.primal: max 2x₁ + 5x₂dual: min 8y₁ + 12y₂x₁ + x₂ ≤ 83x₁ + x₂ ≤ 12y₁ + 3y₂ ≥ 2y₁ + y₂ ≥ 501234502468x₁x₂344080(0, 8)01234560123456y₁y₂6040(5, 0)01020304050603440806040they meet at 40primal vertex values, from belowdual vertex values, from aboveweak duality checked on all 8 pairs — each of the 4 feasible primal vertices against each of the 2 feasible dual vertices — andcᵀx ≤ bᵀy held every timestrong duality is the equality of the two optima: max 2x₁ + 5x₂ = 40 = min 8y₁ + 12y₂, one number reached from below and fromabovethe dual region is unbounded upward and the drawing cuts it at the box; the enumeration ignores the cut
Fig. 4 Two optima at corners that look nothing alike: the primal maximum is reached at (0, 8), high on one axis, and the dual minimum at (5, 0), out along the other. Weak duality was checked on all 8 pairs and both programs are worth 40.

This is the case worth staring at. The primal optimum sits at (0,8)(0, 8) — one variable at zero, the other as large as a single constraint allows. The dual optimum sits at (5,0)(5, 0) — again one variable at zero, but a different one, in a different plane, on a different region, reached by minimising rather than maximising. The two corners have nothing in common as points. Both programs are worth 4040.

Two polytopes, two optima, one numberThe feasible regions of a linear program and of its dual, side by side, each with its optimal vertex, and a number line on which the gap between the two optima closes to nothing.primal: max x₁ + x₂dual: min 10y₁ + 15y₂2x₁ + x₂ ≤ 10x₁ + 3x₂ ≤ 152y₁ + y₂ ≥ 1y₁ + 3y₂ ≥ 101234560123456x₁x₂7550(3, 4)00.511.5200.511.52y₁y₂71510(2/5, 1/5)02468101214755071510they meet at 7primal vertex values, from belowdual vertex values, from aboveweak duality checked on all 12 pairs — each of the 4 feasible primal vertices against each of the 3 feasible dual vertices — andcᵀx ≤ bᵀy held every timestrong duality is the equality of the two optima: max x₁ + x₂ = 7 = min 10y₁ + 15y₂, one number reached from below and fromabovethe dual region is unbounded upward and the drawing cuts it at the box; the enumeration ignores the cut
Fig. 5 A primal with a tie: two of its 4 vertices are worth 5, and the best is 7 at (3, 4). The dual’s 3 vertices are worth 7, 10 and 15, and its optimum (2/5, 1/5) is worth 7. Weak duality was checked on all 12 pairs.

And here the primal has a tie — two of its corners are worth 55 apiece — while the dual has no tie at all, three distinct vertex values, and an optimum at a point with fractional coordinates. The structures of the two vertex lists do not match. The top of one list and the bottom of the other do.

Four programs, four pairs of pictures with no visible family resemblance, and in every case the largest number one region can produce is the smallest number the other can produce. That is not what two lists of numbers separated by an inequality usually do.

Why the equality is not obvious

It is worth being precise about how much of a jump the second half is, because familiarity flattens it.

Weak duality is a chain of two inequalities and takes one line. Strong duality — that the maximum and the minimum are equal whenever the first program has a feasible region and a bounded objective — is not a chain of anything. It is an existence claim: there is a feasible yy achieving the primal’s value. Proving it means producing that yy, or proving it cannot fail to exist, and the standard route does the latter.

The route is a separating argument. If no feasible yy reached the primal value, then a certain system of linear inequalities would have no solution, and a system of linear inequalities with no solution admits a certificate of its own insolubility — a non-negative combination of the inequalities adding up to a contradiction. That is Farkas’ lemma, published in 1902, and geometrically it says a point outside a closed convex cone can be separated from it by a plane. Convexity is doing the work: the same property that makes the region an intersection of half-planes, exactly as the cells of a nearest-point diagram are, is what guarantees the separating plane exists.

The result is therefore an existence proof with no picture in it. It does not exhibit the dual optimum; it shows that a world in which the gap stays open is contradictory. That is the same species of argument as the one that turns two injections into a bijection: there, too, two one-sided comparisons are forced into an equality by a construction nobody would have guessed from either side alone, and the equality is far stronger than the inequalities that produced it.

The history matches the difficulty. The transposed program was written down by John von Neumann in 1947, in conversation with George Dantzig, who had the maximisation problem and no idea it had a shadow. The first published proof came in 1951, from David Gale, Harold Kuhn and Albert Tucker. The gap between noticing the pairing and proving the equality was four years, and the pairing itself is an afternoon’s algebra.

What the drawing settles, and what it does not

The two halves of the theorem are settled to very different degrees by anything drawn here, and the difference is the point of this section.

Weak duality is checked exhaustively, and only on these programs. For each figure, every feasible primal vertex is tested against every feasible dual vertex — the whole cross product, twelve pairs in the first program, six in the triangle, eight in the third, twelve again in the fourth — and cTxbTyc^\mathsf{T}x \le b^\mathsf{T}y holds in every one. That is a complete check of a finite claim about four particular programs. It is not the theorem, which quantifies over every feasible pair in every linear program, including the infinitely many non-vertex points of these four.

Strong duality is checked as one exact rational identity, four times. In the first program the two optima are both 785\frac{78}{5}; in the others, 2020, 4040 and 77. Four equalities between rationals, each verified with no tolerance anywhere. Four is not every linear program, and no number of examples would be.

So the drawing settles that the phenomenon is real and reproducible on programs that look nothing alike, and settles nothing at all about why. The theorem’s actual content — that the equality holds for every linear program with a feasible region and a bounded objective — is the separating argument above, and that argument has no diagram. A picture can show that two numbers met. Only a proof can show they had to.

There is a third limit, and it is structural. The dual can only be drawn when the primal has exactly two constraints, because otherwise the dual has more than two variables and is not a polygon in a plane. The primal vertex enumeration has no such restriction:

The vertex that maximises 3x₁ + 4x₂A two-variable linear program's feasible region, drawn from the exact intersection of every pair of its constraints, with the objective's contour lines and the optimal vertex marked.00.511.522.533.5401234x₁x₂3x₁ + 4x₂ = 53x₁ + 4x₂ = 103x₁ + 4x₂ = 78/578/5151090(14/5, 9/5)1: 3x₁ + 2x₂ ≤ 122: x₁ + 4x₂ ≤ 103: x₁ ≤ 34: x₁ ≥ 05: x₂ ≥ 0rowsthey meet atfeasible?1 , 2(14/5, 9/5)yes · best1 , 3(3, 3/2)yes1 , 4(0, 6)no1 , 5(4, 0)no2 , 3(3, 7/4)no2 , 4(0, 5/2)yes2 , 5(10, 0)no3 , 4parallel3 , 5(3, 0)yes4 , 5(0, 0)yes10 pairs of the 5 constraints were formed and 1 of them are parallel; 5 of the intersections satisfy every constraint exactly, and those arethe 5 verticesthe largest value of 3x₁ + 4x₂ over those 5 vertices is 78/5, at (14/5, 9/5) — and none of the 118 feasible points of a quarter-unit latticebeats it
Fig. 6 The same objective with a third constraint added. Now 10 pairs are formed from 5 constraints, 1 pair is parallel, and 5 intersections survive to be vertices. The optimum is unmoved at (14/5, 9/5), worth 78/5, and none of the 118 feasible lattice points beats it — but this program’s dual lives in three variables and has no drawing here at all.

Ten pairs, one of them parallel — the new constraint x13x_1 \le 3 runs parallel to x10x_1 \ge 0 and the two meet nowhere — and five surviving vertices. The theorem applies to this program exactly as it applies to the others, and its dual is a polyhedron in three-dimensional space that this family declines to project onto a page rather than drawing dishonestly. Counting the faces and corners of such a thing is a separate pleasure, taken up where every corner pays for itself.

The same theorem in a payoff matrix

Now the connection that makes the equality feel less like a coincidence, because it turns out to have been met before under another name.

Consider a two-player game given by a matrix of payoffs, one player choosing a row and the other a column. The row chooser, being cautious, asks for the mixture of rows whose worst outcome is best — a guaranteed floor. The column chooser, equally cautious, asks for the mixture of columns whose worst outcome is best from the other side — a guaranteed ceiling. The floor can never exceed the ceiling, for a reason that is one line of algebra and is the same line as the weak duality calculation above.

Von Neumann’s minimax theorem says the floor and the ceiling are equal. The cautious player and the cautious opponent, planning independently against a worst case, name the same number. And that theorem is not merely analogous to strong duality: each is a consequence of the other, by a translation that turns the row chooser’s problem into a linear program whose dual is the column chooser’s problem. The minimax value is the meeting point of the figure above, wearing different clothes. The essay one rung across this field writes the same equality in the language of a payoff matrix and computes it there.

That is why von Neumann recognised the dual immediately in 1947. He had proved the minimax theorem in 1928, and Dantzig’s maximisation problem was the same statement in another notation.

Where this duality has already appeared

The word duality is used on this site for four other things, and this essay joins them rather than starting a fifth usage.

There is the duality of the logical connectives, where swapping every and with every or and negating everything carries true statements to true statements — De Morgan’s laws as a symmetry of the whole system. There is the duality of the Fano plane, where points and lines can be exchanged wholesale and every theorem survives. There is the duality of the regular solids, where the cube’s faces become the octahedron’s corners and the five solids fall into pairs. And there is the duality of the nearest-point diagram and its triangulation, where each is completely determined by the other and neither is prior.

Every one of those has the same shape: two structures, built from the same data by exchanging the roles of two kinds of thing, carrying the same information. That is precisely what a linear program and its dual are — the constraints of one are the variables of the other, and the transposition is the exchange. What is added here is that the correspondence is not merely structural but numerical: the two objects do not just mirror each other, they agree on a number. The other four dualities pair objects; this one pairs objects and then makes them answer the same question identically.

Getting the same number from two arrangements of the same data is also this collection’s oldest trick, the one behind counting a rectangle twice. The difference is that a double count arranges the same objects two ways on purpose, and here the two arrangements were not obviously counting anything in common.

What the meeting point is worth

Once the two numbers are known to be equal, the dual optimum stops being a curiosity and starts being an answer to a question the primal did not ask.

Complementary slackness, product by productA table of a linear program's constraints and variables at the optimum, each with its slack, its dual variable and the product of the two, which is zero in every row.max 3x₁ + x₂ at (4, 0), worth 12the dual optimum is (1, 0), worth 121 pair of the 2 constraints binding there was tried, and 1 certified the optimumone row per constraintslack sᵢdual yᵢsᵢ × yᵢverdict3x₁ + 2x₂ ≤ 12x₁ + 4x₂ ≤ 10010binding600worth nothingone row per variablevalue xⱼreduced rⱼxⱼ × rⱼverdictx₁x₂400in use010held at 0exactly zerothe productpositiveall 4 products are exactly zero — 1 of the 2 constraints binds and so may carry a price, 1 is worth nothing, and 1 ofthe 2 variables is usedthe optimum is (4, 0) and both sides are worth 12; a zero on the left of a row and a zero on the right of it are differentfacts, and every row has one
Fig. 7 Complementary slackness at a tilted objective, max 3x₁ + x₂, whose optimum is (4, 0), worth 12. All 4 products are exactly zero — 1 of the 2 constraints binds and may carry a price, 1 has slack 6 and is worth nothing, and 1 of the 2 variables is used.

At the optimum, the slack in a constraint multiplied by that constraint’s dual variable is zero in every row, and there are two different ways for a product to vanish. A constraint with room to spare gets a price of zero. A variable held at zero has a positive reduced cost. The table’s four rows split two and two, and the two kinds of zero are not the same fact. Note that this figure uses a tilted objective, 3x1+x23x_1 + x_2, on the same region: at the original optimum both constraints bind and every row would be zero on the same side, showing nothing.

What one more unit of constraint 1 is worthThe optimum of a linear program plotted against one of its right-hand sides, as an exact piecewise linear graph, with the breakpoints marked and each piece's slope named as a dual variable.51015202530051015202530b₁max 3x₁ + 4x₂b₁ = 5b₁ = 30slope 2 = y₁slope 4/5 = y₁slope 0 = y₁one row per linear piecethe optimum sits onslope of the optimumdual variable y₁b₁ from 2 to 5b₁ from 5 to 30b₁ from 30 to 32row 1 and x₁ = 0(0, 5/4)22row 1 and row 2(1/5, 49/20)4/54/5row 2 and x₂ = 0(10, 0)00the optimum is piecewise linear in b₁ with 3 pieces, breaking at b₁ = 5 and 30on each piece the slope, taken from the optima at the two ends, equals the dual variable y₁ at the middleof that piece — 2, then 4/5, then 0 — and it changes exactly where a different vertex becomes optimal
Fig. 8 The primal optimum as an exact function of one right-hand side, re-solved at every whole value. It is piecewise linear with 3 pieces, breaking at b₁ = 5 and b₁ = 30, and on each piece the slope — 2, then 4/5, then 0 — equals the dual variable computed independently at the middle of that piece.

And the dual variable turns out to be a rate. Sweep one right-hand side and re-solve the program at every value, and the optimum traces a piecewise linear graph whose slope on each piece is exactly the dual variable for that constraint. Three pieces here, with slopes 22, 45\frac{4}{5} and 00, breaking where a different vertex takes over — which is the same event as the dual solution jumping, seen from the other side. Above b1=30b_1 = 30 the constraint has stopped mattering and one more unit of it is worth nothing at all.

That is where this anchor goes next. The equality proved here is the fact that makes those readings legitimate; what a constraint is worth is the essay that takes them seriously, and it needs the meeting point to exist before it can ask what the meeting point means. The bound is the easy half. The theorem is that there is no room left between the halves — and the strangeness of that never quite wears off, however many pairs of polygons are drawn.

What links here

Computed from the collection, not written here: the essays that point at this one.

Reads more easily once this is understood

Essays that name this one as worth reading first.

Named objects

A dashed tag is an object no other essay names yet.

ConvexityDualityExistence proofFeasible regionLinear programMatrixMinimaxVertex enumeration