gecoder-with-gecode 0.8.2-mswin32 → 0.8.3-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/CHANGES +14 -0
  2. data/lib/gecode.dll +0 -0
  3. data/lib/gecoder/bindings/bindings.rb +104 -46
  4. data/lib/gecoder/interface/binding_changes.rb +1 -301
  5. data/lib/gecoder/interface/branch.rb +15 -11
  6. data/lib/gecoder/interface/constraints.rb +38 -0
  7. data/lib/gecoder/interface/constraints/bool/boolean.rb +56 -52
  8. data/lib/gecoder/interface/constraints/bool/channel.rb +1 -16
  9. data/lib/gecoder/interface/constraints/bool_enum/channel.rb +13 -8
  10. data/lib/gecoder/interface/constraints/bool_enum/extensional.rb +48 -0
  11. data/lib/gecoder/interface/constraints/extensional_regexp.rb +101 -0
  12. data/lib/gecoder/interface/constraints/int/channel.rb +1 -13
  13. data/lib/gecoder/interface/constraints/int_enum/channel.rb +15 -35
  14. data/lib/gecoder/interface/constraints/int_enum/extensional.rb +130 -0
  15. data/lib/gecoder/interface/constraints/set/channel.rb +54 -0
  16. data/lib/gecoder/interface/constraints/set_enum/channel.rb +37 -6
  17. data/lib/gecoder/interface/constraints/set_var_constraints.rb +1 -0
  18. data/lib/gecoder/interface/model.rb +110 -85
  19. data/lib/gecoder/interface/variables.rb +3 -21
  20. data/lib/gecoder/version.rb +1 -1
  21. data/specs/branch.rb +16 -1
  22. data/specs/constraints/bool_enum_relation.rb +6 -6
  23. data/specs/constraints/boolean.rb +31 -25
  24. data/specs/constraints/channel.rb +102 -4
  25. data/specs/constraints/extensional.rb +185 -2
  26. data/specs/constraints/reification_sugar.rb +2 -46
  27. data/specs/model.rb +85 -7
  28. data/tasks/dependencies.txt +1 -0
  29. data/vendor/rust/rust/class.rb +33 -35
  30. data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +1 -1
  31. data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +10 -1
  32. metadata +186 -185
  33. data/example/raw_bindings.rb +0 -44
  34. data/specs/binding_changes.rb +0 -76
