gecoder-with-gecode 0.7.1-mswin32

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.
Files changed (159) hide show
  1. data/CHANGES +81 -0
  2. data/COPYING +17 -0
  3. data/LGPL-LICENSE +458 -0
  4. data/README +45 -0
  5. data/Rakefile +13 -0
  6. data/example/example_helper.rb +1 -0
  7. data/example/magic_sequence.rb +43 -0
  8. data/example/queens.rb +43 -0
  9. data/example/raw_bindings.rb +42 -0
  10. data/example/send_more_money.rb +43 -0
  11. data/example/send_most_money.rb +58 -0
  12. data/example/square_tiling.rb +84 -0
  13. data/example/sudoku-set.rb +110 -0
  14. data/example/sudoku.rb +61 -0
  15. data/lib/gecode.dll +0 -0
  16. data/lib/gecoder.rb +5 -0
  17. data/lib/gecoder/bindings.rb +54 -0
  18. data/lib/gecoder/bindings/bindings.rb +2210 -0
  19. data/lib/gecoder/interface.rb +8 -0
  20. data/lib/gecoder/interface/binding_changes.rb +313 -0
  21. data/lib/gecoder/interface/branch.rb +152 -0
  22. data/lib/gecoder/interface/constraints.rb +397 -0
  23. data/lib/gecoder/interface/constraints/bool/boolean.rb +246 -0
  24. data/lib/gecoder/interface/constraints/bool/linear.rb +29 -0
  25. data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +84 -0
  26. data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +8 -0
  27. data/lib/gecoder/interface/constraints/bool_var_constraints.rb +75 -0
  28. data/lib/gecoder/interface/constraints/int/arithmetic.rb +71 -0
  29. data/lib/gecoder/interface/constraints/int/domain.rb +78 -0
  30. data/lib/gecoder/interface/constraints/int/linear.rb +295 -0
  31. data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +72 -0
  32. data/lib/gecoder/interface/constraints/int_enum/channel.rb +100 -0
  33. data/lib/gecoder/interface/constraints/int_enum/count.rb +92 -0
  34. data/lib/gecoder/interface/constraints/int_enum/distinct.rb +69 -0
  35. data/lib/gecoder/interface/constraints/int_enum/element.rb +82 -0
  36. data/lib/gecoder/interface/constraints/int_enum/equality.rb +38 -0
  37. data/lib/gecoder/interface/constraints/int_enum/sort.rb +126 -0
  38. data/lib/gecoder/interface/constraints/int_enum_constraints.rb +37 -0
  39. data/lib/gecoder/interface/constraints/int_var_constraints.rb +58 -0
  40. data/lib/gecoder/interface/constraints/reifiable_constraints.rb +78 -0
  41. data/lib/gecoder/interface/constraints/set/cardinality.rb +75 -0
  42. data/lib/gecoder/interface/constraints/set/connection.rb +193 -0
  43. data/lib/gecoder/interface/constraints/set/domain.rb +109 -0
  44. data/lib/gecoder/interface/constraints/set/operation.rb +132 -0
  45. data/lib/gecoder/interface/constraints/set/relation.rb +178 -0
  46. data/lib/gecoder/interface/constraints/set_enum/channel.rb +18 -0
  47. data/lib/gecoder/interface/constraints/set_enum/distinct.rb +80 -0
  48. data/lib/gecoder/interface/constraints/set_enum/operation.rb +60 -0
  49. data/lib/gecoder/interface/constraints/set_enum/selection.rb +217 -0
  50. data/lib/gecoder/interface/constraints/set_enum_constraints.rb +34 -0
  51. data/lib/gecoder/interface/constraints/set_var_constraints.rb +72 -0
  52. data/lib/gecoder/interface/enum_matrix.rb +64 -0
  53. data/lib/gecoder/interface/enum_wrapper.rb +153 -0
  54. data/lib/gecoder/interface/model.rb +251 -0
  55. data/lib/gecoder/interface/search.rb +123 -0
  56. data/lib/gecoder/interface/variables.rb +254 -0
  57. data/lib/gecoder/version.rb +4 -0
  58. data/specs/binding_changes.rb +76 -0
  59. data/specs/bool_var.rb +74 -0
  60. data/specs/branch.rb +170 -0
  61. data/specs/constraints/arithmetic.rb +266 -0
  62. data/specs/constraints/bool_enum.rb +140 -0
  63. data/specs/constraints/boolean.rb +232 -0
  64. data/specs/constraints/cardinality.rb +154 -0
  65. data/specs/constraints/channel.rb +126 -0
  66. data/specs/constraints/connection.rb +373 -0
  67. data/specs/constraints/constraint_helper.rb +180 -0
  68. data/specs/constraints/constraints.rb +74 -0
  69. data/specs/constraints/count.rb +139 -0
  70. data/specs/constraints/distinct.rb +218 -0
  71. data/specs/constraints/element.rb +106 -0
  72. data/specs/constraints/equality.rb +31 -0
  73. data/specs/constraints/int_domain.rb +69 -0
  74. data/specs/constraints/int_relation.rb +78 -0
  75. data/specs/constraints/linear.rb +332 -0
  76. data/specs/constraints/reification_sugar.rb +96 -0
  77. data/specs/constraints/selection.rb +292 -0
  78. data/specs/constraints/set_domain.rb +181 -0
  79. data/specs/constraints/set_operation.rb +285 -0
  80. data/specs/constraints/set_relation.rb +201 -0
  81. data/specs/constraints/sort.rb +175 -0
  82. data/specs/distribution.rb +14 -0
  83. data/specs/enum_matrix.rb +43 -0
  84. data/specs/enum_wrapper.rb +122 -0
  85. data/specs/int_var.rb +144 -0
  86. data/specs/logging.rb +24 -0
  87. data/specs/model.rb +190 -0
  88. data/specs/search.rb +246 -0
  89. data/specs/set_var.rb +68 -0
  90. data/specs/spec_helper.rb +93 -0
  91. data/tasks/all_tasks.rb +1 -0
  92. data/tasks/building.howto +65 -0
  93. data/tasks/distribution.rake +156 -0
  94. data/tasks/rcov.rake +17 -0
  95. data/tasks/specs.rake +15 -0
  96. data/tasks/svn.rake +11 -0
  97. data/tasks/website.rake +51 -0
  98. data/vendor/gecode/win32/lib/libgecodeint.dll +0 -0
  99. data/vendor/gecode/win32/lib/libgecodekernel.dll +0 -0
  100. data/vendor/gecode/win32/lib/libgecodeminimodel.dll +0 -0
  101. data/vendor/gecode/win32/lib/libgecodesearch.dll +0 -0
  102. data/vendor/gecode/win32/lib/libgecodeset.dll +0 -0
  103. data/vendor/rust/README +28 -0
  104. data/vendor/rust/bin/cxxgenerator.rb +93 -0
  105. data/vendor/rust/include/rust_checks.hh +115 -0
  106. data/vendor/rust/include/rust_conversions.hh +102 -0
  107. data/vendor/rust/rust.rb +67 -0
  108. data/vendor/rust/rust/attribute.rb +51 -0
  109. data/vendor/rust/rust/bindings.rb +172 -0
  110. data/vendor/rust/rust/class.rb +339 -0
  111. data/vendor/rust/rust/constants.rb +48 -0
  112. data/vendor/rust/rust/container.rb +110 -0
  113. data/vendor/rust/rust/cppifaceparser.rb +129 -0
  114. data/vendor/rust/rust/cwrapper.rb +72 -0
  115. data/vendor/rust/rust/cxxclass.rb +98 -0
  116. data/vendor/rust/rust/element.rb +81 -0
  117. data/vendor/rust/rust/enum.rb +63 -0
  118. data/vendor/rust/rust/function.rb +407 -0
  119. data/vendor/rust/rust/namespace.rb +61 -0
  120. data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +17 -0
  121. data/vendor/rust/rust/templates/AttributeInitBinding.rusttpl +9 -0
  122. data/vendor/rust/rust/templates/BindingsHeader.rusttpl +24 -0
  123. data/vendor/rust/rust/templates/BindingsUnit.rusttpl +46 -0
  124. data/vendor/rust/rust/templates/CWrapperClassDefinitions.rusttpl +64 -0
  125. data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +7 -0
  126. data/vendor/rust/rust/templates/ClassInitialize.rusttpl +6 -0
  127. data/vendor/rust/rust/templates/ConstructorStub.rusttpl +21 -0
  128. data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +91 -0
  129. data/vendor/rust/rust/templates/CxxMethodStub.rusttpl +12 -0
  130. data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +26 -0
  131. data/vendor/rust/rust/templates/EnumDeclarations.rusttpl +3 -0
  132. data/vendor/rust/rust/templates/EnumDefinitions.rusttpl +29 -0
  133. data/vendor/rust/rust/templates/FunctionDefinition.rusttpl +9 -0
  134. data/vendor/rust/rust/templates/FunctionInitAlias.rusttpl +5 -0
  135. data/vendor/rust/rust/templates/FunctionInitBinding.rusttpl +9 -0
  136. data/vendor/rust/rust/templates/MethodInitBinding.rusttpl +9 -0
  137. data/vendor/rust/rust/templates/ModuleDeclarations.rusttpl +3 -0
  138. data/vendor/rust/rust/templates/ModuleDefinitions.rusttpl +3 -0
  139. data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +7 -0
  140. data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +14 -0
  141. data/vendor/rust/rust/type.rb +98 -0
  142. data/vendor/rust/test/Makefile +4 -0
  143. data/vendor/rust/test/constants.rb +36 -0
  144. data/vendor/rust/test/cppclass.cc +45 -0
  145. data/vendor/rust/test/cppclass.hh +67 -0
  146. data/vendor/rust/test/cppclass.rb +59 -0
  147. data/vendor/rust/test/cwrapper.c +74 -0
  148. data/vendor/rust/test/cwrapper.h +41 -0
  149. data/vendor/rust/test/cwrapper.rb +56 -0
  150. data/vendor/rust/test/dummyclass.hh +31 -0
  151. data/vendor/rust/test/lib/extension-test.rb +98 -0
  152. data/vendor/rust/test/operators.cc +41 -0
  153. data/vendor/rust/test/operators.hh +39 -0
  154. data/vendor/rust/test/operators.rb +39 -0
  155. data/vendor/rust/test/test-constants.rb +43 -0
  156. data/vendor/rust/test/test-cppclass.rb +82 -0
  157. data/vendor/rust/test/test-cwrapper.rb +80 -0
  158. data/vendor/rust/test/test-operators.rb +42 -0
  159. metadata +293 -0
