diff --git a/lib/OptimizationMOI/src/OptimizationMOI.jl b/lib/OptimizationMOI/src/OptimizationMOI.jl index 06b48882f..1f3d3a66d 100644 --- a/lib/OptimizationMOI/src/OptimizationMOI.jl +++ b/lib/OptimizationMOI/src/OptimizationMOI.jl @@ -116,25 +116,25 @@ function __moi_status_to_ReturnCode(status::MOI.TerminationStatusCode) end end -function get_expr_map(prob, f) - pairs_arr = if prob.p isa SciMLBase.NullParameters - [Meta.parse(string(_s)) => Expr(:ref, :x, i) for (i, _s) in enumerate(f.syms)] - else - vcat([Symbol(_s) => Expr(:ref, :x, i) for (i, _s) in enumerate(f.syms)], - [Symbol(_s) => Expr(:ref, p, i) for (i, _p) in enumerate(f.paramsyms)]) - end - return pairs_arr -end +# function get_expr_map(prob, f) +# pairs_arr = if prob.p isa SciMLBase.NullParameters +# [Meta.parse(string(_s)) => Expr(:ref, :x, i) for (i, _s) in enumerate(f.syms)] +# else +# vcat([Symbol(_s) => Expr(:ref, :x, i) for (i, _s) in enumerate(f.syms)], +# [Symbol(_s) => Expr(:ref, p, i) for (i, _p) in enumerate(f.paramsyms)]) +# end +# return pairs_arr +# end -""" -Substitute variables and parameters with canonical names x and p respectively. -""" -function rep_pars_vals!(e::Expr, p) - rep_pars_vals!.(e.args, Ref(p)) - replace!(e.args, p...) -end +# """ +# Substitute variables and parameters with canonical names x and p respectively. +# """ +# function rep_pars_vals!(e::Expr, p) +# rep_pars_vals!.(e.args, Ref(p)) +# replace!(e.args, p...) +# end -function rep_pars_vals!(e, p) end +# function rep_pars_vals!(e, p) end """ Replaces every expression `:x[i]` with `:x[MOI.VariableIndex(i)]` diff --git a/lib/OptimizationMOI/src/moi.jl b/lib/OptimizationMOI/src/moi.jl index 457ab49be..f6414ac54 100644 --- a/lib/OptimizationMOI/src/moi.jl +++ b/lib/OptimizationMOI/src/moi.jl @@ -23,8 +23,9 @@ function MOIOptimizationCache(prob::OptimizationProblem, opt; kwargs...) throw(ArgumentError("Expected an `OptimizationProblem` that was setup via an `OptimizationSystem`, or AutoModelingToolkit ad choice")) end end + # TODO: check if the problem is at most bilinear, i.e. affine and or quadratic terms in two variables - expr_map = get_expr_map(prob, f) + expr_map = get_expr_map(prob.f.sys) expr = repl_getindex!(convert_to_expr(f.expr, expr_map; expand_expr = false)) cons = MTK.constraints(f.sys) @@ -448,3 +449,12 @@ function convert_to_expr(eq, expr_map; expand_expr = false) expr = symbolify!(expr) return expr end + +function get_expr_map(sys) + dvs = ModelingToolkit.states(sys) + ps = ModelingToolkit.parameters(sys) + return vcat([ModelingToolkit.toexpr(_s) => Expr(:ref, :x, i) + for (i, _s) in enumerate(dvs)], + [ModelingToolkit.toexpr(_p) => Expr(:ref, :p, i) + for (i, _p) in enumerate(ps)]) +end \ No newline at end of file