data/CHANGES CHANGED
@@ -1,3 +1,17 @@
1
+ == Version 0.8.3
2
+ This release adds regular expression constraints, the last channel
3
+ constraint and various minor convenience improvements. It also fixes a
4
+ rather serious bug that occurs when using the latest patchlevels of Ruby
5
+ 1.8.6.
6
+
7
+ * [#20888] Fixed a GC bug causing problems with Ruby 1.8.6 at patchlevels around 230.
8
+ * Boolean constraints can no longer be specified using the form "bool.must == true". Only the "bool.must_be.true" form can now be used.
9
+ * Added constants in Model that contain the limits of the variables' domains.
10
+ * The domain when construction arrays and matrices of int variables now default to the same as when creating single variables (the largest possible domain).
11
+ * Model#branch_on now accepts single variables as well as enums.
12
+ * Added channel constraints between single set variables and enumerations of boolean variables.
13
+ * Added integer and boolean regular expression constraints. Thanks goes to Eivind Eklund for providing the idea for the syntax used to specify the regular expressions.
14
+
1
15
  == Version 0.8.2
2
16
  This release adds search statistics along with some new arithmetic constraints
3
17
  and channel constraints between boolean and integer variables.
data/lib/gecode.dll CHANGED
Binary file
@@ -77,7 +77,7 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
77
77
  b.include_header 'gecode/set.hh', Rust::Bindings::HeaderGlobal
78
78
  b.include_header 'gecode/search.hh', Rust::Bindings::HeaderGlobal
79
79
  b.include_header 'gecode/minimodel.hh', Rust::Bindings::HeaderGlobal
80
- b.include_header 'missing.h', Rust::Bindings::HeaderLocal
80
+ b.include_header 'gecoder.h', Rust::Bindings::HeaderLocal
81
81
 
82
82
  b.add_custom_definition ruby2intargs
83
83
  b.add_custom_definition custom_mark_definitions
@@ -351,52 +351,47 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
351
351
  klass.add_method "tuples", "int"
352
352
  end
353
353
 
354
- ns.add_cxx_class "MBranchingDesc" do |klass|
355
- klass.bindname = "BranchingDesc"
356
- klass.add_constructor
357
- klass.add_method "alternatives", "int"
358
- klass.add_method "size", "int"
359
- end
360
-
361
354
  ns.add_cxx_class "MSpace" do |klass|
362
355
  klass.bindname = "Space"
363
356
  klass.function_mark = 'Gecode_MSpace_custom_mark'
364
357
 
365
358
  klass.add_constructor
366
-
367
- klass.add_method "debug"
368
-
359
+
369
360
  klass.add_method "constrain" do |method|
370
361
  method.add_parameter "Gecode::MSpace*", "s"
371
362
  end
372
363
 
373
- klass.add_method "own" do |method|
374
- method.add_parameter "Gecode::MIntVarArray *", "x"
375
- method.add_parameter "char*", "name"
364
+ klass.add_method "new_int_var", "int" do |method|
365
+ method.add_parameter "int", "min"
366
+ method.add_parameter "int", "max"
376
367
  end
377
368
 
378
- klass.add_method "own" do |method|
379
- method.add_parameter "Gecode::MBoolVarArray *", "x"
380
- method.add_parameter "char*", "name"
369
+ klass.add_method "new_int_var", "int" do |method|
370
+ method.add_parameter "Gecode::IntSet", "domain"
381
371
  end
382
-
383
- klass.add_method "own" do |method|
384
- method.add_parameter "Gecode::MSetVarArray *", "x"
385
- method.add_parameter "char*", "name"
372
+
373
+ klass.add_method "new_bool_var", "int" do |method|
386
374
  end
387
-
388
- klass.add_method "intVarArray", "Gecode::MIntVarArray *" do |method|
389
- method.add_parameter "char *", "name"
375
+
376
+ klass.add_method "new_set_var", "int" do |method|
377
+ method.add_parameter "Gecode::IntSet", "glb"
378
+ method.add_parameter "Gecode::IntSet", "lub"
379
+ method.add_parameter "int", "cardMin"
380
+ method.add_parameter "int", "cardMax"
390
381
  end
391
-
392
- klass.add_method "boolVarArray", "Gecode::MBoolVarArray *" do |method|
393
- method.add_parameter "char *", "name"
382
+
383
+ klass.add_method "int_var", "Gecode::IntVar*" do |method|
384
+ method.add_parameter "int", "id"
394
385
  end
395
-
396
- klass.add_method "setVarArray", "Gecode::MSetVarArray *" do |method|
397
- method.add_parameter "char *", "name"
386
+
387
+ klass.add_method "bool_var", "Gecode::BoolVar*" do |method|
388
+ method.add_parameter "int", "id"
398
389
  end
399
390
 
391
+ klass.add_method "set_var", "Gecode::SetVar*" do |method|
392
+ method.add_parameter "int", "id"
393
+ end
394
+
400
395
  klass.add_method "clone", "Gecode::MSpace *" do |method|
401
396
  method.add_parameter "bool", "shared"
402
397
  end
@@ -411,13 +406,6 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
411
406
  # description method used by rspec, and isn't used directly in the
412
407
  # interface.
413
408
  #klass.add_method "mdescription", "Gecode::MBranchingDesc *", "description"
414
-
415
- klass.add_method "commit" do |method|
416
- method.add_parameter "Gecode::MBranchingDesc", "desc" do |param|
417
- param.custom_conversion = "ruby2Gecode_MBranchingDescPtr(desc, 1)->ptr()"
418
- end
419
- method.add_parameter "int", "a"
420
- end
421
409
  end
422
410
 
423
411
  # The namespace structure doesn't completely mimic Gecode's namespace
@@ -659,6 +647,57 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
659
647
  klass.add_method "next", "Gecode::MSpace *"
660
648
  klass.add_method "statistics", "Gecode::Search::Statistics"
661
649
  end
650
+
651
+ ns.add_cxx_class "DFA" do |klass|
652
+ klass.add_constructor
653
+ end
654
+
655
+ ns.add_cxx_class "REG" do |klass|
656
+ klass.add_constructor
657
+
658
+ klass.add_constructor do |method|
659
+ method.add_parameter "int", "s"
660
+ end
661
+
662
+ klass.add_constructor do |method|
663
+ method.add_parameter "Gecode::IntArgs&", "x"
664
+ end
665
+
666
+ klass.add_constructor do |method|
667
+ method.add_parameter "Gecode::REG&", "r"
668
+ end
669
+
670
+ klass.add_operator "+", "Gecode::REG" do |operator|
671
+ operator.add_parameter "Gecode::REG&", "r"
672
+ end
673
+
674
+ klass.add_operator "+=", "Gecode::REG&" do |operator|
675
+ operator.add_parameter "Gecode::REG&", "r"
676
+ end
677
+
678
+ klass.add_operator "|", "Gecode::REG" do |operator|
679
+ operator.add_parameter "Gecode::REG&", "r"
680
+ end
681
+
682
+ klass.add_operator "|=", "Gecode::REG&" do |operator|
683
+ operator.add_parameter "Gecode::REG&", "r"
684
+ end
685
+
686
+ klass.add_operator "*", "Gecode::REG" do |operator|
687
+ end
688
+
689
+ klass.add_operator "+", "Gecode::REG" do |operator|
690
+ end
691
+
692
+ klass.add_operator "()", "Gecode::REG" do |operator|
693
+ operator.add_parameter "int", "n"
694
+ operator.add_parameter "int", "m"
695
+ end
696
+
697
+ klass.add_operator "()", "Gecode::REG" do |operator|
698
+ operator.add_parameter "int", "n"
699
+ end
700
+ end
662
701
 
663
702
  # SEARCH NAMESPACE
664
703
 
@@ -789,7 +828,7 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
789
828
  method.add_parameter "Gecode::MiniModel::LinRel<Gecode::BoolVar>", "e"
790
829
  end
791
830
 
792
- klass.add_method "post" do |method|
831
+ klass.add_method "post", "Gecode::BoolVar" do |method|
793
832
  method.add_parameter "Gecode::MSpace *", "home"
794
833
  method.add_parameter "Gecode::IntConLevel", "icl"
795
834
  method.add_parameter "Gecode::PropKind", "pk"
@@ -1276,14 +1315,25 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
1276
1315
  func.add_parameter "Gecode::PropKind", "pk"
1277
1316
  end
1278
1317
 
1279
- # ns.add_function "regular", "void" do |func|
1280
- # func.add_parameter "Gecode::MSpace*", "home"
1281
- # func.add_parameter "Gecode::MIntVarArray *", "x" do |param|
1282
- # param.custom_conversion = "*ruby2Gecode_MIntVarArrayPtr(argv[1], 2)->ptr()"
1283
- # end
1284
- # func.add_parameter "Gecode::DFA", "dfa" # TODO: add class DFA
1285
- # func.add_parameter "Gecode::IntConLevel", "icl", true
1286
- # end
1318
+ ns.add_function "extensional", "void" do |func|
1319
+ func.add_parameter "Gecode::MSpace*", "home"
1320
+ func.add_parameter "Gecode::MIntVarArray *", "x" do |param|
1321
+ param.custom_conversion = "*ruby2Gecode_MIntVarArrayPtr(argv[1], 2)->ptr()"
1322
+ end
1323
+ func.add_parameter "Gecode::REG", "dfa"
1324
+ func.add_parameter "Gecode::IntConLevel", "icl"
1325
+ func.add_parameter "Gecode::PropKind", "pk"
1326
+ end
1327
+
1328
+ ns.add_function "extensional", "void" do |func|
1329
+ func.add_parameter "Gecode::MSpace*", "home"
1330
+ func.add_parameter "Gecode::MBoolVarArray *", "x" do |param|
1331
+ param.custom_conversion = "*ruby2Gecode_MBoolVarArrayPtr(argv[1], 2)->ptr()"
1332
+ end
1333
+ func.add_parameter "Gecode::REG", "dfa"
1334
+ func.add_parameter "Gecode::IntConLevel", "icl"
1335
+ func.add_parameter "Gecode::PropKind", "pk"
1336
+ end
1287
1337
 
1288
1338
  ns.add_function "bab", "Gecode::MSpace*" do |func|
1289
1339
  func.add_parameter "Gecode::MSpace*", "home"
@@ -1765,6 +1815,14 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
1765
1815
  param.custom_conversion = "*ruby2Gecode_MSetVarArrayPtr(argv[2], 3)->ptr()"
1766
1816
  end
1767
1817
  end
1818
+
1819
+ ns.add_function "channel" do |func|
1820
+ func.add_parameter "Gecode::MSpace*", "home"
1821
+ func.add_parameter "Gecode::MBoolVarArray", "x" do |param|
1822
+ param.custom_conversion = "*ruby2Gecode_MBoolVarArrayPtr(argv[1], 2)->ptr()"
1823
+ end
1824
+ func.add_parameter "Gecode::SetVar", "y"
1825
+ end
1768
1826
 
1769
1827
  ns.add_function "weights" do |func|
1770
1828
  func.add_parameter "Gecode::MSpace*", "home"
@@ -1,309 +1,9 @@
1
- # This file adds a small layer on top of the bindings. It alters the allocation
2
- # of variables so that a single array is allocated in each space which is then
3
- # used to store variable. The variables themselves are not directly returned,
4
- # rather they are represented as the index in that store, which allows the
5
- # variable to be retrieved back given a space.
6
- #
7
- # This layer should be moved to the C++ side instead when possible for better
8
- # performance.
1
+ # This file adds a small layer on top of the bindings.
9
2
  module GecodeRaw #:nodoc: all
10
3
  class Space
11
- # Creates the specified number of integer variables in the space with the
12
- # specified domain. Returns the indices with which they can then be
13
- # accessed using int_var. The domain can be given as a Range (trated
14
- # specially) or as another enum.
15
- def new_int_vars(domain, count = 1)
16
- int_var_store.new_vars(domain, count)
17
- end
18
-
19
- # Gets the int variable with the specified index, nil if none exists.
20
- def int_var(index)
21
- int_var_store[index]
22
- end
23
-
24
- # Creates the specified number of boolean variables in the space. Returns
25
- # the indices with which they can then be accessed using bool_var.
26
- def new_bool_vars(count = 1)
27
- bool_var_store.new_vars(count)
28
- end
29
-
30
- # Gets the bool variable with the specified index, nil if none exists.
31
- def bool_var(index)
32
- bool_var_store[index]
33
- end
34
-
35
- # Creates the specified number of set variables in the space with the
36
- # specified domain for greatest lower bound and least upper bound
37
- # (specified as either a range or enum). A range for the allowed
38
- # cardinality of the set can also be specified, if none is specified, or
39
- # nil is given, then the default range (anything) will be used. Returns
40
- # the indices with which they can then be accessed using set_var.
41
- def new_set_vars(*vars)
42
- set_var_store.new_vars(*vars)
43
- end
44
-
45
- # Gets the set variable with the specified index, nil if none exists.
46
- def set_var(index)
47
- set_var_store[index]
48
- end
49
-
50
4
  # Used by Gecode during BAB-search.
51
5
  def constrain(best_so_far_space)
52
6
  Gecode::Model.constrain(self, best_so_far_space)
53
7
  end
54
-
55
- # Refreshes the underlying stores used by the space.
56
- def refresh
57
- @int_var_store = nil
58
- @bool_var_store = nil
59
- @set_var_store = nil
60
- end
61
-
62
- private
63
-
64
- # Retrieves the store used for integer variables. Creates one if none
65
- # exists.
66
- def int_var_store
67
- # TODO: caching interferes with the variable creation during BAB-search,
68
- # find out why.
69
- #if @int_var_store.nil?
70
- @int_var_store = Gecode::Util::IntVarStore.new(self)
71
- #end
72
- return @int_var_store
73
- end
74
-
75
- # Retrieves the store used for boolean variables. Creates one if none
76
- # exists.
77
- def bool_var_store
78
- #if @bool_var_store.nil?
79
- @bool_var_store = Gecode::Util::BoolVarStore.new(self)
80
- #end
81
- return @bool_var_store
82
- end
83
-
84
- # Retrieves the store used for set variables. Creates one if none exists.
85
- def set_var_store
86
- #if @set_var_store.nil?
87
- @set_var_store = Gecode::Util::SetVarStore.new(self)
88
- #end
89
- return @set_var_store
90
- end
91
- end
92
- end
93
-
94
- module Gecode
95
- # Various utility (mainly used to change the behavior of the raw bindings).
96
- module Util #:nodoc: all
97
- # Provides common methods to the variable stores. The stores must provide
98
- # @next_index, @var_array, @size, ARRAY_IDENTIFIER and #new_storage_array .
99
- module VarStoreMethods
100
- # Returns the int var with the specified index, nil if none exists.
101
- def [](index)
102
- if index < 0 or index >= @next_index
103
- return nil
104
- end
105
- return @var_array.at(index)
106
- end
107
-
108
- private
109
-
110
- # Grows the store to the new size.
111
- def grow(new_size)
112
- @var_array.enlargeArray(@space, new_size - @size)
113
- @size = new_size
114
- end
115
- end
116
-
117
- # A store in which int variables are created and stored.
118
- class IntVarStore
119
- # Design note: The store used to double its size when it needed to grow
120
- # leaving unallocated slots (in rev 16). This was changed to only growing
121
- # the amount of space needed because the additional information about which
122
- # slot is the next unallocated one could not be encoded without changes to
123
- # the bindings (and without that information we can not deduce the store
124
- # from the new copy of space). So for additional performance the bindings
125
- # should grow the array more than needed (when this is moved to the bindings).
126
-
127
- include VarStoreMethods
128
-
129
- private
130
-
131
- # A string that identifies the array used by the store.
132
- ARRAY_IDENTIFIER = 'int_array'
133
-
134
- public
135
-
136
- # Creates a store for the specified space with the specified capacit.
137
- def initialize(space)
138
- @space = space
139
-
140
- @var_array = space.int_var_array(ARRAY_IDENTIFIER)
141
- if @var_array.nil?
142
- # Create a new one.
143
- @var_array = new_storage_array(0)
144
- end
145
-
146
- @size = @var_array.size
147
- @next_index = @size
148
- end
149
-
150
- # Creates the specified number of integer variables in the space with the
151
- # specified domain. Returns the indices with which they can then be
152
- # accessed using int_var. The domain can be given as a Range (trated
153
- # specially) or as another enum.
154
- def new_vars(domain, count = 1)
155
- grow(@next_index + count) # See the design note for more information.
156
- count.times do |i|
157
- if domain.kind_of? Range
158
- domain_params = [domain.first, domain.last]
159
- elsif domain.kind_of? Enumerable
160
- arr = domain.to_a
161
- domain_params = [Gecode::Raw::IntSet.new(arr, arr.size)]
162
- else
163
- raise TypeError, "Expected Enumerable, got #{domain.class}."
164
- end
165
-
166
- @var_array[@next_index] = Gecode::Raw::IntVar.new(@space,
167
- *domain_params)
168
- @next_index += 1
169
- end
170
-
171
- ((@next_index - count)...@next_index).to_a
172
- end
173
-
174
- # Returns the int var with the specified index, nil if none exists.
175
- def [](index)
176
- if index < 0 or index >= @next_index
177
- return nil
178
- end
179
- return @var_array.at(index)
180
- end
181
-
182
- private
183
-
184
- # Creates a new storage array for int variables.
185
- def new_storage_array(new_size)
186
- arr = Gecode::Raw::IntVarArray.new(@space, new_size)
187
- @space.own(arr, ARRAY_IDENTIFIER)
188
- return arr
189
- end
190
- end
191
-
192
- # A store in which int variables are created and stored.
193
- class BoolVarStore
194
- # TODO: can we refactor this better seeing as IntVarStore and BoolVarStore
195
- # are similar?
196
-
197
- include VarStoreMethods
198
-
199
- private
200
-
201
- # A string that identifies the array used by the store.
202
- ARRAY_IDENTIFIER = 'bool_array'
203
-
204
- public
205
-
206
- # Creates a store for the specified space with the specified capacit.
207
- def initialize(space)
208
- @space = space
209
-
210
- @var_array = space.bool_var_array(ARRAY_IDENTIFIER)
211
- if @var_array.nil?
212
- # Create a new one.
213
- @var_array = new_storage_array(0)
214
- end
215
-
216
- @size = @var_array.size
217
- @next_index = @size
218
- end
219
-
220
- # Creates the specified number of new bool variables. Returns the indices
221
- # of the created variables as an array.
222
- def new_vars(count = 1)
223
- grow(@next_index + count) # See the design note for more information.
224
- count.times do |i|
225
- @var_array[@next_index] = Gecode::Raw::BoolVar.new(@space, 0, 1)
226
- @next_index += 1
227
- end
228
-
229
- ((@next_index - count)...@next_index).to_a
230
- end
231
-
232
- private
233
-
234
- # Creates a new storage array for bool variables.
235
- def new_storage_array(new_size)
236
- arr = Gecode::Raw::BoolVarArray.new(@space, new_size)
237
- @space.own(arr, ARRAY_IDENTIFIER)
238
- return arr
239
- end
240
- end
241
-
242
- # A store in which int variables are created and stored.
243
- class SetVarStore
244
- include VarStoreMethods
245
-
246
- private
247
-
248
- # A string that identifies the array used by the store.
249
- ARRAY_IDENTIFIER = 'set_array'
250
-
251
- public
252
-
253
- # Creates a store for the specified space with the specified capacit.
254
- def initialize(space)
255
- @space = space
256
-
257
- @var_array = space.set_var_array(ARRAY_IDENTIFIER)
258
- if @var_array.nil?
259
- # Create a new one.
260
- @var_array = new_storage_array(0)
261
- end
262
-
263
- @size = @var_array.size
264
- @next_index = @size
265
- end
266
-
267
- # Creates the specified number of set variables in the space with the
268
- # specified domain for greatest lower bound and least upper bound
269
- # (specified as either a range or enum). A range for the allowed
270
- # cardinality of the set can also be specified, if none is specified, or
271
- # nil is given, then the default range (anything) will be used. Returns
272
- # the indices with which they can then be accessed using set_var.
273
- def new_vars(glb_domain, lub_domain, cardinality_range = nil, count = 1)
274
- grow(@next_index + count) # See the design note for more information.
275
-
276
- if cardinality_range.nil?
277
- cardinality_range = 0..Gecode::Raw::SetLimits::CARD
278
- end
279
-
280
- params = [@space]
281
- params << domain_to_args(glb_domain)
282
- params << domain_to_args(lub_domain)
283
- params << cardinality_range.first << cardinality_range.last
284
- count.times do |i|
285
- @var_array[@next_index] = Gecode::Raw::SetVar.new(*params.flatten)
286
- @next_index += 1
287
- end
288
-
289
- ((@next_index - count)...@next_index).to_a
290
- end
291
-
292
- private
293
-
294
- # Transforms a lub or glb domain given as a fixnum, range or enumeration
295
- # into one or more parameters that describe the domain to
296
- # Gecode::Raw::SetVar .
297
- def domain_to_args(domain)
298
- Gecode::Constraints::Util.constant_set_to_int_set(domain)
299
- end
300
-
301
- # Creates a new storage array for bool variables.
302
- def new_storage_array(new_size)
303
- arr = Gecode::Raw::SetVarArray.new(@space, new_size)
304
- @space.own(arr, ARRAY_IDENTIFIER)
305
- return arr
306
- end
307
- end
308
8
  end
309
9
  end