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,266 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require File.dirname(__FILE__) + '/constraint_helper'
3
+
4
+ class ArithmeticSampleProblem < Gecode::Model
5
+ attr :numbers
6
+ attr :var
7
+ attr :var2
8
+ attr :var3
9
+
10
+ def initialize
11
+ @numbers = int_var_array(4, 0..9)
12
+ @var = int_var(-9..9)
13
+ @var2 = int_var(0..9)
14
+ @var3 = int_var(0..9)
15
+ branch_on @numbers
16
+ branch_on wrap_enum([@var, @var2, @var3])
17
+ end
18
+ end
19
+
20
+ # Requires @stub, @target, @model and @expect.
21
+ describe 'arithmetic constraint', :shared => true do
22
+ before do
23
+ # For constraint option spec.
24
+ @invoke_options = lambda do |hash|
25
+ @stub.must_be.greater_than(@target, hash)
26
+ @model.solve!
27
+ end
28
+ @expect_options = lambda do |strength, reif_var|
29
+ @expect.call(Gecode::Raw::IRT_GR, @target, strength, reif_var, false)
30
+ end
31
+
32
+ # For composite spec.
33
+ @invoke_relation = lambda do |relation, target, negated|
34
+ if negated
35
+ @stub.must_not.send(relation, target)
36
+ else
37
+ @stub.must.send(relation, target)
38
+ end
39
+ @model.solve!
40
+ end
41
+ @expect_relation = lambda do |relation, target, negated|
42
+ @expect.call(relation, target, Gecode::Raw::ICL_DEF, nil, negated)
43
+ end
44
+ end
45
+
46
+ it 'should translate reification when using equality' do
47
+ bool_var = @model.bool_var
48
+ @expect.call(Gecode::Raw::IRT_EQ, @target, Gecode::Raw::ICL_DEF, bool_var,
49
+ false)
50
+ @stub.must_be.equal_to(@target, :reify => bool_var)
51
+ @model.solve!
52
+ end
53
+
54
+ it_should_behave_like 'composite constraint'
55
+ it_should_behave_like 'constraint with options'
56
+ end
57
+
58
+ describe Gecode::Constraints::IntEnum::Arithmetic, ' (max)' do
59
+ before do
60
+ @model = ArithmeticSampleProblem.new
61
+ @numbers = @model.numbers
62
+ @target = @var = @model.var
63
+ @stub = @numbers.max
64
+
65
+ # Creates an expectation corresponding to the specified input.
66
+ @expect = lambda do |relation, rhs, strength, reif_var, negated|
67
+ @model.allow_space_access do
68
+ rhs = an_instance_of(Gecode::Raw::IntVar) if rhs.respond_to? :bind
69
+ if reif_var.nil?
70
+ if !negated and relation == Gecode::Raw::IRT_EQ and
71
+ !rhs.kind_of? Fixnum
72
+ Gecode::Raw.should_receive(:max).once.with(
73
+ an_instance_of(Gecode::Raw::Space),
74
+ an_instance_of(Gecode::Raw::IntVarArray), rhs, strength)
75
+ Gecode::Raw.should_receive(:rel).exactly(0).times
76
+ else
77
+ Gecode::Raw.should_receive(:max).once.with(
78
+ an_instance_of(Gecode::Raw::Space),
79
+ an_instance_of(Gecode::Raw::IntVarArray),
80
+ an_instance_of(Gecode::Raw::IntVar), strength)
81
+ Gecode::Raw.should_receive(:rel).once.with(
82
+ an_instance_of(Gecode::Raw::Space),
83
+ an_instance_of(Gecode::Raw::IntVar), relation, rhs, strength)
84
+ end
85
+ else
86
+ Gecode::Raw.should_receive(:max).once.with(
87
+ an_instance_of(Gecode::Raw::Space),
88
+ an_instance_of(Gecode::Raw::IntVarArray),
89
+ an_instance_of(Gecode::Raw::IntVar), strength)
90
+ Gecode::Raw.should_receive(:rel).once.with(
91
+ an_instance_of(Gecode::Raw::Space),
92
+ an_instance_of(Gecode::Raw::IntVar), relation, rhs,
93
+ an_instance_of(Gecode::Raw::BoolVar),
94
+ strength)
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ it 'should constrain the maximum value' do
101
+ @numbers.max.must > 5
102
+ @model.solve!.numbers.values.max.should > 5
103
+ end
104
+
105
+ it_should_behave_like 'arithmetic constraint'
106
+ end
107
+
108
+ describe Gecode::Constraints::IntEnum::Arithmetic, ' (min)' do
109
+ before do
110
+ @model = ArithmeticSampleProblem.new
111
+ @numbers = @model.numbers
112
+ @target = @var = @model.var
113
+ @stub = @numbers.min
114
+
115
+ # Creates an expectation corresponding to the specified input.
116
+ @expect = lambda do |relation, rhs, strength, reif_var, negated|
117
+ @model.allow_space_access do
118
+ rhs = an_instance_of(Gecode::Raw::IntVar) if rhs.respond_to? :bind
119
+ if reif_var.nil?
120
+ if !negated and relation == Gecode::Raw::IRT_EQ and
121
+ !rhs.kind_of? Fixnum
122
+ Gecode::Raw.should_receive(:min).once.with(
123
+ an_instance_of(Gecode::Raw::Space),
124
+ an_instance_of(Gecode::Raw::IntVarArray), rhs, strength)
125
+ Gecode::Raw.should_receive(:rel).exactly(0).times
126
+ else
127
+ Gecode::Raw.should_receive(:min).once.with(
128
+ an_instance_of(Gecode::Raw::Space),
129
+ an_instance_of(Gecode::Raw::IntVarArray),
130
+ an_instance_of(Gecode::Raw::IntVar), strength)
131
+ Gecode::Raw.should_receive(:rel).once.with(
132
+ an_instance_of(Gecode::Raw::Space),
133
+ an_instance_of(Gecode::Raw::IntVar), relation, rhs, strength)
134
+ end
135
+ else
136
+ Gecode::Raw.should_receive(:min).once.with(
137
+ an_instance_of(Gecode::Raw::Space),
138
+ an_instance_of(Gecode::Raw::IntVarArray),
139
+ an_instance_of(Gecode::Raw::IntVar), strength)
140
+ Gecode::Raw.should_receive(:rel).once.with(
141
+ an_instance_of(Gecode::Raw::Space),
142
+ an_instance_of(Gecode::Raw::IntVar), relation, rhs,
143
+ an_instance_of(Gecode::Raw::BoolVar),
144
+ strength)
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ it 'should constrain the minimum value' do
151
+ @numbers.min.must > 5
152
+ @model.solve!.numbers.values.min.should > 5
153
+ end
154
+
155
+ it_should_behave_like 'arithmetic constraint'
156
+ end
157
+
158
+ describe Gecode::Constraints::Int::Arithmetic, ' (abs)' do
159
+ before do
160
+ @model = ArithmeticSampleProblem.new
161
+ @var = @model.var
162
+ @target = @model.var2
163
+ @stub = @var.abs
164
+
165
+ # Creates an expectation corresponding to the specified input.
166
+ @expect = lambda do |relation, rhs, strength, reif_var, negated|
167
+ @model.allow_space_access do
168
+ rhs = an_instance_of(Gecode::Raw::IntVar) if rhs.respond_to? :bind
169
+ if reif_var.nil?
170
+ if !negated and relation == Gecode::Raw::IRT_EQ and
171
+ !rhs.kind_of? Fixnum
172
+ Gecode::Raw.should_receive(:abs).once.with(
173
+ an_instance_of(Gecode::Raw::Space),
174
+ an_instance_of(Gecode::Raw::IntVar), rhs, strength)
175
+ Gecode::Raw.should_receive(:rel).exactly(0).times
176
+ else
177
+ Gecode::Raw.should_receive(:abs).once.with(
178
+ an_instance_of(Gecode::Raw::Space),
179
+ an_instance_of(Gecode::Raw::IntVar),
180
+ an_instance_of(Gecode::Raw::IntVar), strength)
181
+ Gecode::Raw.should_receive(:rel).once.with(
182
+ an_instance_of(Gecode::Raw::Space),
183
+ an_instance_of(Gecode::Raw::IntVar), relation, rhs, strength)
184
+ end
185
+ else
186
+ Gecode::Raw.should_receive(:abs).once.with(
187
+ an_instance_of(Gecode::Raw::Space),
188
+ an_instance_of(Gecode::Raw::IntVar),
189
+ an_instance_of(Gecode::Raw::IntVar), strength)
190
+ Gecode::Raw.should_receive(:rel).once.with(
191
+ an_instance_of(Gecode::Raw::Space),
192
+ an_instance_of(Gecode::Raw::IntVar), relation, rhs,
193
+ an_instance_of(Gecode::Raw::BoolVar), strength)
194
+ end
195
+ end
196
+ end
197
+ end
198
+
199
+ it 'should constrain the absolute value' do
200
+ @var.must < 0
201
+ @var.abs.must == 5
202
+ @model.solve!.var.value.should == -5
203
+ end
204
+
205
+ it_should_behave_like 'arithmetic constraint'
206
+ end
207
+
208
+ describe Gecode::Constraints::Int::Arithmetic, ' (multiplication)' do
209
+ before do
210
+ @model = ArithmeticSampleProblem.new
211
+ @var = @model.var
212
+ @var2 = @model.var2
213
+ @stub = @var * @var2
214
+ @target = @model.var3
215
+
216
+ # Creates an expectation corresponding to the specified input.
217
+ @expect = lambda do |relation, rhs, strength, reif_var, negated|
218
+ @model.allow_space_access do
219
+ rhs = an_instance_of(Gecode::Raw::IntVar) if rhs.respond_to? :bind
220
+ if reif_var.nil?
221
+ if !negated and relation == Gecode::Raw::IRT_EQ and
222
+ !rhs.kind_of? Fixnum
223
+ Gecode::Raw.should_receive(:mult).once.with(
224
+ an_instance_of(Gecode::Raw::Space),
225
+ an_instance_of(Gecode::Raw::IntVar),
226
+ an_instance_of(Gecode::Raw::IntVar), rhs, strength)
227
+ Gecode::Raw.should_receive(:rel).exactly(0).times
228
+ else
229
+ Gecode::Raw.should_receive(:mult).once.with(
230
+ an_instance_of(Gecode::Raw::Space),
231
+ an_instance_of(Gecode::Raw::IntVar),
232
+ an_instance_of(Gecode::Raw::IntVar),
233
+ an_instance_of(Gecode::Raw::IntVar),
234
+ strength)
235
+ Gecode::Raw.should_receive(:rel).once.with(
236
+ an_instance_of(Gecode::Raw::Space),
237
+ an_instance_of(Gecode::Raw::IntVar), relation, rhs, strength)
238
+ end
239
+ else
240
+ Gecode::Raw.should_receive(:mult).once.with(
241
+ an_instance_of(Gecode::Raw::Space),
242
+ an_instance_of(Gecode::Raw::IntVar),
243
+ an_instance_of(Gecode::Raw::IntVar),
244
+ an_instance_of(Gecode::Raw::IntVar), strength)
245
+ Gecode::Raw.should_receive(:rel).once.with(
246
+ an_instance_of(Gecode::Raw::Space),
247
+ an_instance_of(Gecode::Raw::IntVar), relation, rhs,
248
+ an_instance_of(Gecode::Raw::BoolVar),
249
+ strength)
250
+ end
251
+ end
252
+ end
253
+ end
254
+
255
+ it 'should constrain the value of the multiplication' do
256
+ (@var * @var2).must == 56
257
+ sol = @model.solve!
258
+ [sol.var.value, sol.var2.value].sort.should == [7, 8]
259
+ end
260
+
261
+ it 'should not interfere with other defined multiplication methods' do
262
+ (@var * :foo).should be_nil
263
+ end
264
+
265
+ it_should_behave_like 'arithmetic constraint'
266
+ end
@@ -0,0 +1,140 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require File.dirname(__FILE__) + '/constraint_helper'
3
+
4
+ class BoolEnumSampleProblem < Gecode::Model
5
+ attr :bools
6
+ attr :b1
7
+ attr :b2
8
+
9
+ def initialize
10
+ @bools = bool_var_array(4)
11
+ @b1 = bool_var
12
+ @b2 = bool_var
13
+ branch_on @bools
14
+ branch_on wrap_enum([@b1, @b2])
15
+ end
16
+ end
17
+
18
+ # Expects @stub, which contains the started constraint and @compute_result which
19
+ # computes whether the left hand side is true or not.
20
+ describe 'bool enum constraint', :shared => true do
21
+ it 'should handle being constrained to be true' do
22
+ @stub.must_be.true
23
+ @model.solve!
24
+ @compute_result.call.should be_true
25
+ end
26
+
27
+ it 'should handle being constrained to be negated true' do
28
+ @stub.must_not_be.true
29
+ @model.solve!
30
+ @compute_result.call.should_not be_true
31
+ end
32
+
33
+ it 'should handle being constrained to be false' do
34
+ @stub.must_be.false
35
+ @model.solve!
36
+ @compute_result.call.should_not be_true
37
+ end
38
+
39
+ it 'should handle being constrained to be negated false' do
40
+ @stub.must_not_be.false
41
+ @model.solve!
42
+ @compute_result.call.should be_true
43
+ end
44
+
45
+ it 'should handle being constrained to be equal to a variable' do
46
+ @stub.must_be == @b1
47
+ @model.solve!
48
+ @compute_result.call.should == @b1.value
49
+ end
50
+
51
+ it 'should handle being constrained to not be equal to a variable' do
52
+ @stub.must_not_be == @b1
53
+ @model.solve!
54
+ @compute_result.call.should_not == @b1.value
55
+ end
56
+
57
+ it 'should handle being constrained to be equal to be a nested expression' do
58
+ @stub.must_be == (@b1 | @b2) & @b1
59
+ @model.solve!
60
+ @compute_result.call.should == (@b1.value | @b2.value) & @b1.value
61
+ end
62
+
63
+ it 'should handle being constrained to not be equal to be a nested expression' do
64
+ @stub.must_not_be == (@b1 | @b2) & @b1
65
+ @model.solve!
66
+ @compute_result.call.should_not == (@b1.value | @b2.value) & @b1.value
67
+ end
68
+ end
69
+
70
+ describe Gecode::Constraints::BoolEnum, ' (conjunction)' do
71
+ before do
72
+ @model = BoolEnumSampleProblem.new
73
+ @bools = @model.bools
74
+ @b1 = @model.b1
75
+ @b2 = @model.b2
76
+
77
+ # For constraint option spec.
78
+ @invoke_options = lambda do |hash|
79
+ @bools.conjunction.must_be.equal_to(true, hash)
80
+ @model.solve!
81
+ end
82
+ @expect_options = lambda do |strength, reif_var|
83
+ @model.allow_space_access do
84
+ Gecode::Raw.should_receive(:bool_and).once.with(
85
+ an_instance_of(Gecode::Raw::Space),
86
+ an_instance_of(Gecode::Raw::BoolVarArray),
87
+ an_instance_of(Gecode::Raw::BoolVar), strength)
88
+ unless reif_var.nil?
89
+ Gecode::Raw.should_receive(:bool_eqv).once.with(
90
+ an_instance_of(Gecode::Raw::Space),
91
+ an_instance_of(Gecode::Raw::BoolVar),
92
+ an_instance_of(Gecode::Raw::BoolVar), true, strength)
93
+ end
94
+ end
95
+ end
96
+
97
+ # For bool enum spec.
98
+ @stub = @bools.conjunction
99
+ @compute_result = lambda{ @bools.all?{ |b| b.value } }
100
+ end
101
+
102
+ it_should_behave_like 'bool enum constraint'
103
+ it_should_behave_like 'constraint with options'
104
+ end
105
+
106
+ describe Gecode::Constraints::BoolEnum, ' (disjunction)' do
107
+ before do
108
+ @model = BoolEnumSampleProblem.new
109
+ @bools = @model.bools
110
+ @b1 = @model.b1
111
+ @b2 = @model.b2
112
+
113
+ # For constraint option spec.
114
+ @invoke_options = lambda do |hash|
115
+ @bools.disjunction.must_be.equal_to(true, hash)
116
+ @model.solve!
117
+ end
118
+ @expect_options = lambda do |strength, reif_var|
119
+ @model.allow_space_access do
120
+ Gecode::Raw.should_receive(:bool_or).once.with(
121
+ an_instance_of(Gecode::Raw::Space),
122
+ an_instance_of(Gecode::Raw::BoolVarArray),
123
+ an_instance_of(Gecode::Raw::BoolVar), strength)
124
+ unless reif_var.nil?
125
+ Gecode::Raw.should_receive(:bool_eqv).once.with(
126
+ an_instance_of(Gecode::Raw::Space),
127
+ an_instance_of(Gecode::Raw::BoolVar),
128
+ an_instance_of(Gecode::Raw::BoolVar), true, strength)
129
+ end
130
+ end
131
+ end
132
+
133
+ # For bool enum spec.
134
+ @stub = @bools.disjunction
135
+ @compute_result = lambda{ @bools.any?{ |b| b.value } }
136
+ end
137
+
138
+ it_should_behave_like 'bool enum constraint'
139
+ it_should_behave_like 'constraint with options'
140
+ end
@@ -0,0 +1,232 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require File.dirname(__FILE__) + '/constraint_helper'
3
+
4
+ class BoolSampleProblem < Gecode::Model
5
+ attr :b1
6
+ attr :b2
7
+ attr :b3
8
+
9
+ def initialize
10
+ @b1 = self.bool_var
11
+ @b2 = self.bool_var
12
+ @b3 = self.bool_var
13
+ end
14
+ end
15
+
16
+ describe Gecode::Constraints::Bool do
17
+ before do
18
+ @model = BoolSampleProblem.new
19
+ @b1 = @model.b1
20
+ @b2 = @model.b2
21
+ @b3 = @model.b3
22
+
23
+ # For constraint option spec.
24
+ @invoke_options = lambda do |hash|
25
+ (@b1 | @b2).must_be.equal_to(true, hash)
26
+ @model.solve!
27
+ end
28
+ @expect_options = lambda do |strength, reif_var|
29
+ @model.allow_space_access do
30
+ Gecode::Raw.should_receive(:bool_or).once.with(
31
+ an_instance_of(Gecode::Raw::Space),
32
+ an_instance_of(Gecode::Raw::BoolVar),
33
+ an_instance_of(Gecode::Raw::BoolVar),
34
+ an_instance_of(Gecode::Raw::BoolVar),
35
+ Gecode::Raw::ICL_DEF)
36
+ unless reif_var.nil?
37
+ Gecode::Raw.should_receive(:bool_eqv).once.with(
38
+ an_instance_of(Gecode::Raw::Space),
39
+ an_instance_of(Gecode::Raw::BoolVar),
40
+ an_instance_of(Gecode::Raw::BoolVar), true, strength)
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ it 'should handle single variables constrainted to be true' do
47
+ @b1.must_be.true
48
+ b1 = @model.solve!.b1
49
+ b1.should be_assigned
50
+ b1.value.should be_true
51
+ end
52
+
53
+ it 'should handle single variables constrainted to be false' do
54
+ @b1.must_be.false
55
+ b1 = @model.solve!.b1
56
+ b1.should be_assigned
57
+ b1.value.should_not be_true
58
+ end
59
+
60
+ it 'should handle single variables constrainted not to be false' do
61
+ @b1.must_not_be.false
62
+ b1 = @model.solve!.b1
63
+ b1.should be_assigned
64
+ b1.value.should be_true
65
+ end
66
+
67
+ it 'should handle single variables constrainted not to be true' do
68
+ @b1.must_not_be.true
69
+ b1 = @model.solve!.b1
70
+ b1.should be_assigned
71
+ b1.value.should_not be_true
72
+ end
73
+
74
+ it 'should handle disjunction' do
75
+ @b1.must_be.false
76
+ (@b1 | @b2).must_be.true
77
+ sol = @model.solve!
78
+ sol.b1.value.should_not be_true
79
+ sol.b2.value.should be_true
80
+ end
81
+
82
+ it 'should handle negated disjunction' do
83
+ @b1.must_be.false
84
+ (@b1 | @b2).must_not_be.true
85
+ sol = @model.solve!
86
+ sol.b1.value.should_not be_true
87
+ sol.b2.value.should_not be_true
88
+ end
89
+
90
+ it 'should handle conjunction' do
91
+ (@b1 & @b2).must_be.true
92
+ sol = @model.solve!
93
+ sol.b1.value.should be_true
94
+ sol.b2.value.should be_true
95
+ end
96
+
97
+ it 'should handle negated conjunction' do
98
+ @b1.must_be.true
99
+ (@b1 & @b2).must_not_be.true
100
+ sol = @model.solve!
101
+ sol.b1.value.should be_true
102
+ sol.b2.value.should_not be_true
103
+ end
104
+
105
+ it 'should handle exclusive or' do
106
+ @b1.must_be.false
107
+ (@b1 ^ @b2).must_be.true
108
+ sol = @model.solve!
109
+ sol.b1.value.should_not be_true
110
+ sol.b2.value.should be_true
111
+ end
112
+
113
+ it 'should handle negated exclusive or' do
114
+ @b1.must_be.true
115
+ (@b1 ^ @b2).must_not_be.true
116
+ sol = @model.solve!
117
+ sol.b1.value.should be_true
118
+ sol.b2.value.should be_true
119
+ end
120
+
121
+ it 'should handle implication' do
122
+ @b2.must_be.false
123
+ (@b1.implies @b2).must_be.true
124
+ sol = @model.solve!
125
+ sol.b1.value.should_not be_true
126
+ sol.b2.value.should_not be_true
127
+ end
128
+
129
+ it 'should handle negated implication' do
130
+ @b1.must_be.true
131
+ ((@b1 | @b2).implies @b2).must_not_be.true
132
+ sol = @model.solve!
133
+ sol.b1.value.should be_true
134
+ sol.b2.value.should_not be_true
135
+ end
136
+
137
+ it 'should handle imply after must' do
138
+ @b2.must_be.false
139
+ @b1.must.imply @b2
140
+ sol = @model.solve!
141
+ sol.b1.value.should_not be_true
142
+ sol.b2.value.should_not be_true
143
+ end
144
+
145
+ it 'should handle imply after must_not' do
146
+ @b1.must_be.true
147
+ @b1.must_not.imply @b2
148
+ sol = @model.solve!
149
+ sol.b1.value.should be_true
150
+ sol.b2.value.should_not be_true
151
+ end
152
+
153
+ it 'should handle single variables as right hand side' do
154
+ @b1.must == @b2
155
+ @b2.must_be.false
156
+ sol = @model.solve!
157
+ sol.b1.value.should_not be_true
158
+ sol.b2.value.should_not be_true
159
+ end
160
+
161
+ it 'should handle single variables with negation as right hand side' do
162
+ @b1.must_not == @b2
163
+ @b2.must_be.false
164
+ sol = @model.solve!
165
+ sol.b1.value.should be_true
166
+ sol.b2.value.should_not be_true
167
+ end
168
+
169
+ it 'should handle expressions as right hand side' do
170
+ @b1.must == (@b2 | @b3)
171
+ @b2.must_be.true
172
+ sol = @model.solve!
173
+ sol.b1.value.should be_true
174
+ sol.b2.value.should be_true
175
+ end
176
+
177
+ it 'should handle nested expressions as left hand side' do
178
+ ((@b1 & @b2) | @b3 | (@b1 & @b3)).must_be.true
179
+ @b1.must_be.false
180
+ sol = @model.solve!
181
+ sol.b1.value.should_not be_true
182
+ sol.b3.value.should be_true
183
+ end
184
+
185
+ it 'should handle nested expressions on both side' do
186
+ ((@b1 & @b1) | @b3).must == ((@b1 & @b3) & @b2)
187
+ @b1.must_be.true
188
+ sol = @model.solve!
189
+ sol.b1.value.should be_true
190
+ sol.b2.value.should be_true
191
+ sol.b3.value.should be_true
192
+ end
193
+
194
+ it 'should handle nested expressions containing exclusive or' do
195
+ ((@b1 ^ @b1) & @b3).must == ((@b2 | @b3) ^ @b2)
196
+ @b1.must_be.true
197
+ @b2.must_be.false
198
+ sol = @model.solve!
199
+ sol.b1.value.should be_true
200
+ sol.b2.value.should_not be_true
201
+ sol.b3.value.should_not be_true
202
+ end
203
+
204
+ it 'should handle nested expressions on both sides with negation' do
205
+ ((@b1 & @b1) | @b3).must_not == ((@b1 | @b3) & @b2)
206
+ @b1.must_be.true
207
+ @b3.must_be.true
208
+ sol = @model.solve!
209
+ sol.b1.value.should be_true
210
+ sol.b2.value.should_not be_true
211
+ sol.b3.value.should be_true
212
+ end
213
+
214
+ it 'should translate reification with a variable right hand side' do
215
+ @b1.must_be.equal_to(@b2, :reify => @b3)
216
+ @b1.must_be.true
217
+ @b2.must_be.false
218
+ sol = @model.solve!
219
+ sol.b3.value.should_not be_true
220
+ end
221
+
222
+ it 'should translate reification with a variable right hand side and negation' do
223
+ @b1.must_not_be.equal_to(@b2, :reify => @b3)
224
+ @b1.must_be.true
225
+ @b2.must_be.false
226
+ sol = @model.solve!
227
+ sol.b3.value.should be_true
228
+ end
229
+
230
+
231
+ it_should_behave_like 'constraint with options'
232
+ end