Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Handle != constraint via MOI.AllDifferent(2) #3656

Closed

Commits on Jan 19, 2024

  1. [WIP] Handle != constraint via MOI.AllDifferent(2)

    ```
    (@v1.10) pkg> activate /repositories/JuMP.jl
      Activating project at `/repositories/JuMP.jl`
    
    julia> using JuMP
    Precompiling JuMP
      1 dependency successfully precompiled in 10 seconds. 37 already precompiled.
    
    julia> model = Model();
    
    julia> @variable(model, x[1:3])
    3-element Vector{VariableRef}:
     x[1]
     x[2]
     x[3]
    
    julia> @variable(model, y[1:3])
    3-element Vector{VariableRef}:
     y[1]
     y[2]
     y[3]
    
    julia> @constraint(model, x[1] != y[1])
    x[1] != y[1]
    
    julia> @constraint(model, x .!= y)
    3-element Vector{ConstraintRef{Model, MathOptInterface.ConstraintIndex{MathOptInterface.VectorOfVariables, MathOptInterface.AllDifferent}, VectorShape}}:
     x[1] != y[1]
     x[2] != y[2]
     x[3] != y[3]
    
    julia> @constraint(model, x != y)
    ERROR: At REPL[8]:1: `@constraint(model, x != y)`: Ineqality operator with vector operands must be explicitly vectorized, use `.!=` instead of `!=`.
    Stacktrace:
     [1] error(::String, ::String)
       @ Base ./error.jl:44
     [2] (::JuMP.Containers.var"#error_fn#98"{String})(str::String)
       @ JuMP.Containers ~/.julia/compiled/v1.10/JuMP/DmXqY_F8XkK.so:-1
     [3] macro expansion
       @ /repositories/JuMP.jl/src/macros/@constraint.jl:132 [inlined]
     [4] macro expansion
       @ /repositories/JuMP.jl/src/macros.jl:393 [inlined]
     [5] top-level scope
       @ REPL[8]:1
    ```
    
    I'm not yet sure how to support the not-explicitly vectorized case.
    We'd need to somehow deduce (in `parse_constraint_call()`)
    that our arguments are vectors, and extend `parse_constraint_call()`
    to return `vectorized` itself. I'm not convinced this is even possible.
    
    Otherwise, we get
    ```
    julia> @constraint(model, x != y)
    vectorized = false
    ERROR: MethodError: no method matching _build_inequality_constraint(::Bool, ::JuMP.Containers.var"#error_fn#98"{String}, ::Vector{VariableRef}, ::Vector{VariableRef})
    
    Closest candidates are:
      _build_inequality_constraint(::Function, ::Bool, ::Vector{VariableRef}, ::Vector{VariableRef})
       @ JuMP /repositories/JuMP.jl/src/inequality.jl:14
    
    Stacktrace:
     [1] macro expansion
       @ /repositories/JuMP.jl/src/macros/@constraint.jl:132 [inlined]
     [2] macro expansion
       @ /repositories/JuMP.jl/src/macros.jl:393 [inlined]
     [3] top-level scope
       @ REPL[8]:1
    ```
    (because we should have called `@constraint.jl:123`)
    
    Missing tests, docs.
    
    As discussed in jump-dev/MathOptInterface.jl#2405
    LebedevRI committed Jan 19, 2024
    Configuration menu
    Copy the full SHA
    73f0c9c View commit details
    Browse the repository at this point in the history