@@ -345,18 +345,40 @@ function parse_expression(
345345 x:: MOI.ScalarQuadraticTerm ,
346346 parent_index:: Int ,
347347)
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
348+ # There are four cases:
349+ # (1): 1 * x * x --> ^(x, 2)
350+ # (2): a * x * x --> *(a, ^(x, 2))
351+ # (3): a * x * y --> *(a, x, y)
352+ # (4): 1 * x * y --> *(x, y)
352353 if x. variable_1 == x. variable_2
353- coef /= 2
354- end
355- if ! isone (coef)
356- parse_expression (data, expr, coef, mul_parent)
354+ # Case (1): 1 * x * x --> ^(x, 2)
355+ # Case (2): a * x * x --> *(a, ^(x, 2))
356+ coef = x. coefficient / 2
357+ parent = parent_index
358+ if ! isone (coef)
359+ id = data. operators. multivariate_operator_to_id[:* ]
360+ push! (expr. nodes, Node (NODE_CALL_MULTIVARIATE, id, parent_index))
361+ parent = length (expr. nodes)
362+ parse_expression (data, expr, coef, parent)
363+ parent
364+ end
365+ id = data. operators. multivariate_operator_to_id[:^ ]
366+ push! (expr. nodes, Node (NODE_CALL_MULTIVARIATE, id, parent))
367+ pow_parent = length (expr. nodes)
368+ parse_expression (data, expr, x. variable_1, pow_parent)
369+ parse_expression (data, expr, 2 , pow_parent)
370+ else
371+ # Case (3): a * x * y --> *(a, x, y)
372+ # Case (4): 1 * x * y --> *(x, y)
373+ id_mul = data. operators. multivariate_operator_to_id[:* ]
374+ push! (expr. nodes, Node (NODE_CALL_MULTIVARIATE, id_mul, parent_index))
375+ mul_parent = length (expr. nodes)
376+ if ! isone (x. coefficient)
377+ parse_expression (data, expr, x. coefficient, mul_parent)
378+ end
379+ parse_expression (data, expr, x. variable_1, mul_parent)
380+ parse_expression (data, expr, x. variable_2, mul_parent)
357381 end
358- parse_expression (data, expr, x. variable_1, mul_parent)
359- parse_expression (data, expr, x. variable_2, mul_parent)
360382 return
361383end
362384
0 commit comments