@@ -0,0 +1,96 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ class ReifSugarSampleProblem < Gecode::Model
4
+ attr :x
5
+ attr :y
6
+ attr :z
7
+
8
+ def initialize
9
+ @x = int_var(0..1)
10
+ @y = int_var(1..2)
11
+ @z = int_var(3..4)
12
+ branch_on wrap_enum([@x, @y, @z])
13
+ end
14
+ end
15
+
16
+ describe Gecode::Constraints::ReifiableConstraint do
17
+ before do
18
+ @model = ReifSugarSampleProblem.new
19
+ @x = @model.x
20
+ @y = @model.y
21
+ @z = @model.z
22
+ end
23
+
24
+ it 'should fail disjunctions if neither side can be satisfied' do
25
+ (@x.must == 3) | (@y.must == 3)
26
+ @model.solve!.should be_nil
27
+ end
28
+
29
+ it 'should translate disjunctions' do
30
+ Gecode::Raw.should_receive(:rel).once.with(
31
+ an_instance_of(Gecode::Raw::Space),
32
+ an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_GR, 0,
33
+ an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF)
34
+ Gecode::Raw.should_receive(:rel).once.with(
35
+ an_instance_of(Gecode::Raw::Space),
36
+ an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_EQ, 3,
37
+ an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF)
38
+ (@x.must > 0) | (@y.must == 3)
39
+ sol = @model.solve!
40
+ end
41
+
42
+ it 'should solve disjunctions' do
43
+ (@x.must > 0) | (@y.must == 3)
44
+ sol = @model.solve!
45
+ sol.should_not be_nil
46
+ sol.x.should have_domain([1])
47
+ end
48
+
49
+ it 'should fail conjunctions if one side can\'t be satisfied' do
50
+ (@x.must > 3) & (@y.must == 3)
51
+ @model.solve!.should be_nil
52
+ end
53
+
54
+ it 'should translate conjunctions' do
55
+ Gecode::Raw.should_receive(:rel).once.with(
56
+ an_instance_of(Gecode::Raw::Space),
57
+ an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_GR, 0,
58
+ an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF)
59
+ Gecode::Raw.should_receive(:rel).once.with(
60
+ an_instance_of(Gecode::Raw::Space),
61
+ an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_EQ, 2,
62
+ an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF)
63
+ (@x.must > 0) & (@y.must == 2)
64
+ sol = @model.solve!
65
+ end
66
+
67
+ it 'should solve conjunctions' do
68
+ (@x.must > 0) & (@y.must == 2)
69
+ sol = @model.solve!
70
+ sol.should_not be_nil
71
+ sol.x.should have_domain([1])
72
+ sol.y.should have_domain([2])
73
+ end
74
+
75
+ it 'should handle the same variable being used multiple times' do
76
+ (@z.must == 4) | (@z.must == 4)
77
+ sol = @model.solve!
78
+ sol.should_not be_nil
79
+ sol.z.should have_domain([4])
80
+ end
81
+
82
+ it 'should handle nested operations' do
83
+ ((@x.must > 3) & (@y.must == 2)) | (@z.must == 4) | (
84
+ (@x.must == 0) & (@z.must == 4))
85
+ sol = @model.solve!
86
+ sol.should_not be_nil
87
+ sol.x.should have_domain([0])
88
+ sol.z.should have_domain([4])
89
+ end
90
+
91
+ it 'should handle negations' do
92
+ (@z.must_not == 4) & (@z.must == 4)
93
+ sol = @model.solve!
94
+ sol.should be_nil
95
+ end
96
+ end
@@ -0,0 +1,292 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require File.dirname(__FILE__) + '/constraint_helper'
3
+
4
+ class SelectionSampleProblem < Gecode::Model
5
+ attr :sets
6
+ attr :set
7
+ attr :target
8
+ attr :index
9
+
10
+ def initialize
11
+ @sets = set_var_array(3, [], 0..20)
12
+ @set = set_var([], 0...3)
13
+ @target = set_var([], 0..20)
14
+ @index = int_var(0...3)
15
+ branch_on wrap_enum([@index])
16
+ branch_on @sets
17
+ end
18
+ end
19
+
20
+ # Requires everything that composite behaviour spec requires in addition to
21
+ # @stub and @expect_constrain_equal .
22
+ describe 'selection constraint', :shared => true do
23
+ before do
24
+ @expect = lambda do |index, relation, target, reif_var, negated|
25
+ @model.allow_space_access do
26
+ if target.respond_to? :bind
27
+ expected_target = [an_instance_of(Gecode::Raw::SetVar)]
28
+ relation_constraint = :rel
29
+ else
30
+ expected_target = expect_constant_set(target)
31
+ relation_constraint = :dom
32
+ end
33
+ if reif_var.nil?
34
+ if !negated and relation == Gecode::Raw::IRT_EQ and
35
+ !target.kind_of? Enumerable
36
+ @expect_constrain_equal.call
37
+ Gecode::Raw.should_receive(:rel).exactly(0).times
38
+ Gecode::Raw.should_receive(:dom).exactly(0).times
39
+ else
40
+ @expect_constrain_equal.call
41
+ if relation_constraint == :dom
42
+ # We can't seem to get any more specific than this with mocks.
43
+ Gecode::Raw.should_receive(relation_constraint).at_most(:twice)
44
+ else
45
+ Gecode::Raw.should_receive(relation_constraint).once.with(
46
+ an_instance_of(Gecode::Raw::Space),
47
+ an_instance_of(Gecode::Raw::SetVar), relation, *expected_target)
48
+ end
49
+ end
50
+ else
51
+ @expect_constrain_equal.call
52
+ if relation_constraint == :dom
53
+ Gecode::Raw.should_receive(relation_constraint).at_least(:twice)
54
+ else
55
+ expected_target << an_instance_of(Gecode::Raw::BoolVar)
56
+ Gecode::Raw.should_receive(relation_constraint).once.with(
57
+ an_instance_of(Gecode::Raw::Space),
58
+ an_instance_of(Gecode::Raw::SetVar), relation, *expected_target)
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ # For composite spec.
65
+ @invoke_relation = lambda do |relation, target, negated|
66
+ if negated
67
+ @stub.must_not.send(relation, target)
68
+ else
69
+ @stub.must.send(relation, target)
70
+ end
71
+ @model.solve!
72
+ end
73
+ @expect_relation = lambda do |relation, target, negated|
74
+ @expect.call(@index, relation, target, nil, negated)
75
+ end
76
+
77
+ # For options spec.
78
+ @invoke_options = lambda do |hash|
79
+ @stub.must_be.subset_of(@target, hash)
80
+ @model.solve!
81
+ end
82
+ @expect_options = lambda do |strength, reif_var|
83
+ @expect.call(17, Gecode::Raw::SRT_SUB, @target, reif_var, false)
84
+ end
85
+ end
86
+
87
+ it 'should not disturb normal array access' do
88
+ @sets[0].should be_kind_of(Gecode::FreeSetVar)
89
+ end
90
+
91
+ it_should_behave_like 'reifiable set constraint'
92
+ it_should_behave_like 'composite set constraint'
93
+ end
94
+
95
+ describe Gecode::Constraints::SetEnum::Selection, ' (select)' do
96
+ include GecodeR::Specs::SetHelper
97
+
98
+ before do
99
+ @model = SelectionSampleProblem.new
100
+ @sets = @model.sets
101
+ @target = @set = @model.target
102
+ @index = @model.index
103
+ @model.branch_on @model.wrap_enum([@set])
104
+ @stub = @sets[@index]
105
+
106
+ @expect_constrain_equal = lambda do
107
+ Gecode::Raw.should_receive(:selectSet).once.with(
108
+ an_instance_of(Gecode::Raw::Space),
109
+ an_instance_of(Gecode::Raw::SetVarArray),
110
+ an_instance_of(Gecode::Raw::IntVar),
111
+ an_instance_of(Gecode::Raw::SetVar))
112
+ end
113
+ end
114
+
115
+ it 'should constrain the specified element of an enum of sets' do
116
+ @sets[@index].must_be.superset_of([5,7,9])
117
+ @model.solve!
118
+ @sets[@index.value].value.should include(5,7,9)
119
+ end
120
+
121
+ it_should_behave_like 'selection constraint'
122
+ end
123
+
124
+ describe Gecode::Constraints::SetEnum::Selection, ' (union)' do
125
+ include GecodeR::Specs::SetHelper
126
+
127
+ before do
128
+ @model = SelectionSampleProblem.new
129
+ @sets = @model.sets
130
+ @set = @model.set
131
+ @target = @model.target
132
+ @model.branch_on @model.wrap_enum([@target, @set])
133
+ @stub = @sets[@set].union
134
+
135
+ @expect_constrain_equal = lambda do
136
+ Gecode::Raw.should_receive(:selectUnion).once.with(
137
+ an_instance_of(Gecode::Raw::Space),
138
+ an_instance_of(Gecode::Raw::SetVarArray),
139
+ an_instance_of(Gecode::Raw::SetVar),
140
+ an_instance_of(Gecode::Raw::SetVar))
141
+ end
142
+ end
143
+
144
+ it 'should constrain the selected union of an enum of sets' do
145
+ @sets[@set].union.must_be.subset_of([5,7,9])
146
+ @sets[@set].union.must_be.superset_of([5])
147
+ @model.solve!
148
+ union = @set.value.inject([]) do |union, i|
149
+ union += @sets[i].value.to_a
150
+ end.uniq
151
+ union.should include(5)
152
+ (union - [5,7,9]).should be_empty
153
+ end
154
+
155
+ it_should_behave_like 'selection constraint'
156
+ end
157
+
158
+ describe Gecode::Constraints::SetEnum::Selection, ' (intersection)' do
159
+ include GecodeR::Specs::SetHelper
160
+
161
+ before do
162
+ @model = SelectionSampleProblem.new
163
+ @sets = @model.sets
164
+ @set = @model.set
165
+ @target = @model.target
166
+ @model.branch_on @model.wrap_enum([@target, @set])
167
+ @stub = @sets[@set].intersection
168
+
169
+ @expect_constrain_equal = lambda do
170
+ Gecode::Raw.should_receive(:selectInter).once.with(
171
+ an_instance_of(Gecode::Raw::Space),
172
+ an_instance_of(Gecode::Raw::SetVarArray),
173
+ an_instance_of(Gecode::Raw::SetVar),
174
+ an_instance_of(Gecode::Raw::SetVar))
175
+ end
176
+ end
177
+
178
+ it 'should constrain the selected intersection of an enum of sets' do
179
+ @sets[@set].intersection.must_be.subset_of([5,7,9])
180
+ @sets[@set].intersection.must_be.superset_of([5])
181
+ @model.solve!
182
+ intersection = @set.value.inject(nil) do |intersection, i|
183
+ elements = @sets[i].value.to_a
184
+ next elements if intersection.nil?
185
+ intersection &= elements
186
+ end.uniq
187
+ intersection.should include(5)
188
+ (intersection - [5,7,9]).should be_empty
189
+ end
190
+
191
+ it_should_behave_like 'selection constraint'
192
+ end
193
+
194
+ describe Gecode::Constraints::SetEnum::Selection, ' (intersection with universe)' do
195
+ include GecodeR::Specs::SetHelper
196
+
197
+ before do
198
+ @model = SelectionSampleProblem.new
199
+ @sets = @model.sets
200
+ @set = @model.set
201
+ @target = @model.target
202
+ @model.branch_on @model.wrap_enum([@target, @set])
203
+ @universe = [1,2]
204
+ @stub = @sets[@set].intersection(:with => @universe)
205
+
206
+ @expect_constrain_equal = lambda do
207
+ Gecode::Raw.should_receive(:selectInterIn).once.with(
208
+ an_instance_of(Gecode::Raw::Space),
209
+ an_instance_of(Gecode::Raw::SetVarArray),
210
+ an_instance_of(Gecode::Raw::SetVar),
211
+ an_instance_of(Gecode::Raw::SetVar),
212
+ an_instance_of(Gecode::Raw::IntSet))
213
+ end
214
+ end
215
+
216
+ it 'should constrain the selected intersection of an enum of sets in a universe' do
217
+ @sets[@set].intersection(:with => @universe).must_be.subset_of([2])
218
+ @model.solve!
219
+ intersection = @set.value.inject(@universe) do |intersection, i|
220
+ intersection &= @sets[i].value.to_a
221
+ end.uniq
222
+ intersection.should include(2)
223
+ (intersection - [1,2]).should be_empty
224
+ end
225
+
226
+ it 'should allow the universe to be specified as a range' do
227
+ @sets[@set].intersection(:with => 1..2).must_be.subset_of([2])
228
+ @model.solve!
229
+ intersection = @set.value.inject(@universe) do |intersection, i|
230
+ intersection &= @sets[i].value.to_a
231
+ end.uniq
232
+ intersection.should include(2)
233
+ (intersection - [1,2]).should be_empty
234
+ end
235
+
236
+ it 'should raise error if unknown options are specified' do
237
+ lambda do
238
+ @sets[@set].intersection(:does_not_exist => nil).must_be.subset_of([2])
239
+ end.should raise_error(ArgumentError)
240
+ end
241
+
242
+ it 'should raise error if the universe is of the wrong type' do
243
+ lambda do
244
+ @sets[@set].intersection(:with => 'foo').must_be.subset_of([2])
245
+ end.should raise_error(TypeError)
246
+ end
247
+
248
+ it_should_behave_like 'selection constraint'
249
+ end
250
+
251
+ describe Gecode::Constraints::SetEnum::Selection, ' (disjoint)' do
252
+ include GecodeR::Specs::SetHelper
253
+
254
+ before do
255
+ @model = SelectionSampleProblem.new
256
+ @sets = @model.sets
257
+ @set = @model.set
258
+ @target = @model.target
259
+ @model.branch_on @model.wrap_enum([@target, @set])
260
+
261
+ @expect = lambda do |index|
262
+ Gecode::Raw.should_receive(:selectDisjoint)
263
+ end
264
+
265
+ # For options spec.
266
+ @invoke_options = lambda do |hash|
267
+ @sets[@set].must_be.disjoint(hash)
268
+ @model.solve!
269
+ end
270
+ @expect_options = lambda do |strength, reif_var|
271
+ @expect.call(@set)
272
+ end
273
+ end
274
+
275
+ it 'should constrain the selected sets to be disjoint' do
276
+ @sets[0].must_be.superset_of([7,8])
277
+ @sets[1].must_be.superset_of([5,7,9])
278
+ @sets[2].must_be.superset_of([6,8,10])
279
+ @sets[@set].must_be.disjoint
280
+ @set.size.must > 1
281
+ @model.solve!.should_not be_nil
282
+
283
+ @set.value.to_a.sort.should == [1,2]
284
+ end
285
+
286
+ it 'should not allow negation' do
287
+ lambda{ @sets[@set].must_not_be.disjoint }.should raise_error(
288
+ Gecode::MissingConstraintError)
289
+ end
290
+
291
+ it_should_behave_like 'non-reifiable set constraint'
292
+ end
@@ -0,0 +1,181 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require File.dirname(__FILE__) + '/constraint_helper'
3
+
4
+ describe Gecode::Constraints::Set::Domain do
5
+ include GecodeR::Specs::SetHelper
6
+
7
+ before do
8
+ @model = Gecode::Model.new
9
+ @glb = [0]
10
+ @lub = 0..3
11
+ @set = @model.set_var(@glb, @lub)
12
+ @range = 0..1
13
+ @non_range = [0, 2]
14
+ @singleton = 0
15
+
16
+ @expect = lambda do |relation_type, rhs, reif_var, negated|
17
+ @model.allow_space_access do
18
+ if reif_var.nil? and !negated
19
+ Gecode::Raw.should_receive(:dom).once.with(
20
+ an_instance_of(Gecode::Raw::Space),
21
+ an_instance_of(Gecode::Raw::SetVar), relation_type,
22
+ *expect_constant_set(rhs))
23
+ else
24
+ params = [an_instance_of(Gecode::Raw::Space),
25
+ an_instance_of(Gecode::Raw::SetVar), relation_type]
26
+ params << expect_constant_set(rhs)
27
+ params << an_instance_of(Gecode::Raw::BoolVar)
28
+ Gecode::Raw.should_receive(:dom).once.with(*params.flatten)
29
+ end
30
+ end
31
+ end
32
+
33
+ # For options spec.
34
+ @invoke_options = lambda do |hash|
35
+ @set.must_be.superset_of(@non_range, hash)
36
+ @model.solve!
37
+ end
38
+ @expect_options = lambda do |strength, reif_var|
39
+ @expect.call(Gecode::Raw::SRT_SUP, @non_range, reif_var, false)
40
+ end
41
+ end
42
+
43
+ Gecode::Constraints::Util::SET_RELATION_TYPES.each_pair do |relation, type|
44
+ next if relation == :==
45
+
46
+ it "should translate #{relation} with constant range to domain constraint" do
47
+ @expect.call(type, @range, nil, false)
48
+ @set.must.send(relation, @range)
49
+ @model.solve!
50
+ end
51
+
52
+ it "should translate #{relation} with constant non-range to domain constraint" do
53
+ @expect.call(type, @non_range, nil, false)
54
+ @set.must.send(relation, @non_range)
55
+ @model.solve!
56
+ end
57
+
58
+ it "should translate #{relation} with constant singleton to domain constraint" do
59
+ @expect.call(type, @singleton, nil, false)
60
+ @set.must.send(relation, @singleton)
61
+ @model.solve!
62
+ end
63
+
64
+ it "should translate negated #{relation} with constant range to domain constraint" do
65
+ @expect.call(type, @range, nil, true)
66
+ @set.must_not.send(relation, @range)
67
+ @model.solve!
68
+ end
69
+
70
+ it "should translate negated #{relation} with constant non-range to domain constraint" do
71
+ @expect.call(type, @non_range, nil, true)
72
+ @set.must_not.send(relation, @non_range)
73
+ @model.solve!
74
+ end
75
+
76
+ it "should translate negated #{relation} with constant singleton to domain constraint" do
77
+ @expect.call(type, @singleton, nil, true)
78
+ @set.must_not.send(relation, @singleton)
79
+ @model.solve!
80
+ end
81
+ end
82
+
83
+ it 'should raise error if the right hand side is not a constant set' do
84
+ lambda do
85
+ @set.must_be.superset_of('not a constant set')
86
+ end.should raise_error(TypeError)
87
+ end
88
+
89
+ it_should_behave_like 'reifiable set constraint'
90
+ end
91
+
92
+ describe Gecode::Constraints::Set::Domain, ' (equality)' do
93
+ include GecodeR::Specs::SetHelper
94
+
95
+ before do
96
+ @model = Gecode::Model.new
97
+ @glb = [0]
98
+ @lub = 0..3
99
+ @set = @model.set_var(@glb, @lub)
100
+ @range = 0..1
101
+ @non_range = [0, 2]
102
+ @singleton = 0
103
+
104
+ @expect = lambda do |relation_type, rhs, reif_var|
105
+ @model.allow_space_access do
106
+ if reif_var.nil?
107
+ Gecode::Raw.should_receive(:dom).once.with(
108
+ an_instance_of(Gecode::Raw::Space),
109
+ an_instance_of(Gecode::Raw::SetVar), relation_type,
110
+ *expect_constant_set(rhs))
111
+ else
112
+ params = [an_instance_of(Gecode::Raw::Space),
113
+ an_instance_of(Gecode::Raw::SetVar), relation_type]
114
+ params << expect_constant_set(rhs)
115
+ params << an_instance_of(Gecode::Raw::BoolVar)
116
+ Gecode::Raw.should_receive(:dom).once.with(*params.flatten)
117
+ end
118
+ end
119
+ end
120
+
121
+ # For options spec.
122
+ @invoke_options = lambda do |hash|
123
+ @set.must_be.equal_to(@non_range, hash)
124
+ @model.solve!
125
+ end
126
+ @expect_options = lambda do |strength, reif_var|
127
+ @expect.call(Gecode::Raw::SRT_EQ, @non_range, reif_var)
128
+ end
129
+ end
130
+
131
+ it 'should translate equality with constant range to domain constraint' do
132
+ @expect.call(Gecode::Raw::SRT_EQ, @range, nil)
133
+ @set.must == @range
134
+ @model.solve!
135
+ end
136
+
137
+ it 'should translate equality with constant non-range to domain constraint' do
138
+ @expect.call(Gecode::Raw::SRT_EQ, @non_range, nil)
139
+ @set.must == @non_range
140
+ @model.solve!
141
+ end
142
+
143
+ it 'should translate equality with constant singleton to domain constraint' do
144
+ @expect.call(Gecode::Raw::SRT_EQ, @singleton, nil)
145
+ @set.must == @singleton
146
+ @model.solve!
147
+ end
148
+
149
+ it 'should translate negated equality with constant range to domain constraint' do
150
+ @expect.call(Gecode::Raw::SRT_NQ, @range, nil)
151
+ @set.must_not == @range
152
+ @model.solve!
153
+ end
154
+
155
+ it 'should translate negated equality with constant non-range to domain constraint' do
156
+ @expect.call(Gecode::Raw::SRT_NQ, @non_range, nil)
157
+ @set.must_not == @non_range
158
+ @model.solve!
159
+ end
160
+
161
+ it 'should translate negated equality with constant singleton to domain constraint' do
162
+ @expect.call(Gecode::Raw::SRT_NQ, @singleton, nil)
163
+ @set.must_not == @singleton
164
+ @model.solve!
165
+ end
166
+
167
+ it 'should constrain the domain with equality' do
168
+ @set.must == @singleton
169
+ @model.solve!
170
+ @set.should be_assigned
171
+ @set.value.should include(@singleton)
172
+ @set.value.size.should == 1
173
+ end
174
+
175
+ it 'should constrain the domain with inequality' do
176
+ @set.must_not == @singleton
177
+ @model.solve!.should be_nil
178
+ end
179
+
180
+ it_should_behave_like 'reifiable set constraint'
181
+ end