@@ -265,22 +265,98 @@ end
265
265
function parse_expression (
266
266
data:: Model ,
267
267
expr:: Expression ,
268
- x :: MOI.ScalarAffineFunction ,
268
+ f :: MOI.ScalarAffineFunction ,
269
269
parent_index:: Int ,
270
270
)
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
273
288
return
274
289
end
275
290
276
291
function parse_expression (
277
292
data:: Model ,
278
293
expr:: Expression ,
279
- x :: MOI.ScalarQuadraticFunction ,
294
+ f :: MOI.ScalarQuadraticFunction ,
280
295
parent_index:: Int ,
281
296
)
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)
284
360
return
285
361
end
286
362
0 commit comments