4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/opt/solvers/highs_solver.rb', line 4
def solve(sense:, start:, index:, value:, col_lower:, col_upper:, obj:, row_lower:, row_upper:, vars:, offset:, verbose:, type:, time_limit:, indexed_objective:, **)
start.pop
model =
case type
when :mip
Highs.mip(
sense: sense,
col_cost: obj,
col_lower: col_lower,
col_upper: col_upper,
row_lower: row_lower,
row_upper: row_upper,
a_format: :colwise,
a_start: start,
a_index: index,
a_value: value,
offset: offset,
integrality: vars.map { |var| integrality(var) }
)
when :qp
q_start = []
q_index = []
q_value = []
vars.each_with_index do |v2, j|
q_start << q_index.size
vars.each_with_index do |v1, i|
v = indexed_objective[[v1, v2]]
if v != 0
q_index << i
q_value << (v1.equal?(v2) ? v * 2 : v)
end
end
end
Highs.qp(
sense: sense,
col_cost: obj,
col_lower: col_lower,
col_upper: col_upper,
row_lower: row_lower,
row_upper: row_upper,
a_format: :colwise,
a_start: start,
a_index: index,
a_value: value,
offset: offset,
q_format: :colwise,
q_start: q_start,
q_index: q_index,
q_value: q_value
)
else
Highs.lp(
sense: sense,
col_cost: obj,
col_lower: col_lower,
col_upper: col_upper,
row_lower: row_lower,
row_upper: row_upper,
a_format: :colwise,
a_start: start,
a_index: index,
a_value: value,
offset: offset
)
end
res = model.solve(verbose: verbose, time_limit: time_limit)
{
status: res[:status],
objective: res[:obj_value],
x: res[:col_value]
}
end
|