@@ -265,22 +265,98 @@ end
265265function parse_expression (
266266 data:: Model ,
267267 expr:: Expression ,
268- x :: MOI.ScalarAffineFunction ,
268+ f :: MOI.ScalarAffineFunction ,
269269 parent_index:: Int ,
270270)
271- f = convert (MOI. ScalarNonlinearFunction, x)
272- parse_expression (data, expr, f, parent_index)
271+ if isempty (f. terms)
272+ parse_expression (data, expr, f. constant, parent_index)
273+ return
274+ elseif iszero (f. constant) && length (f. terms) == 1
275+ # Expression of for `a * x`
276+ parse_expression (data, expr, only (f. terms), parent_index)
277+ return
278+ end
279+ id_plus = data. operators. multivariate_operator_to_id[:+ ]
280+ push! (expr. nodes, Node (NODE_CALL_MULTIVARIATE, id_plus, parent_index))
281+ new_parent = length (expr. nodes)
282+ for term in f. terms
283+ parse_expression (data, expr, term, new_parent)
284+ end
285+ if ! iszero (f. constant)
286+ parse_expression (data, expr, f. constant, new_parent)
287+ end
273288 return
274289end
275290
276291function parse_expression (
277292 data:: Model ,
278293 expr:: Expression ,
279- x :: MOI.ScalarQuadraticFunction ,
294+ f :: MOI.ScalarQuadraticFunction ,
280295 parent_index:: Int ,
281296)
282- f = convert (MOI. ScalarNonlinearFunction, x)
283- parse_expression (data, expr, f, parent_index)
297+ if isempty (f. quadratic_terms) && isempty (f. affine_terms)
298+ parse_expression (data, expr, f. constant, parent_index)
299+ return
300+ elseif iszero (f. constant)
301+ if length (f. quadratic_terms) == 1 && isempty (f. affine_terms)
302+ parse_expression (data, expr, only (f. quadratic_terms), parent_index)
303+ return
304+ elseif isempty (f. quadratic_terms) && length (f. affine_terms) == 1
305+ parse_expression (data, expr, only (f. affine_terms), parent_index)
306+ return
307+ end
308+ end
309+ id_plus = data. operators. multivariate_operator_to_id[:+ ]
310+ push! (expr. nodes, Node (NODE_CALL_MULTIVARIATE, id_plus, parent_index))
311+ new_parent = length (expr. nodes)
312+ for term in f. quadratic_terms
313+ parse_expression (data, expr, term, new_parent)
314+ end
315+ for term in f. affine_terms
316+ parse_expression (data, expr, term, new_parent)
317+ end
318+ if ! iszero (f. constant)
319+ parse_expression (data, expr, f. constant, new_parent)
320+ end
321+ return
322+ end
323+
324+ function parse_expression (
325+ data:: Model ,
326+ expr:: Expression ,
327+ x:: MOI.ScalarAffineTerm ,
328+ parent_index:: Int ,
329+ )
330+ if isone (x. coefficient)
331+ parse_expression (data, expr, x. variable, parent_index)
332+ else
333+ id_mul = data. operators. multivariate_operator_to_id[:* ]
334+ push! (expr. nodes, Node (NODE_CALL_MULTIVARIATE, id_mul, parent_index))
335+ mul_parent = length (expr. nodes)
336+ parse_expression (data, expr, x. coefficient, mul_parent)
337+ parse_expression (data, expr, x. variable, mul_parent)
338+ end
339+ return
340+ end
341+
342+ function parse_expression (
343+ data:: Model ,
344+ expr:: Expression ,
345+ x:: MOI.ScalarQuadraticTerm ,
346+ parent_index:: Int ,
347+ )
348+ id_mul = data. operators. multivariate_operator_to_id[:* ]
349+ push! (expr. nodes, Node (NODE_CALL_MULTIVARIATE, id_mul, parent_index))
350+ mul_parent = length (expr. nodes)
351+ coef = x. coefficient
352+ if x. variable_1 == x. variable_2
353+ coef /= 2
354+ end
355+ if ! isone (coef)
356+ parse_expression (data, expr, coef, mul_parent)
357+ end
358+ parse_expression (data, expr, x. variable_1, mul_parent)
359+ parse_expression (data, expr, x. variable_2, mul_parent)
284360 return
285361end
286362
0 commit comments