ruby-minisat 2.2.0.2 → 2.2.0.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: 56d2498370e733a7bb4a2e20db76990b4db87bf15b72fc4475cd2bb031d99593
4
- data.tar.gz: 7da4e10783c565025222ee3ba90df0043206343210d4faf0bd50748deddc77aa
3
+ metadata.gz: 34056195496ee40822633a89100c76924d2996a03c530f509837a929ca858695
4
+ data.tar.gz: 33f663f96330f53227c5eacbda20eb4c90d95cfb1ddb8049b01ee4820e7d566a
5
5
  SHA512:
6
- metadata.gz: '08b3ea24f656cba2cf2d00c4e9a3bee8e7e54eab4198bd113ec8c64402ceb9c34d2c1970da82b64cc5cc10c9d7f78457c8b68721b97a0277a6db4f508ce59e2f'
7
- data.tar.gz: be10fdee68ddfceff50aa553a1b8ed3b59360d0c10c4448efd5b10012a19558646c75e20018e5d756825e820a413b1e30d0f9bbbdf37c6baf8e137b36d1e82eb
6
+ metadata.gz: a4828f7b39efd95eb28956fca07ec6e650dbc941ef8d3526b5e0841f021c3eb486947dc9d8cf01c0e7e2ab155983b0dd36aadf5329b7b7bdfbcbdc02d7716898
7
+ data.tar.gz: 55f0c175f2798efa0773ddae57440537be275ee56eb42f6881b29a96cf9ddc226763b37915588449cf5704c70727d2cc8ca19db803e883ef9063537d782b1691
@@ -0,0 +1,37 @@
1
+ name: Ruby
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ ruby-versions:
10
+ uses: ruby/actions/.github/workflows/ruby_versions.yml@master
11
+ with:
12
+ engine: cruby-truffleruby
13
+ min_version: 3.3
14
+
15
+ build:
16
+ needs: ruby-versions
17
+ name: build (${{ matrix.ruby }})
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
22
+ include:
23
+ - ruby: "3.3"
24
+ rubyopt: "--enable-frozen-string-literal"
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - name: Set up Ruby
29
+ uses: ruby/setup-ruby@v1
30
+ with:
31
+ ruby-version: ${{ matrix.ruby }}
32
+ - name: Bundle install
33
+ run: |
34
+ bundle install
35
+ - name: Run the test suite
36
+ run: |
37
+ bundle exec rake TESTOPT=-v RUBYOPT="${{ matrix.rubyopt }}"
data/Gemfile CHANGED
@@ -2,3 +2,8 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in minisat.gemspec
4
4
  gemspec
5
+
6
+ group :development do
7
+ gem "rake"
8
+ gem "test-unit"
9
+ end
data/Rakefile CHANGED
@@ -1 +1,13 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/extensiontask"
3
+ require "rake/testtask"
4
+
5
+ Rake::ExtensionTask.new("minisat")
6
+
7
+ Rake::TestTask.new(:test => :compile) do |t|
8
+ t.libs << "test"
9
+ t.libs << "lib"
10
+ t.test_files = FileList["test/**/test_*.rb"]
11
+ end
12
+
13
+ task :default => :test
@@ -58,6 +58,10 @@ extern "C" void wrap_solver_free(wrap_solver slv) {
58
58
  delete (Solver*) slv;
59
59
  }
60
60
 
61
+ extern "C" size_t wrap_solver_memsize(wrap_solver slv) {
62
+ return sizeof(Solver);
63
+ }
64
+
61
65
  extern "C" int wrap_solver_new_var(wrap_solver slv) {
62
66
  return ((Solver*) slv)->newVar();
63
67
  }
@@ -39,6 +39,8 @@ THE SOFTWARE.
39
39
 
40
40
  VALUE rb_mMiniSat, rb_cSolver, rb_cVariable, rb_cLiteral;
41
41
 
42
+ static const rb_data_type_t minisat_solver_data_type;
43
+
42
44
  #define SATISFIED 0 /* satisfied */
43
45
  #define NOT_SOLVED_YET 1 /* not solved yet */
44
46
  #define UNSATISFIABLE 2 /* always unsatisfiable */
@@ -79,16 +81,29 @@ static void check_model_available(int result, int check_only_unsatisfied)
79
81
 
80
82
  /***** variable **************************************************************/
81
83
 
82
- static void value_free(cvariable *cvar)
84
+ static void value_free(void *ptr)
83
85
  {
86
+ cvariable *cvar = (cvariable *)ptr;
84
87
  free(cvar);
85
88
  }
86
89
 
