diff --git a/src/Utilities/print.jl b/src/Utilities/print.jl index 5c0bee7fd7..dc8580b265 100644 --- a/src/Utilities/print.jl +++ b/src/Utilities/print.jl @@ -49,38 +49,20 @@ end # REPL-specific symbols # Anything here: https://en.wikipedia.org/wiki/Windows-1252 # should probably work fine on Windows -function _to_string(::_PrintOptions, name::Symbol) - if name == :leq - return "<=" - elseif name == :geq - return ">=" - elseif name == :eq - return "==" - elseif name == :times - return "*" - elseif name == :sq - return "²" - elseif name == :in - return Sys.iswindows() ? "in" : "∈" - end + +_to_string(::_PrintOptions, ::typeof(*)) = "*" +_to_string(::_PrintOptions{MIME"text/latex"}, ::typeof(*)) = "\\times " + +function _to_string(::_PrintOptions, ::typeof(^), n::Int) + return n == 2 ? "²" : string('^', n) end -function _to_string(::_PrintOptions{MIME"text/latex"}, name::Symbol) - if name == :leq - return "\\leq" - elseif name == :geq - return "\\geq" - elseif name == :eq - return "=" - elseif name == :times - return "\\times " - elseif name == :sq - return "^2" - elseif name == :in - return "\\in" - end +function _to_string(::_PrintOptions{MIME"text/latex"}, ::typeof(^), n::Int) + return string('^', n) end +_to_string(::_PrintOptions, ::typeof(in)) = @static Sys.iswindows() ? "in" : "∈" + #------------------------------------------------------------------------ # Functions #------------------------------------------------------------------------ @@ -211,9 +193,9 @@ function _to_string( coef = term.coefficient name = if term.variable_1 == term.variable_2 coef /= 2 - string(name_1, _to_string(options, :sq)) + string(name_1, _to_string(options, ^, 2)) else - string(name_1, _to_string(options, :times), name_2) + string(name_1, _to_string(options, *), name_2) end return _to_string(options, coef, name; is_first = is_first) end @@ -278,7 +260,7 @@ end #------------------------------------------------------------------------ function _to_string(options::_PrintOptions, set::MOI.LessThan) - return string(_to_string(options, :leq), " ", _shorten(options, set.upper)) + return string("<= ", _shorten(options, set.upper)) end function _to_string(options::_PrintOptions{MIME"text/latex"}, set::MOI.LessThan) @@ -286,7 +268,7 @@ function _to_string(options::_PrintOptions{MIME"text/latex"}, set::MOI.LessThan) end function _to_string(options::_PrintOptions, set::MOI.GreaterThan) - return string(_to_string(options, :geq), " ", _shorten(options, set.lower)) + return string(">= ", _shorten(options, set.lower)) end function _to_string( @@ -297,7 +279,7 @@ function _to_string( end function _to_string(options::_PrintOptions, set::MOI.EqualTo) - return string(_to_string(options, :eq), " ", _shorten(options, set.value)) + return string("== ", _shorten(options, set.value)) end function _to_string(options::_PrintOptions{MIME"text/latex"}, set::MOI.EqualTo) @@ -306,7 +288,7 @@ end function _to_string(options::_PrintOptions, set::MOI.Interval) return string( - _to_string(options, :in), + _to_string(options, in), " [", _shorten(options, set.lower), ", ", @@ -326,13 +308,13 @@ function _to_string(options::_PrintOptions{MIME"text/latex"}, set::MOI.Interval) end function _to_string(options::_PrintOptions, ::MOI.ZeroOne) - return string(_to_string(options, :in), " {0, 1}") + return string(_to_string(options, in), " {0, 1}") end _to_string(::_PrintOptions{MIME"text/latex"}, ::MOI.ZeroOne) = "\\in \\{0, 1\\}" function _to_string(options::_PrintOptions, ::MOI.Integer) - return string(_to_string(options, :in), " ℤ") + return string(_to_string(options, in), " ℤ") end function _to_string(::_PrintOptions{MIME"text/latex"}, ::MOI.Integer) @@ -340,7 +322,7 @@ function _to_string(::_PrintOptions{MIME"text/latex"}, ::MOI.Integer) end function _to_string(options::_PrintOptions, set::MOI.AbstractSet) - return string(_to_string(options, :in), " ", _drop_moi(set)) + return string(_to_string(options, in), " ", _drop_moi(set)) end function _to_string(::_PrintOptions{MIME"text/latex"}, set::MOI.AbstractSet) diff --git a/test/Utilities/print.jl b/test/Utilities/print.jl index 4d664779b5..2874f4bc1e 100644 --- a/test/Utilities/print.jl +++ b/test/Utilities/print.jl @@ -584,6 +584,46 @@ function test_nlp() return end +function test_nlp_no_objective() + model = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()) + v = MOI.add_variables(model, 4) + for i in 1:4 + MOI.set(model, MOI.VariableName(), v[i], "x[$i]") + end + lb, ub = [25.0, 40.0], [Inf, 40.0] + evaluator = MOI.Test.HS071(true) + block_data = MOI.NLPBlockData(MOI.NLPBoundsPair.(lb, ub), evaluator, false) + MOI.set(model, MOI.NLPBlock(), block_data) + MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) + MOI.set( + model, + MOI.ObjectiveFunction{MOI.SingleVariable}(), + MOI.SingleVariable(v[1]), + ) + @test sprint(print, model) == """ + Minimize SingleVariable: + x[1] + + Subject to: + + Nonlinear + x[1] * x[2] * x[3] * x[4] >= 25.0 + x[1] ^ 2 + x[2] ^ 2 + x[3] ^ 2 + x[4] ^ 2 == 40.0 + """ + _string_compare( + sprint(print, MOIU.latex_formulation(model)), + raw""" + $$ \begin{aligned} + \min\quad & x_{1} \\ + \text{Subject to}\\ + & \text{Nonlinear} \\ + & x_{1} \times x_{2} \times x_{3} \times x_{4} \ge 25.0 \\ + & x_{1} ^ 2 + x_{2} ^ 2 + x_{3} ^ 2 + x_{4} ^ 2 = 40.0 \\ + \end{aligned} $$""", + ) + return +end + function test_print_with_acronym() @test sprint(MOIU.print_with_acronym, "MathOptInterface") == "MOI" @test sprint(