{"id":45887094,"url":"https://github.com/isaacrudich/implicitdds.jl","last_synced_at":"2026-03-02T19:01:09.269Z","repository":{"id":340378075,"uuid":"1165744182","full_name":"IsaacRudich/ImplicitDDs.jl","owner":"IsaacRudich","description":"Exact MIP solver using decision diagram relaxations instead of LP relaxations.","archived":false,"fork":false,"pushed_at":"2026-02-27T14:38:08.000Z","size":140,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-27T19:36:02.781Z","etag":null,"topics":["combinatorial-optimization","decision-diagrams","exact-algorithm","mixed-integer-programming","operations-research","optimization"],"latest_commit_sha":null,"homepage":"","language":"Julia","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/IsaacRudich.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-24T13:54:33.000Z","updated_at":"2026-02-25T20:44:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/IsaacRudich/ImplicitDDs.jl","commit_stats":null,"previous_names":["isaacrudich/implicitdds.jl"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/IsaacRudich/ImplicitDDs.jl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IsaacRudich%2FImplicitDDs.jl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IsaacRudich%2FImplicitDDs.jl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IsaacRudich%2FImplicitDDs.jl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IsaacRudich%2FImplicitDDs.jl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/IsaacRudich","download_url":"https://codeload.github.com/IsaacRudich/ImplicitDDs.jl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IsaacRudich%2FImplicitDDs.jl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29943631,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T13:49:17.081Z","status":"ssl_error","status_checked_at":"2026-02-28T13:48:50.396Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["combinatorial-optimization","decision-diagrams","exact-algorithm","mixed-integer-programming","operations-research","optimization"],"created_at":"2026-02-27T16:18:23.957Z","updated_at":"2026-02-28T17:00:21.448Z","avatar_url":"https://github.com/IsaacRudich.png","language":"Julia","readme":"# ImplicitDDs\n\n**ImplicitDDs.jl** is an exact MIP solver that uses decision diagram (DD) branch-and-bound in place of LP relaxations. Dual bounds come from *relaxed* DDs and primal bounds from *restricted* DDs. By reasoning over combinatorial structure rather than a linear approximation, this approach is most effective precisely where LP-based solvers struggle most.\n\nFor more details, see our paper: [Implicit Decision Diagrams](https://arxiv.org/abs/2602.20793).\n\n## When to Use ImplicitDDs\n\nImplicitDDs is designed for specific problem characteristics:\n\n**Best suited for:**\n- Binary integer programs (0-1 variables)\n- Problems with weak linear relaxations where traditional LP-based solvers struggle\n- Highly combinatorial problems where objective value depends primarily on integer variables\n- Problems with small integer domains (precompiled for domains up to Int16, i.e., [-32768, 32767])\n\n**Requirements:**\n- All variables must have finite bounds\n\n**Not recommended for:**\n- Problems with large integer domains (Int32/Int64)\n- Problems where the linear relaxation is tight\n- Problems dominated by continuous variable contributions\n\n## Installation\n\n```julia\nusing Pkg\nPkg.add(\"ImplicitDDs\")\n```\n\n## Basic Usage\n\n```julia\nusing JuMP, ImplicitDDs\n\nmodel = Model(ImplicitDDs.Optimizer)\n\n@variable(model, x[1:5], Bin)\n@constraint(model, sum(x) \u003c= 3)\n@objective(model, Max, sum(i * x[i] for i in 1:5))\n\noptimize!(model)\n\nprintln(\"Status: \", termination_status(model))\nprintln(\"Objective: \", objective_value(model))\nprintln(\"Solution: \", value.(x))\n```\n\n## Optimizer Attributes\n\nConfigure the solver using `set_optimizer_attribute`:\n\n```julia\nmodel = Model(ImplicitDDs.Optimizer)\nset_optimizer_attribute(model, \"relaxed_w\", 5000)\nset_optimizer_attribute(model, \"restricted_w\", 5000)\nset_optimizer_attribute(model, MOI.Silent(), true)\n```\n\n### Decision Diagram Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `relaxed_w` | Int | 10000 | Width limit for relaxed decision diagrams. Larger values give tighter bounds but slower iterations. |\n| `restricted_w` | Int | 10000 | Width limit for restricted decision diagrams. Larger values improve solution quality but slow construction. |\n| `num_LPs_to_run` | Int | 10 | Maximum LP subproblems to solve per restricted DD. More LPs can find better solutions but significantly slow the restricted DD phase. |\n\n**Tuning tips:**\n- Start with default widths (10000) and adjust based on performance\n- If bounds aren't tight enough, increase `relaxed_w`\n- If finding good solutions is difficult, increase `restricted_w`\n- For problems with few continuous variables, reduce `num_LPs_to_run`\n\n### Performance Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `parallel_processing` | Bool | true | Enable multi-threaded branch-and-bound. Run Julia with `-t N` for N threads. |\n| `numerical_precision` | DataType | Float32 | Float precision for calculations. Use Float64 if numerical issues arise. |\n\n### Output Control\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `MOI.Silent()` | Bool | false | Suppress all console output. |\n| `bounds_print` | Bool | true | Print lower/upper bounds as they improve. |\n| `solution_print` | Bool | false | Print full solution vectors when found. |\n| `debug_mode` | Bool | false | Verbose internal solver state (very verbose). |\n| `timer_outputs` | Bool | false | Print detailed timing breakdown at end. |\n\n### Logging Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `log_file_path` | String/Nothing | nothing | Path for JSON log file. |\n| `wait_to_write_solutions` | Bool | false | If true, batch log writes for performance. If false, write immediately (safer if solver crashes). |\n\n### Other Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `MOI.TimeLimitSec()` | Float64/Nothing | nothing | Time limit in seconds. |\n| `custom_variable_order` | Vector{MOI.VariableIndex}/Nothing | nothing | Custom ordering for integer variables. Default uses METIS-based ordering. |\n\n## Example with Configuration\n\n```julia\nusing JuMP, ImplicitDDs\n\nmodel = Model(ImplicitDDs.Optimizer)\n\n# Configure solver\nset_optimizer_attribute(model, \"relaxed_w\", 50000)\nset_optimizer_attribute(model, \"restricted_w\", 50000)\nset_optimizer_attribute(model, \"parallel_processing\", true)\nset_optimizer_attribute(model, MOI.Silent(), true)\nset_optimizer_attribute(model, MOI.TimeLimitSec(), 300.0)  # 5 minute limit\n\n# Define problem\n@variable(model, x[1:10], Bin)\n@constraint(model, sum(x) \u003c= 5)\n@objective(model, Max, sum(i * x[i] for i in 1:10))\n\noptimize!(model)\n\nif termination_status(model) == MOI.OPTIMAL\n    println(\"Optimal solution found!\")\n    println(\"Objective: \", objective_value(model))\nelseif termination_status(model) == MOI.TIME_LIMIT\n    println(\"Time limit reached\")\n    if has_values(model)\n        println(\"Best solution found: \", objective_value(model))\n    end\nend\n```\n\n## Querying Results\n\nStandard JuMP/MOI result queries are supported:\n\n```julia\ntermination_status(model)  # MOI.OPTIMAL, MOI.TIME_LIMIT, MOI.INFEASIBLE, etc.\nobjective_value(model)     # Best objective found\nobjective_bound(model)     # Best bound (lower for min, upper for max)\nrelative_gap(model)        # Relative optimality gap\nsolve_time(model)          # Solve time in seconds\nvalue(x)                   # Variable values\n```\n\n## Citation\n\nIf you use ImplicitDDs in your research, please cite:\n\n```bibtex\n@article{rudich2026implicitDDs,\n      title={Implicit Decision Diagrams}, \n      author={Isaac Rudich and Louis-Martin Rousseau},\n      year={2026},\n      eprint={2602.20793},\n      archivePrefix={arXiv},\n      primaryClass={math.OC},\n      url={https://arxiv.org/abs/2602.20793}, \n}\n```","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fisaacrudich%2Fimplicitdds.jl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fisaacrudich%2Fimplicitdds.jl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fisaacrudich%2Fimplicitdds.jl/lists"}