87
- static void value_mark(cvariable *cval)
90
+ static void value_mark(void *ptr)
88
91
  {
92
+ cvariable *cval = (cvariable *)ptr;
89
93
  rb_gc_mark(cval->solver);
90
94
  }
91
95
 
96
+ static size_t value_memsize(const void *ptr)
97
+ {
98
+ return sizeof(cvariable);
99
+ }
100
+
101
+ static const rb_data_type_t minisat_value_data_type = {
102
+ "minisat_value",
103
+ { value_mark, value_free, value_memsize, },
104
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
105
+ };
106
+
92
107
  /*
93
108
  * call-seq:
94
109
  * +variable -> Literal
@@ -101,11 +116,10 @@ static VALUE variable_pos(VALUE rvar)
101
116
  cvariable *cvar, *clit;
102
117
  VALUE rlit;
103
118
 
104
- Data_Get_Struct(rvar, cvariable, cvar);
105
- rlit = Data_Make_Struct(rb_cLiteral, cvariable, value_mark, value_free, clit);
119
+ TypedData_Get_Struct(rvar, cvariable, &minisat_value_data_type, cvar);
120
+ rlit = TypedData_Make_Struct(rb_cLiteral, cvariable, &minisat_value_data_type, clit);
106
121
  clit->value = wrap_lit_pos_var(cvar->value);
107
122
  clit->solver = cvar->solver;
108
- if(OBJ_TAINTED(rvar)) OBJ_TAINT(rlit);
109
123
 
110
124
  return rlit;
111
125
  }
@@ -122,11 +136,10 @@ static VALUE variable_neg(VALUE rvar)
122
136
  cvariable *cvar, *clit;
123
137
  VALUE rlit;
124
138
 
125
- Data_Get_Struct(rvar, cvariable, cvar);
126
- rlit = Data_Make_Struct(rb_cLiteral, cvariable, value_mark, value_free, clit);
139
+ TypedData_Get_Struct(rvar, cvariable, &minisat_value_data_type, cvar);
140
+ rlit = TypedData_Make_Struct(rb_cLiteral, cvariable, &minisat_value_data_type, clit);
127
141
  clit->value = wrap_lit_neg_var(cvar->value);
128
142
  clit->solver = cvar->solver;
129
- if(OBJ_TAINTED(rvar)) OBJ_TAINT(rlit);
130
143
 
131
144
  return rlit;
132
145
  }
@@ -144,8 +157,8 @@ static VALUE variable_value(VALUE rvar)
144
157
  cvariable *cvar;
145
158
  csolver *cslv;
146
159
 
147
- Data_Get_Struct(rvar, cvariable, cvar);
148
- Data_Get_Struct(cvar->solver, csolver, cslv);
160
+ TypedData_Get_Struct(rvar, cvariable, &minisat_value_data_type, cvar);
161
+ TypedData_Get_Struct(cvar->solver, csolver, &minisat_solver_data_type, cslv);
149
162
  check_model_available(cslv->result, 0);
150
163
  switch(wrap_solver_ref_var(cslv->solver, cvar->value)) {
151
164
  case 0: return Qfalse;
@@ -163,13 +176,12 @@ static void convert_lits(int *lits, int argc, VALUE *argv, VALUE rslv)
163
176
 
164
177
  for(i = 0; i < argc; i++) {
165
178
  rval = argv[i];
166
- if(TYPE(rval) != T_DATA
167
- || RDATA(rval)->dfree != (RUBY_DATA_FUNC)value_free) {
179
+ if(!rb_typeddata_is_kind_of(rval, &minisat_value_data_type)) {
168
180
  rb_raise(rb_eTypeError,
169
181
  "wrong argument type %s (expected Variable or Literal)",
170
182
  rb_obj_classname(rval));
171
183
  }
172
- Data_Get_Struct(rval, cvariable, cval);
184
+ TypedData_Get_Struct(rval, cvariable, &minisat_value_data_type,cval);
173
185
  if(cval->solver != rslv) {
174
186
  rb_raise(rb_eArgError,
175
187
  "Variable or Literal of different solver");
@@ -182,18 +194,31 @@ static void convert_lits(int *lits, int argc, VALUE *argv, VALUE rslv)
182
194
 
183
195
  /***** solver ****************************************************************/
184
196
 
185
- static void solver_free(csolver *cslv)
197
+ static void solver_free(void *ptr)
186
198
  {
199
+ csolver *cslv = (csolver *)ptr;
187
200
  wrap_solver_free(cslv->solver);
188
201
  free(cslv);
189
202
  }
190
203
 
