{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# First steps with the nullspace optimizer\n", "\n", "This notebook proposes you to familiar you with the nullspace optimization algorithm, which in the case of equality constrained optimization, reduces to the flow proposed by Yamashita in \n", "\n", "*H. Yamashita, A differential equation approach to nonlinear programming. Math. Program.18(1980) 155–168.*\n", "\n", "The flow reads \n", "\n", "\\begin{equation}\n", "\\newcommand{\\DD}{\\mathrm{D}}\n", "\\renewcommand{\\dagger}{T}\n", "\\renewcommand{\\x}{x}\n", "\\renewcommand{\\I}{I}\n", "\\renewcommand{\\g}{g}\n", " \\label{eqn:flow}\n", " \\left\\{\\begin{aligned}\n", " \\dot\\x&={ -\\alpha_J(\\I-\\DD\\g^\\dagger(\\DD\\g\\DD\\g^ \\dagger)^{-1}\\DD\\g(x))\\nabla\n", " J(x) }{ -\\alpha_C\\DD\\g^ \\dagger(\\DD\\g\\DD\\g^ \\dagger)^{-1}\\g(x) }\\\\\n", " \\x(0)&=x_0\n", " \\end{aligned}\\right.\n", "\\end{equation}\n", "\n", "where $J$ is the cost function and $g$ the equality constraint:\n", "\\begin{equation}\n", " \\label{eqn:nlsvg}\n", "\\begin{aligned}\n", "\t\\min_{\\x\\in \\mathbb{R}^n}& \\quad J(\\x)\\\\\n", "\t\\textrm{s.t.} & \\left.\\begin{aligned}\n", " \\g(\\x)&=0\n", "\t\t\\end{aligned}\\right.\n", "\\end{aligned}\n", "\\end{equation}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. A first optimization program" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Write an optimization program to solve the constrained minimization problem on the hyperbola:\n", " $$\n", " \\begin{aligned}\n", " \\min_{(x_1,x_2)\\in\\mathbb{R}^{2}} & \\qquad x_1+x_2\\\\\n", " s.t. & \\left.\\begin{aligned}\n", " x_1x_2 &= 1. \n", " \\end{aligned}\\right.\n", " \\end{aligned}\n", "$$\n", "\n", "In order to solve the optimization problem, we use the function `nlspace_solve` which solves the above optimization program and whose prototype is \n", "```python\n", "from nullspace_optimizer import nlspace_solve\n", "\n", "# Define problem\n", "\n", "results = nlspace_solve(problem: Optimizable, params=None, results=None)\n", "```\n", "The input variables are \n", "- `problem` : an `Optimizable` object described below. This variable contains all the information about the optimization problem to solve (objective and constraint functions, derivatives...)\n", "- `params` : (optional) a dictionary containing algorithm parameters.\n", "\n", "- `results` : (optional) a previous output of the `nlspace_solve` function. The optimization will then keep going from the last input of the dictionary `results['x'][-1]`. This is useful when one needs to restart an optimization after an interruption.\n", "\n", "The optimization routine `nlspace_solve` returns the dictionary `opt_results` which contains various information about the optimization path, including the values of the optimization variables `results['x']`.\n", " \n", " \n", " In our particular optimization test case in $\\mathbb R^n$ with $n=2$, we use the `EuclideanOptimizable` class which inherits `Optimizable` which simplifies the definition of the optimization program (the inner product is specified by default). \n", "We allow the user to specify the initialization in the constructor `__init__`.\n", "\n", "Fill in the definition below with the right values for solving the above optimization program.\n", " " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from nullspace_optimizer import nlspace_solve, EuclideanOptimizable\n", "import numpy as np\n", "\n", "class problem1(EuclideanOptimizable):\n", " def __init__(self,x0):\n", " super().__init__(2)\n", " self.xinit = x0\n", " self.nconstraints = 1\n", " self.nineqconstraints = 0\n", "\n", " def x0(self):\n", " return self.xinit\n", "\n", " def J(self, x):\n", " return x[0]+x[1]\n", "\n", " def dJ(self, x):\n", " return [1, 1]\n", "\n", " def G(self, x):\n", " return [x[0]*x[1]-1]\n", "\n", " def dG(self, x):\n", " return [[x[1],x[0]]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then write a routine to solve the problem several time with several initializations. Adapt the code below to specify the entries (0.1,0.1), (4.0,0.25), (4,1). " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def run_problems():\n", " xinits = ([0.1,0.1], [4.0, 0.25], [4, 1])\n", " # Write xinits\n", " problems = [problem1(x0=x0) for x0 in xinits]\n", " params = {'dt': 0.1, 'alphaJ':2, 'alphaC':1, 'debug': -1}\n", " return [nlspace_solve(pb, params) for pb in problems]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function nlspace_solve calls the null space optimizer on this problem. Get the result by calling the function run_problems:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Optimization completed.\n", "\u001b[38;5;4m14. J=2 G=[-9.741e-08] H=[]\u001b[0m\n", "\n", "\n", "Optimization completed.\n", "\u001b[38;5;4m65. J=2 G=[-5.8e-13] H=[]\u001b[0m\n", "\n", "\n", "Optimization completed.\n", "\u001b[38;5;4m50. J=2 G=[-4.101e-13] H=[]\u001b[0m\n" ] } ], "source": [ "results = run_problems()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The variable `results` contains various data about the optimization trajectories, e.g.:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'it': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],\n", " 'x': [[0.1, 0.1],\n", " array([0.2, 0.2]),\n", " array([0.3, 0.3]),\n", " array([0.4, 0.4]),\n", " array([0.5, 0.5]),\n", " array([0.6, 0.6]),\n", " array([0.69999998, 0.69999998]),\n", " array([0.79999998, 0.79999998]),\n", " array([0.89999996, 0.89999996]),\n", " array([0.995, 0.995]),\n", " array([0.99951131, 0.99951131]),\n", " array([0.99995128, 0.99995128]),\n", " array([0.99999513, 0.99999513]),\n", " array([0.99999951, 0.99999951]),\n", " array([0.99999995, 0.99999995])],\n", " 'J': [0.2,\n", " 0.4,\n", " 0.6000000000000001,\n", " 0.8,\n", " 1.0,\n", " 1.2,\n", " 1.3999999555910838,\n", " 1.5999999555910838,\n", " 1.7999999111821676,\n", " 1.9900000004934348,\n", " 1.999022613112433,\n", " 1.99990256517331,\n", " 1.9999902586534828,\n", " 1.9999990258866995,\n", " 1.9999999025888835],\n", " 'G': [[-0.99],\n", " [-0.96],\n", " [-0.9099999999999999],\n", " [-0.84],\n", " [-0.75],\n", " [-0.64],\n", " [-0.5100000310862408],\n", " [-0.36000003552713244],\n", " [-0.19000007993604717],\n", " [-0.009974999509032356],\n", " [-0.0009771480662851273],\n", " [-9.743245330362527e-05],\n", " [-9.741322793743734e-06],\n", " [-9.741130632123784e-07],\n", " [-9.741111417493897e-08]],\n", " 'H': [[], [], [], [], [], [], [], [], [], [], [], [], [], [], []],\n", " 'muls': [array([-10.]),\n", " array([-5.]),\n", " array([-3.33333333]),\n", " array([-2.5]),\n", " array([-2.]),\n", " array([-1.66666667]),\n", " array([-1.42857147]),\n", " array([-1.25000003]),\n", " array([-1.11111117]),\n", " array([-1.00502513]),\n", " array([-1.00048893]),\n", " array([-1.00004872]),\n", " array([-1.00000487]),\n", " array([-1.00000049])],\n", " 'normxiJ': [0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 1.1102230246251565e-16,\n", " 0.0,\n", " 1.1102230246251565e-16,\n", " 0.0,\n", " 0.0,\n", " 2.220446049250313e-16,\n", " 0.0,\n", " 0.0,\n", " 0.0],\n", " 'normxiJ_save': [0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0],\n", " 'tolerance': [array([0.02]),\n", " array([0.04]),\n", " array([0.06]),\n", " array([0.08]),\n", " array([0.1]),\n", " array([0.12]),\n", " array([0.14]),\n", " array([0.16]),\n", " array([0.17999999]),\n", " array([0.199]),\n", " array([0.19990226]),\n", " array([0.19999026]),\n", " array([0.19999903]),\n", " array([0.1999999])],\n", " 's': [0,\n", " 0.1,\n", " 0.2,\n", " 0.30000000000000004,\n", " 0.4,\n", " 0.5,\n", " 0.599999977795542,\n", " 0.699999977795542,\n", " 0.7999999555910839,\n", " 0.8950000002467176,\n", " 0.8995113065562166,\n", " 0.8999512825866551,\n", " 0.8999951293267415,\n", " 0.8999995129433499,\n", " 0.8999999512944419],\n", " 'eps': [array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64),\n", " array([], dtype=float64)]}" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have access to the objective function and constraint histories, and the value of the Lagrange multiplier:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "i=1\n", "\n", "import matplotlib.pyplot as plt\n", "plt.plot(results[i]['it'],results[i]['J'])\n", "plt.title('J')\n", "plt.figure()\n", "plt.plot(results[i]['it'],[ g[0] for g in results[i]['G']])\n", "plt.title('G')\n", "plt.figure()\n", "plt.plot(results[i]['it'][:-1],[mu[0] for mu in results[i]['muls']])\n", "plt.title('$\\lambda$');\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comment on the numerical values of the constraint G. Observe that the objective function keeps decreasing while maintaining the constraint satisfied.\n", "\n", "Plot the constraint $x_1x_2=1$ and the optimization trajectories:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import nullspace_optimizer.examples.draw as draw\n", "t = np.linspace(1/3,5,100)\n", "plt.plot(t,1/t,color='red',linewidth=0.5,label=\"y=1/x\")\n", "plt.plot(-t,-1/t,color='red',linewidth=0.5)\n", "for i, r in enumerate(results):\n", " draw.drawData(r, f'x{i}', f'C{i}', x0=True, xfinal=True, initlabel=None)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Further works\n", "\n", "1. Adapt the above codes to display other trajectories.\n", "2. Try with other initializations, change the parameter alphaC and alphaJ\n", "3. Comment on the trajectories\n", "4. Try another equality constrained optimization program below" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Another problem\n", "\n", "Do the same to solve \n", "\n", "$$\n", " \\begin{aligned}\n", " \\max_{(x_1,x_2)\\in\\mathbb{R}^{2}} & \\qquad x_2\\\\\n", " s.t. & \\left\\{\\begin{aligned}\n", " (x_1-0.5)^{2}+x_2^{2} &= 2\\\\\n", " (x_1+0.5)^{2}+x_2^{2} &= 2.\n", " \\end{aligned}\\right.\n", " \\end{aligned}\n", "$$" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "class problem2(EuclideanOptimizable):\n", " def __init__(self,x0):\n", " super().__init__(2)\n", " self.xinit = x0\n", " self.nconstraints = 2\n", " self.nineqconstraints = 0\n", "\n", " def x0(self):\n", " return self.xinit\n", "\n", " def J(self, x):\n", " return -x[1]\n", "\n", " def dJ(self, x):\n", " return [0, -1]\n", "\n", " def G(self, x):\n", " return [(x[0]-0.5)**2+x[1]**2-2,(x[0]+0.5)**2+x[1]**2-2]\n", "\n", " def dG(self, x):\n", " return [[2*(x[0]-0.5),2*x[1]],[2*(x[0]+0.5),2*x[1]]]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Optimization completed.\n", "\u001b[38;5;4m31. J=-1.323 G=[-5.529e-08,-5.529e-08] H=[]\u001b[0m\n", "\n", "\n", "Optimization completed.\n", "\u001b[38;5;4m37. J=-1.323 G=[-3.685e-08,3.784e-08] H=[]\u001b[0m\n", "\n", "\n", "Optimization completed.\n", "\u001b[38;5;4m68. J=1.323 G=[-4.121e-08,-3.668e-08] H=[]\u001b[0m\n", "\n", "\n", "Optimization completed.\n", "\u001b[38;5;4m39. J=1.323 G=[-2.874e-08,-6.206e-08] H=[]\u001b[0m\n" ] } ], "source": [ "def run_problems():\n", " xinits = ([0,0], [1.0, 0], [3, -1], [-1.5,-0.5])\n", " # Write xinits\n", " problems = [problem2(x0=x0) for x0 in xinits]\n", " params = {'dt': 0.05, 'alphaJ':2, 'alphaC':1, 'debug': -1}\n", " return [nlspace_solve(pb, params) for pb in problems]\n", "\n", "results=run_problems()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "t=np.linspace(0,2*np.pi,100)\n", "plt.plot(0.5+np.sqrt(2)*np.cos(t),np.sqrt(2)*np.sin(t),color='red',linewidth='0.5')\n", "plt.plot(-0.5+np.sqrt(2)*np.cos(t),np.sqrt(2)*np.sin(t),color='red',linewidth='0.5')\n", "plt.axis('equal')\n", "for i, r in enumerate(results):\n", " draw.drawData(r, f'x{i}', f'C{i}', x0=True, xfinal=True, initlabel=None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Is the behavior of the trajectories `x2` and `x3` surprising ?" ] } ], "metadata": { "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.8.10" } }, "nbformat": 4, "nbformat_minor": 4 }