Skip to content

Instantly share code, notes, and snippets.

@antonior92
Last active March 12, 2017 20:15
Show Gist options
  • Save antonior92/5c06cee871006ef4e91ef4f0d13314ba to your computer and use it in GitHub Desktop.
Save antonior92/5c06cee871006ef4e91ef4f0d13314ba to your computer and use it in GitHub Desktop.
Compare scipy current implementation of BFGS with a more efficient one.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2017-03-12T17:05:39.711886",
"start_time": "2017-03-12T17:05:39.525637"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy.linalg import get_blas_funcs, eigh\n",
"import matplotlib.pyplot as plt\n",
"import time\n",
"import cProfile\n",
"%matplotlib inline\n",
"\n",
"sym_rank1update=get_blas_funcs('syr', dtype='d')\n",
"sym_rank2update=get_blas_funcs('syr2', dtype='d')\n",
"sym_matrixvectorproduct=get_blas_funcs('symv', dtype='d')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2017-03-12T17:05:39.717122",
"start_time": "2017-03-12T17:05:39.712802"
},
"collapsed": true,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [],
"source": [
"def BFGS_ineficient(Hk, sk, yk, gfk, I):\n",
" \n",
" rhok = 1.0 / (np.dot(yk, sk))\n",
" \n",
" A1 = I - sk[:, np.newaxis] * yk[np.newaxis, :] * rhok\n",
" A2 = I - yk[:, np.newaxis] * sk[np.newaxis, :] * rhok\n",
" Hk = np.dot(A1, np.dot(Hk, A2)) + (rhok * sk[:, np.newaxis] * sk[np.newaxis, :])\n",
" \n",
" pk = -np.dot(Hk, gfk)\n",
" \n",
" return Hk, pk"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2017-03-12T17:05:39.858582",
"start_time": "2017-03-12T17:05:39.717878"
},
"collapsed": true,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [],
"source": [
"def BFGS(Hk, sk, yk, gfk):\n",
" ykdotsk = np.dot(yk, sk)\n",
" rhok = 1.0 / ykdotsk\n",
" Hkyk = sym_matrixvectorproduct(1, Hk, yk)\n",
" const = rhok**2*(ykdotsk+Hkyk.dot(yk))\n",
" Hk = sym_rank2update(-rhok, sk, Hkyk, a=Hk)\n",
" Hk = sym_rank1update(const, sk, a=Hk)\n",
" \n",
" pk = sym_matrixvectorproduct(-1, Hk, gfk)\n",
" \n",
" return Hk, pk"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2017-03-12T17:06:12.894350",
"start_time": "2017-03-12T17:05:39.859476"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [],
"source": [
"delta_n = 200\n",
"max_n = 2000\n",
"range_n = range(delta_n, max_n+delta_n, delta_n)\n",
"avgtime_bfgs = []\n",
"avgtime_bfgs_ineficient = []\n",
"for n in range_n:\n",
"\n",
" I = np.eye(n, dtype=int)\n",
" C = np.random.uniform(size=(n, n))\n",
" H = np.dot(C.T, C)\n",
" s = np.random.uniform(size=n)\n",
" y = np.random.uniform(size=n)\n",
" g = np.random.uniform(size=n)\n",
" aux = np.triu(H)\n",
"\n",
" start_time = time.time()\n",
" H1, p = BFGS(aux, s, y, g)\n",
" execution_time = time.time()-start_time\n",
" avgtime_bfgs += [execution_time]\n",
"\n",
" start_time = time.time()\n",
" H1_ineficient, p_ineficient = BFGS_ineficient(H, s, y, g, I)\n",
" execution_time = time.time()-start_time\n",
" avgtime_bfgs_ineficient += [execution_time]\n",
"\n",
"avgtime_bfgs = np.asarray(avgtime_bfgs)\n",
"avgtime_bfgs_ineficient = np.asarray(avgtime_bfgs_ineficient)\n",
"mean = np.mean(avgtime_bfgs_ineficient/avgtime_bfgs)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2017-03-12T17:06:13.095181",
"start_time": "2017-03-12T17:06:12.895238"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [
{
"data": {
"image/png": "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\nWDn/FnpSK/k+DEpo+PN051xVF7qs0Br4obxOnpWdRafbO9EyrSWdbu9EVnZWXJ0vv6VLl5KQkMAN\nN9zA0qVLueaaa6hTpw7VqlXjlFNOybsiVpiXX36ZVq1aceCBB1KtWjWOO+447r33XrZv3563T+5w\n35gxYzAzkpOT84Zjly1bBuy7Z+3VV1+ldevW1KpVi2rVqtGgQQOuu+46vvrqq73OUVjP2sqVK+nR\nowcNGzakatWq1K5dm8suu4wvv/xyr33T09NJSEhg1qxZvPHGG5x22mnst99+1KpVi2uvvZZVq/5u\nm8z9vc2aNSv0pUkofiiypBITEznllFMAWLduXamP88knnzB27Fhq167Nxx9/zDHHHFPofocffjhP\nPfUU1113Xd66b7/9lt9//50mTZrk/Z9iQaeffjqJiYmljq84RZ033invYFHe0S1zTSbTs6bT8/Se\nfoeyF9+HQc1srnPuDWABsCPn56jyOHdWdhbn9TiPJU2XQC1gO8zpMYcpI6bQILlBzJ+vKNnZ2Zx6\n6qk0bNiQ66+/nt9++41XX32Vyy+/nKlTp9KiRYs99r/xxhsZPXo0hx9+OFdddRVJSUnMmTOH/v37\nM336dKZMmUJCQgLNmjUjPT2dt99+m4ULF9KzZ0+SkpIA8n4WNYyYlpbGuHHjqFOnDldddRV16tRh\nxYoVzJgxg2OOOYaTT/579ujCjjF//nzatGnDxo0bOf/887nqqqtYv349EydOpHnz5kycODGvby73\nGM45nnzySSZNmsSll15KamoqX3zxBa+++ioLFy7k66+/plKlSiQlJZGens7o0aNZtmwZ6enpeZO+\nFhyKDNemTZuYN29e3u+vtEaNGoVzju7du1OnTp1i98/fe1erVi0AVq1axdatW6lWrVqp4xARiVX9\nZ/Tn7uZ3s3/l/f0OZW9eXaKL9IsIDIN2vK2j0RcjPd+rL9bxto4lPkY4yvN8hQ2DZmdn560fMmTI\nHtsmT55szjlr27btHutHjx5tzjlr166dbdu2bY9tgwYNsoSEBHviiSf2WJ87fFfYMGhycrI1aNBg\nj3XPPPOMOefs9NNPt99//32Pbbt377Y1a9bkLY8ZM2avocGdO3daw4YNrVq1avbJJ5/s8f7Vq1db\nvXr1rG7durZ9+/a89enp6eacs5o1a9p33323x3uuu+46S0hIsNdff32P9WUdBm3WrJmlp6dbenq6\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f43d61e1978>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10, 8))\n",
"plt.plot(range_n, avgtime_bfgs, '-x', label='BFGS')\n",
"plt.plot(range_n, avgtime_bfgs_ineficient, '-o', label='Ineficient BFGS')\n",
"plt.xlabel(\"Matrix Size\", fontsize=20)\n",
"plt.ylabel(\"Average Execution Time\", fontsize=20)\n",
"plt.legend(loc=2, fontsize=20)\n",
"plt.grid()\n",
"plt.savefig('comparison.png')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2017-03-12T17:06:13.348179",
"start_time": "2017-03-12T17:06:13.096188"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [
{
"data": {
"image/png": "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\n5zvwtKe14zdKkiS1rmsuy7aq6suyDzwA550He+1V2VtKkiQB1V6WtbmTJEmqWREzdxqcUmcVzF0W\nc5fF3GUpNXeVbO4kSZJ6iJdl1+KRR+AJT6ioIEmSpDXwsmwb/PrX8OpXQ4/2vpIkqUfZ3PXjH/+A\nKVPg05/u3PXs1qTUWQVzl8XcZTF3WUrNXSWbu9VkwoEHwj77wMSJdVcjSZLUGmfuVnPyyXDiifDH\nP8KGGw5DYZIkSatxnbsBGExzd+ed8IIXwIUXwnbbDVNhkiRJq/ELFcNk883h0ku7u7ErdVbB3GUx\nd1nMXZZSc1fJ5m41Y8bUXYEkSdLgeVlWkiSpZl6WlSRJUr+Kbu4y4dZb666iWqXOKpi7LOYui7nL\nUmruKhXd3J16Krz1rd6FQpIk9Y5iZ+5uvhl22w3OPx/+/d/bWJgkSdJqnLkbokcegUmTYNo0GztJ\nktRbimzuPvMZeNrT4OCD666keqXOKpi7LOYui7nLUmruKq1fdwHtdvfd8KMfwbx5EJV8+ClJktQ5\nipy5W74c1i+urZUkSZ3KmbshsrGTJEm9qsjmrpeVOqtg7rKYuyzmLkupuatkcydJktRDen7mbvly\nOPNMeNvb/AKFJEnqTM7cteBzn4OTT/YuFJIkqQw93dxddBF89auN24yN6Omkjyp1VsHcZTF3Wcxd\nllJzV6mnW54995zBkUcuYuTIuiuRJElqj56euYP7GTduOnPnHszYsaPrLkmSJKlfztwN2MbccssM\npk2bXXchkiRJbdHjzR3AxixZsrLuItqm1FkFc5fF3GUxd1lKzV2lApq7ZYwcWUBMSZIknLmTJEmq\nnTN3AzRp0iwbO0mSVJSebu5OP316cY1dqbMK5i6Lucti7rKUmrtKPd3cSZIklaanZ+56NZskSeot\nztxJkiSpXzZ3PabUWQVzl8XcZTF3WUrNXSWbO0mSpB7izJ0kSVLNnLmTJElSv2zuekypswrmLou5\ny2LuspSau0o2d5IkST3EmTtJkqSaOXMnSZKkftnc9ZhSZxXMXRZzl8XcZSk1d5Vs7iRJknqIM3eS\nJEk1c+ZOkiRJ/bK56zGlziqYuyzmLou5y1Jq7irZ3EmSJPUQZ+4kSZJq5sydJEmS+mVz12NKnVUw\nd1nMXRZzl6XU3FWyuZMkSeohztxJkiTVzJk7SZIk9cvmrseUOqtg7rKYuyzmLkupuatkcydJktRD\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f43d61e1588>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10, 8))\n",
"plt.plot(range_n, avgtime_bfgs_ineficient/avgtime_bfgs, '--o')\n",
"plt.xlabel(\"Matrix Size\", fontsize=20)\n",
"plt.ylabel(\"Execution Time Ratio\", fontsize=20)\n",
"plt.grid()\n",
"plt.savefig('comparison2.png')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2017-03-12T17:06:16.176184",
"start_time": "2017-03-12T17:06:13.349028"
},
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 6 function calls in 0.030 seconds\n",
"\n",
" Ordered by: standard name\n",
"\n",
" ncalls tottime percall cumtime percall filename:lineno(function)\n",
" 1 0.030 0.030 0.030 0.030 <ipython-input-3-a1774bb19283>:1(BFGS)\n",
" 1 0.000 0.000 0.030 0.030 <string>:1(<module>)\n",
" 1 0.000 0.000 0.030 0.030 {built-in method builtins.exec}\n",
" 1 0.000 0.000 0.000 0.000 {built-in method numpy.core.multiarray.dot}\n",
" 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n",
" 1 0.000 0.000 0.000 0.000 {method 'dot' of 'numpy.ndarray' objects}\n",
"\n",
"\n"
]
}
],
"source": [
"n = 2000\n",
"I = np.eye(n, dtype=int)\n",
"C = np.random.uniform(size=(n, n))\n",
"H = np.dot(C.T, C)\n",
"s = np.random.uniform(size=n)\n",
"y = np.random.uniform(size=n)\n",
"g = np.random.uniform(size=n)\n",
"aux = np.triu(H)\n",
"\n",
"\n",
"cProfile.run(\"BFGS(aux, s, y, g)\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2017-03-12T17:06:24.886439",
"start_time": "2017-03-12T17:06:16.178063"
},
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 8 function calls in 8.706 seconds\n",
"\n",
" Ordered by: standard name\n",
"\n",
" ncalls tottime percall cumtime percall filename:lineno(function)\n",
" 1 0.056 0.056 8.705 8.705 <ipython-input-2-e3c30c7e7eb4>:1(BFGS_ineficient)\n",
" 1 0.000 0.000 8.705 8.705 <string>:1(<module>)\n",
" 1 0.000 0.000 8.706 8.706 {built-in method builtins.exec}\n",
" 4 8.650 2.162 8.650 2.162 {built-in method numpy.core.multiarray.dot}\n",
" 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n",
"\n",
"\n"
]
}
],
"source": [
"cProfile.run(\"BFGS_ineficient(H, s, y, g, I)\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.5.2"
},
"latex_envs": {
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 0
},
"toc": {
"nav_menu": {
"height": "12px",
"width": "252px"
},
"navigate_menu": true,
"number_sections": true,
"sideBar": true,
"threshold": 4,
"toc_cell": false,
"toc_section_display": "block",
"toc_window_display": true
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment