Skip to content

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

Draft
cafzal wants to merge 12 commits into
NVIDIA:mainfrom
cafzal:multi-objective-exploration-skill
Draft

Add cuopt-multi-objective-exploration skill (Pareto frontier)#1355
cafzal wants to merge 12 commits into
NVIDIA:mainfrom
cafzal:multi-objective-exploration-skill

Conversation

@cafzal
Copy link
Copy Markdown

@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, and is linked from the goal-programming pattern in cuopt-numerical-optimization-formulation (which already covers the fixed-priority case).

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 (add_quadratic_constraint, inequality only), though SOCP support is beta.
  • 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
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.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants