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.
- data/CHANGES +81 -0
- data/COPYING +17 -0
- data/LGPL-LICENSE +458 -0
- data/README +45 -0
- data/Rakefile +13 -0
- data/example/example_helper.rb +1 -0
- data/example/magic_sequence.rb +43 -0
- data/example/queens.rb +43 -0
- data/example/raw_bindings.rb +42 -0
- data/example/send_more_money.rb +43 -0
- data/example/send_most_money.rb +58 -0
- data/example/square_tiling.rb +84 -0
- data/example/sudoku-set.rb +110 -0
- data/example/sudoku.rb +61 -0
- data/lib/gecode.dll +0 -0
- data/lib/gecoder.rb +5 -0
- data/lib/gecoder/bindings.rb +54 -0
- data/lib/gecoder/bindings/bindings.rb +2210 -0
- data/lib/gecoder/interface.rb +8 -0
- data/lib/gecoder/interface/binding_changes.rb +313 -0
- data/lib/gecoder/interface/branch.rb +152 -0
- data/lib/gecoder/interface/constraints.rb +397 -0
- data/lib/gecoder/interface/constraints/bool/boolean.rb +246 -0
- data/lib/gecoder/interface/constraints/bool/linear.rb +29 -0
- data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +84 -0
- data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +8 -0
- data/lib/gecoder/interface/constraints/bool_var_constraints.rb +75 -0
- data/lib/gecoder/interface/constraints/int/arithmetic.rb +71 -0
- data/lib/gecoder/interface/constraints/int/domain.rb +78 -0
- data/lib/gecoder/interface/constraints/int/linear.rb +295 -0
- data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +72 -0
- data/lib/gecoder/interface/constraints/int_enum/channel.rb +100 -0
- data/lib/gecoder/interface/constraints/int_enum/count.rb +92 -0
- data/lib/gecoder/interface/constraints/int_enum/distinct.rb +69 -0
- data/lib/gecoder/interface/constraints/int_enum/element.rb +82 -0
- data/lib/gecoder/interface/constraints/int_enum/equality.rb +38 -0
- data/lib/gecoder/interface/constraints/int_enum/sort.rb +126 -0
- data/lib/gecoder/interface/constraints/int_enum_constraints.rb +37 -0
- data/lib/gecoder/interface/constraints/int_var_constraints.rb +58 -0
- data/lib/gecoder/interface/constraints/reifiable_constraints.rb +78 -0
- data/lib/gecoder/interface/constraints/set/cardinality.rb +75 -0
- data/lib/gecoder/interface/constraints/set/connection.rb +193 -0
- data/lib/gecoder/interface/constraints/set/domain.rb +109 -0
- data/lib/gecoder/interface/constraints/set/operation.rb +132 -0
- data/lib/gecoder/interface/constraints/set/relation.rb +178 -0
- data/lib/gecoder/interface/constraints/set_enum/channel.rb +18 -0
- data/lib/gecoder/interface/constraints/set_enum/distinct.rb +80 -0
- data/lib/gecoder/interface/constraints/set_enum/operation.rb +60 -0
- data/lib/gecoder/interface/constraints/set_enum/selection.rb +217 -0
- data/lib/gecoder/interface/constraints/set_enum_constraints.rb +34 -0
- data/lib/gecoder/interface/constraints/set_var_constraints.rb +72 -0
- data/lib/gecoder/interface/enum_matrix.rb +64 -0
- data/lib/gecoder/interface/enum_wrapper.rb +153 -0
- data/lib/gecoder/interface/model.rb +251 -0
- data/lib/gecoder/interface/search.rb +123 -0
- data/lib/gecoder/interface/variables.rb +254 -0
- data/lib/gecoder/version.rb +4 -0
- data/specs/binding_changes.rb +76 -0
- data/specs/bool_var.rb +74 -0
- data/specs/branch.rb +170 -0
- data/specs/constraints/arithmetic.rb +266 -0
- data/specs/constraints/bool_enum.rb +140 -0
- data/specs/constraints/boolean.rb +232 -0
- data/specs/constraints/cardinality.rb +154 -0
- data/specs/constraints/channel.rb +126 -0
- data/specs/constraints/connection.rb +373 -0
- data/specs/constraints/constraint_helper.rb +180 -0
- data/specs/constraints/constraints.rb +74 -0
- data/specs/constraints/count.rb +139 -0
- data/specs/constraints/distinct.rb +218 -0
- data/specs/constraints/element.rb +106 -0
- data/specs/constraints/equality.rb +31 -0
- data/specs/constraints/int_domain.rb +69 -0
- data/specs/constraints/int_relation.rb +78 -0
- data/specs/constraints/linear.rb +332 -0
- data/specs/constraints/reification_sugar.rb +96 -0
- data/specs/constraints/selection.rb +292 -0
- data/specs/constraints/set_domain.rb +181 -0
- data/specs/constraints/set_operation.rb +285 -0
- data/specs/constraints/set_relation.rb +201 -0
- data/specs/constraints/sort.rb +175 -0
- data/specs/distribution.rb +14 -0
- data/specs/enum_matrix.rb +43 -0
- data/specs/enum_wrapper.rb +122 -0
- data/specs/int_var.rb +144 -0
- data/specs/logging.rb +24 -0
- data/specs/model.rb +190 -0
- data/specs/search.rb +246 -0
- data/specs/set_var.rb +68 -0
- data/specs/spec_helper.rb +93 -0
- data/tasks/all_tasks.rb +1 -0
- data/tasks/building.howto +65 -0
- data/tasks/distribution.rake +156 -0
- data/tasks/rcov.rake +17 -0
- data/tasks/specs.rake +15 -0
- data/tasks/svn.rake +11 -0
- data/tasks/website.rake +51 -0
- data/vendor/gecode/win32/lib/libgecodeint.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodekernel.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodeminimodel.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodesearch.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodeset.dll +0 -0
- data/vendor/rust/README +28 -0
- data/vendor/rust/bin/cxxgenerator.rb +93 -0
- data/vendor/rust/include/rust_checks.hh +115 -0
- data/vendor/rust/include/rust_conversions.hh +102 -0
- data/vendor/rust/rust.rb +67 -0
- data/vendor/rust/rust/attribute.rb +51 -0
- data/vendor/rust/rust/bindings.rb +172 -0
- data/vendor/rust/rust/class.rb +339 -0
- data/vendor/rust/rust/constants.rb +48 -0
- data/vendor/rust/rust/container.rb +110 -0
- data/vendor/rust/rust/cppifaceparser.rb +129 -0
- data/vendor/rust/rust/cwrapper.rb +72 -0
- data/vendor/rust/rust/cxxclass.rb +98 -0
- data/vendor/rust/rust/element.rb +81 -0
- data/vendor/rust/rust/enum.rb +63 -0
- data/vendor/rust/rust/function.rb +407 -0
- data/vendor/rust/rust/namespace.rb +61 -0
- data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +17 -0
- data/vendor/rust/rust/templates/AttributeInitBinding.rusttpl +9 -0
- data/vendor/rust/rust/templates/BindingsHeader.rusttpl +24 -0
- data/vendor/rust/rust/templates/BindingsUnit.rusttpl +46 -0
- data/vendor/rust/rust/templates/CWrapperClassDefinitions.rusttpl +64 -0
- data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +7 -0
- data/vendor/rust/rust/templates/ClassInitialize.rusttpl +6 -0
- data/vendor/rust/rust/templates/ConstructorStub.rusttpl +21 -0
- data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +91 -0
- data/vendor/rust/rust/templates/CxxMethodStub.rusttpl +12 -0
- data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +26 -0
- data/vendor/rust/rust/templates/EnumDeclarations.rusttpl +3 -0
- data/vendor/rust/rust/templates/EnumDefinitions.rusttpl +29 -0
- data/vendor/rust/rust/templates/FunctionDefinition.rusttpl +9 -0
- data/vendor/rust/rust/templates/FunctionInitAlias.rusttpl +5 -0
- data/vendor/rust/rust/templates/FunctionInitBinding.rusttpl +9 -0
- data/vendor/rust/rust/templates/MethodInitBinding.rusttpl +9 -0
- data/vendor/rust/rust/templates/ModuleDeclarations.rusttpl +3 -0
- data/vendor/rust/rust/templates/ModuleDefinitions.rusttpl +3 -0
- data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +7 -0
- data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +14 -0
- data/vendor/rust/rust/type.rb +98 -0
- data/vendor/rust/test/Makefile +4 -0
- data/vendor/rust/test/constants.rb +36 -0
- data/vendor/rust/test/cppclass.cc +45 -0
- data/vendor/rust/test/cppclass.hh +67 -0
- data/vendor/rust/test/cppclass.rb +59 -0
- data/vendor/rust/test/cwrapper.c +74 -0
- data/vendor/rust/test/cwrapper.h +41 -0
- data/vendor/rust/test/cwrapper.rb +56 -0
- data/vendor/rust/test/dummyclass.hh +31 -0
- data/vendor/rust/test/lib/extension-test.rb +98 -0
- data/vendor/rust/test/operators.cc +41 -0
- data/vendor/rust/test/operators.hh +39 -0
- data/vendor/rust/test/operators.rb +39 -0
- data/vendor/rust/test/test-constants.rb +43 -0
- data/vendor/rust/test/test-cppclass.rb +82 -0
- data/vendor/rust/test/test-cwrapper.rb +80 -0
- data/vendor/rust/test/test-operators.rb +42 -0
- 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
|