Class: Opt::Solvers::HighsSolver

Inherits:
AbstractSolver show all
Defined in:
lib/opt/solvers/highs_solver.rb

Instance Method Summary collapse

Methods inherited from AbstractSolver

supports_type?

Instance Method Details

#solve(sense:, start:, index:, value:, col_lower:, col_upper:, obj:, row_lower:, row_upper:, vars:, offset:, verbose:, type:, time_limit:, indexed_objective:) ⇒ Object



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
            # multiply values by 2 since minimizes 1/2
            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