I am developing a large scale bilevel problem (1M+ variables), and as a first step I am extracting the constraint coefficient matrix of the lower level linear program using NLPModelMeta (see this post). Here is a simple example:
using JuMP
using NLPModels
using NLPModelsJuMP
model = Model()
@variable(model, x₂) # intentionally defining x₂ first
@variable(model, x₁ ≥ 0)
@objective(model, Min, 2x₁ + 4x₂)
@constraint(model, x₁ + 4x₂ ≥ 3)
@constraint(model, 3x₁ + 2x₂ == 14)
nlp = MathOptNLPModel(model)
x = zeros(nlp.meta.nvar)
A = Matrix(jac(nlp, x)
# ... more code deriving constraint coefficients and bounds vectors to create KKT conditions
julia> A
2×2 Array{Float64,2}:
2.0 3.0
4.0 1.0
In this example the entries of A and the constraints indicate that x = [x₂; x₁]
, where x₂
is in the first entry. From this I assume that MathOptNLPModel
builds the meta data according to the order in which variables were added to the JuMP model (please correct me if I’m wrong!).
My question is this: is there a way to track or map JuMP VariableRefs to the correct indices in the MathOptNLPModel
meta data? (Other than tracking the order of variable definitions and their sizes). For example, the meta data already includes helpful indices such as “indices of equality constraints” for NLPModelMeta.jfix
. Is it possible to get the indices of x₂
?
(Note that for this trivial example it is easy to determine which indices of the meta data map to the model variables. However, my case will contain millions of variables, some of them vectors of ~10,000 entries.)