class RAMS::Solvers::CPLEX

Interface to CPLEX

Public Instance Methods

solve_and_parse(model, model_path, solution_path) click to toggle source
# File lib/rams/solvers/cplex.rb, line 8
def solve_and_parse(model, model_path, solution_path)
  call_solver model, model_path, solution_path
  return RAMS::Solution.new(:infeasible, nil, {}, {}) unless File.exist? solution_path
  parse_solution model, File.read(solution_path)
end
solver_command(model_path, solution_path, args) click to toggle source
# File lib/rams/solvers/cplex.rb, line 14
def solver_command(model_path, solution_path, args)
  ['cplex', '-c', "read #{model_path}"] + args + ['optimize', "write #{solution_path}"]
end

Private Instance Methods

parse_dual(model, xml_doc) click to toggle source
# File lib/rams/solvers/cplex.rb, line 48
def parse_dual(model, xml_doc)
  xml_doc.css('CPLEXSolution').css('linearConstraints').css('constraint').map do |c|
    [model.constraints[c['name']], c['dual'].to_f]
  end.to_h
end
parse_objective(_model, xml_doc) click to toggle source
# File lib/rams/solvers/cplex.rb, line 38
def parse_objective(_model, xml_doc)
  xml_doc.css('CPLEXSolution').css('header').first['objectiveValue'].to_f
end
parse_primal(model, xml_doc) click to toggle source
# File lib/rams/solvers/cplex.rb, line 42
def parse_primal(model, xml_doc)
  xml_doc.css('CPLEXSolution').css('variables').css('variable').map do |v|
    [model.variables[v['name']], v['value'].to_f]
  end.to_h
end
parse_solution(model, solution_text) click to toggle source
# File lib/rams/solvers/cplex.rb, line 20
def parse_solution(model, solution_text)
  xml_doc = Nokogiri::XML solution_text
  RAMS::Solution.new(
    parse_status(model, xml_doc),
    parse_objective(model, xml_doc),
    parse_primal(model, xml_doc),
    parse_dual(model, xml_doc)
  )
end
parse_status(_model, xml_doc) click to toggle source
# File lib/rams/solvers/cplex.rb, line 30
def parse_status(_model, xml_doc)
  status = xml_doc.css('CPLEXSolution').css('header').first['solutionStatusString']
  return :optimal if status =~ /optimal/i
  return :feasible if status =~ /feasible/i
  return :unbounded if status =~ /unbounded/i
  :unknown
end