{"id":21497844,"url":"https://github.com/cvanaret/uno","last_synced_at":"2025-05-16T07:06:32.777Z","repository":{"id":49387143,"uuid":"411774531","full_name":"cvanaret/Uno","owner":"cvanaret","description":"A next-gen SQP \u0026 barrier solver for nonlinearly constrained optimization","archived":false,"fork":false,"pushed_at":"2025-05-14T13:11:08.000Z","size":47580,"stargazers_count":328,"open_issues_count":13,"forks_count":26,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-05-14T14:38:53.868Z","etag":null,"topics":["constrained-optimization","continuous-optimization","cpp","gradient-descent","interior-point-method","local-optimization","mathematical-optimization","mathematical-programming","newton-method","nonconvex-optimization","nonlinear-optimization","nonlinear-programming","nonlinear-programming-algorithms","numerical-optimization","optimization","optimization-algorithms","optimization-methods","optimization-solver","quadratic-programming","sequential-quadratic-programming"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cvanaret.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-09-29T17:46:08.000Z","updated_at":"2025-05-14T11:47:45.000Z","dependencies_parsed_at":"2023-10-14T19:29:18.322Z","dependency_job_id":"e3342add-1acd-406f-a7c8-d18e7e9f753c","html_url":"https://github.com/cvanaret/Uno","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvanaret%2FUno","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvanaret%2FUno/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvanaret%2FUno/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvanaret%2FUno/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cvanaret","download_url":"https://codeload.github.com/cvanaret/Uno/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254485063,"owners_count":22078767,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["constrained-optimization","continuous-optimization","cpp","gradient-descent","interior-point-method","local-optimization","mathematical-optimization","mathematical-programming","newton-method","nonconvex-optimization","nonlinear-optimization","nonlinear-programming","nonlinear-programming-algorithms","numerical-optimization","optimization","optimization-algorithms","optimization-methods","optimization-solver","quadratic-programming","sequential-quadratic-programming"],"created_at":"2024-11-23T16:26:59.202Z","updated_at":"2025-05-16T07:06:27.763Z","avatar_url":"https://github.com/cvanaret.png","language":"C++","readme":"# Uno\n\n\u003cdiv align=\"center\"\u003e\n\n   *A modern, modular solver for nonlinearly constrained nonconvex optimization*\n\n\u003c/div\u003e\n\nUno (Unifying Nonlinear Optimization) is a C++ library that unifies methods for solving nonlinearly constrained optimization problems of the form:\n\n$$\n\\begin{align}\n\\min_{x \\in \\mathbb{R}^n}  \u0026 ~f(x) \\\\\n\\text{s.t.}                \u0026 ~c_L \\le c(x) \\le c_U \\\\\n                           \u0026 ~x_L \\le x \\le x_U \\\\\n\\end{align}\n$$\n\nThe theoretical abstract framework for unifying nonlinearly constrained nonconvex optimization was developed by [Charlie Vanaret](https://github.com/cvanaret/) (Argonne National Laboratory \u0026 Zuse-Institut Berlin) and [Sven Leyffer](https://wiki.mcs.anl.gov/leyffer/index.php/Sven_Leyffer) (Argonne National Laboratory). Uno was designed and implemented by Charlie Vanaret. It is released under the MIT license (see the [license file](LICENSE)).\n\nThe contributors are (in alphabetical order):\nOscar Dowson [@odow](https://github.com/odow), David Kiessling [@david0oo](https://github.com/david0oo), Alexis Montoison [@amontoison](https://github.com/amontoison), Manuel Schaich [@worc4021](https://github.com/worc4021), Silvio Traversaro [@traversaro](https://github.com/traversaro), Rujia Liu [@rujialiu](https://github.com/rujialiu).\n\n![Unit tests on Ubuntu workflow](https://github.com/cvanaret/Uno/actions/workflows/unit-tests-ubuntu.yml/badge.svg)\n\n## Unifying nonlinearly constrained nonconvex optimization\n\nWe argue that most optimization methods can be broken down into four generic ingredients:\n* a **constraint relaxation strategy**: a systematic way to relax the nonlinear constraints;\n* a **subproblem**: a local model of the (possibly relaxed) problem at the current primal-dual iterate;\n* a **globalization strategy**: an acceptance test of the trial iterate;\n* a **globalization mechanism**: a recourse action upon rejection of the trial iterate.\n\n\u003c!--\nThe following hypergraph illustrates how some of the state-of-the-art solvers can be decomposed in terms of the four ingredients:\n\u003cp align=\"center\"\u003e\n   \u003cimg src=\"docs/figures/combination_hypergraph.png\" alt=\"Combination hypergraph\" width=\"75%\" /\u003e\n\u003c/p\u003e\n\n## Uno\n--\u003e\n\nUno implements the following strategies:\n\u003cp align=\"center\"\u003e\n   \u003cimg src=\"docs/figures/hypergraph_uno.png\" alt=\"Uno hypergraph\" width=\"65%\" /\u003e\n\u003c/p\u003e\n\n**Any strategy combination** can be automatically generated without any programming effort from the user. Note that all combinations do not necessarily result in sensible algorithms, or even convergent approaches. For more details, check out our [preprint](https://www.researchgate.net/publication/381522383_Unifying_nonlinearly_constrained_nonconvex_optimization) or my [presentation at the ICCOPT 2022 conference](https://www.researchgate.net/publication/362254109).\n\nUno implements **presets**, that is strategy combinations that correspond to existing solvers (as well as hyperparameter values found in their documentations):\n* `filtersqp` mimics filterSQP (trust-region feasibility restoration filter SQP method);\n* `ipopt` mimics IPOPT (line-search feasibility restoration filter barrier method);\n* `byrd` mimics Byrd's S $\\ell_1$ QP (line-search $\\ell_1$ merit S $\\ell_1$ QP method).\n\n## Latest results (September 26, 2024)\n\nSome of Uno combinations that correspond to existing solvers (called presets, see below) have been tested against state-of-the-art solvers on 429 small problems of the [CUTEst benchmark](https://arnold-neumaier.at/glopt/coconut/Benchmark/Library2_new_v1.html).\nThe figure below is a performance profile of Uno and state-of-the-art solvers filterSQP, IPOPT, SNOPT, MINOS, LANCELOT, LOQO and CONOPT; it shows how many problems are solved for a given budget of function evaluations (1 time, 2 times, 4 times, ..., $2^x$ times the number of objective evaluations of the best solver for each instance).\n\n\u003cp align=\"center\"\u003e\n   \u003cimg src=\"docs/figures/uno_performance_profile.png\" alt=\"Performance profile of Uno\" width=\"75%\" /\u003e\n\u003c/p\u003e\n\nAll log files can be found [here](https://github.com/cvanaret/nonconvex_solver_comparison).\n\n## How to cite Uno\n\n### In an article\n\nWe have submitted our paper to the Mathematical Programming Computation journal. The preprint is available on [ResearchGate](https://www.researchgate.net/publication/381522383_Unifying_nonlinearly_constrained_nonconvex_optimization).\n\nUntil it is published, you can use the following bibtex entry:\n\n```\n@unpublished{VanaretLeyffer2024,\n  author = {Vanaret, Charlie and Leyffer, Sven},\n  title = {Unifying nonlinearly constrained nonconvex optimization},\n  year = {2024},\n  note = {Submitted to Mathematical Programming Computation}\n}\n```\n\n### On social media\n\nTo mention Uno on Twitter, use [@UnoSolver](https://twitter.com/UnoSolver).  \nTo mention Uno on LinkedIn, use [#unosolver](https://www.linkedin.com/feed/hashtag/?keywords=unosolver).  \n\n## Installation instructions\n\nSee the [INSTALL](INSTALL.md) file.\n\n## Solving a problem with Uno\n\n### Controlling Uno via options\n\nOptions can be set in three different ways (with decreasing precedence):\n- passing an option file (`option_file=file`) that contains `option value` on each line;\n- setting a preset that mimics an existing solver (`preset=[filtersqp|ipopt|byrd]`);\n- setting individual options (see the [default options](https://github.com/cvanaret/Uno/blob/main/uno/options/DefaultOptions.cpp)).\n\n### Interfaces\n\n#### AMPL/nl files\nTo solve an AMPL model in the [.nl format](https://en.wikipedia.org/wiki/Nl_(format)), type in the `build` directory: ```./uno_ampl model.nl -AMPL [option=value ...]```  \nwhere ```[option=value ...]``` is a list of options separated by spaces. \n\nA couple of CUTEst instances are available in the `/examples` directory.\n\n#### Julia\nUno can be installed in Julia via [Uno_jll.jl](https://github.com/JuliaBinaryWrappers/Uno_jll.jl) and used via [AmplNLWriter.jl](https://juliahub.com/ui/Packages/General/AmplNLWriter.jl). An example can be found [here](https://discourse.julialang.org/t/the-uno-unifying-nonconvex-optimization-solver/115883/15?u=cvanaret).\n\n### Combining strategies on the fly\n\nFor an overview of the available strategies, type: ```./uno_ampl --strategies```:\n- to pick a globalization mechanism, use the argument : ```globalization_mechanism=[LS|TR]```  \n- to pick a constraint relaxation strategy, use the argument: ```constraint_relaxation_strategy=[feasibility_restoration|l1_relaxation]```  \n- to pick a globalization strategy, use the argument: ```globalization_strategy=[l1_merit|fletcher_filter_method|waechter_filter_method|funnel_method]```  \n- to pick a subproblem method, use the argument: ```subproblem=[QP|LP|primal_dual_interior_point]```  \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcvanaret%2Funo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcvanaret%2Funo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcvanaret%2Funo/lists"}