204
+ static size_t solver_memsize(const void *ptr)
205
+ {
206
+ const csolver *cslv = (const csolver *)ptr;
207
+ return sizeof(csolver) + wrap_solver_memsize(cslv->solver);
208
+ }
209
+
210
+ static const rb_data_type_t minisat_solver_data_type = {
211
+ "minisat_solver",
212
+ { NULL, solver_free, solver_memsize, },
213
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
214
+ };
215
+
191
216
  static VALUE solver_alloc(VALUE klass)
192
217
  {
193
218
  csolver *cslv;
194
219
  VALUE rslv;
195
220
 
196
- rslv = Data_Make_Struct(klass, csolver, NULL, solver_free, cslv);
221
+ rslv = TypedData_Make_Struct(klass, csolver, &minisat_solver_data_type, cslv);
197
222
  cslv->solver = wrap_solver_new();
198
223
  cslv->result = NOT_SOLVED_YET;
199
224
 
@@ -214,14 +239,13 @@ static VALUE solver_new_var(VALUE rslv)
214
239
  cvariable *cvar;
215
240
  VALUE rvar;
216
241
 
217
- Data_Get_Struct(rslv, csolver, cslv);
242
+ TypedData_Get_Struct(rslv, csolver, &minisat_solver_data_type, cslv);
218
243
  check_model_available(cslv->result, 1);
219
244
  rvar =
220
- Data_Make_Struct(rb_cVariable, cvariable, value_mark, value_free, cvar);
245
+ TypedData_Make_Struct(rb_cVariable, cvariable, &minisat_value_data_type, cvar);
221
246
  cvar->value = wrap_solver_new_var(cslv->solver);
222
247
  cvar->solver = rslv;
223
248
  cslv->result = NOT_SOLVED_YET;
224
- if(OBJ_TAINTED(rslv)) OBJ_TAINT(rvar);
225
249
 
226
250
  return rvar;
227
251
  }
@@ -243,9 +267,10 @@ static VALUE solver_add_clause(int argc, VALUE *argv, VALUE rslv)
243
267
  {
244
268
  csolver *cslv;
245
269
  int *lits;
270
+ VALUE lits_val;
246
271
 
247
- Data_Get_Struct(rslv, csolver, cslv);
248
- lits = ALLOCA_N(int, argc);
272
+ TypedData_Get_Struct(rslv, csolver, &minisat_solver_data_type, cslv);
273
+ lits = (int *)RB_ALLOCV_N(int, lits_val, argc);
249
274
  convert_lits(lits, argc, argv, rslv);
250
275
  if(!wrap_solver_add_clause(cslv->solver, lits, argc)) {
251
276
  cslv->result = UNSATISFIABLE;
@@ -255,6 +280,8 @@ static VALUE solver_add_clause(int argc, VALUE *argv, VALUE rslv)
255
280
  cslv->clause_count++;
256
281
  }
257
282
 
283
+ RB_GC_GUARD(lits_val);
284
+
258
285
  return rslv;
259
286
  }
260
287
 
@@ -271,8 +298,7 @@ static VALUE solver_add_clause(int argc, VALUE *argv, VALUE rslv)
271
298
  */
272
299
  static VALUE solver_add_clause_2(VALUE rslv, VALUE rcls)
