rulp 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzVkMDQ0N2U5ZTg3NGNiMGQ3N2ZlODAyNDljY2U4MDNlMDVkOGRhMg==
4
+ YzYxYzBjMTNmYmFhN2MxY2MwOGVmZTgzZmEzNTBlZTczMzAzODg4YQ==
5
5
  data.tar.gz: !binary |-
6
- MGI2M2ZiYWVlZWYzMmUzZDM2NjU4NzZlNGQ2Y2M4YzU4YTU0NGE5Ng==
6
+ OGYxNzNjODE3YmJmMWVjYzU5MjFhOWM2NTg2OWQ2ZTY2MTI3ZTEyYg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NGQxOWZlNDZkNTU2ZjA1ZTM1M2RkMTIxYmY0ZTExOWE5YjMyODRhNjVlZDhj
10
- MGI5YWZiM2MwMTU5ZTcyNDQ2MmI1NWU2NzVmZjNhYzViNmE4MGY5MjcxZjZh
11
- YjJjZTM3YTUzZmZiYWE5MGJiNTNlZjBjNWFiYzNjOTg5NTgzZDc=
9
+ YTZhMmIyYjdkMGZhNzFjM2VkNDBjNjZkOTBjYWU1YjNjMmQzOGRiMDUxNWZm
10
+ MmQwNmJkZWIzZjczMjU3YTAzNTc4NjFlYTgzNWIyMjIxYTI3ODM4ZDkwNTcy
11
+ Y2Y1N2RjM2I4N2U4YzFmNjVhYzI0N2FkMzAwZGIyMzBmNzY0Nzk=
12
12
  data.tar.gz: !binary |-
13
- NmYwM2Q1NmFmODk1OGI3OGNjNDRmNDU5OTRhMDRiZGE5ZDJmYzAzZTI3YTQw
14
- MzNiMTRhZjdlOTQzZWE2NDE4ZGMwOWI0YzM5MTFjZjAyM2M0MjM4M2YyZjZl
15
- Yzc0OWI5NGYxYjdiZTRhMzUxMmM1ODYxZGI3ZWU1NDM3ODBjOWE=
13
+ YzllNGI2NTQxZDcyNGU0OWQxYjg0MjM4NjY5YTRlNDFkMWYzZTU0NDMzODFj
14
+ NjRiYzc3Njc5NjAwZWEwZDBjYzg3NGU3ZjNkNGM1MDdlM2EwY2NjOWQzOGI1
15
+ ZmU5YWFlNjM5MDI5N2ZlZDFkZWE5ZDIyNjk0MGNmZTdhOTQyODM=
@@ -13,8 +13,6 @@ require 'set'
13
13
  GLPK = "glpsol"
14
14
  SCIP = "scip"
15
15
  CBC = "cbc"
16
- PSCIP = "pscip"
17
- PCBC = "pcbc"
18
16
  GUROBI = "gurobi_cl"
19
17
 
20
18
  module Rulp
@@ -26,20 +24,16 @@ module Rulp
26
24
  GUROBI = ::GUROBI
27
25
  SCIP = ::SCIP
28
26
  CBC = ::CBC
29
- PSCIP = ::PSCIP
30
- PCBC = ::PCBC
31
27
 
32
28
  SOLVERS = {
33
29
  GLPK => Glpk,
34
30
  SCIP => Scip,
35
- PSCIP => PScip,
36
- PCBC => PCbc,
37
31
  CBC => Cbc,
38
32
  GUROBI => Gurobi,
39
33
  }
40
34
 
41
35
  def self.Glpk(lp, opts={})
42
- lp.solve_with(GLPK, opts) rescue nil
36
+ lp.solve_with(GLPK, opts)
43
37
  end
44
38
 
45
39
  def self.Cbc(lp, opts={})
@@ -47,23 +41,11 @@ module Rulp
47
41
  end
48
42
 
49
43
  def self.Scip(lp, opts={})
50
- lp.solve_with(SCIP, opts) rescue nil
51
- end
52
-
53
- def self.Pcbc(lp, opts={})
54
- lp.solve_with(PCBC, opts) rescue nil
55
- end
56
-
57
- def self.Pscip(lp, opts={})
58
- lp.solve_with(PSCIP, opts) rescue nil
59
- end
60
-
61
- def self.Pscip(lp, opts={})
62
- lp.solve_with(PSCIP, opts) rescue nil
44
+ lp.solve_with(SCIP, opts)
63
45
  end
64
46
 
65
47
  def self.Gurobi(lp, opts={})
66
- lp.solve_with(GUROBI, opts) rescue nil
48
+ lp.solve_with(GUROBI, opts)
67
49
  end
68
50
 
69
51
  def self.Max(objective_expression)
@@ -160,7 +142,7 @@ module Rulp
160
142
  `open #{filename}` if options[:open_definition]
161
143
 
162
144
  "Solving problem".log(:info)
163
- _, time = _profile{ solver.solve(options) }
145
+ _, time = _profile{ solver.solve }
164
146
 
165
147
  `open #{solver.outfile}` if options[:open_solution]
166
148
 
@@ -1,9 +1,19 @@
1
1
  class Cbc < Solver
2
- def solve(options)
3
- command = "#{executable} #{@filename} %s branch solution #{@outfile}"
4
- command %= options[:gap] ? "ratio #{options[:gap]}":""
2
+
3
+ #maxN
4
+
5
+ def solve
6
+ if options[:parallel]
7
+ command = "#{executable} #{@filename} %s %s threads 8 branch solution #{@outfile}"
8
+ else
9
+ command = "#{executable} #{@filename} %s %s branch solution #{@outfile}"
10
+ end
11
+ command %= [
12
+ options[:gap] ? "ratio #{options[:gap]}":"",
13
+ options[:node_limit] ? "maxN #{options[:node_limit]}":""
14
+ ]
15
+
5
16
  system(command)
