Conflict Graph Improvements: Use non-binary rows for and add probing implications to CG#1569
Conflict Graph Improvements: Use non-binary rows for and add probing implications to CG#1569akifcorduk wants to merge 6 commits into
Conversation
Extract binary sub-cliques from mixed integer/continuous rows by relaxing non-binary terms to their minimum activity, and merge probing implied-bound implications into the conflict graph so the separator can find cliques spanning multiple constraints. Drop infeasible relaxations to avoid a negative normalized RHS. Adds a mixed-row sub-clique extraction test. Signed-off-by: akif <akifcorduk@gmail.com>
Signed-off-by: akif <akifcorduk@gmail.com>
|
/ok to test 76b9211 |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughChangesConflict graph construction
Estimated code review effort: 4 (Complex) | ~60 minutes Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
cpp/src/cuts/cuts.cpp (1)
3306-3469: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy liftAdd regression coverage for probing-only capped selection.
Cover an empty clique table with probing conflicts, weighted edge retention under a small cap, symmetry, and deduplication.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@cpp/src/cuts/cuts.cpp` around lines 3306 - 3469, Add regression tests for the probing-conflict path in the fractional conflict graph preparation logic, covering an empty clique table, probing-only conflicts, and a small edge cap that retains the highest-weight candidates. Verify generated edges are symmetric and duplicate edges are deduplicated, using the existing test helpers and the prepare_fractional_sub_conflict_graph flow.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@cpp/src/cuts/cuts.cpp`:
- Around line 3367-3408: Update the probing-bucket selection loop around
probing_edges and probing_entries_scanned to enforce work and time budgets while
scanning implications: charge each scanned entry, periodically check the elapsed
time and configured work limit, and stop candidate selection immediately when
either budget is exhausted. Ensure the final estimate also accounts for scan,
heap, and sort work, and apply the same budget enforcement to the related logic
around the probing work-limit check.
---
Nitpick comments:
In `@cpp/src/cuts/cuts.cpp`:
- Around line 3306-3469: Add regression tests for the probing-conflict path in
the fractional conflict graph preparation logic, covering an empty clique table,
probing-only conflicts, and a small edge cap that retains the highest-weight
candidates. Verify generated edges are symmetric and duplicate edges are
deduplicated, using the existing test helpers and the
prepare_fractional_sub_conflict_graph flow.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 3b7f9f8a-4865-4d57-9331-7666d34a8d01
📒 Files selected for processing (4)
cpp/src/cuts/cuts.cppcpp/src/mip_heuristics/presolve/conflict_graph/clique_table.cucpp/tests/mip/cuts_test.cuskills/cuopt-developer/references/conventions.md
CI Test Summary✅ All 31 test job(s) passed. |
|
/ok to test 76b9211 |
This PR improves clique and zero-half cut generation by building a better conflict graph.
Mixed-row binary sub-cliques: Extract binary conflict structure from mixed integer/continuous rows by relaxing non-binary terms to their minimum activity, instead of skipping those rows entirely. Previously we were only using binary rows.
Probing implications in the fractional subgraph: Add probing edges to conflict graph in prepare_fractional_sub_conflict_graph, so edges are added only among fractional literals at cut-generation time. Select top edges per literal by fractional weight score and cap the memory.
+3 optimal solutions: from 78 to 81
Wins: map10, neos-662469, neos-933966, s250r10
Lose: neos-5188808-nattai
Root Gap Closed:
Old: avg=30.0359 sgm=8.3019 (shift=1)
New: avg=32.1449 sgm=9.28139 (shift=1)
Number of cliques and zero-half cuts
Old: clique>0=47 zero_half>0=30 | clique avg=39.7375 | zero_half avg=13.1583
New: clique>0=80 zero_half>0=63 | clique avg=159.4 | zero_half avg=22.675
Geomean MIP Gap
Old: 0.196
New: 0.1953
Primal Gap
Old: avg: 11.9335 geomean: 2.0094(shift=1)
New: avg: 11.209 geomean: 1.7679(shift=1)
Same amount of feasible solutions: 227/240