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 |
…ecifics The multi-objective skill PR (NVIDIA#1355) review asked to avoid maturity labels that go stale ("no need to mention beta ... text could get stale by the next release") and to keep concepts skills free of stale-prone specifics. This formulation skill is concepts-only (no API code), so: - drop the "(beta)" label on the QP duals cell (keep the capability statement) - remove specific method/asset names (lp_duals / get_dual_solution / get_reduced_cost / DualValue / ReducedCost); point to the language-specific API skills instead Keeps the per-type capability and the decision-language definitions. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: cafzal <cameron.afzal@gmail.com>
…1393) Adds a per-problem-type **dual / sensitivity** capability note to the concepts-only `cuopt-numerical-optimization-formulation` skill, so the agent guides users correctly on what cuOpt exposes after a solve: - **LP** — shadow prices (constraint duals) + reduced costs - **MILP** — none (integer optima are not continuous) - **QP** — shadow prices + reduced costs Two edits: a `Duals / sensitivity` row in the LP/MILP/QP comparison table, and a short post-solve note giving the decision meaning — **shadow price = where to invest** (marginal objective gain from relaxing a binding constraint) and **reduced cost = near-miss** (how far a left-out option must improve before it enters the solution). As a concepts skill it states *what's supported per type* and *what it means*, and defers *how to read them* to the language-specific API skills (no API symbols inlined). **Why.** Surfaced from real integration use — wiring solver-exact sensitivity/explainability into a downstream multi-objective decision layer. The formulation skill covered how to *formulate* but not which problem types yield sensitivity information, which is exactly what a user needs before relying on it (e.g. not expecting duals off a MILP). The note also reflects the review feedback on #1355: a concepts skill carries no maturity ("beta") labels and no specific API symbols — both drift out of date, with no CI to catch the staleness. **Validation & gating.** `ci/utils/validate_skills.sh` passes (skill structure, marketplace manifest, `AGENTS.md` references). The NVSkills-Eval pipeline — which also (re)generates `BENCHMARK.md`, the skill card, and the signature — is the gate and is **pending**: `skills/**` CI needs a maintainer and cannot be triggered from a fork branch. **Related.** - NVIDIA/cuopt-examples#154 — the diet LP duals example: a runnable worked case of the shadow-price / reduced-cost reading this note describes. - Codebase-side sensitivity gaps (objective/RHS ranging; exposing variable/basis status) are tracked separately as #1394 and #1395. Authors: - Cameron Afzal (https://github.com/cafzal) Approvers: - Ramakrishnap (https://github.com/rgsl888prabhu) URL: #1393
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