Skip to content

Instantly share code, notes, and snippets.

@antonior92
Created June 27, 2017 16:59
Show Gist options
  • Save antonior92/7d3355bcc1c5cc13eff5dbfa86b25a67 to your computer and use it in GitHub Desktop.
Save antonior92/7d3355bcc1c5cc13eff5dbfa86b25a67 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2017-06-27T15:16:36.971165",
"start_time": "2017-06-27T15:16:36.166588Z"
},
"collapsed": true,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [],
"source": [
"import pycutestmgr as cute\n",
"import time\n",
"import pdb \n",
"import numpy as np\n",
"from numpy.linalg import norm\n",
"import matplotlib.pyplot as plt\n",
"from scipy.sparse import csc_matrix, issparse\n",
"from ipsolver import equality_constrained_sqp, projections\n",
"%matplotlib inline\n",
"cute.clearCache('HS71')"
]
},
{
"cell_type": "markdown",
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
}
},
"source": [
"# ``CHANNEL``\n",
"## Import Problem\n",
"Import problem ``CHANNEL`` from COPS 3.0 collection. The problem analyze the flow of a fluid during injection into a long vertical channel."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2017-06-26T19:26:39.739624",
"start_time": "2017-06-26T19:26:35.255058Z"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(9600, 9598)\n"
]
}
],
"source": [
"name = \"CHANNEL\"\n",
"cute.prepareProblem(name)\n",
"problem = cute.importProblem(name)\n",
"info = problem.getinfo()\n",
"x0 = info[\"x\"]\n",
"print(info[\"n\"], info[\"m\"])\n",
"v0 = info[\"v\"]\n",
"\n",
"\n",
"def hess(x, v):\n",
" return csc_matrix(problem.sphess(x, v))\n",
"\n",
"\n",
"def fun(x):\n",
" return problem.obj(x)[0]\n",
"\n",
"\n",
"def grad(x):\n",
" _, g1 = problem.obj(x, True)\n",
" return g1\n",
"\n",
"\n",
"def constr(x):\n",
" return problem.cons(x)\n",
"\n",
"\n",
"def jac(x):\n",
" _, A1 = problem.cons(x, True)\n",
" return csc_matrix(A1)"
]
},
{
"cell_type": "markdown",
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
}
},
"source": [
"## Optimize Problem"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2017-06-26T19:27:22.550937",
"start_time": "2017-06-26T19:26:39.743298Z"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 0.999750542639 1.0\n",
"1 0.998617293968 5.6\n",
"2 0.99268137806 31.36\n",
"3 0.967375361172 175.616\n",
"4 0.58964800494 983.4496\n",
"5 0.999726861957 1078.63957069\n",
"6 0.999964671789 1078.63957069\n",
"7 0.999999994347 1078.63957069\n"
]
}
],
"source": [
"start_time = time.time()\n",
"x, info = equality_constrained_sqp(fun, grad, hess, constr, jac, x0, v0, return_all=True)\n",
"total_time = time.time() - start_time"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2017-06-26T19:27:22.569348",
"start_time": "2017-06-26T19:27:22.557655Z"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"f = 1.0\n",
"optimality = 0.0\n",
"c violation = 9.22779047874e-15\n",
"niter = 8\n",
"total time = 42.7995688915\n"
]
}
],
"source": [
"print('f = '+ str(info[\"fun\"]))\n",
"print('optimality = ' + str(info[\"opt\"]))\n",
"print('c violation = ' + str(info[\"constr_violation\"]))\n",
"print('niter = ' + str(info[\"niter\"]))\n",
"print('total time = ' + str(total_time))"
]
},
{
"cell_type": "markdown",
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
}
},
"source": [
"# ``ELEC``\n",
"## Import Problem\n",
"Import problem ``ELEC`` from COPS 3.0 collection. The problem finds the optimal distribution of electrons on a sphere."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2017-06-27T15:16:42.320011",
"start_time": "2017-06-27T15:16:39.452354Z"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(600, 200)\n"
]
}
],
"source": [
"name = \"ELEC\"\n",
"cute.prepareProblem(name)\n",
"problem = cute.importProblem(name)\n",
"info = problem.getinfo()\n",
"x0 = info[\"x\"]\n",
"print(info[\"n\"], info[\"m\"])\n",
"v0 = info[\"v\"]\n",
"\n",
"\n",
"def hess(x, v):\n",
" return csc_matrix(problem.sphess(x, v))\n",
"\n",
"\n",
"def fun(x):\n",
" return problem.obj(x)[0]\n",
"\n",
"\n",
"def grad(x):\n",
" _, g1 = problem.obj(x, True)\n",
" return g1\n",
"\n",
"\n",
"def constr(x):\n",
" return problem.cons(x)\n",
"\n",
"\n",
"def jac(x):\n",
" _, A1 = problem.cons(x, True)\n",
" return csc_matrix(A1)"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-06-22T12:55:28.756903Z",
"start_time": "2017-06-22T12:55:28.738941Z"
},
"run_control": {
"frozen": false,
"read_only": false
}
},
"source": [
"## Optimize Problem"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2017-06-27T15:16:49.607240",
"start_time": "2017-06-27T15:16:42.482610Z"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [],
"source": [
"start_time = time.time()\n",
"x, info = equality_constrained_sqp(fun, grad, hess, constr, jac, x0, v0, return_all=True)\n",
"total_time = time.time() - start_time"
]
},
{
"cell_type": "markdown",
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
}
},
"source": [
"## Display results"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2017-06-27T15:16:49.624140",
"start_time": "2017-06-27T15:16:49.611143Z"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"f = 18439.1486219\n",
"optimality = 3.4698849539e-07\n",
"c violation = 1.28096175486e-15\n",
"niter = 113\n",
"total time = 7.11929297447\n"
]
}
],
"source": [
"print('f = '+ str(info[\"fun\"]))\n",
"print('optimality = ' + str(info[\"opt\"]))\n",
"print('c violation = ' + str(info[\"constr_violation\"]))\n",
"print('niter = ' + str(info[\"niter\"]))\n",
"print('total time = ' + str(total_time))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2017-06-27T15:16:50.382489",
"start_time": "2017-06-27T15:16:49.627495Z"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [],
"source": [
"n = len(info[\"allvecs\"])\n",
"func = np.zeros(n)\n",
"constr_violation = np.zeros(n)\n",
"optimality = np.zeros(n)\n",
"for k in range(n):\n",
" xk = info[\"allvecs\"][k]\n",
" vk = info[\"allmult\"][k]\n",
" gk = grad(xk)\n",
" ck = constr(xk)\n",
" Ak = jac(xk)\n",
" func[k] = fun(xk)\n",
" optimality[k] = norm(gk + Ak.T.dot(vk))\n",
" constr_violation[k] = np.linalg.norm(ck)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2017-06-27T15:16:52.166672",
"start_time": "2017-06-27T15:16:50.386810Z"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [
{
"data": {
"image/png": "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\n+5Pto48+mqKiokrPMyBLakoMyJJUiW0ZQf7DH/6QTN82YMAATjnllErPO/PMM5Pte++9l3x9Wbq0\ntLRCQK6svaJcekCeOnVq0rMsSY2RAVmSKrH77rsn2x988AElJSXVnr969WpuuOGGZP+yyy6rcoaK\n448/no4dOwKpFobXXnutwvGXX36Z4447jgMPPLDCZ9SoUfz973/f1l+pzl599dVkqe2uXbty1FFH\nVXluz5492XHHHQFYt26dKxBKatRqnF8ohDCiIQqpxJwY47wcPVtSM9ehQwf69evH3Llz2bRpEx9+\n+GGFtost3XHHHclCGv379+fUU0+t8tx27drxne98hzvuuANIvax3yCGHAPDAAw9wxhlnsGnTpkqv\nfe2115g4cSLFxTXOUlRv6e0fJ598Mq1bt672/OHDhzNvXupf25MnT2bIkCFZrU+SsqU2E3C+BOTi\nv/9dCVyVg+dKEpDqQy4fQZ05c2aVAXnmzJlcf/31yf4ll1xCy5Ytq733mWeemQTkcePGcfPNN3PP\nPffws5/9rNrrNm3axCmnnMK0adNo3759XX6dOlm3bh3jxo1L9qtrryg3fPjw5JrJkydzzjnnZK0+\nScqm2rZYhBx8JCmnaupDjjFy6623UlxczBdffAGklmFOn8qtKkOHDmWvvfYCYO3atXzjG9+oEI73\n2GMPXnjhBSZMmMCECRP4v//7v2Su4Y8++oif/OQn9frdavLYY4+xatUqIPVi4X777VfjNenn+KKe\npMasNiPIo7JeReXm5Oi5kgRUP5PF4sWLOeOMMyos9tGmTRvuvPPOGlsRAEIInHnmmZx//vkAvPnm\nm8mxQw45hMcee4wuXbpUuOb2229PWjf+9Kc/ccQRR1Q57Vp9pb+cd9ppp9VqZbyhQ4fSokULNm/e\nzPvvv8+KFSvo1KlTVuqTpGxyqek841LTUv546623GDp0KABFRUXJnMYxRh599FEWL16cnLv33nvz\n0EMPsdtuu9X6/kuXLqV3794VXgAcM2YMf/3rX2nbtm2l15x22mk88MADAHTq1Im3336bfv361fl3\nq86iRYvYYYcd2Lx5MwCffPIJO+20U62uHTJkCNOnTwfgueee4+tf/3pGa5Ok+nCpaUmqp1133TUZ\nOV2yZAm33347t99+O3fccUeFcHzBBRcwefLkOoVjgG7dunHyyScn+2eddRbjxo2rMhxDaiq58rC6\nYsUKvvvd77J27Vo2bNiQfEpLS+tUx5YeeuihJBwfcsghtQ7H4HzIkpoGA7IkVaFdu3YcccQRVR7v\n2bMnzz77LDfccEOt2ioqc8stt3DFFVfwwAMPcMcdd1Q5NVy5jh078te//jVZgGTChAlst912tGnT\nJvkUFRUxfvz4baoHtm6vqAsDsqSmwBaLPGOLhZRfVq5cyRNPPMGKFSsqfN+xY0eOPvrorfqEG8o1\n11zD5ZdfXuXxfv368cEHH9Q5uM+aNSt5ObF169YsXLiQzp071/r6d999N+nd7tGjBwsXLqxV/7Ik\nNYTatljU5iU9SWq2OnbsyHe/+91cl7GViy++mNmzZzNu3LikHQJg48aNxBiZO3cud999N+eee26l\n17///vt06NCBHXbYocL36aPHxx13XJ3CMaTaUjp27MjKlStZvHgxc+fOpX///nW6hyTlmi0WktQI\ntWjRgj//+c9b9R+nr+Z39dVXs2bNmq2uvfXWW9ltt9342te+VmFlvtLSUh588MFkv67tFQAFBQUM\nGzYs2bfNQlJj5Ep6ktSE/PjHP+bGG2/k008/ZdGiRdx6661cfPHFyfFJkyZxwQUXAFBSUsJJJ53E\nX/7yF77zne/w0ksv8emnnwKpWTuOPPLIbaph+PDhPP/880CqRzpbU9FJUrbU2IMcQiglRyvpxRib\n3Up69iBLqq+7776bs846C4DOnTvzySef0KVLF5YvX86QIUOS1QHLhRC45557eOWVV/jzn/8MwHnn\nncctt9yyTc9/9tlnk3Ddu3dv5s2bl7xUKEm5VNse5NoG5Fz4pQFZkupu48aNDB48mA8//BCASy+9\nlKuvvpqxY8fy2GOPAang3Lt3b959993kulatWiVzMr/xxhsVWiXq+vwddtghWV3w+eefZ/To0bW6\ndtmyZdx///18+eWXFb5v164dJ554ov3Mkuolky/puZKeJDUiLVu25KqrruKUU04B4KabbiKEkIRj\nSK3Ed/DBB3P44Yczbdo0gCQc77rrrhQX1/jnR7XPP+mkk/j9738PwIMPPljrgPztb387ac/Y0l13\n3cX777/vaLSkrHOatzzjCLKkTCgtLWXIkCHMmDFjq2M/+clPuPnmmwFYvnw5//Zv/1bhZbprrrmG\nSy+9tF7PnzRpEgcccACQmglk0aJFtGnTptprXn31VUaMqP61lxdffJFDDz20XrVJar5cSU+SmrGC\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x110d306d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10, 10))\n",
"plt.semilogy(range(n), optimality, color='black', lw=3)\n",
"plt.xlabel(\"iteration\", fontsize=30)\n",
"plt.ylabel(r\"$\\||\\nabla \\mathcal{L}(x, \\lambda)\\||$\", fontsize=30)\n",
"plt.tick_params(axis='both', which='both', labelsize=20)\n",
"plt.tight_layout()\n",
"plt.savefig(\"optimality_elec_soc.png\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [],
"source": []
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"display_name": "cutest",
"language": "python",
"name": "cutest"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.11"
},
"latex_envs": {
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 0
},
"toc": {
"nav_menu": {
"height": "30px",
"width": "252px"
},
"navigate_menu": true,
"number_sections": true,
"sideBar": true,
"threshold": 4,
"toc_cell": false,
"toc_position": {
"height": "913px",
"left": "0px",
"right": "auto",
"top": "106px",
"width": "212px"
},
"toc_section_display": "block",
"toc_window_display": true
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment