# Is it possible to set the attribute of optimizer in the iteration of \_solve\_in\_sequence in Lexicographic?

**URL:** https://discourse.julialang.org/t/is-it-possible-to-set-the-attribute-of-optimizer-in-the-iteration-of-solve-in-sequence-in-lexicographic/108793
**Category:** Optimization (Mathematical)
**Tags:** question, package, jump
**Created:** [January 14, 2024, 1:42pm UTC](https://discourse.julialang.org/t/is-it-possible-to-set-the-attribute-of-optimizer-in-the-iteration-of-solve-in-sequence-in-lexicographic/108793 "2024-01-14T13:42:46Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![Hongliang\_Yang](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/hongliang_yang/32/8141_2.png) [@Hongliang\_Yang](https://discourse.julialang.org/u/Hongliang_Yang)
#### Post date: [January 14, 2024, 1:42pm UTC](https://discourse.julialang.org/t/is-it-possible-to-set-the-attribute-of-optimizer-in-the-iteration-of-solve-in-sequence-in-lexicographic/108793/1 "2024-01-14T13:42:46Z")

</div>

For the following code

```julia
using JuMP
import HiGHS
import MultiObjectiveAlgorithms as MOA
model = JuMP.Model(() -> MOA.Optimizer(HiGHS.Optimizer))
set_attribute(model, MOA.Algorithm(), MOA.Lexicographic())

```

> <https://github.com/jump-dev/MultiObjectiveAlgorithms.jl/blob/60bda9c48b6c98b5f9c1e5c7265dadacdf5b501c/src/algorithms/Lexicographic.jl#L100-L107>

Is it possible to set the attribute of optimizer in the iteration of \_solve\_in\_sequence in Lexicographic? For example, modify the time\_limit.I would like to modify the code above to achieve something similar to the following sample code:

```julia
for i in sequence
    if i <= 2
        set_attribute(model, "time_limit", 1000.0)
    else 
        set_attribute(model, "time_limit", 500.0)
    end
    
    if _time_limit_exceeded(model, start_time)
        status = MOI.TIME_LIMIT
        break
    end
    # ....
end

```

---

<div class="post-metadata">

### Author: ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)
#### Post date: [January 14, 2024, 11:19pm UTC](https://discourse.julialang.org/t/is-it-possible-to-set-the-attribute-of-optimizer-in-the-iteration-of-solve-in-sequence-in-lexicographic/108793/2 "2024-01-14T23:19:25Z")

</div>

Hi @Hongliang_Yang,

No, it’s not possible. You’ll need to manually code the algorithm if you want to do something like that.

---

<div class="post-metadata">

### Author: ![Hongliang\_Yang](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/hongliang_yang/32/8141_2.png) [@Hongliang\_Yang](https://discourse.julialang.org/u/Hongliang_Yang)
#### Post date: [January 15, 2024, 12:52am UTC](https://discourse.julialang.org/t/is-it-possible-to-set-the-attribute-of-optimizer-in-the-iteration-of-solve-in-sequence-in-lexicographic/108793/4 "2024-01-15T00:52:48Z")

</div>

Is it possible to give some detailed tips or sample code? Thanks for your help. @odow

---

<div class="post-metadata">

### Author: ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)
#### Post date: [January 15, 2024, 1:03am UTC](https://discourse.julialang.org/t/is-it-possible-to-set-the-attribute-of-optimizer-in-the-iteration-of-solve-in-sequence-in-lexicographic/108793/5 "2024-01-15T01:03:39Z")

</div>

The source code is

> <https://github.com/jump-dev/MultiObjectiveAlgorithms.jl/blob/master/src/algorithms/Lexicographic.jl>

but that might be a bit complicated to be helpful.

One approach is to write a new algorithm,

```julia
import MultiObjectiveAlgorithms as MOA
import MathOptInterface as MOI
import Combinatorics

mutable struct CustomLexicographic <: MOA.AbstractAlgorithm end

function MOA.optimize_multiobjective!(
    algorithm::CustomLexicographic,
    model::MOA.Optimizer,
)
    start_time = time()
    sequence = 1:MOI.output_dimension(model.f)
    solutions = MOA.SolutionPoint[]
    status = MOI.OPTIMAL
    for sequence in Combinatorics.permutations(sequence)
        status, solution =
            _solve_in_sequence(algorithm, model, sequence, start_time)
        if !isempty(solution)
            push!(solutions, solution[1])
        end
        if !MOA._is_scalar_status_optimal(status)
            break
        end
    end
    sense = MOI.get(model.inner, MOI.ObjectiveSense())
    return status, MOA.filter_nondominated(sense, solutions)
end

function _solve_in_sequence(
    ::CustomLexicographic,
    model::MOA.Optimizer,
    sequence::AbstractVector{Int},
    start_time::Float64,
)
    variables = MOI.get(model.inner, MOI.ListOfVariableIndices())
    constraints = Any[]
    scalars = MOI.Utilities.eachscalar(model.f)
    solution = MOA.SolutionPoint[]
    status = MOI.OPTIMAL
    for i in sequence
        if MOA._time_limit_exceeded(model, start_time)
            status = MOI.TIME_LIMIT
            break
        end
        f = scalars[i]
        # Do something here...
        MOI.set(model.inner, MOI.ObjectiveFunction{typeof(f)}(), f)
        MOI.optimize!(model.inner)
        status = MOI.get(model.inner, MOI.TerminationStatus())
        primal_status = MOI.get(model.inner, MOI.PrimalStatus())
        if MOA._is_scalar_status_feasible_point(primal_status)
            X, Y = MOA._compute_point(model, variables, model.f)
            solution = [MOA.SolutionPoint(X, Y)]
        end
        if !MOA._is_scalar_status_optimal(status)
            break
        end
        X, Y = MOA._compute_point(model, variables, f)
        rtol = 1e-3
        set = if MOI.get(model.inner, MOI.ObjectiveSense()) == MOI.MIN_SENSE
            MOI.LessThan(Y + rtol * abs(Y))
        else
            MOI.GreaterThan(Y - rtol * abs(Y))
        end
        ci = MOI.Utilities.normalize_and_add_constraint(model, f, set)
        push!(constraints, ci)
    end
    for c in constraints
        MOI.delete(model, c)
    end
    return status, solution
end

```

and then use

```julia
set_attribute(model, MOA.Algorithm(), CustomLexicographic())

```

Alternatively, you would just code something in JuMP, don’t use MOA:

```julia
using JuMP, HiGHS
model = Model(HiGHS.Optimizer)
@variable(model, x[1:3] >= 0)
# ... build model ...
objectives = [x[1], 2 * x[2], x[3] + 1]
solutions = Any[]
for o in objectives
    @objective(model, Min, o)
    # set_attribute(...) # stuff here
    optimize!(model)
    push!(solutions, value.(x))
    @constraint(model, o <= objective_value(model))
end

```

---

<div class="post-metadata">

### Author: ![Hongliang\_Yang](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/hongliang_yang/32/8141_2.png) [@Hongliang\_Yang](https://discourse.julialang.org/u/Hongliang_Yang)
#### Post date: [January 15, 2024, 6:42am UTC](https://discourse.julialang.org/t/is-it-possible-to-set-the-attribute-of-optimizer-in-the-iteration-of-solve-in-sequence-in-lexicographic/108793/6 "2024-01-15T06:42:00Z")

</div>

@odow Thanks for the answer, the method you provided for using MOA is exactly what we are trying. However, I don’t know how to modify the attribute of the optimizer in the \_solve\_in\_sequence function, and have tried several methods that have failed. For example,

set\_attribute(model.inner, “time\_limit”, 500.0)

---

<div class="post-metadata">

### Author: ![Hongliang\_Yang](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/hongliang_yang/32/8141_2.png) [@Hongliang\_Yang](https://discourse.julialang.org/u/Hongliang_Yang)
#### Post date: [January 15, 2024, 7:00am UTC](https://discourse.julialang.org/t/is-it-possible-to-set-the-attribute-of-optimizer-in-the-iteration-of-solve-in-sequence-in-lexicographic/108793/7 "2024-01-15T07:00:00Z")

</div>

I solved it using MOI.set, thanks for your help.
