gecoder-with-gecode 0.7.1-mswin32 → 0.8.0-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 +7 -0
- data/README +10 -1
- data/lib/gecode.dll +0 -0
- data/lib/gecoder/bindings/bindings.rb +407 -731
- data/lib/gecoder/interface/binding_changes.rb +1 -1
- data/lib/gecoder/interface/branch.rb +25 -25
- data/lib/gecoder/interface/constraints.rb +47 -4
- data/lib/gecoder/interface/constraints/bool/boolean.rb +18 -16
- data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +13 -11
- data/lib/gecoder/interface/constraints/int/arithmetic.rb +5 -4
- data/lib/gecoder/interface/constraints/int/domain.rb +8 -9
- data/lib/gecoder/interface/constraints/int/linear.rb +10 -8
- data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +4 -4
- data/lib/gecoder/interface/constraints/int_enum/channel.rb +2 -2
- data/lib/gecoder/interface/constraints/int_enum/count.rb +4 -5
- data/lib/gecoder/interface/constraints/int_enum/distinct.rb +7 -2
- data/lib/gecoder/interface/constraints/int_enum/element.rb +2 -2
- data/lib/gecoder/interface/constraints/int_enum/equality.rb +6 -3
- data/lib/gecoder/interface/constraints/int_enum/sort.rb +17 -5
- data/lib/gecoder/interface/constraints/set_enum/distinct.rb +0 -36
- data/lib/gecoder/interface/constraints/set_var_constraints.rb +5 -0
- data/lib/gecoder/interface/model.rb +3 -3
- data/lib/gecoder/interface/search.rb +5 -4
- data/lib/gecoder/version.rb +1 -1
- data/specs/branch.rb +27 -27
- data/specs/constraints/arithmetic.rb +48 -30
- data/specs/constraints/bool_enum.rb +39 -19
- data/specs/constraints/boolean.rb +10 -10
- data/specs/constraints/cardinality.rb +12 -9
- data/specs/constraints/channel.rb +6 -6
- data/specs/constraints/connection.rb +22 -26
- data/specs/constraints/constraint_helper.rb +125 -41
- data/specs/constraints/count.rb +22 -15
- data/specs/constraints/distinct.rb +10 -64
- data/specs/constraints/element.rb +14 -12
- data/specs/constraints/equality.rb +4 -4
- data/specs/constraints/int_domain.rb +8 -7
- data/specs/constraints/int_relation.rb +12 -8
- data/specs/constraints/linear.rb +4 -4
- data/specs/constraints/reification_sugar.rb +22 -4
- data/specs/constraints/selection.rb +2 -2
- data/specs/constraints/set_domain.rb +7 -3
- data/specs/constraints/set_operation.rb +2 -2
- data/specs/constraints/set_relation.rb +2 -6
- data/specs/constraints/sort.rb +20 -16
- data/specs/model.rb +4 -4
- data/tasks/dependencies.txt +21 -0
- data/tasks/distribution.rake +13 -5
- 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/gecode/win32/lib/libgecodesupport.dll +0 -0
- data/vendor/rust/include/rust_checks.hh +2 -1
- data/vendor/rust/include/rust_conversions.hh +2 -2
- data/vendor/rust/rust/attribute.rb +2 -2
- data/vendor/rust/rust/class.rb +2 -2
- data/vendor/rust/rust/cxxclass.rb +0 -2
- data/vendor/rust/rust/function.rb +2 -2
- data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +1 -1
- data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +1 -1
- data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +1 -1
- data/vendor/rust/rust/type.rb +1 -1
- metadata +4 -3
- data/tasks/building.howto +0 -65
@@ -79,17 +79,27 @@ describe Gecode::Constraints::BoolEnum, ' (conjunction)' do
|
|
79
79
|
@bools.conjunction.must_be.equal_to(true, hash)
|
80
80
|
@model.solve!
|
81
81
|
end
|
82
|
-
@expect_options =
|
82
|
+
@expect_options = option_expectation do |strength, kind, reif_var|
|
83
83
|
@model.allow_space_access do
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
Gecode::Raw.should_receive(:bool_eqv).once.with(
|
90
|
-
an_instance_of(Gecode::Raw::Space),
|
84
|
+
if reif_var.nil?
|
85
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
86
|
+
an_instance_of(Gecode::Raw::Space),
|
87
|
+
Gecode::Raw::BOT_AND,
|
88
|
+
an_instance_of(Gecode::Raw::BoolVarArray),
|
91
89
|
an_instance_of(Gecode::Raw::BoolVar),
|
92
|
-
|
90
|
+
strength, kind)
|
91
|
+
else
|
92
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
93
|
+
an_instance_of(Gecode::Raw::Space),
|
94
|
+
an_instance_of(Gecode::Raw::BoolVar),
|
95
|
+
anything,
|
96
|
+
an_instance_of(Gecode::Raw::BoolVar),
|
97
|
+
anything, anything, anything)
|
98
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
99
|
+
an_instance_of(Gecode::Raw::Space),
|
100
|
+
Gecode::Raw::BOT_AND,
|
101
|
+
an_instance_of(Gecode::Raw::BoolVarArray),
|
102
|
+
reif_var, strength, kind)
|
93
103
|
end
|
94
104
|
end
|
95
105
|
end
|
@@ -100,7 +110,7 @@ describe Gecode::Constraints::BoolEnum, ' (conjunction)' do
|
|
100
110
|
end
|
101
111
|
|
102
112
|
it_should_behave_like 'bool enum constraint'
|
103
|
-
it_should_behave_like 'constraint
|
113
|
+
it_should_behave_like 'reifiable constraint'
|
104
114
|
end
|
105
115
|
|
106
116
|
describe Gecode::Constraints::BoolEnum, ' (disjunction)' do
|
@@ -115,17 +125,27 @@ describe Gecode::Constraints::BoolEnum, ' (disjunction)' do
|
|
115
125
|
@bools.disjunction.must_be.equal_to(true, hash)
|
116
126
|
@model.solve!
|
117
127
|
end
|
118
|
-
@expect_options =
|
128
|
+
@expect_options = option_expectation do |strength, kind, reif_var|
|
119
129
|
@model.allow_space_access do
|
120
|
-
|
121
|
-
|
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(
|
130
|
+
if reif_var.nil?
|
131
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
126
132
|
an_instance_of(Gecode::Raw::Space),
|
133
|
+
Gecode::Raw::BOT_OR,
|
134
|
+
an_instance_of(Gecode::Raw::BoolVarArray),
|
127
135
|
an_instance_of(Gecode::Raw::BoolVar),
|
128
|
-
|
136
|
+
strength, kind)
|
137
|
+
else
|
138
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
139
|
+
an_instance_of(Gecode::Raw::Space),
|
140
|
+
an_instance_of(Gecode::Raw::BoolVar),
|
141
|
+
anything,
|
142
|
+
an_instance_of(Gecode::Raw::BoolVar),
|
143
|
+
anything, anything, anything)
|
144
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
145
|
+
an_instance_of(Gecode::Raw::Space),
|
146
|
+
Gecode::Raw::BOT_OR,
|
147
|
+
an_instance_of(Gecode::Raw::BoolVarArray),
|
148
|
+
reif_var, strength, kind)
|
129
149
|
end
|
130
150
|
end
|
131
151
|
end
|
@@ -136,5 +156,5 @@ describe Gecode::Constraints::BoolEnum, ' (disjunction)' do
|
|
136
156
|
end
|
137
157
|
|
138
158
|
it_should_behave_like 'bool enum constraint'
|
139
|
-
it_should_behave_like 'constraint
|
159
|
+
it_should_behave_like 'reifiable constraint'
|
140
160
|
end
|
@@ -25,19 +25,20 @@ describe Gecode::Constraints::Bool do
|
|
25
25
|
(@b1 | @b2).must_be.equal_to(true, hash)
|
26
26
|
@model.solve!
|
27
27
|
end
|
28
|
-
@expect_options =
|
28
|
+
@expect_options = option_expectation do |strength, kind, reif_var|
|
29
29
|
@model.allow_space_access do
|
30
|
-
Gecode::Raw.should_receive(:
|
30
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
31
31
|
an_instance_of(Gecode::Raw::Space),
|
32
|
+
an_instance_of(Gecode::Raw::BoolVar),
|
33
|
+
Gecode::Raw::BOT_OR,
|
32
34
|
an_instance_of(Gecode::Raw::BoolVar),
|
33
|
-
an_instance_of(Gecode::Raw::BoolVar),
|
34
|
-
|
35
|
-
Gecode::Raw::ICL_DEF)
|
35
|
+
an_instance_of(Gecode::Raw::BoolVar),
|
36
|
+
Gecode::Raw::ICL_DEF, Gecode::Raw::PK_DEF)
|
36
37
|
unless reif_var.nil?
|
37
|
-
Gecode::Raw.should_receive(:
|
38
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
38
39
|
an_instance_of(Gecode::Raw::Space),
|
39
|
-
an_instance_of(Gecode::Raw::BoolVar),
|
40
|
-
an_instance_of(Gecode::Raw::BoolVar),
|
40
|
+
an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::BOT_EQV,
|
41
|
+
an_instance_of(Gecode::Raw::BoolVar), 1, strength, kind)
|
41
42
|
end
|
42
43
|
end
|
43
44
|
end
|
@@ -227,6 +228,5 @@ describe Gecode::Constraints::Bool do
|
|
227
228
|
sol.b3.value.should be_true
|
228
229
|
end
|
229
230
|
|
230
|
-
|
231
|
-
it_should_behave_like 'constraint with options'
|
231
|
+
it_should_behave_like 'reifiable constraint'
|
232
232
|
end
|
@@ -49,11 +49,13 @@ describe Gecode::Constraints::Set::Cardinality, ' (range)' do
|
|
49
49
|
it 'should not shadow the integer variable domain constrain' do
|
50
50
|
Gecode::Raw.should_receive(:dom).with(
|
51
51
|
an_instance_of(Gecode::Raw::Space),
|
52
|
-
an_instance_of(Gecode::Raw::IntVar), 0, 11, Gecode::Raw::ICL_DEF
|
52
|
+
an_instance_of(Gecode::Raw::IntVar), 0, 11, Gecode::Raw::ICL_DEF,
|
53
|
+
Gecode::Raw::PK_DEF)
|
53
54
|
Gecode::Raw.should_receive(:dom).with(
|
54
55
|
an_instance_of(Gecode::Raw::Space),
|
55
56
|
an_instance_of(Gecode::Raw::IntVar), an_instance_of(Gecode::Raw::IntSet),
|
56
|
-
an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF
|
57
|
+
an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF,
|
58
|
+
Gecode::Raw::PK_DEF)
|
57
59
|
@set.size.must_not_be.in [1,3]
|
58
60
|
@model.solve!
|
59
61
|
end
|
@@ -73,7 +75,7 @@ describe Gecode::Constraints::Set::Cardinality, ' (composite)' do
|
|
73
75
|
@set.size.must == rhs
|
74
76
|
@model.solve!
|
75
77
|
end
|
76
|
-
@expect = lambda do |relation, rhs, strength, reif_var, negated|
|
78
|
+
@expect = lambda do |relation, rhs, strength, kind, reif_var, negated|
|
77
79
|
@model.allow_space_access do
|
78
80
|
rhs = an_instance_of(Gecode::Raw::IntVar) if rhs.respond_to? :bind
|
79
81
|
if reif_var.nil?
|
@@ -91,7 +93,7 @@ describe Gecode::Constraints::Set::Cardinality, ' (composite)' do
|
|
91
93
|
Gecode::Raw.should_receive(:rel).once.with(
|
92
94
|
an_instance_of(Gecode::Raw::Space),
|
93
95
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
94
|
-
strength)
|
96
|
+
strength, kind)
|
95
97
|
end
|
96
98
|
else
|
97
99
|
Gecode::Raw.should_receive(:cardinality).once.with(
|
@@ -102,7 +104,7 @@ describe Gecode::Constraints::Set::Cardinality, ' (composite)' do
|
|
102
104
|
an_instance_of(Gecode::Raw::Space),
|
103
105
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
104
106
|
an_instance_of(Gecode::Raw::BoolVar),
|
105
|
-
strength)
|
107
|
+
strength, kind)
|
106
108
|
end
|
107
109
|
end
|
108
110
|
end
|
@@ -117,7 +119,8 @@ describe Gecode::Constraints::Set::Cardinality, ' (composite)' do
|
|
117
119
|
@model.solve!
|
118
120
|
end
|
119
121
|
@expect_relation = lambda do |relation, target, negated|
|
120
|
-
@expect.call(relation, target, Gecode::Raw::ICL_DEF,
|
122
|
+
@expect.call(relation, target, Gecode::Raw::ICL_DEF, Gecode::Raw::PK_DEF,
|
123
|
+
nil, negated)
|
121
124
|
end
|
122
125
|
|
123
126
|
# For options spec.
|
@@ -125,8 +128,8 @@ describe Gecode::Constraints::Set::Cardinality, ' (composite)' do
|
|
125
128
|
@set.size.must_be.less_than_or_equal_to(17, hash)
|
126
129
|
@model.solve!
|
127
130
|
end
|
128
|
-
@expect_options =
|
129
|
-
@expect.call(Gecode::Raw::IRT_LQ, 17, strength, reif_var, false)
|
131
|
+
@expect_options = option_expectation do |strength, kind, reif_var|
|
132
|
+
@expect.call(Gecode::Raw::IRT_LQ, 17, strength, kind, reif_var, false)
|
130
133
|
end
|
131
134
|
end
|
132
135
|
|
@@ -149,6 +152,6 @@ describe Gecode::Constraints::Set::Cardinality, ' (composite)' do
|
|
149
152
|
@set.value.size.should == 2
|
150
153
|
end
|
151
154
|
|
152
|
-
it_should_behave_like 'constraint
|
155
|
+
it_should_behave_like 'reifiable constraint'
|
153
156
|
it_should_behave_like 'composite constraint'
|
154
157
|
end
|
@@ -25,18 +25,18 @@ describe Gecode::Constraints::IntEnum::Channel, ' (two int enums)' do
|
|
25
25
|
@positions.must.channel @elements, hash
|
26
26
|
@model.solve!
|
27
27
|
end
|
28
|
-
@expect_options =
|
28
|
+
@expect_options = option_expectation do |strength, kind, reif_var|
|
29
29
|
Gecode::Raw.should_receive(:channel).once.with(
|
30
30
|
an_instance_of(Gecode::Raw::Space),
|
31
31
|
an_instance_of(Gecode::Raw::IntVarArray),
|
32
|
-
an_instance_of(Gecode::Raw::IntVarArray), strength)
|
32
|
+
an_instance_of(Gecode::Raw::IntVarArray), strength, kind)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'should translate into a channel constraint' do
|
37
37
|
Gecode::Raw.should_receive(:channel).once.with(
|
38
38
|
an_instance_of(Gecode::Raw::Space),
|
39
|
-
anything, anything, Gecode::Raw::ICL_DEF)
|
39
|
+
anything, anything, Gecode::Raw::ICL_DEF, Gecode::Raw::PK_DEF)
|
40
40
|
@invoke_options.call({})
|
41
41
|
end
|
42
42
|
|
@@ -59,7 +59,7 @@ describe Gecode::Constraints::IntEnum::Channel, ' (two int enums)' do
|
|
59
59
|
lambda{ @elements.must.channel 'hello' }.should raise_error(TypeError)
|
60
60
|
end
|
61
61
|
|
62
|
-
it_should_behave_like 'constraint
|
62
|
+
it_should_behave_like 'reifiable constraint'
|
63
63
|
end
|
64
64
|
|
65
65
|
describe Gecode::Constraints::IntEnum::Channel, ' (one int enum and one set enum)' do
|
@@ -99,7 +99,7 @@ describe Gecode::Constraints::SetEnum, ' (channel with set as left hand side)' d
|
|
99
99
|
@sets.must.channel @positions, hash
|
100
100
|
@model.solve!
|
101
101
|
end
|
102
|
-
@expect_options =
|
102
|
+
@expect_options = option_expectation do |strength, kind, reif_var|
|
103
103
|
Gecode::Raw.should_receive(:channel).once.with(
|
104
104
|
an_instance_of(Gecode::Raw::Space),
|
105
105
|
an_instance_of(Gecode::Raw::IntVarArray),
|
@@ -108,7 +108,7 @@ describe Gecode::Constraints::SetEnum, ' (channel with set as left hand side)' d
|
|
108
108
|
end
|
109
109
|
|
110
110
|
it 'should translate into a channel constraint' do
|
111
|
-
@expect_options.call(
|
111
|
+
@expect_options.call({})
|
112
112
|
@sets.must.channel @positions
|
113
113
|
@model.solve!
|
114
114
|
end
|
@@ -19,7 +19,8 @@ describe 'connection constraint', :shared => true do
|
|
19
19
|
@model.solve!
|
20
20
|
end
|
21
21
|
@expect_relation = lambda do |relation, target, negated|
|
22
|
-
@expect.call(relation, target, Gecode::Raw::ICL_DEF,
|
22
|
+
@expect.call(relation, target, Gecode::Raw::ICL_DEF, Gecode::Raw::PK_DEF,
|
23
|
+
nil, negated)
|
23
24
|
end
|
24
25
|
|
25
26
|
# For options spec.
|
@@ -27,12 +28,12 @@ describe 'connection constraint', :shared => true do
|
|
27
28
|
@stub.must_be.less_than_or_equal_to(17, hash)
|
28
29
|
@model.solve!
|
29
30
|
end
|
30
|
-
@expect_options =
|
31
|
-
@expect.call(Gecode::Raw::IRT_LQ, 17, strength, reif_var, false)
|
31
|
+
@expect_options = option_expectation do |strength, kind, reif_var|
|
32
|
+
@expect.call(Gecode::Raw::IRT_LQ, 17, strength, kind, reif_var, false)
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
|
-
it_should_behave_like 'constraint
|
36
|
+
it_should_behave_like 'reifiable constraint'
|
36
37
|
it_should_behave_like 'composite constraint'
|
37
38
|
end
|
38
39
|
|
@@ -44,7 +45,7 @@ describe Gecode::Constraints::Set::Connection, ' (min)' do
|
|
44
45
|
@model.branch_on @model.wrap_enum([@set])
|
45
46
|
@stub = @set.min
|
46
47
|
|
47
|
-
@expect = lambda do |relation, rhs, strength, reif_var, negated|
|
48
|
+
@expect = lambda do |relation, rhs, strength, kind, reif_var, negated|
|
48
49
|
@model.allow_space_access do
|
49
50
|
rhs = an_instance_of(Gecode::Raw::IntVar) if rhs.respond_to? :bind
|
50
51
|
if reif_var.nil?
|
@@ -62,7 +63,7 @@ describe Gecode::Constraints::Set::Connection, ' (min)' do
|
|
62
63
|
Gecode::Raw.should_receive(:rel).once.with(
|
63
64
|
an_instance_of(Gecode::Raw::Space),
|
64
65
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
65
|
-
strength)
|
66
|
+
strength, kind)
|
66
67
|
end
|
67
68
|
else
|
68
69
|
Gecode::Raw.should_receive(:min).once.with(
|
@@ -72,8 +73,7 @@ describe Gecode::Constraints::Set::Connection, ' (min)' do
|
|
72
73
|
Gecode::Raw.should_receive(:rel).once.with(
|
73
74
|
an_instance_of(Gecode::Raw::Space),
|
74
75
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
75
|
-
|
76
|
-
strength)
|
76
|
+
reif_var, strength, kind)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
@@ -96,7 +96,7 @@ describe Gecode::Constraints::Set::Connection, ' (max)' do
|
|
96
96
|
@model.branch_on @model.wrap_enum([@set])
|
97
97
|
@stub = @set.max
|
98
98
|
|
99
|
-
@expect = lambda do |relation, rhs, strength, reif_var, negated|
|
99
|
+
@expect = lambda do |relation, rhs, strength, kind, reif_var, negated|
|
100
100
|
@model.allow_space_access do
|
101
101
|
rhs = an_instance_of(Gecode::Raw::IntVar) if rhs.respond_to? :bind
|
102
102
|
if reif_var.nil?
|
@@ -114,7 +114,7 @@ describe Gecode::Constraints::Set::Connection, ' (max)' do
|
|
114
114
|
Gecode::Raw.should_receive(:rel).once.with(
|
115
115
|
an_instance_of(Gecode::Raw::Space),
|
116
116
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
117
|
-
strength)
|
117
|
+
strength, kind)
|
118
118
|
end
|
119
119
|
else
|
120
120
|
Gecode::Raw.should_receive(:max).once.with(
|
@@ -124,8 +124,7 @@ describe Gecode::Constraints::Set::Connection, ' (max)' do
|
|
124
124
|
Gecode::Raw.should_receive(:rel).once.with(
|
125
125
|
an_instance_of(Gecode::Raw::Space),
|
126
126
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
127
|
-
|
128
|
-
strength)
|
127
|
+
reif_var, strength, kind)
|
129
128
|
end
|
130
129
|
end
|
131
130
|
end
|
@@ -148,7 +147,7 @@ describe Gecode::Constraints::Set::Connection, ' (sum)' do
|
|
148
147
|
@model.branch_on @model.wrap_enum([@set])
|
149
148
|
@stub = @set.sum
|
150
149
|
|
151
|
-
@expect = lambda do |relation, rhs, strength, reif_var, negated|
|
150
|
+
@expect = lambda do |relation, rhs, strength, kind, reif_var, negated|
|
152
151
|
@model.allow_space_access do
|
153
152
|
rhs = an_instance_of(Gecode::Raw::IntVar) if rhs.respond_to? :bind
|
154
153
|
if reif_var.nil?
|
@@ -167,7 +166,7 @@ describe Gecode::Constraints::Set::Connection, ' (sum)' do
|
|
167
166
|
Gecode::Raw.should_receive(:rel).once.with(
|
168
167
|
an_instance_of(Gecode::Raw::Space),
|
169
168
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
170
|
-
strength)
|
169
|
+
strength, kind)
|
171
170
|
end
|
172
171
|
else
|
173
172
|
Gecode::Raw.should_receive(:weights).once.with(
|
@@ -177,8 +176,7 @@ describe Gecode::Constraints::Set::Connection, ' (sum)' do
|
|
177
176
|
Gecode::Raw.should_receive(:rel).once.with(
|
178
177
|
an_instance_of(Gecode::Raw::Space),
|
179
178
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
180
|
-
|
181
|
-
strength)
|
179
|
+
reif_var, strength, kind)
|
182
180
|
end
|
183
181
|
end
|
184
182
|
end
|
@@ -214,7 +212,7 @@ describe Gecode::Constraints::Set::Connection, ' (sum with weights)' do
|
|
214
212
|
@weights = Hash[*(0..9).zip((-9..-0).to_a.reverse).flatten]
|
215
213
|
@stub = @set.sum(:weights => @weights)
|
216
214
|
|
217
|
-
@expect = lambda do |relation, rhs, strength, reif_var, negated|
|
215
|
+
@expect = lambda do |relation, rhs, strength, kind, reif_var, negated|
|
218
216
|
@model.allow_space_access do
|
219
217
|
rhs = an_instance_of(Gecode::Raw::IntVar) if rhs.respond_to? :bind
|
220
218
|
if reif_var.nil?
|
@@ -232,7 +230,7 @@ describe Gecode::Constraints::Set::Connection, ' (sum with weights)' do
|
|
232
230
|
Gecode::Raw.should_receive(:rel).once.with(
|
233
231
|
an_instance_of(Gecode::Raw::Space),
|
234
232
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
235
|
-
strength)
|
233
|
+
strength, kind)
|
236
234
|
end
|
237
235
|
else
|
238
236
|
Gecode::Raw.should_receive(:weights).once.with(
|
@@ -242,8 +240,7 @@ describe Gecode::Constraints::Set::Connection, ' (sum with weights)' do
|
|
242
240
|
Gecode::Raw.should_receive(:rel).once.with(
|
243
241
|
an_instance_of(Gecode::Raw::Space),
|
244
242
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
245
|
-
|
246
|
-
strength)
|
243
|
+
reif_var, strength, kind)
|
247
244
|
end
|
248
245
|
end
|
249
246
|
end
|
@@ -275,7 +272,7 @@ describe Gecode::Constraints::Set::Connection, ' (sum with substitutions)' do
|
|
275
272
|
@subs = Hash[*(0..9).zip((-9..-0).to_a.reverse).flatten]
|
276
273
|
@stub = @set.sum(:substitutions => @subs)
|
277
274
|
|
278
|
-
@expect = lambda do |relation, rhs, strength, reif_var, negated|
|
275
|
+
@expect = lambda do |relation, rhs, strength, kind, reif_var, negated|
|
279
276
|
@model.allow_space_access do
|
280
277
|
rhs = an_instance_of(Gecode::Raw::IntVar) if rhs.respond_to? :bind
|
281
278
|
if reif_var.nil?
|
@@ -293,7 +290,7 @@ describe Gecode::Constraints::Set::Connection, ' (sum with substitutions)' do
|
|
293
290
|
Gecode::Raw.should_receive(:rel).once.with(
|
294
291
|
an_instance_of(Gecode::Raw::Space),
|
295
292
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
296
|
-
strength)
|
293
|
+
strength, kind)
|
297
294
|
end
|
298
295
|
else
|
299
296
|
Gecode::Raw.should_receive(:weights).once.with(
|
@@ -303,8 +300,7 @@ describe Gecode::Constraints::Set::Connection, ' (sum with substitutions)' do
|
|
303
300
|
Gecode::Raw.should_receive(:rel).once.with(
|
304
301
|
an_instance_of(Gecode::Raw::Space),
|
305
302
|
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
306
|
-
|
307
|
-
strength)
|
303
|
+
reif_var, strength, kind)
|
308
304
|
end
|
309
305
|
end
|
310
306
|
end
|
@@ -339,7 +335,7 @@ describe Gecode::Constraints::Set::Connection, ' (include)' do
|
|
339
335
|
end
|
340
336
|
end
|
341
337
|
|
342
|
-
@expect_options =
|
338
|
+
@expect_options = option_expectation do |strength, kind, reif_var|
|
343
339
|
@expect.call(@array, strength, reif_var)
|
344
340
|
end
|
345
341
|
@invoke_options = lambda do |hash|
|
@@ -349,7 +345,7 @@ describe Gecode::Constraints::Set::Connection, ' (include)' do
|
|
349
345
|
end
|
350
346
|
|
351
347
|
it 'should translate to a match constraint' do
|
352
|
-
@expect_options.call(
|
348
|
+
@expect_options.call({})
|
353
349
|
@set.must.include @array
|
354
350
|
@model.solve!
|
355
351
|
end
|
@@ -1,7 +1,28 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
3
|
+
# Several of these shared specs requires one or more of the following instance
|
4
|
+
# variables to be used:
|
5
|
+
# [@expect_options] A method that creates an expectation on the aspect to be
|
6
|
+
# tested, using the provided hash of Gecode values. The hash
|
7
|
+
# can have values for the keys :icl (ICL_*), :pk (PK_*), and
|
8
|
+
# :bool (bound reification variable). Any values not
|
9
|
+
# provided are assumed to be default values (nil in the case
|
10
|
+
# of :bool).
|
11
|
+
# [@invoke_options] A method that invokes the aspect to be tested, with the
|
12
|
+
# provided hash of options (with at most the keys :strength,
|
13
|
+
# :kind and :reify).
|
14
|
+
# [@model] The model instance that contains the aspects being tested.
|
15
|
+
# [@expect_relation] A method that takes a relation, right hand side, and
|
16
|
+
# whether it's negated, as arguments and sets up the
|
17
|
+
# corresponding expectations.
|
18
|
+
# [@invoke_relation] A method that takes a relation, right hand side, and
|
19
|
+
# whether it's negated, as arguments and adds the
|
20
|
+
# corresponding constraint and invokes it.
|
21
|
+
# [@target] A legal right hand side that can be used as argument to
|
22
|
+
# the above two methods.
|
23
|
+
|
24
|
+
|
25
|
+
# Requires @invoke_options and @expect_options.
|
5
26
|
describe 'constraint with strength option', :shared => true do
|
6
27
|
{ :default => Gecode::Raw::ICL_DEF,
|
7
28
|
:value => Gecode::Raw::ICL_VAL,
|
@@ -9,49 +30,92 @@ describe 'constraint with strength option', :shared => true do
|
|
9
30
|
:domain => Gecode::Raw::ICL_DOM
|
10
31
|
}.each_pair do |name, gecode_value|
|
11
32
|
it "should translate propagation strength #{name}" do
|
12
|
-
@expect_options.call(gecode_value
|
33
|
+
@expect_options.call(:icl => gecode_value)
|
13
34
|
@invoke_options.call(:strength => name)
|
14
35
|
end
|
15
36
|
end
|
16
37
|
|
17
38
|
it 'should default to using default as propagation strength' do
|
18
|
-
@expect_options.call(
|
39
|
+
@expect_options.call({})
|
19
40
|
@invoke_options.call({})
|
20
41
|
end
|
21
42
|
|
22
|
-
it 'should raise errors for unrecognized
|
23
|
-
lambda
|
24
|
-
|
43
|
+
it 'should raise errors for unrecognized propagation strengths' do
|
44
|
+
lambda do
|
45
|
+
@invoke_options.call(:strength => :does_not_exist)
|
46
|
+
end.should raise_error(ArgumentError)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Requires @invoke_options and @expect_options.
|
51
|
+
describe 'constraint with kind option', :shared => true do
|
52
|
+
{ :default => Gecode::Raw::PK_DEF,
|
53
|
+
:speed => Gecode::Raw::PK_SPEED,
|
54
|
+
:memory => Gecode::Raw::PK_MEMORY
|
55
|
+
}.each_pair do |name, gecode_value|
|
56
|
+
it "should translate propagation kind #{name}" do
|
57
|
+
@expect_options.call(:pk => gecode_value)
|
58
|
+
@invoke_options.call(:kind => name)
|
59
|
+
end
|
25
60
|
end
|
26
61
|
|
27
|
-
it 'should
|
28
|
-
|
29
|
-
|
62
|
+
it 'should default to using default as propagation kind' do
|
63
|
+
@expect_options.call({})
|
64
|
+
@invoke_options.call({})
|
30
65
|
end
|
31
66
|
|
32
|
-
it 'should raise errors for
|
33
|
-
lambda
|
34
|
-
|
67
|
+
it 'should raise errors for unrecognized propagation kinds' do
|
68
|
+
lambda do
|
69
|
+
@invoke_options.call(:kind => :does_not_exist)
|
70
|
+
end.should raise_error(ArgumentError)
|
35
71
|
end
|
36
72
|
end
|
37
73
|
|
38
|
-
|
39
|
-
# and @expect_options
|
40
|
-
describe 'constraint with
|
74
|
+
|
75
|
+
# Requires @invoke_options and @expect_options.
|
76
|
+
describe 'constraint with reification option', :shared => true do
|
41
77
|
it 'should translate reification' do
|
42
78
|
var = @model.bool_var
|
43
|
-
@expect_options.call(
|
79
|
+
@expect_options.call(:bool => var)
|
44
80
|
@invoke_options.call(:reify => var)
|
45
81
|
end
|
46
82
|
|
83
|
+
it 'should raise errors for reification variables of incorrect type' do
|
84
|
+
lambda do
|
85
|
+
@invoke_options.call(:reify => 'foo')
|
86
|
+
end.should raise_error(TypeError)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Requires @invoke_options and @expect_options.
|
91
|
+
describe 'reifiable constraint', :shared => true do
|
92
|
+
it_should_behave_like 'constraint with default options'
|
93
|
+
it_should_behave_like 'constraint with reification option'
|
94
|
+
end
|
95
|
+
|
96
|
+
# Requires @invoke_options, @expect_options and @model.
|
97
|
+
describe 'non-reifiable constraint', :shared => true do
|
98
|
+
it 'should raise errors if reification is used' do
|
99
|
+
lambda do
|
100
|
+
@invoke_options.call(:reify => @model.bool_var)
|
101
|
+
end.should raise_error(ArgumentError)
|
102
|
+
end
|
103
|
+
|
104
|
+
it_should_behave_like 'constraint with default options'
|
105
|
+
end
|
106
|
+
|
107
|
+
# Requires @invoke_options and @expect_options.
|
108
|
+
describe 'constraint with default options', :shared => true do
|
109
|
+
it 'should raise errors for unrecognized options' do
|
110
|
+
lambda{ @invoke_options.call(:does_not_exist => :foo) }.should(
|
111
|
+
raise_error(ArgumentError))
|
112
|
+
end
|
113
|
+
|
47
114
|
it_should_behave_like 'constraint with strength option'
|
115
|
+
it_should_behave_like 'constraint with kind option'
|
48
116
|
end
|
49
117
|
|
50
|
-
#
|
51
|
-
# @expect_relation which takes a relation, right hand side and whether it's
|
52
|
-
# negated as arguments and sets up the corresponding expectations. It also
|
53
|
-
# requires @invoke_relation with the same arguments. The spec is also required
|
54
|
-
# to provide a variable @target.
|
118
|
+
# Requires @expect_relation, @invoke_relation and @target.
|
55
119
|
describe 'composite constraint', :shared => true do
|
56
120
|
Gecode::Constraints::Util::RELATION_TYPES.each_pair do |relation, type|
|
57
121
|
it "should translate #{relation} with constant target" do
|
@@ -88,11 +152,7 @@ describe 'composite constraint', :shared => true do
|
|
88
152
|
end
|
89
153
|
end
|
90
154
|
|
91
|
-
#
|
92
|
-
# @expect_relation which takes a relation, right hand side and whether it's
|
93
|
-
# negated as arguments and sets up the corresponding expectations. It also
|
94
|
-
# requires @invoke_relation with the same arguments. The spec is also required
|
95
|
-
# to provide a variable @target.
|
155
|
+
# Requires @expect_relation, @invoke_relation and @target.
|
96
156
|
describe 'composite set constraint', :shared => true do
|
97
157
|
Gecode::Constraints::Util::SET_RELATION_TYPES.each_pair do |relation, type|
|
98
158
|
it "should translate #{relation} with constant target" do
|
@@ -129,35 +189,42 @@ describe 'composite set constraint', :shared => true do
|
|
129
189
|
end
|
130
190
|
end
|
131
191
|
|
132
|
-
|
133
|
-
describe 'non-reifiable set constraint', :shared => true do
|
192
|
+
describe 'set constraint', :shared => true do
|
134
193
|
it 'should not accept strength option' do
|
135
194
|
lambda do
|
136
195
|
@invoke_options.call(:strength => :default)
|
137
196
|
end.should raise_error(ArgumentError)
|
138
197
|
end
|
139
198
|
|
199
|
+
it 'should not accept kind option' do
|
200
|
+
lambda do
|
201
|
+
@invoke_options.call(:kind => :default)
|
202
|
+
end.should raise_error(ArgumentError)
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'should raise errors for unrecognized options' do
|
206
|
+
lambda do
|
207
|
+
@invoke_options.call(:does_not_exist => :foo)
|
208
|
+
end.should raise_error(ArgumentError)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# Requires @invoke_options and @model.
|
213
|
+
describe 'non-reifiable set constraint', :shared => true do
|
140
214
|
it 'should not accept reification option' do
|
141
215
|
bool = @model.bool_var
|
142
216
|
lambda do
|
143
217
|
@invoke_options.call(:reify => bool)
|
144
218
|
end.should raise_error(ArgumentError)
|
145
219
|
end
|
220
|
+
|
221
|
+
it_should_behave_like 'set constraint'
|
146
222
|
end
|
147
223
|
|
148
224
|
# Requires @invoke_options, @expect_options and @model.
|
149
225
|
describe 'reifiable set constraint', :shared => true do
|
150
|
-
|
151
|
-
|
152
|
-
@invoke_options.call(:strength => :default)
|
153
|
-
end.should raise_error(ArgumentError)
|
154
|
-
end
|
155
|
-
|
156
|
-
it 'should accept reification option' do
|
157
|
-
bool = @model.bool_var
|
158
|
-
@expect_options.call(nil, bool)
|
159
|
-
@invoke_options.call(:reify => bool)
|
160
|
-
end
|
226
|
+
it_should_behave_like 'set constraint'
|
227
|
+
it_should_behave_like 'constraint with reification option'
|
161
228
|
end
|
162
229
|
|
163
230
|
# Help methods for the GecodeR specs.
|
@@ -177,4 +244,21 @@ module GecodeR::Specs
|
|
177
244
|
end
|
178
245
|
end
|
179
246
|
end
|
180
|
-
end
|
247
|
+
end
|
248
|
+
|
249
|
+
# Helper for creating @expect_option. Creates a method which takes a hash that
|
250
|
+
# may have values for the keys :icl (ICL_*), :pk (PK_*), and :bool (reification
|
251
|
+
# variable). Expectations corresponding to the hash values are given to the
|
252
|
+
# specified block in the order of icl, pk and bool. Default values are provided
|
253
|
+
# if the hash doesn't specify anything else.
|
254
|
+
def option_expectation(&block)
|
255
|
+
lambda do |hash|
|
256
|
+
bool = hash[:bool]
|
257
|
+
# We loosen the expectation some to avoid practical problems with expecting
|
258
|
+
# specific variables not under our control.
|
259
|
+
bool = an_instance_of(Gecode::Raw::BoolVar) unless bool.nil?
|
260
|
+
yield(hash[:icl] || Gecode::Raw::ICL_DEF,
|
261
|
+
hash[:pk] || Gecode::Raw::PK_DEF,
|
262
|
+
bool)
|
263
|
+
end
|
264
|
+
end
|