{"cells":[{"cell_type":"markdown","metadata":{},"source":["# Optimization with CSDL models\n","\n","*Problem:*\n","\n","$$\n","\\begin{align}\n","\\underset{x, y \\in \\mathbb{R}}{\\text{minimize}} & \\quad x^4 + y^4 \\\\\n","\\text{subject to} & \\quad x\\geq0, \\\\\n"," & \\quad x+y=1, \\\\\n"," & \\quad x-y\\geq1.\n","\\end{align}\n","$$"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stderr","output_type":"stream","text":["/Users//modopt/modopt/external_libraries/snopt/snoptc.py:6: UserWarning: snoptc from 'optimize' could not be imported\n"," warnings.warn(\"snoptc from 'optimize' could not be imported\")\n","/Users//modopt/modopt/external_libraries/snopt/snoptc.py:10: UserWarning: snopt7_python from 'optimize.solvers' could not be imported\n"," warnings.warn(\"snopt7_python from 'optimize.solvers' could not be imported\")\n","/Users//modopt/modopt/external_libraries/snopt/snopt_optimizer.py:6: UserWarning: SNOPT_options from 'optimize' could not be imported\n"," warnings.warn(\"SNOPT_options from 'optimize' could not be imported\")\n"]},{"name":"stdout","output_type":"stream","text":["Deleting self.pFpx ...\n","Deleting self.pCpx, pCpx_dict ...\n","Computing objective >>>>>>>>>>\n","---------Computed objective---------\n","Computing constraints >>>>>>>>>>\n","---------Computed constraints---------\n","Computing gradient >>>>>>>>>>\n","(('constraint_1', 'constraint_2', 'z'), ('x', 'y')) not found, generating...\n","\n","generating: DERIVATIVESconstraint_1,constraint_2,z-->x,y\n","constraint_1--> (1/5) |........ |\n","constraint_2--> (1/5) |........ |\n","z--> (3/5) |........................ |\n","---------Computed gradient---------\n","Computing Jacobian >>>>>>>>>>\n","---------Computed Jacobian---------\n","Computing objective >>>>>>>>>>\n","---------Computed objective---------\n","Computing constraints >>>>>>>>>>\n","---------Computed constraints---------\n","Computing gradient >>>>>>>>>>\n","---------Computed gradient---------\n","Computing Jacobian >>>>>>>>>>\n","---------Computed Jacobian---------\n","Optimization terminated successfully (Exit mode 0)\n"," Final objective value : 1.000000e+00\n"," Final optimality : 3.002483e-15\n"," Final feasibility : 1.110223e-16\n"," Number of major iterations : 2\n"," Number of function evaluations : 2\n"," Number of derivative evaluations : 2\n"," Average Derivative evaluation time : 0.000222 s per evaluation\n"," Average Function evaluation time : 0.000989 s per evaluation\n"," Total Function evaluation time : 0.000443 s [ 5.62%]\n"," Total Derivative evaluation time : 0.001979 s [ 25.07%]\n"," Optimizer time : 0.000843 s [ 10.68%]\n"," Processing time : 0.004627 s [ 58.63%]\n"," Visualization time : 0.000000 s [ 0.00%]\n"," Total optimization time : 0.007892 s [100.00%]\n"," Summary saved to : slsqp_summary.out\n","[1.]\n","[1.11022302e-16]\n","[1.]\n"]},{"name":"stderr","output_type":"stream","text":["/Users//modopt/modopt/external_libraries/csdl/csdl_problem.py:53: UserWarning: This version of CSDL or python_csdl_backend does not support SURF paradigm.\n"," warnings.warn('This version of CSDL or python_csdl_backend does not support SURF paradigm.')\n","/Users//modopt/modopt/external_libraries/pyslsqp/pyslsqp.py:132: UserWarning: PySLSQP prints the final results by default. To suppress the results, set `solver_options={\"iprint\":0}`. Check the summary file \"slsqp_summary.out\" for the summary of optimization.\n"," warnings.warn('PySLSQP prints the final results by default. '\n"]}],"source":["from csdl import Model\n","\n","# minimize x^4 + y^4 subject to x>=0, x+y=1, x-y>=1.\n","\n","class QuarticFunc(Model):\n"," def initialize(self):\n"," pass\n","\n"," def define(self):\n"," # add_inputs\n"," x = self.create_input('x', val=1.)\n"," y = self.create_input('y', val=1.)\n","\n"," z = x**4 + y**4\n","\n"," # add_outputs\n"," self.register_output('z', z)\n","\n"," constraint_1 = x + y\n"," constraint_2 = x - y\n"," self.register_output('constraint_1', constraint_1)\n"," self.register_output('constraint_2', constraint_2)\n","\n"," # define optimization problem\n"," self.add_design_variable('x', lower=0.)\n"," self.add_design_variable('y')\n"," self.add_objective('z')\n"," self.add_constraint('constraint_1', equals=1.)\n"," self.add_constraint('constraint_2', lower=1.)\n","\n","\n","if __name__ == \"__main__\":\n"," # from csdl_om import Simulator\n"," from python_csdl_backend import Simulator\n","\n"," # Create a Simulator object for your model\n"," sim = Simulator(QuarticFunc())\n","\n"," from modopt import CSDLProblem\n","\n"," # Instantiate your problem using the csdl Simulator object and name your problem\n"," prob = CSDLProblem(problem_name='quartic',simulator=sim)\n","\n"," from modopt import SQP, SLSQP, SNOPT, PySLSQP\n","\n"," # Setup your preferred optimizer (here, SLSQP) with the Problem object \n"," # Pass in the options for your chosen optimizer\n"," optimizer = PySLSQP(prob, solver_options={'maxiter': 20, 'acc':1e-6})\n"," # optimizer = SLSQP(prob, solver_options={'maxiter':20, 'ftol':1e-6})\n"," # optimizer = SQP(prob, maxiter=20)\n"," snopt_options = {\n"," 'Infinite bound': 1.0e20, \n"," 'Verify level': 3,\n"," 'Verbose': True,\n"," }\n"," # optimizer = SNOPT(prob, solver_options=snopt_options)\n","\n"," # Check first derivatives at the initial guess, if needed\n"," # optimizer.check_first_derivatives(prob.x0)\n"," # sim.run()\n"," # sim.check_totals()\n","\n"," # Solve your optimization problem\n"," optimizer.solve()\n","\n"," # Print results of optimization (summary_table contains information from each iteration)\n"," optimizer.print_results(summary_table=True)\n","\n"," print(sim['x'])\n"," print(sim['y'])\n"," print(sim['z'])"]}],"metadata":{"kernelspec":{"display_name":".venv","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.9.13"}},"nbformat":4,"nbformat_minor":2}