{"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/hybrid-models-for-learning-to-branch","title":"Hybrid Models for Learning to Branch","arxiv_id":"2006.15212","date":"2020-06-26","proceeding":"NeurIPS 2020 12","authors":["Prateek Gupta","Maxime Gasse","Elias B. Khalil","M. Pawan Kumar","Andrea Lodi","Yoshua Bengio"],"abstract":"A recent Graph Neural Network (GNN) approach for learning to branch has been shown to successfully reduce the running time of branch-and-bound algorithms for Mixed Integer Linear Programming (MILP). While the GNN relies on a GPU for inference, MILP solvers are purely CPU-based. This severely limits its application as many practitioners may not have access to high-end GPUs. In this work, we ask two key questions. First, in a more realistic setting where only a CPU is available, is the GNN model still competitive? Second, can we devise an alternate computationally inexpensive model that retains the predictive power of the GNN architecture? We answer the first question in the negative, and address the second question by proposing a new hybrid architecture for efficient branching on CPU machines. The proposed architecture combines the expressive power of GNNs with computationally inexpensive multi-layer perceptrons (MLP) for branching. We evaluate our methods on four classes of MILP problems, and show that they lead to up to 26% reduction in solver running time compared to state-of-the-art methods without a GPU, while extrapolating to harder problems than it was trained on. The code for this project is publicly available at https://github.com/pg2455/Hybrid-learn2branch.","url_abs":"https://arxiv.org/abs/2006.15212v3","url_pdf":"https://arxiv.org/pdf/2006.15212v3.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":"hybrid-models-for-learning-to-branch","repo_url":"https://github.com/pg2455/Hybrid-learn2branch","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":null,"task_name":"CPU"},{"task_slug":null,"task_name":"GPU"},{"task_slug":"graph-neural-network","task_name":"Graph Neural Network"}],"methods":[{"method_slug":"graph-neural-network","method_name":"Graph Neural Network"}],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2006.15212","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2006.15212"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+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":"deterministic:regex_extraction","url":"https://github.com/pg2455/Hybrid-learn2branch","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"ran":4,"unverified":12},"by_repo_kind":{"official":{"samples":16,"ran":4,"repositories":1}},"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":0,"samples":[{"code_sha256_prefix":"32a993f121a70da5","entry":"BaseModel","repo":"pg2455/hybrid-learn2branch","repo_kind":"official","path":"models/film/model.py","file_url":"https://github.com/pg2455/hybrid-learn2branch/blob/HEAD/models/film/model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"32a993f121a70da5"}},{"code_sha256_prefix":"5953c5ecd35e3c6c","entry":"BipartiteGraphConvolution","repo":"pg2455/hybrid-learn2branch","repo_kind":"official","path":"models/film/model.py","file_url":"https://github.com/pg2455/hybrid-learn2branch/blob/HEAD/models/film/model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"5953c5ecd35e3c6c"}},{"code_sha256_prefix":"1405c5b3fe3c07a3","entry":"MLP","repo":"pg2455/hybrid-learn2branch","repo_kind":"official","path":"models/film/model.py","file_url":"https://github.com/pg2455/hybrid-learn2branch/blob/HEAD/models/film/model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"1405c5b3fe3c07a3"}},{"code_sha256_prefix":"5262341c42986c96","entry":"PreNormLayer","repo":"pg2455/hybrid-learn2branch","repo_kind":"official","path":"models/film/model.py","file_url":"https://github.com/pg2455/hybrid-learn2branch/blob/HEAD/models/film/model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"5262341c42986c96"}},{"code_sha256_prefix":"87f6886035ac0757","entry":"GCNPolicy","repo":"pg2455/hybrid-learn2branch","repo_kind":"official","path":"models/film/model.py","file_url":"https://github.com/pg2455/hybrid-learn2branch/blob/HEAD/models/film/model.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"87f6886035ac0757"}},{"code_sha256_prefix":"2d9532467e473d7e","entry":"Policy","repo":"pg2455/hybrid-learn2branch","repo_kind":"official","path":"models/film/model.py","file_url":"https://github.com/pg2455/hybrid-learn2branch/blob/HEAD/models/film/model.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"2d9532467e473d7e"}},{"code_sha256_prefix":"4c335c2ac6bd0f5e","entry":"PreNormException","repo":"pg2455/hybrid-learn2branch","repo_kind":"official","path":"models/film/model.py","file_url":"https://github.com/pg2455/hybrid-learn2branch/blob/HEAD/models/film/model.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"4c335c2ac6bd0f5e"}},{"code_sha256_prefix":"01d962ccce151759","entry":"load_batch","repo":"pg2455/Hybrid-learn2branch","repo_kind":"official","path":"utilities_hybrid.py","file_url":"https://github.com/pg2455/Hybrid-learn2branch/blob/HEAD/utilities_hybrid.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"01d962ccce151759"}},{"code_sha256_prefix":"62ce4a248978c550","entry":"load_batch_gcnn_minimal","repo":"pg2455/Hybrid-learn2branch","repo_kind":"official","path":"utilities_hybrid.py","file_url":"https://github.com/pg2455/Hybrid-learn2branch/blob/HEAD/utilities_hybrid.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"62ce4a248978c550"}},{"code_sha256_prefix":"8a1bc164bad6b1ee","entry":"pretrain","repo":"pg2455/Hybrid-learn2branch","repo_kind":"official","path":"03_train_hybrid.py","file_url":"https://github.com/pg2455/Hybrid-learn2branch/blob/HEAD/03_train_hybrid.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"8a1bc164bad6b1ee"}},{"code_sha256_prefix":"8ec2bdad43e420bf","entry":"pretrain","repo":"pg2455/Hybrid-learn2branch","repo_kind":"official","path":"03_train_gcnn_torch.py","file_url":"https://github.com/pg2455/Hybrid-learn2branch/blob/HEAD/03_train_gcnn_torch.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"8ec2bdad43e420bf"}},{"code_sha256_prefix":"e6ac98604045bf21","entry":"process","repo":"pg2455/Hybrid-learn2branch","repo_kind":"official","path":"04_test_hybrid.py","file_url":"https://github.com/pg2455/Hybrid-learn2branch/blob/HEAD/04_test_hybrid.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"e6ac98604045bf21"}},{"code_sha256_prefix":"df842ea8c5a19e80","entry":"process","repo":"pg2455/Hybrid-learn2branch","repo_kind":"official","path":"03_train_gcnn_torch.py","file_url":"https://github.com/pg2455/Hybrid-learn2branch/blob/HEAD/03_train_gcnn_torch.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"df842ea8c5a19e80"}},{"code_sha256_prefix":"6bba154b3f9e639b","entry":"process","repo":"pg2455/Hybrid-learn2branch","repo_kind":"official","path":"03_train_mlp.py","file_url":"https://github.com/pg2455/Hybrid-learn2branch/blob/HEAD/03_train_mlp.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"6bba154b3f9e639b"}},{"code_sha256_prefix":"ce3326ede28ef913","entry":"process","repo":"pg2455/Hybrid-learn2branch","repo_kind":"official","path":"04_test_gcnn_torch.py","file_url":"https://github.com/pg2455/Hybrid-learn2branch/blob/HEAD/04_test_gcnn_torch.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ce3326ede28ef913"}},{"code_sha256_prefix":"b24e2eb594f07e54","entry":"process","repo":"pg2455/Hybrid-learn2branch","repo_kind":"official","path":"04_test_mlp.py","file_url":"https://github.com/pg2455/Hybrid-learn2branch/blob/HEAD/04_test_mlp.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"b24e2eb594f07e54"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}