Created
March 22, 2017 07:40
-
-
Save drvinceknight/7ce338a3845a761e8d649f192f39c8f4 to your computer and use it in GitHub Desktop.
Notebook from lightning talk demoing the fire library to create a command line tool for a linear programming problem.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"A mathematical/lego problem:\n", | |
"\n", | |
"Maximize $z=1600x_1+1000x_2$ such that:\n", | |
"\n", | |
"$$2x_1+x_2\\leq 6$$\n", | |
"$$2x_1+2x_2\\leq 8$$\n", | |
"$$x_1, x_2\\geq 0$$\n", | |
"$$x_1, x_2\\in\\mathbb{Z}$$\n", | |
"\n", | |
"## Plotting the problem" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 57, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\nATJEcwLzktmQAAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7f161679fef0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"%matplotlib inline\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"x1s = [0, 3]\n", | |
"large_piece_constraint = [6 - 2 * x1 for x1 in x1s]\n", | |
"small_piece_constraint = [4 - x1 for x1 in x1s]\n", | |
"plt.plot(x1s, large_piece_constraint, label=\"$2x_1+x_2=6$\")\n", | |
"plt.plot(x1s, small_piece_constraint, label=\"$2x_1+2x_2=8$\")\n", | |
"plt.xlim(x1s)\n", | |
"plt.ylim([0, 6])\n", | |
"plt.legend();" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Solving the problem" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 58, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"import pulp # Library for linear programming\n", | |
"\n", | |
"prob = pulp.LpProblem(\"Lego\", pulp.LpMaximize)\n", | |
"\n", | |
"x1 = pulp.LpVariable(\"Tables\", lowBound=0, cat=\"Integer\")\n", | |
"x2 = pulp.LpVariable(\"Chairs\", lowBound=0, cat=\"Integer\")\n", | |
"\n", | |
"prob += 1600 * x1 + 1000 * x2\n", | |
"\n", | |
"prob += 2 * x1 + x2 <= 6\n", | |
"prob += 2 * x1 + 2 * x2 <= 8" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 59, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"1" | |
] | |
}, | |
"execution_count": 59, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"prob.solve()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 60, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(2.0, 2.0)" | |
] | |
}, | |
"execution_count": 60, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"x1.value(), x2.value()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 61, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def chairs_and_tables(cost_of_table=1600, cost_of_chair=1000,\n", | |
" number_of_small_pieces=8, number_of_large_pieces=6):\n", | |
" prob = pulp.LpProblem(\"Lego\", pulp.LpMaximize)\n", | |
" x1 = pulp.LpVariable(\"Tables\", lowBound=0, cat=\"Integer\")\n", | |
" x2 = pulp.LpVariable(\"Chairs\", lowBound=0, cat=\"Integer\")\n", | |
" \n", | |
" prob += cost_of_table * x1 + cost_of_chair * x2\n", | |
" \n", | |
" prob += 2 * x1 + x2 <= number_of_large_pieces\n", | |
" prob += 2 * x1 + 2 * x2 <= number_of_small_pieces\n", | |
" \n", | |
" prob.solve()\n", | |
" return x1.value(), x2.value()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 62, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(2.0, 2.0)" | |
] | |
}, | |
"execution_count": 62, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"chairs_and_tables()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 63, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(5.0, 10.0)" | |
] | |
}, | |
"execution_count": 63, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"chairs_and_tables(number_of_large_pieces=20, number_of_small_pieces=30)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Let's make a command line tool!\n", | |
"\n", | |
"- `from sys import argv`\n", | |
"- `import argparse`\n", | |
"- `import docopt`\n", | |
"- `import fire` \n", | |
"\n", | |
"\n", | |
"Here's `main.py`:\n", | |
"\n", | |
"```python\n", | |
"import fire\n", | |
"import pulp\n", | |
"\n", | |
"def chairs_and_tables(cost_of_table=1600, cost_of_chair=1000,\n", | |
" number_of_small_pieces=8, number_of_large_pieces=6):\n", | |
" prob = pulp.LpProblem(\"Lego\", pulp.LpMaximize)\n", | |
" x1 = pulp.LpVariable(\"Tables\", lowBound=0, cat=\"Integer\")\n", | |
" x2 = pulp.LpVariable(\"Chairs\", lowBound=0, cat=\"Integer\")\n", | |
" prob += cost_of_table * x1 + cost_of_chair * x2\n", | |
" prob += 2 * x1 + x2 <= number_of_large_pieces\n", | |
" prob += 2 * x1 + 2 * x2 <= number_of_small_pieces\n", | |
" prob.solve()\n", | |
" return x1.value(), x2.value()\n", | |
"\n", | |
"if __name__==\"__main__\":\n", | |
" fire.Fire(chairs_and_tables)\n", | |
"\n", | |
"```" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"With `fire` we can then do:\n", | |
"\n", | |
"```bash\n", | |
"$ python main.py --number_of_large_pieces 20 --number_of_small_pieces 30\n", | |
"[5.0, 10.0]\n", | |
"```" | |
] | |
} | |
], | |
"metadata": { | |
"anaconda-cloud": {}, | |
"kernelspec": { | |
"display_name": "Python [conda env:fire-lightning]", | |
"language": "python", | |
"name": "conda-env-fire-lightning-py" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.0" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 1 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
oh ,i don't kwon at all.