opl 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. data/lib/opl.rb +33 -14
  2. metadata +2 -2
data/lib/opl.rb CHANGED
@@ -1,10 +1,20 @@
1
1
  require "rglpk"
2
2
 
3
3
  #TODO
4
+ #unbounded or conflicting bounds messages
5
+ # e.g.
6
+ # lp = maximize(
7
+ # "x",
8
+ # subject_to([
9
+ # "x >= 0"
10
+ # ]))
11
+
12
+ #put a warning about branch and cut in the github description
13
+
4
14
  #1.1
5
15
  #setting variable values in constraints
6
16
  #and then using that variable value in further constraints
7
- #Look into fixed variables in the glp documentation
17
+
8
18
  #1.2
9
19
  #summing of variables
10
20
  #e.g. x1 + x1 <= 3
@@ -89,7 +99,7 @@ class OPL
89
99
  variable = text.scan(/[a-z]\[/)[0].gsub("[","")
90
100
  #will need to make this multiple variables??
91
101
  #or is this even used at all????
92
- value_combinations = OPL::Helper.mass_product(values)
102
+ value_combinations = self.mass_product(values)
93
103
  value_combinations.each_index do |vc_index|
94
104
  value_combination = value_combinations[vc_index]
95
105
  value_combination = [value_combination] unless value_combination.is_a?(Array)
@@ -263,7 +273,7 @@ class OPL
263
273
  end
264
274
 
265
275
  def self.coefficients(text)#parameter is one side of the equation
266
- equation = OPL::Helper.add_ones(text)
276
+ equation = self.add_ones(text)
267
277
  if equation[0]=="-"
268
278
  equation.scan(/[+-][\d\.]+/)
269
279
  else
@@ -272,7 +282,7 @@ class OPL
272
282
  end
273
283
 
274
284
  def self.variables(text)#parameter is one side of the equation
275
- equation = OPL::Helper.add_ones(text)
285
+ equation = self.add_ones(text)
276
286
  equation.scan(/[a-z]+[\[\]\d]*/)
277
287
  end
278
288
 
@@ -312,8 +322,8 @@ class OPL
312
322
  #in: "-8 + x + y + 3 <= 100"
313
323
  #out: "x + y <= 100 + 5"
314
324
  text = text.gsub(" ","")
315
- s = OPL::Helper.sides(text)
316
- constants_results = OPL::Helper.get_constants(s[:lhs])
325
+ s = self.sides(text)
326
+ constants_results = self.get_constants(s[:lhs])
317
327
  constants = []
318
328
  constants_results[:formatted].each_index do |i|
319
329
  formatted_constant = constants_results[:formatted][i]
@@ -356,7 +366,7 @@ class OPL
356
366
  end
357
367
 
358
368
  def self.sub_rhs_with_summed_constants(constraint)
359
- rhs = OPL::Helper.sides(constraint)[:rhs]
369
+ rhs = self.sides(constraint)[:rhs]
360
370
  constraint.gsub(rhs, self.sum_constants(rhs))
361
371
  end
362
372
 
@@ -382,7 +392,7 @@ class OPL
382
392
  #in: "x + y - x[3] <= 3z + 2x[2] - 10"
383
393
  #out: "x + y - x[3] - 3z - 2x[2] <= -10"
384
394
  text = text.gsub(" ", "")
385
- s = OPL::Helper.sides(text)
395
+ s = self.sides(text)
386
396
  oper = self.operator(text)
387
397
  rhs = s[:rhs]
388
398
  lhs = s[:lhs]
@@ -471,6 +481,9 @@ class OPL
471
481
  attr_accessor :formatted_constraints
472
482
  attr_accessor :rglpk_object
473
483
  attr_accessor :solver
484
+ attr_accessor :matrix
485
+ attr_accessor :simplex_message
486
+ attr_accessor :mip_message
474
487
 
475
488
  def initialize(objective, constraints)
476
489
  @objective = objective
@@ -629,8 +642,9 @@ def optimize(optimization, objective, rows_c)
629
642
  rows_c.each_index do |i|
630
643
  row = rows_c[i]
631
644
  rows[i].name = row.name
632
- rows[i].set_bounds(Rglpk::GLP_UP, 0.0, row.upper_bound) unless row.upper_bound.nil?
633
- rows[i].set_bounds(Rglpk::GLP_LO, 0.0, row.lower_bound) unless row.lower_bound.nil?
645
+ rows[i].set_bounds(Rglpk::GLP_UP, nil, row.upper_bound) unless row.upper_bound.nil?
646
+ rows[i].set_bounds(Rglpk::GLP_LO, nil, row.lower_bound) unless row.lower_bound.nil?
647
+ #rows[i].set_bounds(Rglpk::GLP_FR, row.lower_bound, row.upper_bound)
634
648
  end
635
649
  vars = rows_c.first.variable_coefficient_pairs
636
650
  cols = p.add_cols(vars.size)
@@ -638,12 +652,15 @@ def optimize(optimization, objective, rows_c)
638
652
  vars.each_index do |i|
639
653
  column_name = vars[i].variable
640
654
  cols[i].name = column_name
641
- cols[i].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
642
655
  cols[i].kind = vars[i].variable_type#boolean, integer, etc.
656
+ if [1,2].include? cols[i].kind
657
+ cols[i].set_bounds(Rglpk::GLP_FR, nil, nil)
658
+ end
643
659
  if vars[i].variable_type != 1
644
660
  solver = "mip"
645
661
  end
646
662
  end
663
+ lp.solver = solver
647
664
  all_vars = rows_c.first.variable_coefficient_pairs.map{|vcp|vcp.variable}
648
665
  obj_coefficients = OPL::Helper.coefficients(objective.gsub(" ","")).map{|c|c.to_f}
649
666
  obj_vars = OPL::Helper.variables(objective.gsub(" ",""))
@@ -654,16 +671,18 @@ def optimize(optimization, objective, rows_c)
654
671
  all_obj_coefficients << coef
655
672
  end
656
673
  p.obj.coefs = all_obj_coefficients
657
- p.set_matrix(rows_c.map{|row|row.variable_coefficient_pairs.map{|vcp|vcp.coefficient.to_f}}.flatten)
674
+ matrix = rows_c.map{|row|row.variable_coefficient_pairs.map{|vcp|vcp.coefficient.to_f}}.flatten
675
+ lp.matrix = matrix
676
+ p.set_matrix(matrix)
658
677
  answer = Hash.new()
659
- p.simplex
678
+ lp.simplex_message = p.simplex
660
679
  if solver == "simplex"
661
680
  lp.objective.optimized_value = p.obj.get + objective_addition.to_f
662
681
  cols.each do |c|
663
682
  answer[c.name] = c.get_prim.to_s
664
683
  end
665
684
  elsif solver == "mip"
666
- p.mip
685
+ lp.mip_message = p.mip
667
686
  lp.objective.optimized_value = p.obj.mip + objective_addition.to_f
668
687
  cols.each do |c|
669
688
  answer[c.name] = c.mip_val.to_s
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-03 00:00:00.000000000 Z
12
+ date: 2013-09-24 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Built on top of the glpk gem for linear programming. The syntax is copied
15
15
  from OPL Studio, which remains my favorite linear programming software, but the