273
300
  {
274
- if(TYPE(rcls) == T_DATA
275
- && RDATA(rcls)->dfree == (RUBY_DATA_FUNC)value_free) {
301
+ if(rb_typeddata_is_kind_of(rcls, &minisat_value_data_type)) {
276
302
  return solver_add_clause(1, &rcls, rslv);
277
303
  }
278
304
  else {
@@ -294,14 +320,14 @@ static VALUE solver_ref_var(VALUE rslv, VALUE rvar)
294
320
  csolver *cslv;
295
321
  cvariable *cvar;
296
322
 
297
- Data_Get_Struct(rslv, csolver, cslv);
323
+ TypedData_Get_Struct(rslv, csolver, &minisat_solver_data_type, cslv);
298
324
  if(CLASS_OF(rvar) != rb_cVariable) {
299
325
  rb_raise(rb_eTypeError,
300
326
  "wrong argument type %s (expected Variable)",
301
327
  rb_obj_classname(rvar));
302
328
  }
303
329
  check_model_available(cslv->result, 0);
304
- Data_Get_Struct(rvar, cvariable, cvar);
330
+ TypedData_Get_Struct(rvar, cvariable, &minisat_value_data_type, cvar);
305
331
  switch(wrap_solver_ref_var(cslv->solver, cvar->value)) {
306
332
  case 0: return Qfalse;
307
333
  case 1: return Qtrue;
@@ -322,9 +348,10 @@ static VALUE solver_solve(int argc, VALUE *argv, VALUE rslv)
322
348
  {
323
349
  csolver *cslv;
324
350
  int *lits;
351
+ VALUE lits_val;
325
352
 
326
- Data_Get_Struct(rslv, csolver, cslv);
327
- lits = ALLOCA_N(int, argc);
353
+ TypedData_Get_Struct(rslv, csolver, &minisat_solver_data_type, cslv);
354
+ lits = (int *)RB_ALLOCV_N(int, lits_val, argc);
328
355
  convert_lits(lits, argc, argv, rslv);
329
356
  if(wrap_solver_solve(cslv->solver, lits, argc)) {
330
357
  cslv->result = SATISFIED;
@@ -335,6 +362,7 @@ static VALUE solver_solve(int argc, VALUE *argv, VALUE rslv)
335
362
  argc == 0 ? UNSATISFIABLE : UNSATISFIABLE_UNDER_ASSUMPTIONS;
336
363
  return Qfalse;
337
364
  }
365
+ RB_GC_GUARD(lits_val);
338
366
  }
339
367
 
340
368
  /*
@@ -350,7 +378,7 @@ static VALUE solver_simplify(VALUE rslv)
350
378
  {
351
379
  csolver *cslv;
352
380
 
353
- Data_Get_Struct(rslv, csolver, cslv);
381
+ TypedData_Get_Struct(rslv, csolver, &minisat_solver_data_type, cslv);
354
382
 
355
383
  check_model_available(cslv->result, 0);
356
384
  if(!wrap_solver_simplify(cslv->solver)) {
@@ -384,7 +412,7 @@ static VALUE solver_var_size(VALUE rslv)
384
412
  {
385
413
  csolver *cslv;
386
414
 
387
- Data_Get_Struct(rslv, csolver, cslv);
415
+ TypedData_Get_Struct(rslv, csolver, &minisat_solver_data_type, cslv);
388
416
 
389
417
  return LONG2NUM(wrap_solver_var_size(cslv->solver));
390
418
  }
@@ -400,7 +428,7 @@ static VALUE solver_clause_size(VALUE rslv)
400
428
  {
401
429
  csolver *cslv;
402
430
 
403
- Data_Get_Struct(rslv, csolver, cslv);
431
+ TypedData_Get_Struct(rslv, csolver, &minisat_solver_data_type, cslv);
404
432
 
405
433
  return LONG2NUM(cslv->clause_count);
406
434
  }
@@ -419,12 +447,9 @@ static VALUE solver_to_s(VALUE rslv)
419
447
  {
420
448
  const char *cname = rb_obj_classname(rslv);
421
449
  const char *msg = NULL;
422
- char *buf;
423
450
  csolver *cslv;
424
- VALUE str;
425
- size_t len;
426
451
 
427
- Data_Get_Struct(rslv, csolver, cslv);
452
+ TypedData_Get_Struct(rslv, csolver, &minisat_solver_data_type, cslv);
428
453
  switch(cslv->result) {
429
454
  case NOT_SOLVED_YET:
430
455
  msg = "not solved yet";
@@ -439,13 +464,8 @@ static VALUE solver_to_s(VALUE rslv)
439
464
  msg = "unsatisfiable under assumptions";
440
465
  break;
441
466
  }
442
- len = strlen(cname) + strlen(msg) + 6 + 16;
443
- buf = ALLOCA_N(char, len);
444
- snprintf(buf, len + 1, "#<%s:%p %s>", cname, (void*)rslv, msg);
445
- str = rb_str_new2(buf);
446
- if(OBJ_TAINTED(rslv)) OBJ_TAINT(str);
447
467
 
448
- return str;
468
+ return rb_sprintf("#<%s:%p %s", cname, (void*)rslv, msg);
449
469
  }
450
470
 
451
471
  /*
@@ -459,7 +479,7 @@ static VALUE solver_solved_p(VALUE rslv)
459
479
  {
460
480
  csolver *cslv;
461
481
 
462
- Data_Get_Struct(rslv, csolver, cslv);
482
+ TypedData_Get_Struct(rslv, csolver, &minisat_solver_data_type, cslv);
463
483
 
464
484
  return (cslv->result != NOT_SOLVED_YET ? Qtrue : Qfalse);
465
485
  }
@@ -475,13 +495,13 @@ static VALUE solver_satisfied_p(VALUE rslv)
475
495
  {
476
496
  csolver *cslv;
477
497
 
478
- Data_Get_Struct(rslv, csolver, cslv);
498
+ TypedData_Get_Struct(rslv, csolver, &minisat_solver_data_type, cslv);
479
499
 
480
500
  return (cslv->result == SATISFIED ? Qtrue : Qfalse);
481
501
  }
482
502
 
483
503
 
484
- void Init_minisat()
504
+ void Init_minisat(void)
485
505
  {
486
506
  rb_mMiniSat = rb_define_module("MiniSat");
487
507
 
@@ -502,10 +522,12 @@ void Init_minisat()
502
522
 
503
523
  rb_cVariable = rb_define_class_under(rb_mMiniSat, "Variable", rb_cObject);
504
524
  rb_undef_method(CLASS_OF(rb_cVariable), "new");
525
+ rb_undef_alloc_func(rb_cVariable);
505
526
  rb_define_method(rb_cVariable, "+@", variable_pos, 0);
506
527
  rb_define_method(rb_cVariable, "-@", variable_neg, 0);
507
528
  rb_define_method(rb_cVariable, "value", variable_value, 0);
508
529
 
509
530
  rb_cLiteral = rb_define_class_under(rb_mMiniSat, "Literal", rb_cObject);
510
531
  rb_undef_method(CLASS_OF(rb_cLiteral), "new");
532
+ rb_undef_alloc_func(rb_cLiteral);
511
533
  }
@@ -40,6 +40,7 @@ extern int wrap_lit_neg_var(int v);
40
40
 
41
41
  extern wrap_solver wrap_solver_new();
42
42
  extern void wrap_solver_free(wrap_solver slv);
43
+ extern size_t wrap_solver_memsize(wrap_solver slv);
43
44
  extern int wrap_solver_new_var(wrap_solver slv);
44
45
  extern int wrap_solver_add_clause(wrap_solver slv, int *lits, int len);
45
46
  extern int wrap_solver_ref_var(wrap_solver slv, int var);
data/ruby-minisat.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # coding: utf-8
2
2
  Gem::Specification.new do |spec|
3
3
  spec.name = "ruby-minisat"
4
- spec.version = "2.2.0.2"
4
+ spec.version = "2.2.0.3"
5
5
  spec.authors = ["Yusuke Endoh"]
6
6
  spec.email = ["mame@ruby-lang.org"]
7
7
  spec.description = %q{ruby binding for MiniSat, an open-source SAT solver}
@@ -16,6 +16,5 @@ Gem::Specification.new do |spec|
16
16
  spec.require_paths = ["ext/minisat/"]
17
17
  spec.rdoc_options = %w[--exclude .*\.o --exclude minisat.so]
18
18
 
19
- spec.add_development_dependency "bundler", "~> 1.3"
20
- spec.add_development_dependency "rake"
19
+ spec.add_development_dependency "rake-compiler"
21
20
  end
data/test/test_minisat.rb CHANGED
@@ -104,9 +104,9 @@ class TestMiniSat < Test::Unit::TestCase
104
104
 
105
105
  def test_var_size
106
106
  assert_equal(0, @solver.var_size)
107
- var1 = @solver.new_var
107
+ _var1 = @solver.new_var
108
108
  assert_equal(1, @solver.var_size)
109
- var2 = @solver.new_var
109
+ _var2 = @solver.new_var
110
110
  assert_equal(2, @solver.var_size)
111
111
  end
112
112
 
metadata CHANGED
@@ -1,31 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-minisat
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0.2
4
+ version: 2.2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yusuke Endoh
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2019-10-26 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.3'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.3'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
13
+ name: rake-compiler
29
14
  requirement: !ruby/object:Gem::Requirement
30
15
  requirements:
31
16
  - - ">="
@@ -46,6 +31,7 @@ extensions:
46
31
  - ext/minisat/extconf.rb
47
32
  extra_rdoc_files: []
48
33
  files:
34
+ - ".github/workflows/main.yml"
49
35
  - ".gitignore"
50
36
  - Gemfile
51
37
  - LICENSE
@@ -105,7 +91,6 @@ homepage: http://github.com/mame/ruby-minisat
105
91
  licenses:
106
92
  - MIT
107
93
  metadata: {}
108
- post_install_message:
109
94
  rdoc_options:
110
95
  - "--exclude"
111
96
  - ".*\\.o"
@@ -124,8 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  requirements: []
127
- rubygems_version: 3.0.3
128
- signing_key:
112
+ rubygems_version: 3.8.0.dev
129
113
  specification_version: 4
130
114
  summary: ruby binding for MiniSat, an open-source SAT solver
131
115
  test_files: