Skip to content

Add cuopt-multi-objective-exploration skill (Pareto frontier)#1355

Merged
rapids-bot[bot] merged 22 commits into
NVIDIA:mainfrom
cafzal:multi-objective-exploration-skill
Jun 4, 2026
Merged

Add cuopt-multi-objective-exploration skill (Pareto frontier)#1355
rapids-bot[bot] merged 22 commits into
NVIDIA:mainfrom
cafzal:multi-objective-exploration-skill

Conversation

@cafzal
Copy link
Copy Markdown
Contributor

@cafzal cafzal commented Jun 1, 2026

Description

Adds cuopt-multi-objective-exploration — a concept skill for problems with two or more objectives and no fixed weighting, where the user wants to see the tradeoff instead of accepting one weighted answer. It turns repeated single-objective cuOpt solves into a Pareto frontier (payoff table → ε-constraint / weighted-sum sweep → filter dominated) and supplies the discipline to read it: exchange rates, knee points, deferring the final choice. It adds no solver features and invents no API; it sits above the api-* and formulation skills, orchestrating the solves they already cover.

cuOpt-specific correctness points

  • ε-constraining is most natural on linear objectives, so a quadratic objective (risk xᵀΣx) can simply stay the objective. A convex one can also be ε-constrained directly: cuOpt routes xᵀQx ≤ ε through the barrier solver as a second-order cone.
  • PDLP warm-start is LP-only; MILP frontier points are optimal to the gap you set, since each solve gets a time limit.
  • A hard constraint (coverage floor, budget, fairness cap) is often a latent objective — promote it to a swept ε-constraint (when its level was an assumption, not a firm limit).

User testing

Used the skill to enrich two existing examples and confirmed it drove the right calls — companion PR NVIDIA/cuopt-examples#151:

  • Workforce (MILP) — promoted two hard constraints into tradeoffs (coverage → cost vs. coverage; the max_shifts cap → cost vs. fairness), chose ε-constraint over weighted-sum, anchored objective ranges, filtered dominated points, capped each solve, and reported no MILP duals.
  • Portfolio (QP) — recognized the base notebook's hand-coded target-return loop as ε-constraint and added what it omits: the return-constraint dual (shadow price d(variance)/d(return)), with the PDLP-tolerance caveat.

The skill drives the method; runnable code still needs cuopt-numerical-optimization-api-python plus the worked notebooks, which are Colab-GPU validated (T4, clean end-to-end).

Validation & gating

Registered in AGENTS.md + marketplace.json; ci/utils/validate_skills.sh passes. The contribution is SKILL.md + evals/evals.jsonBENCHMARK.md, the skill card, and skill.oms.sig are generated by the NVSkills onboarding pipeline. The official NVSkills-Eval is the gate (PENDING).

Checklist

  • I am familiar with the Contributing Guidelines.
  • Testing
    • New or existing tests cover these changes
    • Added tests
    • Created an issue to follow-up
    • NA
  • Documentation
    • The documentation is up to date with these changes
    • Added new documentation
    • NA

cafzal added 3 commits May 30, 2026 12:43
Signed-off-by: cafzal <cameron.afzal@gmail.com>
Signed-off-by: cafzal <cameron.afzal@gmail.com>
Signed-off-by: cafzal <cameron.afzal@gmail.com>
@copy-pr-bot
Copy link
Copy Markdown

copy-pr-bot Bot commented Jun 1, 2026

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.

cafzal added 2 commits June 1, 2026 10:38
- Remove forward-ref to the not-yet-existent cuopt-examples/multi_objective_frontier/ from the goal-programming pointer (the worked example is a separate, in-flight effort)
- Inline the publication next-steps in BENCHMARK.md (CONTRIBUTION_NEXT_STEPS.md is not in the repo)
- Add a per-solve MILP time-limit note to Step 3 so points are reported optimal to the gap you set, not certified optimal

Signed-off-by: cafzal <cameron.afzal@gmail.com>
…ifications)

Signed-off-by: cafzal <cameron.afzal@gmail.com>
cafzal added 6 commits June 1, 2026 10:52
- Objectives and constraints are interchangeable: read a single-objective model's hard constraints as candidate objectives to promote to parametric ε-constraints
- Recognition cue: a hand-coded loop over a target/budget value is already the ε-constraint method
- Verify, don't assume: measure method-vs-method claims rather than asserting them; flag feasible-but-not-Optimal solves

Signed-off-by: cafzal <cameron.afzal@gmail.com>
- Guard the constraint→objective note: promote a fixed constraint only when its level was an assumption; a genuinely non-negotiable limit (hard budget cap, regulatory minimum) stays a constraint. Keeps Add A from undercutting the single-objective decoy eval.
- Correct the BENCHMARK caveat: the shipped SKILL.md also gained three method/discipline notes the A/B didn't exercise, not just the feasibility clarifications; the numbers reflect the tested text, and NVSkills-Eval gates the final text.

Signed-off-by: cafzal <cameron.afzal@gmail.com>
- SKILL.md: cuOpt now solves convex quadratic constraints (barrier solver converts xᵀQx ≤ ε to a second-order cone; add_quadratic_constraint, inequality only) per the SOCP work (NVIDIA#1290). A convex quadratic objective can therefore be ε-constrained, not only kept as the objective. The prior "constraints are linear, not quadratically-constrained" claim was outdated.
- evals.json: eval-002 supplier count ~25 → 12 to match the validated A/B exploration instance (BENCHMARK says 12 suppliers; "of 24 non-supported portfolios" corroborates a ~12-supplier instance), since the skill-card states the A/B was run over these eval tasks.

Signed-off-by: cafzal <cameron.afzal@gmail.com>
Signed-off-by: cafzal <cameron.afzal@gmail.com>
The skill's BENCHMARK and skill-card said NVSkills-Eval "runs on the fork" / via a "fork-based draft PR with CI", but request-nvskills-ci.yml states fork PRs are not supported and the run is maintainer-triggered (/nvskills-ci by an OWNER/MEMBER/COLLABORATOR) on a non-fork NVIDIA/cuopt branch; its bot attaches the skill.oms.sig signature. Reworded to match.

Signed-off-by: cafzal <cameron.afzal@gmail.com>
Signed-off-by: cafzal <cameron.afzal@gmail.com>
@rgsl888prabhu
Copy link
Copy Markdown
Collaborator

@cafzal Thank you for the draft PR, do you have access to push PR branch to main repo? Currently there is a requirement for skill related PRs to be made available in main repo to trigger CI pipe line.

Once you have done that, pipeline will validate and eval. It will also create BENCHMARK.md and skill card.

These are generated by the NVSkills onboarding pipeline (as for the sibling skills, e.g. cuopt-numerical-optimization-formulation), not authored by the contributor. Leaving just SKILL.md + evals/evals.json so the pipeline produces BENCHMARK.md, the skill card, and skill.oms.sig cleanly once the branch is on the main repo.

Signed-off-by: cafzal <cameron.afzal@gmail.com>
@cafzal
Copy link
Copy Markdown
Contributor Author

cafzal commented Jun 2, 2026

Thank you for the draft PR, do you have access to push PR branch to main repo? Currently there is a requirement for skill related PRs to be made available in main repo to trigger CI pipe line.

Once you have done that, pipeline will validate and eval. It will also create BENCHMARK.md and skill card.

@rgsl888prabhu I don't have write access to NVIDIA/cuopt (push: false), so I've been working from my own fork.

Could you either:

  1. Push this PR's branch to the main repo on your end so the skill CI can run; or
  2. Add me as a collaborator (write access) and I'll push it up.

Either works for me. Thanks.

@rgsl888prabhu
Copy link
Copy Markdown
Collaborator

Thank you for the draft PR, do you have access to push PR branch to main repo? Currently there is a requirement for skill related PRs to be made available in main repo to trigger CI pipe line.
Once you have done that, pipeline will validate and eval. It will also create BENCHMARK.md and skill card.

@rgsl888prabhu I don't have write access to NVIDIA/cuopt (push: false), so I've been working from my own fork.

Could you either:

  1. Push this PR's branch to the main repo on your end so the skill CI can run; or
  2. Add me as a collaborator (write access) and I'll push it up.

Either works for me. Thanks.

Hmm, even if I create a branch, don't think you will be able to push changes to that. And the CI requires elevated access to run. So for now, lets review and merge this PR through this. And I will create another PR once it is merged to trigger to create new skill card and BENCHMARK.md.

@cafzal cafzal marked this pull request as ready for review June 3, 2026 16:47
@cafzal cafzal requested a review from a team as a code owner June 3, 2026 16:47
@cafzal cafzal requested a review from rgsl888prabhu June 3, 2026 16:47
@cafzal
Copy link
Copy Markdown
Contributor Author

cafzal commented Jun 3, 2026

Sounds good @rgsl888prabhu . I marked this PR as ready for review:

Waiting on code owner review from NVIDIA/cuopt-infra-codeowners

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 3, 2026

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds a new cuopt-multi-objective-exploration skill registered in the marketplace, documents a stepwise Pareto-frontier exploration workflow, supplies evaluation cases for multi-objective reasoning, and cross-references the new skill from numerical optimization formulation guidance.

Changes

Multi-objective Exploration Skill

Layer / File(s) Summary
Skill registration and agent documentation
.claude-plugin/marketplace.json, AGENTS.md
The new skill is registered in the marketplace manifest pointing to ./skills/cuopt-multi-objective-exploration and added to the agent skills listing as a concept-level skill for Pareto-frontier exploration.
Pareto frontier exploration workflow and evaluation
skills/cuopt-multi-objective-exploration/SKILL.md, skills/cuopt-multi-objective-exploration/evals/evals.json
Comprehensive documentation defines the complete workflow: frontmatter, core Pareto concepts, four practical steps (payoff-table construction, scalarization method selection with weighted-sum vs ε-constraint tradeoffs, sweep/collection with warm-start and MILP guidance, and result interpretation with knee-point and tradeoff reporting). Evaluation cases validate multi-objective reasoning and correctly reject single-objective hard-constraint problems.
Cross-reference in formulation skill
skills/cuopt-numerical-optimization-formulation/SKILL.md
The existing formulation skill is updated to direct users to the new multi-objective skill when objectives conflict without fixed priority, recommending ε-constraint or weighted-sum Pareto sweeps for non-dominated solution filtering.

🎯 2 (Simple) | ⏱️ ~12 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title directly and clearly describes the main change: adding a new skill for multi-objective exploration using Pareto frontier methodology, which is the core objective of the PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
Description check ✅ Passed The PR description provides comprehensive context about the skill, its methodology, cuOpt-specific considerations, user testing, and validation status, clearly relating to all changes in the changeset.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
skills/cuopt-multi-objective-exploration/SKILL.md (1)

1-136: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Block merge until NVSkills CI maintainer validation is present.

This PR modifies skills/**, but the provided context states NVSkills-Eval is still pending. Per policy, merge should wait for a maintainer /nvskills-ci validation comment.

As per coding guidelines skills/**: “PRs that change content under 'skills/' must be validated by NVSkills CI with maintainer '/nvskills-ci' comment before merge”.

🤖 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 `@skills/cuopt-multi-objective-exploration/SKILL.md` around lines 1 - 136, The
PR modifies content under skills/ (the skill named
"cuopt-multi-objective-exploration" in SKILL.md) but lacks the required NVSkills
CI maintainer validation; before merging, add or request the maintainer
'/nvskills-ci' validation comment (or otherwise obtain NVSkills CI approval) so
the CI gate for skills/** is satisfied and the change can be merged.
🤖 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 `@skills/cuopt-multi-objective-exploration/SKILL.md`:
- Around line 48-53: Update all fenced code blocks in SKILL.md to include a
language identifier (e.g., add "text" after the opening triple backticks) so
markdownlint MD040 is satisfied; specifically, change fences that currently
start with ``` to ```text for blocks containing the table ("f1 f2 f3" grid), the
weighted-objective line ("minimize  w1·f1(x) + w2·f2(x) + ..."), the
ε-constrained example ("minimize  f1(x) subject to  f2(x) ≤ ε2 ..."), and the
pseudocode block beginning with "frontier = []" (and any other similar fenced
sections at the noted locations). Ensure each opening fence has the language
token while leaving the block contents unchanged.

---

Outside diff comments:
In `@skills/cuopt-multi-objective-exploration/SKILL.md`:
- Around line 1-136: The PR modifies content under skills/ (the skill named
"cuopt-multi-objective-exploration" in SKILL.md) but lacks the required NVSkills
CI maintainer validation; before merging, add or request the maintainer
'/nvskills-ci' validation comment (or otherwise obtain NVSkills CI approval) so
the CI gate for skills/** is satisfied and the change can be merged.
🪄 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: af2492a4-3014-4982-adde-ccd81d315e52

📥 Commits

Reviewing files that changed from the base of the PR and between c4e878d and 7b70227.

📒 Files selected for processing (5)
  • .claude-plugin/marketplace.json
  • AGENTS.md
  • skills/cuopt-multi-objective-exploration/SKILL.md
  • skills/cuopt-multi-objective-exploration/evals/evals.json
  • skills/cuopt-numerical-optimization-formulation/SKILL.md

Comment thread skills/cuopt-multi-objective-exploration/SKILL.md Outdated
Signed-off-by: cafzal <cameron.afzal@gmail.com>
@cafzal
Copy link
Copy Markdown
Contributor Author

cafzal commented Jun 3, 2026

Ready on my side. Once it's on a non-fork branch, two things clear the checks:

  1. NVSkills CI - /nvskills-ci for eval
  2. Label Checker to add add improvement + non-breaking

Thanks!

@rgsl888prabhu rgsl888prabhu added the non-breaking Introduces a non-breaking change label Jun 3, 2026
@rgsl888prabhu rgsl888prabhu added the improvement Improves an existing functionality label Jun 3, 2026
@rgsl888prabhu rgsl888prabhu requested a review from mlubin June 3, 2026 18:06
@rgsl888prabhu
Copy link
Copy Markdown
Collaborator

@mlubin may I get your review on this PR ?

Copy link
Copy Markdown
Contributor

@mlubin mlubin left a comment

Choose a reason for hiding this comment

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

I can see this skill being useful, thanks for the contribution.

Comment thread skills/cuopt-multi-objective-exploration/SKILL.md Outdated
Comment thread skills/cuopt-multi-objective-exploration/SKILL.md Outdated
cafzal added 6 commits June 3, 2026 16:06
…uidance, remove cross-skill section refs

Signed-off-by: cafzal <cameron.afzal@gmail.com>
…(conflicting objectives, informative frontier)

Signed-off-by: cafzal <cameron.afzal@gmail.com>
Signed-off-by: cafzal <cameron.afzal@gmail.com>
…ptive

- Promote "Getting each objective right" to Step 1 (define the objectives), so the body reads as a clean workflow: define -> anchor (payoff table) -> scalarize -> sweep/collect/filter -> interpret. The opening (when this applies + core idea) stays as the conceptual preamble.
- Replace specific method-name citations with the operation they perform, deferring exact calls to cuopt-numerical-optimization-api-python: "add it as a quadratic constraint" (was add_quadratic_constraint, which the merged NVIDIA#1339 docs supply via addConstraint); "carry the previous solve's PDLP warmstart data into the next" (was getWarmstartData -> set_pdlp_warm_start_data). Keeps the framing signal without binding to a changing API.

Signed-off-by: cafzal <cameron.afzal@gmail.com>
Signed-off-by: cafzal <cameron.afzal@gmail.com>
@cafzal cafzal requested a review from mlubin June 4, 2026 00:27
Signed-off-by: cafzal <cameron.afzal@gmail.com>
@cafzal
Copy link
Copy Markdown
Contributor Author

cafzal commented Jun 4, 2026

Thanks @mlubin , I addressed your review comments and lightly revamped the workflow steps for clarity and consistency.

Comment thread skills/cuopt-numerical-optimization-formulation/SKILL.md Outdated
…tion (keep skills independent, per review)

Signed-off-by: cafzal <cameron.afzal@gmail.com>
@cafzal cafzal requested a review from rgsl888prabhu June 4, 2026 16:58
@rgsl888prabhu
Copy link
Copy Markdown
Collaborator

/ok to test abbafe7

@rgsl888prabhu
Copy link
Copy Markdown
Collaborator

@cafzal Thank you for the awesome skill, once CI passes, will merge it and then create a new PR for eval

@rgsl888prabhu
Copy link
Copy Markdown
Collaborator

/merge

@rapids-bot rapids-bot Bot merged commit c9c526b into NVIDIA:main Jun 4, 2026
43 checks passed
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.

3 participants