6
- `open #{@outfile}` if options[:open_solution]
7
17
  end
8
18
 
9
19
  def self.executable
@@ -1,5 +1,5 @@
1
1
  class Glpk < Solver
2
- def solve(options)
2
+ def solve
3
3
  command = "#{executable} --lp #{@filename} %s --cuts --write #{@outfile}"
4
4
  command %= options[:gap] ? "--mipgap #{options[:gap]}" : ""
5
5
  system(command)
@@ -1,12 +1,15 @@
1
1
  class Gurobi < Solver
2
- def solve(options)
3
- command = "gurobi_cl ResultFile=#{@outfile} #{@filename}"
4
- command %= options[:gap] ? "MipGap=#{options[:gap]}":""
2
+ def solve
3
+ command = "#{executable} ResultFile=#{@outfile} %s %s #{@filename}"
4
+ command %= [
5
+ options[:gap] ? "MipGap=#{options[:gap]}":"",
6
+ options[:node_limit] ? "NodeLimit=#{options[:node_limit]}":""
7
+ ]
5
8
  system(command)
6
9
  end
7
10
 
8
11
  def self.executable
9
- :cbc
12
+ :gurobi_cl
10
13
  end
11
14
 
12
15
  def store_results(variables)
@@ -3,8 +3,36 @@ class Scip < Solver
3
3
  :scip
4
4
  end
5
5
 
6
- def solve(options)
7
- system("rm #{@outfile}; #{executable} -f #{@filename} -l #{@outfile} -s ./scip.set")
6
+ def solve
7
+ settings = settings_file
8
+ if options[:parallel]
9
+ command = "touch /tmp/fscip_params; rm #{@outfile}; fscip /tmp/fscip_params #{@filename} -fsol #{@outfile} -s #{settings}"
10
+ else
11
+ command = "rm #{@outfile}; #{executable} -f #{@filename} -l #{@outfile} -s #{settings}"
12
+ end
13
+ system(command)
14
+ end
15
+
16
+ def settings_file
17
+ existing_settings = if File.exists?("./scip.set")
18
+ IO.read("./scip.set")
19
+ else
20
+ ""
21
+ end
22
+ if options[:node_limit]
23
+ existing_settings += "\nlimits/nodes = #{options[:node_limit]}"
24
+ end
25
+ if options[:gap]
26
+ existing_settings += "\nlimits/gap = #{options[:gap]}"
27
+ end
28
+
29
+ settings_file = get_settings_filename
30
+ IO.write(settings_file, existing_settings)
31
+ return settings_file
32
+ end
33
+
34
+ def get_settings_filename
35
+ "/tmp/rulp-#{Random.rand(0..1000)}.set"
8
36
  end
9
37
 
10
38
  def store_results(variables)
@@ -33,6 +33,4 @@ end
33
33
  require_relative 'cbc'
34
34
  require_relative 'scip'
35
35
  require_relative 'glpk'
36
- require_relative 'pscip'
37
- require_relative 'pcbc'
38
36
  require_relative 'gurobi'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rulp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters
@@ -35,8 +35,6 @@ files:
35
35
  - lib/solvers/cbc.rb
36
36
  - lib/solvers/glpk.rb
37
37
  - lib/solvers/gurobi.rb
38
- - lib/solvers/pcbc.rb
39
- - lib/solvers/pscip.rb
40
38
  - lib/solvers/scip.rb
41
39
  - lib/solvers/solvers.rb
42
40
  - test/test_basic_suite.rb
@@ -1,25 +0,0 @@
1
- class PCbc < Solver
2
- def solve(options)
3
- command = "#{executable} #{@filename} %s threads 8 branch solution #{@outfile}"
4
- command %= options[:gap] ? "ratio #{options[:gap]}":""
5
- system(command)
6
- end
7
-
8
- def self.executable
9
- :cbc
10
- end
11
-
12
- def store_results(variables)
13
- rows = IO.read(@outfile).split("\n")
14
- objective = rows[0].split(/\s+/)[-1].to_f
15
- vars_by_name = {}
16
- rows[1..-1].each do |row|
17
- cols = row.strip.split(/\s+/)
18
- vars_by_name[cols[1].to_s] = cols[2].to_f
19
- end
20
- variables.each do |var|
21
- var.value = vars_by_name[var.to_s].to_f
22
- end
23
- return objective
24
- end
25
- end
@@ -1,30 +0,0 @@
1
- class PScip < Solver
2
-
3
- def self.executable
4
- :fscip
5
- end
6
-
7
- def solve(options)
8
- command = "touch /tmp/fscip_params; rm #{@outfile}; #{executable} /tmp/fscip_params #{@filename} -fsol #{@outfile}"
9
- command += " -s ./scip.set" if File.exists?("./scip.set")
10
- system(command)
11
- end
12
-
13
- def store_results(variables)
14
- results = IO.read(@outfile)
15
- rows = results.split("\n")
16
-
17
- objective = rows[1].split(/\s+/)[-1].to_f
18
-
19
- vars_by_name = {}
20
- rows[1..-1].each do |row|
21
- cols = row.strip.split(/\s+/)
22
- vars_by_name[cols[0].to_s] = cols[1].to_f
23
- end
24
- variables.each do |var|
25
- var.value = vars_by_name[var.to_s].to_f
26
- end
27
-
28
- return objective
29
- end
30
- end