{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/learning-to-optimize-for-mixed-integer-non","title":"Learning to Optimize for Mixed-Integer Non-linear Programming with Feasibility Guarantees","arxiv_id":"2410.11061","date":"2024-10-14","proceeding":null,"authors":["Bo Tang","Elias B. Khalil","Ján Drgoňa"],"abstract":"Mixed-integer nonlinear programs (MINLPs) arise in domains as diverse as energy systems and transportation, but are notoriously difficult to solve, particularly at scale. While learning-to-optimize (L2O) methods have been successful at continuous optimization, extending them to MINLPs is challenging due to integer constraints. To overcome this, we propose a novel L2O approach with two integer correction layers to ensure the integrality of the solution and a projection step to ensure the feasibility of the solution. We prove that the projection step converges, providing a theoretical guarantee for our method. Our experiments show that our methods efficiently solve MINLPs with up to tens of thousands of variables, providing high-quality solutions within milliseconds, even for problems where traditional solvers and heuristics fail. This is the first general L2O method for parametric MINLPs, finding solutions to some of the largest instances reported to date.","url_abs":"https://arxiv.org/abs/2410.11061v9","url_pdf":"https://arxiv.org/pdf/2410.11061v9.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"learning-to-optimize-for-mixed-integer-non","repo_url":"https://github.com/pnnl/l2o-pminlp","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"NOASSERTION"}},{"paper_slug":"learning-to-optimize-for-mixed-integer-non","repo_url":"https://github.com/pnnl/neuromancer","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"NOASSERTION"}}],"tasks":[],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2410.11061","atlas_url":"https://app.syntology.ai/?focus=2410.11061","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2410.11061"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-25T09:33:49+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/pnnl/neuromancer","reach":{"status":"ok","spdx":"NOASSERTION"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/pnnl/l2o-pminlp","reach":{"status":"ok","spdx":"NOASSERTION"}}],"summary":{"ran":15,"unverified":3},"by_repo_kind":{"official":{"samples":18,"ran":15,"repositories":2}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":18,"samples":[{"code_sha256_prefix":"29a7dc8bf982359a","entry":"add","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/arg.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/arg.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"29a7dc8bf982359a"}},{"code_sha256_prefix":"24ec9f4dad13f79e","entry":"batch_tensor","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/dataset.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/dataset.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"24ec9f4dad13f79e"}},{"code_sha256_prefix":"3a05873c30fb749b","entry":"cl_simulate","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/plot.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/plot.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"3a05873c30fb749b"}},{"code_sha256_prefix":"b0e0c9009e30f4b0","entry":"evaluate","repo":"pnnl/l2o-pminlp","repo_kind":"official","path":"run/nonconvex.py","file_url":"https://github.com/pnnl/l2o-pminlp/blob/HEAD/run/nonconvex.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"b0e0c9009e30f4b0"}},{"code_sha256_prefix":"171645155c800b62","entry":"evaluate","repo":"pnnl/l2o-pminlp","repo_kind":"official","path":"run/quadratic.py","file_url":"https://github.com/pnnl/l2o-pminlp/blob/HEAD/run/quadratic.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"171645155c800b62"}},{"code_sha256_prefix":"f20ae166063e333b","entry":"evaluate","repo":"pnnl/l2o-pminlp","repo_kind":"official","path":"run/rosenbrock.py","file_url":"https://github.com/pnnl/l2o-pminlp/blob/HEAD/run/rosenbrock.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"f20ae166063e333b"}},{"code_sha256_prefix":"8b28071267345d6d","entry":"extract_ml_solutions","repo":"pnnl/l2o-pminlp","repo_kind":"official","path":"run/quadratic.py","file_url":"https://github.com/pnnl/l2o-pminlp/blob/HEAD/run/quadratic.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"8b28071267345d6d"}},{"code_sha256_prefix":"12c6b72306191889","entry":"extract_ml_solutions","repo":"pnnl/l2o-pminlp","repo_kind":"official","path":"run/rosenbrock.py","file_url":"https://github.com/pnnl/l2o-pminlp/blob/HEAD/run/rosenbrock.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"12c6b72306191889"}},{"code_sha256_prefix":"f7718aa07053729c","entry":"get_colors","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/plot.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/plot.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"f7718aa07053729c"}},{"code_sha256_prefix":"25e1d6c622bcdd75","entry":"gradient","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/gradients.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/gradients.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"25e1d6c622bcdd75"}},{"code_sha256_prefix":"e7329dead01b2e5d","entry":"handle_device_placement","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/utils.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/utils.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"e7329dead01b2e5d"}},{"code_sha256_prefix":"a59076d06397e905","entry":"jacobian","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/gradients.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/gradients.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"a59076d06397e905"}},{"code_sha256_prefix":"5b2f67f0d74e4b97","entry":"load_state_dict_lightning","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/utils.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/utils.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"5b2f67f0d74e4b97"}},{"code_sha256_prefix":"1a93986bc2f00d59","entry":"move_batch_to_device","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/trainer.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/trainer.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"1a93986bc2f00d59"}},{"code_sha256_prefix":"a41bf9e7cfefab28","entry":"read_file","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/dataset.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/dataset.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"a41bf9e7cfefab28"}},{"code_sha256_prefix":"a84c2400ad96c43e","entry":"log","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/arg.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/arg.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"a84c2400ad96c43e"}},{"code_sha256_prefix":"2c4fd99e6572045d","entry":"opt","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/arg.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/arg.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"2c4fd99e6572045d"}},{"code_sha256_prefix":"0bafb6c0a0f02682","entry":"unbatch_tensor","repo":"pnnl/neuromancer","repo_kind":"official","path":"src/neuromancer/dataset.py","file_url":"https://github.com/pnnl/neuromancer/blob/HEAD/src/neuromancer/dataset.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"0bafb6c0a0f02682"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}