clp 0.1.1 → 0.1.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c01ab7d7209bb40c13fe725a54180e7001bd3eff8c406c83e9edb8fa0d686f9
4
- data.tar.gz: 9a82639091ecc4cfb4029c7c4ff60ff3913b57cd010e2e21a67580a94b98e6ca
3
+ metadata.gz: ce8d28ee2e7e1772cfc1cdc8ea027e6946a791a3682ac4865f10f78cce765426
4
+ data.tar.gz: 656c14297cc86e4baf08b33b64940530b3a83e2133a8e944c1c47d75487fae0f
5
5
  SHA512:
6
- metadata.gz: e267c07368a63e59e45eceba7dc008b7192fd65ef33e8fe87ba2517f490a7727388414ad9640ccd1f6adc04613440513b77c911440e9205c7489234bc1ec4c8d
7
- data.tar.gz: 21578e3dcd102e122ba217adfa41a1c6b6302d13cc26cb13ea054c64ea6c1181f7ae3200090884d24aa04914a284e476b8a13c8446dd0d0b8c3ff6b29f0241ab
6
+ metadata.gz: '086c1b6352fb07f1a425b955ccf95eebe4fbf7c4c7a2ba8736ca04811732dd0c9dde9f7233611d12ed71c9880b2646f6ffcc892b334231a33aee9e63f2b1ace7'
7
+ data.tar.gz: 103720186f2a2a547fd9561a381ab9b4bb7b7c8c197a2f573ac6183e52506ecafb6d1513a61cd68862209d915a3dabc3e856d7cbceb3d9e4ca3a9c492ecc2e0c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 0.1.3 (2023-06-07)
2
+
3
+ - Improved support for Mac ARM
4
+ - Fixed error with `dup` and `clone`
5
+
6
+ ## 0.1.2 (2022-04-14)
7
+
8
+ - Added `log_level` and `time_limit` options to `solve` method
9
+
1
10
  ## 0.1.1 (2022-04-06)
2
11
 
3
12
  - Fixed shared library detection on Linux
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  [Clp](https://github.com/coin-or/Clp) - linear programming solver - for Ruby
4
4
 
5
+ Check out [Opt](https://github.com/ankane/opt) for a high-level interface
6
+
5
7
  [![Build Status](https://github.com/ankane/clp-ruby/workflows/build/badge.svg?branch=master)](https://github.com/ankane/clp-ruby/actions)
6
8
 
7
9
  ## Installation
@@ -63,6 +65,20 @@ Read a problem from an MPS file
63
65
  model = Clp.read_mps("hello.mps")
64
66
  ```
65
67
 
68
+ ## Reference
69
+
70
+ Set the log level
71
+
72
+ ```ruby
73
+ model.solve(log_level: 4)
74
+ ```
75
+
76
+ Set the time limit in seconds
77
+
78
+ ```ruby
79
+ model.solve(time_limit: 30)
80
+ ```
81
+
66
82
  ## History
67
83
 
68
84
  View the [changelog](https://github.com/ankane/clp-ruby/blob/master/CHANGELOG.md)
data/lib/clp/ffi.rb CHANGED
@@ -14,6 +14,7 @@ module Clp
14
14
 
15
15
  OBJ_SENSE = {
16
16
  minimize: 1,
17
+ ignore: 0,
17
18
  maximize: -1
18
19
  }
19
20
 
@@ -42,6 +43,8 @@ module Clp
42
43
  extern "int Clp_numberColumns(Clp_Simplex *model)"
43
44
  extern "double Clp_objectiveOffset(Clp_Simplex *model)"
44
45
  extern "void Clp_setObjectiveOffset(Clp_Simplex *model, double value)"
46
+ extern "double Clp_maximumSeconds(Clp_Simplex *model)"
47
+ extern "void Clp_setMaximumSeconds(Clp_Simplex *model, double value)"
45
48
  extern "int Clp_status(Clp_Simplex *model)"
46
49
  extern "double Clp_getObjSense(Clp_Simplex *model)"
47
50
  extern "void Clp_setObjSense(Clp_Simplex *model, double objsen)"
@@ -57,6 +60,7 @@ module Clp
57
60
  extern "double * Clp_getElements(Clp_Simplex *model)"
58
61
  extern "double Clp_objectiveValue(Clp_Simplex *model)"
59
62
  extern "void Clp_setLogLevel(Clp_Simplex *model, int value)"
63
+ extern "int Clp_logLevel(Clp_Simplex *model)"
60
64
 
61
65
  # solve
62
66
  extern "int Clp_initialSolve(Clp_Simplex *model)"
data/lib/clp/model.rb CHANGED
@@ -2,7 +2,7 @@ module Clp
2
2
  class Model
3
3
  def initialize
4
4
  @model = FFI.Clp_newModel
5
- ObjectSpace.define_finalizer(self, self.class.finalize(@model))
5
+ @model.free = FFI["Clp_deleteModel"]
6
6
 
7
7
  FFI.Clp_setLogLevel(model, 0)
8
8
  end
@@ -34,8 +34,11 @@ module Clp
34
34
  check_status FFI.Clp_writeMps(model, filename, 0, 1, 0)
35
35
  end
36
36
 
37
- def solve
38
- check_status FFI.Clp_initialSolve(model)
37
+ def solve(log_level: nil, time_limit: nil)
38
+ with_options(log_level: log_level, time_limit: time_limit) do
39
+ # do not check status
40
+ FFI.Clp_initialSolve(model)
41
+ end
39
42
 
40
43
  num_rows = FFI.Clp_numberRows(model)
41
44
  num_cols = FFI.Clp_numberColumns(model)
@@ -50,11 +53,6 @@ module Clp
50
53
  }
51
54
  end
52
55
 
53
- def self.finalize(model)
54
- # must use proc instead of stabby lambda
55
- proc { FFI.Clp_deleteModel(model) }
56
- end
57
-
58
56
  private
59
57
 
60
58
  def model
@@ -63,7 +61,7 @@ module Clp
63
61
 
64
62
  def check_status(status)
65
63
  if status != 0
66
- raise Error, "Bad status"
64
+ raise Error, "Bad status: #{status}"
67
65
  end
68
66
  end
69
67
 
@@ -87,5 +85,22 @@ module Clp
87
85
  def read_double_array(ptr, size)
88
86
  ptr[0, size * Fiddle::SIZEOF_DOUBLE].unpack("d#{size}")
89
87
  end
88
+
89
+ def with_options(log_level:, time_limit:)
90
+ if log_level
91
+ previous_log_level = FFI.Clp_logLevel(model)
92
+ FFI.Clp_setLogLevel(model, log_level)
93
+ end
94
+
95
+ if time_limit
96
+ previous_time_limit = FFI.Clp_maximumSeconds(model)
97
+ FFI.Clp_setMaximumSeconds(model, time_limit)
98
+ end
99
+
100
+ yield
101
+ ensure
102
+ FFI.Clp_setLogLevel(model, previous_log_level) if previous_log_level
103
+ FFI.Clp_setMaximumSeconds(model, previous_time_limit) if previous_time_limit
104
+ end
90
105
  end
91
106
  end
data/lib/clp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Clp
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.3"
3
3
  end
data/lib/clp.rb CHANGED
@@ -2,8 +2,8 @@
2
2
  require "fiddle/import"
3
3
 
4
4
  # modules
5
- require "clp/model"
6
- require "clp/version"
5
+ require_relative "clp/model"
6
+ require_relative "clp/version"
7
7
 
8
8
  module Clp
9
9
  class Error < StandardError; end
@@ -16,7 +16,11 @@ module Clp
16
16
  # TODO test
17
17
  ["Clp.dll"]
18
18
  elsif RbConfig::CONFIG["host_os"] =~ /darwin/i
19
- ["libClp.dylib"]
19
+ if RbConfig::CONFIG["host_cpu"] =~ /arm|aarch64/i
20
+ ["libClp.dylib", "/opt/homebrew/lib/libClp.dylib"]
21
+ else
22
+ ["libClp.dylib"]
23
+ end
20
24
  else
21
25
  # coinor-libclp-dev has libClp.so
22
26
  # coinor-libclp1 has libClp.so.1
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-06 00:00:00.000000000 Z
11
+ date: 2023-06-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: andrew@ankane.org
@@ -42,7 +42,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
42
42
  - !ruby/object:Gem::Version
43
43
  version: '0'
44
44
  requirements: []
45
- rubygems_version: 3.3.7
45
+ rubygems_version: 3.4.10
46
46
  signing_key:
47
47
  specification_version: 4
48
48
  summary: Linear programming solver for Ruby