@@ -26,66 +26,73 @@ This algorithm is restricted to problems with:
2626struct Chalmet <: AbstractAlgorithm end
2727
2828function _solve_constrained_model (
29- model:: Optimizer ,
3029 :: Chalmet ,
30+ model:: Optimizer ,
31+ inner:: MOI.ModelLike ,
32+ f:: MOI.AbstractVectorFunction ,
3133 rhs:: Vector{Float64} ,
3234)
33- f = MOI. Utilities. scalarize (model. f)
34- g = sum ( 1.0 * fi for fi in f )
35- MOI. set (model . inner, MOI. ObjectiveFunction {typeof(g)} (), g)
35+ f_scalars = MOI. Utilities. scalarize (model. f)
36+ g = MOI . Utilities . operate ( + , Float64, f_scalars ... )
37+ MOI. set (inner, MOI. ObjectiveFunction {typeof(g)} (), g)
3638 sets = MOI. LessThan .(rhs .- 1 )
37- c = MOI. Utilities. normalize_and_add_constraint .(model . inner, f , sets)
39+ c = MOI. Utilities. normalize_and_add_constraint .(inner, f_scalars , sets)
3840 optimize_inner! (model)
39- status = MOI. get (model . inner, MOI. TerminationStatus ())
41+ status = MOI. get (inner, MOI. TerminationStatus ())
4042 if ! _is_scalar_status_optimal (status)
4143 _log_subproblem_solve (model, " subproblem not optimal" )
4244 MOI. delete .(model, c)
4345 return status, nothing
4446 end
45- variables = MOI. get (model . inner, MOI. ListOfVariableIndices ())
46- X, Y = _compute_point (model, variables, model . f)
47+ variables = MOI. get (inner, MOI. ListOfVariableIndices ())
48+ X, Y = _compute_point (model, variables, f)
4749 _log_subproblem_solve (model, Y)
4850 MOI. delete .(model, c)
4951 return status, SolutionPoint (X, Y)
5052end
5153
52- function minimize_multiobjective! (algorithm:: Chalmet , model:: Optimizer )
53- @assert MOI. get (model. inner, MOI. ObjectiveSense ()) == MOI. MIN_SENSE
54- if MOI. output_dimension (model. f) != 2
54+ function minimize_multiobjective! (
55+ algorithm:: Chalmet ,
56+ model:: Optimizer ,
57+ inner:: MOI.ModelLike ,
58+ f:: MOI.AbstractVectorFunction ,
59+ )
60+ @assert MOI. get (inner, MOI. ObjectiveSense ()) == MOI. MIN_SENSE
61+ if MOI. output_dimension (f) != 2
5562 error (" Chalmet requires exactly two objectives" )
5663 end
5764 solutions = SolutionPoint[]
5865 E = Tuple{Int,Int}[]
5966 Q = Tuple{Int,Int}[]
60- variables = MOI. get (model . inner, MOI. ListOfVariableIndices ())
61- f1, f2 = MOI. Utilities. scalarize (model . f)
67+ variables = MOI. get (inner, MOI. ListOfVariableIndices ())
68+ f1, f2 = MOI. Utilities. scalarize (f)
6269 y1, y2 = zeros (2 ), zeros (2 )
63- MOI. set (model . inner, MOI. ObjectiveFunction {typeof(f2)} (), f2)
70+ MOI. set (inner, MOI. ObjectiveFunction {typeof(f2)} (), f2)
6471 optimize_inner! (model)
65- status = MOI. get (model . inner, MOI. TerminationStatus ())
72+ status = MOI. get (inner, MOI. TerminationStatus ())
6673 if ! _is_scalar_status_optimal (status)
6774 return status, solutions
6875 end
6976 _, y1[2 ] = _compute_point (model, variables, f2)
7077 _log_subproblem_solve (model, variables)
71- MOI. set (model . inner, MOI. ObjectiveFunction {typeof(f1)} (), f1)
78+ MOI. set (inner, MOI. ObjectiveFunction {typeof(f1)} (), f1)
7279 y1_constraint = MOI. Utilities. normalize_and_add_constraint (
73- model . inner,
80+ inner,
7481 f2,
7582 MOI. LessThan (y1[2 ]),
7683 )
7784 optimize_inner! (model)
78- status = MOI. get (model . inner, MOI. TerminationStatus ())
85+ status = MOI. get (inner, MOI. TerminationStatus ())
7986 if ! _is_scalar_status_optimal (status)
8087 return status, solutions
8188 end
8289 x1, y1[1 ] = _compute_point (model, variables, f1)
8390 _log_subproblem_solve (model, y1)
84- MOI. delete (model . inner, y1_constraint)
91+ MOI. delete (inner, y1_constraint)
8592 push! (solutions, SolutionPoint (x1, y1))
86- MOI. set (model . inner, MOI. ObjectiveFunction {typeof(f1)} (), f1)
93+ MOI. set (inner, MOI. ObjectiveFunction {typeof(f1)} (), f1)
8794 optimize_inner! (model)
88- status = MOI. get (model . inner, MOI. TerminationStatus ())
95+ status = MOI. get (inner, MOI. TerminationStatus ())
8996 if ! _is_scalar_status_optimal (status)
9097 return status, solutions
9198 end
@@ -94,20 +101,20 @@ function minimize_multiobjective!(algorithm::Chalmet, model::Optimizer)
94101 if y2[1 ] ≈ solutions[1 ]. y[1 ]
95102 return MOI. OPTIMAL, solutions
96103 end
97- MOI. set (model . inner, MOI. ObjectiveFunction {typeof(f2)} (), f2)
104+ MOI. set (inner, MOI. ObjectiveFunction {typeof(f2)} (), f2)
98105 y2_constraint = MOI. Utilities. normalize_and_add_constraint (
99- model . inner,
106+ inner,
100107 f1,
101108 MOI. LessThan (y2[1 ]),
102109 )
103110 optimize_inner! (model)
104- status = MOI. get (model . inner, MOI. TerminationStatus ())
111+ status = MOI. get (inner, MOI. TerminationStatus ())
105112 if ! _is_scalar_status_optimal (status)
106113 return status, solutions
107114 end
108115 x2, y2[2 ] = _compute_point (model, variables, f2)
109116 _log_subproblem_solve (model, y2)
110- MOI. delete (model . inner, y2_constraint)
117+ MOI. delete (inner, y2_constraint)
111118 push! (solutions, SolutionPoint (x2, y2))
112119 push! (Q, (1 , 2 ))
113120 t = 3
@@ -118,7 +125,8 @@ function minimize_multiobjective!(algorithm::Chalmet, model::Optimizer)
118125 r, s = pop! (Q)
119126 yr, ys = solutions[r]. y, solutions[s]. y
120127 rhs = [max (yr[1 ], ys[1 ]), max (yr[2 ], ys[2 ])]
121- status, solution = _solve_constrained_model (model, algorithm, rhs)
128+ status, solution =
129+ _solve_constrained_model (algorithm, model, inner, f, rhs)
122130 if ! _is_scalar_status_optimal (status)
123131 push! (E, (r, s))
124132 continue
0 commit comments