Skip to content

Add QPBlockData - #3048

Open
blegat wants to merge 5 commits into
masterfrom
bl/qp_block_data
Open

Add QPBlockData#3048
blegat wants to merge 5 commits into
masterfrom
bl/qp_block_data

Conversation

@blegat

@blegat blegat commented Aug 13, 2026

Copy link
Copy Markdown
Member

This is essentially a copy-paste from @odow 's implementation in Ipopt : https://github.com/jump-dev/Ipopt.jl/blob/b5b0e62b11aff4ae4bf0c5f0bc852c55b8953b4f/ext/IpoptMathOptInterfaceExt/utils.jl#L62 with these 3 functions added by @frapac in MadNLP https://github.com/madsuite-org/MadNLP.jl/blob/9947ee116559e9a2ab684a2006d37951f0bb9a6f/ext/MadNLPMOI/MOI_utils.jl#L654-L691
The changes I made on top of it were: adding _ in front of a few functions like eval_function-> _eval_function.
The returned value of eval_constraint_jacobian/eval_hessian_lagrangian was returning nnz + 1, not it returns nnz.
_is_parameter(x) = x.value >= 0x00f0000000000000 is replaced with haskey(block.parameters, x.value) which means the parameters need to be registered before being used.

Downstream PRs:

Comment thread src/Nonlinear/qp_block_data.jl Outdated
Comment thread src/Nonlinear/qp_block_data.jl
Comment thread src/Nonlinear/qp_block_data.jl Outdated
Comment thread src/Nonlinear/qp_block_data.jl Outdated
Comment thread src/Nonlinear/qp_block_data.jl Outdated

# The product evaluators below ACCUMULATE into their output vector, so that
# they compose with the products of the other layers. Zero the output before
# the first call.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This needs to be something other than a comment.

Comment thread src/Nonlinear/qp_block_data.jl Outdated
w::AbstractVector{T},
) where {T}
for (i, constraint) in enumerate(block.constraints)
_eval_Jv_product(constraint, y, x, w, block.parameters, i)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

For example, we don't zero y before this first call.

x::AbstractVector{T},
w::AbstractVector{T},
) where {T}
for (i, constraint) in enumerate(block.constraints)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ditto here

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Yes, this is the source of bugs like madsuite-org/MadNLP.jl#641

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I'll just rename them to add_.... These eval_... need to not zero out so that we can combine the NL part with the quadratic part so I'll just create new add functions here. We could make them internal functions if we just used this QPBlockData internally and only expose the EvaluatorWithQuad. But if we want to first release an QPBlockData used by wrappers, we have to expose these new add_... functions. That's probably an argument toward EvaluatorWithQuad 😇

Comment thread src/Nonlinear/qp_block_data.jl Outdated
σ::T,
μ::AbstractVector{T},
) where {T}
_eval_Hv_product(block.objective, H, x, v, σ, block.parameters)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ditto here

blegat added 2 commits August 13, 2026 14:18
The generic functions MOI.eval_constraint_jacobian and
MOI.eval_hessian_lagrangian are documented to return nothing: the
caller constructs the sparsity pattern, so it knows how many entries
are written. Returning the count invited callers to rely on a return
value that no other evaluator provides.
The products accumulate into their output vector, so that the
contributions of several blocks (the QP block, oracle constraints, and
an MOI.AbstractNLPEvaluator) can be composed into the same output. This
is incompatible with the contract of MOI.eval_constraint_jacobian_product
and friends, which store the result, so the functions are renamed
add_constraint_jacobian_product, add_constraint_jacobian_transpose_product,
and add_hessian_lagrangian_product instead of overloading the MOI
generic functions: QPBlockData is not an MOI.AbstractNLPEvaluator, so
it does not have to define the same interface as evaluators. The
private helpers are renamed _eval_... to _add_... accordingly.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants