Add cuopt-multi-objective-exploration skill (Pareto frontier)#1355
Conversation
Signed-off-by: cafzal <cameron.afzal@gmail.com>
Signed-off-by: cafzal <cameron.afzal@gmail.com>
Signed-off-by: cafzal <cameron.afzal@gmail.com>
- 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>
- 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>
|
@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>
@rgsl888prabhu I don't have write access to NVIDIA/cuopt ( Could you either:
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. |
|
Sounds good @rgsl888prabhu . I marked this PR as ready for review:
|
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThis PR adds a new ChangesMulti-objective Exploration Skill
🎯 2 (Simple) | ⏱️ ~12 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
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 winBlock 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-civalidation 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
📒 Files selected for processing (5)
.claude-plugin/marketplace.jsonAGENTS.mdskills/cuopt-multi-objective-exploration/SKILL.mdskills/cuopt-multi-objective-exploration/evals/evals.jsonskills/cuopt-numerical-optimization-formulation/SKILL.md
Signed-off-by: cafzal <cameron.afzal@gmail.com>
|
Ready on my side. Once it's on a non-fork branch, two things clear the checks:
Thanks! |
|
@mlubin may I get your review on this PR ? |
mlubin
left a comment
There was a problem hiding this comment.
I can see this skill being useful, thanks for the contribution.
…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>
Signed-off-by: cafzal <cameron.afzal@gmail.com>
|
Thanks @mlubin , I addressed your review comments and lightly revamped the workflow steps for clarity and consistency. |
…tion (keep skills independent, per review) Signed-off-by: cafzal <cameron.afzal@gmail.com>
|
/ok to test abbafe7 |
|
@cafzal Thank you for the awesome skill, once CI passes, will merge it and then create a new PR for eval |
|
/merge |
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
xᵀΣx) can simply stay the objective. A convex one can also be ε-constrained directly: cuOpt routesxᵀQx ≤ εthrough the barrier solver as a second-order cone.User testing
Used the skill to enrich two existing examples and confirmed it drove the right calls — companion PR NVIDIA/cuopt-examples#151:
max_shiftscap → cost vs. fairness), chose ε-constraint over weighted-sum, anchored objective ranges, filtered dominated points, capped each solve, and reported no MILP duals.The skill drives the method; runnable code still needs
cuopt-numerical-optimization-api-pythonplus 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.shpasses. The contribution isSKILL.md+evals/evals.json—BENCHMARK.md, the skill card, andskill.oms.sigare generated by the NVSkills onboarding pipeline. The official NVSkills-Eval is the gate (PENDING).Checklist