Open
Description
Create functionality to approximate NLP functions present in a optimization model by ML proxies (e.g. Neural Network).
For example, if we have an optimization problem dependent on non-linear (NL) expressions:
function build_test_nlp_model()
model = Model()
@variable(model, x[i = 1:2]);
@variable(model, y[i = 1:2] >= 0.0);
ex1 = sin(x[1])
ex2 = cos(x[2])
cons = @NLconstraint(model, ex1 == ex2)
@objective(model, Min, sum(x) + sum(y))
return model, cons
end
We might be able to extract and evaluate NLP expressions:
function constraints_nlp_evaluator(model, x)
d = NLPEvaluator(model)
MOI.initialize(d, [:ExprGraph])
f = zeros(length(model.nlp_model.constraints))
MOI.eval_constraint(d, f, x)
return f
end
model, cons = build_test_nlp_model()
input = [[i] for i in rand(1000)]
output = constraints_nlp_evaluator.(model, input)
After fitting a proxy to these expressions/functions, we can add them back to the optimization problem:
flux_model = Chain(Dense(3, 3, relu), Dense(3, 1))
ex = flux_model(x)[1]
cons = @constraint(model, ex == 1)