@@ -267,6 +267,36 @@ function _parsed_to_moi(model, f::_ParsedVariableIndex)
267267 return _parsed_to_moi (model, f. variable)
268268end
269269
270+ _walk_expr (f:: F , expr) where {F<: Function } = f (expr)
271+
272+ function _walk_expr (f:: F , expr:: Expr ) where {F<: Function }
273+ for (i, arg) in enumerate (expr. args)
274+ expr. args[i] = _walk_expr (f, arg)
275+ end
276+ return expr
277+ end
278+
279+ function _parse_set (expr:: Expr )
280+ expr = _walk_expr (expr) do arg
281+ if arg isa Symbol && arg in (:MOI , :MathOptInterface )
282+ return MOI
283+ end
284+ return arg
285+ end
286+ @assert Meta. isexpr (expr, :call )
287+ if expr. args[1 ] isa Symbol
288+ # If the set is a Symbol, it must be one of the MOI sets. We need to
289+ # eval this in the MOI module.
290+ return Core. eval (MOI, expr)
291+ elseif Meta. isexpr (expr. args[1 ], :curly ) && expr. args[1 ]. args[1 ] isa Symbol
292+ # Something like Indicator{}()
293+ return Core. eval (MOI, expr)
294+ end
295+ # If the set is an expression, it must be something like
296+ # `SCS.ScaledPSDCone()`. We need to eval this in `Main`.
297+ return Core. eval (Main, expr)
298+ end
299+
270300# Ideally, this should be load_from_string
271301"""
272302 loadfromstring!(model, s)
@@ -333,7 +363,7 @@ function loadfromstring!(model, s)
333363 elseif label == :constrainedvariable
334364 @assert length (ex. args) == 3
335365 @assert ex. args[1 ] == :in
336- set = Core . eval (MOI, ex. args[3 ])
366+ set = _parse_set ( ex. args[3 ])
337367 if isa (ex. args[2 ], Symbol)
338368 # constrainedvariable: x in LessThan(1.0)
339369 x, _ = MOI. add_constrained_variable (model, set)
@@ -362,7 +392,7 @@ function loadfromstring!(model, s)
362392 f = _parsed_to_moi (model, _parse_function (ex. args[2 ], T))
363393 if ex. args[1 ] == :in
364394 # Could be safer here
365- set = Core . eval (MOI, ex. args[3 ])
395+ set = _parse_set ( ex. args[3 ])
366396 elseif ex. args[1 ] == :<=
367397 set = MOI. LessThan (Core. eval (Base, ex. args[3 ]))
368398 elseif ex. args[1 ] == :>=
0 commit comments