[Dev] Expose the duals of the JuMP path, boundary and box constraints, aligned with signs.md

Aberta
#430 0 comentários 0 reações 1 responsável Ver no GitHub

Mantenedores costumam responder em até 1 dia

@ocots já está trabalhando nisso.

Desde 8/11/2026.

Avaliação

Esta issue ainda não foi avaliada.

Descrição

Context

#326 aligns the sign of the JuMP costate with OptimalControl (ct-conventions rules/signs.md, SGN1–SGN6, v0.11.0): the normalized multiplier of a constraint row is -JuMP.dual(ref), for a Min and a Max model alike. Today only the dynamics constraints are exposed — their duals are read as the costate. The duals of the other constraints the JuMP models create exist but are never read:

  • path constraints: lower <= g(x, u, v, t) <= upper rows, built at every node;
  • boundary constraints: lower <= g(x0, xf, v) <= upper rows;
  • box bounds on the state, control and variable components (LowerBoundRef / UpperBoundRef).

All of them are concatenated in model[:constraints] (dynamics, path, boundary); build.jl would have to keep the refs per group to expose them.

What to do (later)

  • Expose the duals of the path and boundary constraints, and of the box bounds, normalized as the costate (-JuMP.dual).
  • Conventions to apply (rules/signs.md v0.11.0):
    • SGN3: a two-sided row l ≤ c ≤ u carries one signed multiplier y = μU − μL (≥ 0 upper active, ≤ 0 lower active) — a JuMP Interval constraint gives one signed dual, mapped by -dual;
    • SGN2: for a box bound or a single-bounded row, the dual is the multiplier of that side, ≥ 0 — i.e. -dual(LowerBoundRef) / -dual(UpperBoundRef) give the nonnegative per-side values;
    • SGN5: the same constraint declared as a path constraint or as a box must have the same dual — the comparison tests should check it;
    • the scale of a time-dependent dual (density vs raw multiplier) is free in SGN5 — CTDirect divides the path multipliers by h; choose the same here for consistency.
  • Follow the ecosystem design for reading duals by constraint label (dual(sol, model, label)): CTModels.jl#105, CTFlows.jl#314 and discussion #312 — this issue waits for it, as #326 did for the costate.

Tests

Extend the sign tests of #326 (two layers, SGN6): the normalized duals must satisfy ∇F + Jᵀy = 0 on hand-written JuMP problems with known multipliers — active lower and upper sides of a two-sided row, bounds of variables, min f vs max -f (SGN1) — and match the OptimalControl duals of the same problem where both are exposed.

Related

#326, #170, control-toolbox/CTDirect.jl#405, control-toolbox/CTModels.jl#105.

Linguagem predominante
Julia
Estrelas
13
Forks
1
Merge médio
3h 33min
PRs com merge (30d)
55

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de control-toolbox/OptimalControlProblems.jl

Todas as issues de control-toolbox/OptimalControlProblems.jl

Issues semelhantes

Mais issues de Julia

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.