Skip to content

Conflict Graph Improvements: Use non-binary rows for and add probing implications to CG#1569

Open
akifcorduk wants to merge 6 commits into
NVIDIA:mainfrom
akifcorduk:clique_improvements
Open

Conflict Graph Improvements: Use non-binary rows for and add probing implications to CG#1569
akifcorduk wants to merge 6 commits into
NVIDIA:mainfrom
akifcorduk:clique_improvements

Conversation

@akifcorduk

@akifcorduk akifcorduk commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

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

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>
@akifcorduk akifcorduk added this to the 26.08 milestone Jul 14, 2026
@akifcorduk akifcorduk requested review from a team as code owners July 14, 2026 11:20
@akifcorduk akifcorduk requested a review from tmckayus July 14, 2026 11:20
@akifcorduk akifcorduk added non-breaking Introduces a non-breaking change improvement Improves an existing functionality labels Jul 14, 2026
@copy-pr-bot

copy-pr-bot Bot commented Jul 14, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@akifcorduk

Copy link
Copy Markdown
Contributor Author

/ok to test 76b9211

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 4790c3f7-113a-4021-b309-32789821a216

📥 Commits

Reviewing files that changed from the base of the PR and between 5fc4eeb and 76b9211.

📒 Files selected for processing (2)
  • cpp/src/cuts/cuts.cpp
  • cpp/src/mip_heuristics/presolve/conflict_graph/clique_table.cu
🚧 Files skipped from review as they are similar to previous changes (2)
  • cpp/src/cuts/cuts.cpp
  • cpp/src/mip_heuristics/presolve/conflict_graph/clique_table.cu

📝 Walkthrough

Walkthrough

Changes

Conflict graph construction

Layer / File(s) Summary
Mixed-row knapsack extraction
cpp/src/mip_heuristics/presolve/conflict_graph/clique_table.cu, cpp/tests/mip/cuts_test.cu, skills/cuopt-developer/references/conventions.md
Knapsack extraction now relaxes non-binary terms, emits binary subconstraints for row sides, and tests implied conflicts from mixed rows. C++ style guidance documents loop and helper preferences.
Budgeted probing subgraph construction
cpp/src/cuts/cuts.cpp
Fractional subgraph generation preserves probing-only conflicts, bounds candidate edges by memory and work budgets, deduplicates adjacency, validates offsets, and logs probing scan/keep counts.

Estimated code review effort: 4 (Complex) | ~60 minutes

Suggested reviewers: tmckayus, hlinsen, yuwenchen95

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the main changes: using non-binary rows and adding probing implications to the conflict graph.
Description check ✅ Passed The description is directly related to the implemented conflict-graph and cut-generation improvements.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
cpp/src/cuts/cuts.cpp (1)

3306-3469: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

Add 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

📥 Commits

Reviewing files that changed from the base of the PR and between 4ec2c07 and 5fc4eeb.

📒 Files selected for processing (4)
  • cpp/src/cuts/cuts.cpp
  • cpp/src/mip_heuristics/presolve/conflict_graph/clique_table.cu
  • cpp/tests/mip/cuts_test.cu
  • skills/cuopt-developer/references/conventions.md

Comment thread cpp/src/cuts/cuts.cpp
@akifcorduk akifcorduk requested a review from chris-maes July 14, 2026 11:26
@github-actions

github-actions Bot commented Jul 14, 2026

Copy link
Copy Markdown

CI Test Summary

✅ All 31 test job(s) passed.

@akifcorduk

Copy link
Copy Markdown
Contributor Author

/ok to test 76b9211

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

improvement Improves an existing functionality non-breaking Introduces a non-breaking change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants