opl 2.4.1 → 2.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +5 -5
  2. data/lib/opl.rb +7 -2
  3. data/lib/sudoku.rb +71 -0
  4. metadata +20 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1a11eb865eed8b1f280c8dd764f76fa4916357d3
4
- data.tar.gz: 78ec8f5196e4d90f2d6f237c21571262cab92dd0
2
+ SHA256:
3
+ metadata.gz: 577e5853623d778f8c4aa44f28e787180aededce471e953107af513a132793d8
4
+ data.tar.gz: 58364f2f6b34053fa45a8a6bdb827b6fcd777cfb14d4752a6be82c1f214d6b7f
5
5
  SHA512:
6
- metadata.gz: 5124341d93c8438663e4c2244c7abad2f51036ea6278b0f6e9f2ae092823cf29a821cc4d29541a3ee64ee668a4bad1068e424a2c39f950a0d0ff85f468ec7eee
7
- data.tar.gz: fd1490b7e159ab31361fe0e748bafb0dfd8f03a2c578e732f79d0eaea7a25309d37cbb302b4ca11e2f8b84dd7a1671e34c75f2e59bc8adea02fdda441783597f
6
+ metadata.gz: d529766f941755f63be3a3e44a1cb8986c16368119493076bdb61aaf1f91c63e8bc73d6ab66b5bca512aebaf1ce72c99a1cf94f37a041000fa99cbc0bfbc43a4
7
+ data.tar.gz: 98d388bdd84b40c9476031fffd036255eb06e9c120b84ef916f9bf796714b68087bf7fa7dcc379fc7c5e6d25e270283f08219ec8edf828c68591f46612135963
data/lib/opl.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "rglpk"
2
- require_relative "string.rb"
3
2
  require_relative "array.rb"
3
+ require_relative "string.rb"
4
+ require_relative "sudoku.rb"
4
5
 
5
6
  # Notes for future functionality
6
7
  #
@@ -1115,7 +1116,11 @@ def optimize(optimization, objective, lp)
1115
1116
  end
1116
1117
  lp.solution = answer
1117
1118
  lp.rglpk_object = p
1118
- lp.matrix_solution = lp.solution_as_matrix
1119
+ begin
1120
+ lp.matrix_solution = lp.solution_as_matrix
1121
+ rescue
1122
+ return lp
1123
+ end
1119
1124
  if lp.stop_processing
1120
1125
  lp.solution = lp.error_message
1121
1126
  lp.matrix_solution = lp.error_message
@@ -0,0 +1,71 @@
1
+ class OPL
2
+ class Sudoku
3
+ attr_accessor :input_matrix
4
+ attr_accessor :lp
5
+ attr_accessor :solution
6
+
7
+ def initialize(input_matrix)
8
+ @input_matrix = input_matrix
9
+ ""
10
+ end
11
+
12
+ def solve
13
+ size = input_matrix.count
14
+ rubysize = size-1
15
+
16
+ constant_constraints = []
17
+ input_matrix.each_index do |i|
18
+ row = input_matrix[i]
19
+
20
+ row.each_index do |j|
21
+ element = input_matrix[i][j]
22
+
23
+ if element != 0
24
+ constant_constraints << "x[#{i}][#{j}][#{element-1}] = 1"
25
+ end
26
+ end
27
+ end
28
+
29
+ @lp = minimize("y", subject_to([
30
+ "y = 2",# y is a dummy variable so I don't have to worry about the objective function
31
+ "forall(i in (0..#{rubysize}), j in (0..#{rubysize}), sum(k in (0..#{rubysize}), x[i][j][k]) = 1)",# an element contains only one number
32
+ "forall(i in (0..#{rubysize}), k in (0..#{rubysize}), sum(j in (0..#{rubysize}), x[i][j][k]) = 1)",# every row contains every number
33
+ "forall(j in (0..#{rubysize}), k in (0..#{rubysize}), sum(i in (0..#{rubysize}), x[i][j][k]) = 1)",# every column contains every number
34
+ "forall(u in [0,3,6], v in [0,3,6], k in (0..#{rubysize}), sum(i in ((0+u)..(#{(size/3)-1}+u)), j in ((0+v)..(#{(size/3)-1}+v)), x[i][j][k]) = 1)",# every 3x3 grid contains every number
35
+ constant_constraints# some elements already have their values set
36
+ ].flatten,["BOOLEAN: x"]))
37
+ ""
38
+ end
39
+
40
+ def format_solution
41
+ @lp.matrix_solution["x"]
42
+ mat = @lp.matrix_solution["x"]
43
+ sol = Array.new(mat[0][0].size) { Array.new(mat[0][0].size, 0) }
44
+ mat.each_index do |i|
45
+ mat[i].each_index do |j|
46
+ mat[i][j].each_index do |k|
47
+ if mat[i][j][k].to_f == 1.0
48
+ sol[i][j] = k+1
49
+ end
50
+ end
51
+ end
52
+ end
53
+ @solution = sol
54
+ ""
55
+ end
56
+
57
+ def print_problem
58
+ @input_matrix.each do |row|
59
+ puts row.join(" ")
60
+ end
61
+ ""
62
+ end
63
+
64
+ def print_solution
65
+ @solution.each do |row|
66
+ puts row.join(" ")
67
+ end
68
+ ""
69
+ end
70
+ end
71
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opl
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.1
4
+ version: 2.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Godlove
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-15 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2020-06-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rglpk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.4.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.4.0
13
27
  description: This gem gives you a beautifully simple way to formulate your linear
14
28
  or mixed integer program. The syntax is inspired by OPL Studio, which remains my
15
29
  favorite linear programming software, but the license is quite expensive.
@@ -21,9 +35,10 @@ files:
21
35
  - lib/array.rb
22
36
  - lib/opl.rb
23
37
  - lib/string.rb
38
+ - lib/sudoku.rb
24
39
  homepage: http://github.com/brg8/opl
25
40
  licenses:
26
- - GNU
41
+ - MIT
27
42
  metadata: {}
28
43
  post_install_message:
29
44
  rdoc_options: []
@@ -40,8 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
40
55
  - !ruby/object:Gem::Version
41
56
  version: '0'
42
57
  requirements: []
43
- rubyforge_project:
44
- rubygems_version: 2.2.2
58
+ rubygems_version: 3.0.6
45
59
  signing_key:
46
60
  specification_version: 4
47
61
  summary: Linear Or Mixed Integer Program Solver