Skip to content

Commit edee8cb

Browse files
authored
Fix unary +, -, * (#72)
1 parent 3bc82dc commit edee8cb

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

src/write.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,16 @@ function _write_expression(
447447
if f.head == :ifelse
448448
_write_ifelse(io, predicates, variables, f.args)
449449
return
450-
elseif haskey(_INFIX_OPS, f.head)
450+
elseif f.head in (:+, :*) && length(f.args) == 1
451+
_write_expression(io, predicates, variables, f.args[1])
452+
return
453+
elseif f.head == :- && length(f.args) == 1
454+
print(io, "-(")
455+
_write_expression(io, predicates, variables, f.args[1])
456+
print(io, ")")
457+
return
458+
end
459+
if haskey(_INFIX_OPS, f.head)
451460
op = _INFIX_OPS[f.head]
452461
@assert length(f.args) > 1
453462
sep = string(" ", op, " ")

test/runtests.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,6 +1602,34 @@ function test_highs_int_frac_ub()
16021602
return
16031603
end
16041604

1605+
function test_infix_unary_minus()
1606+
model = MOI.Utilities.Model{Float64}()
1607+
x, _ = MOI.add_constrained_variable(model, MOI.Interval(1.0, 3.0))
1608+
solver = MiniZinc.Optimizer{Float64}("highs")
1609+
f = MOI.ScalarNonlinearFunction(:-, Any[x])
1610+
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
1611+
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
1612+
index_map, _ = MOI.optimize!(solver, model)
1613+
@test MOI.get(solver, MOI.VariablePrimal(), index_map[x]) 1.0
1614+
@test MOI.get(solver, MOI.ObjectiveValue()) -1.0
1615+
return
1616+
end
1617+
1618+
function test_infix_unary_addition()
1619+
for op in (:+, :*)
1620+
model = MOI.Utilities.Model{Float64}()
1621+
x, _ = MOI.add_constrained_variable(model, MOI.Interval(1.0, 3.0))
1622+
solver = MiniZinc.Optimizer{Float64}("highs")
1623+
f = MOI.ScalarNonlinearFunction(op, Any[x])
1624+
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
1625+
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
1626+
index_map, _ = MOI.optimize!(solver, model)
1627+
@test MOI.get(solver, MOI.VariablePrimal(), index_map[x]) 3.0
1628+
@test MOI.get(solver, MOI.ObjectiveValue()) 3.0
1629+
end
1630+
return
1631+
end
1632+
16051633
end
16061634

16071635
TestMiniZinc.runtests()

0 commit comments

Comments
 (0)