gecoder 0.5.0 → 0.6.0
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 +16 -3
- data/example/magic_sequence.rb +1 -1
- data/example/queens.rb +1 -1
- data/example/send_more_money.rb +1 -1
- data/example/sudoku.rb +1 -1
- data/ext/missing.cpp +18 -4
- data/ext/missing.h +8 -0
- data/lib/gecoder/bindings.rb +30 -3
- data/lib/gecoder/bindings/bindings.rb +22 -0
- data/lib/gecoder/interface/binding_changes.rb +81 -107
- data/lib/gecoder/interface/branch.rb +65 -14
- data/lib/gecoder/interface/constraints.rb +1 -0
- data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +16 -12
- data/lib/gecoder/interface/constraints/int/arithmetic.rb +7 -3
- data/lib/gecoder/interface/constraints/int/linear.rb +19 -16
- data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +8 -4
- data/lib/gecoder/interface/constraints/int_enum/channel.rb +14 -6
- data/lib/gecoder/interface/constraints/int_enum/element.rb +7 -5
- data/lib/gecoder/interface/constraints/int_enum/sort.rb +1 -4
- data/lib/gecoder/interface/constraints/set/cardinality.rb +6 -3
- data/lib/gecoder/interface/constraints/set/connection.rb +136 -0
- data/lib/gecoder/interface/constraints/set_enum/channel.rb +18 -0
- data/lib/gecoder/interface/constraints/set_enum/distinct.rb +61 -0
- data/lib/gecoder/interface/constraints/set_enum_constraints.rb +32 -0
- data/lib/gecoder/interface/constraints/set_var_constraints.rb +1 -0
- data/lib/gecoder/interface/enum_wrapper.rb +12 -3
- data/lib/gecoder/interface/model.rb +77 -56
- data/lib/gecoder/interface/search.rb +74 -5
- data/lib/gecoder/interface/variables.rb +117 -15
- data/lib/gecoder/version.rb +1 -1
- data/specs/binding_changes.rb +9 -5
- data/specs/bool_var.rb +8 -12
- data/specs/branch.rb +85 -19
- data/specs/constraints/arithmetic.rb +99 -71
- data/specs/constraints/bool_enum.rb +26 -18
- data/specs/constraints/boolean.rb +53 -49
- data/specs/constraints/cardinality.rb +33 -26
- data/specs/constraints/channel.rb +77 -6
- data/specs/constraints/connection.rb +352 -0
- data/specs/constraints/constraints.rb +10 -1
- data/specs/constraints/count.rb +79 -39
- data/specs/constraints/distinct.rb +128 -9
- data/specs/constraints/element.rb +26 -19
- data/specs/constraints/equality.rb +2 -1
- data/specs/constraints/int_domain.rb +19 -12
- data/specs/constraints/int_relation.rb +12 -6
- data/specs/constraints/linear.rb +30 -30
- data/specs/constraints/reification_sugar.rb +8 -4
- data/specs/constraints/set_domain.rb +24 -18
- data/specs/constraints/set_relation.rb +38 -23
- data/specs/constraints/sort.rb +12 -10
- data/specs/enum_wrapper.rb +9 -3
- data/specs/int_var.rb +8 -4
- data/specs/logging.rb +24 -0
- data/specs/model.rb +25 -7
- data/specs/search.rb +41 -1
- data/specs/set_var.rb +36 -7
- data/specs/spec_helper.rb +3 -10
- data/vendor/rust/rust/templates/FunctionDefinition.rusttpl +1 -1
- metadata +12 -3
- data/specs/tmp +0 -22
@@ -27,10 +27,12 @@ describe Gecode::Constraints::ReifiableConstraint do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'should translate disjunctions' do
|
30
|
-
Gecode::Raw.should_receive(:rel).once.with(
|
30
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
31
|
+
an_instance_of(Gecode::Raw::Space),
|
31
32
|
an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_GR, 0,
|
32
33
|
an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF)
|
33
|
-
Gecode::Raw.should_receive(:rel).once.with(
|
34
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
35
|
+
an_instance_of(Gecode::Raw::Space),
|
34
36
|
an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_EQ, 3,
|
35
37
|
an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF)
|
36
38
|
(@x.must > 0) | (@y.must == 3)
|
@@ -50,10 +52,12 @@ describe Gecode::Constraints::ReifiableConstraint do
|
|
50
52
|
end
|
51
53
|
|
52
54
|
it 'should translate conjunctions' do
|
53
|
-
Gecode::Raw.should_receive(:rel).once.with(
|
55
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
56
|
+
an_instance_of(Gecode::Raw::Space),
|
54
57
|
an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_GR, 0,
|
55
58
|
an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF)
|
56
|
-
Gecode::Raw.should_receive(:rel).once.with(
|
59
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
60
|
+
an_instance_of(Gecode::Raw::Space),
|
57
61
|
an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_EQ, 2,
|
58
62
|
an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF)
|
59
63
|
(@x.must > 0) & (@y.must == 2)
|
@@ -14,14 +14,17 @@ describe Gecode::Constraints::Set::Domain do
|
|
14
14
|
@singleton = 0
|
15
15
|
|
16
16
|
@expect = lambda do |relation_type, rhs, reif_var, negated|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
+
@set.bind, relation_type, *expect_constant_set(rhs))
|
22
|
+
else
|
23
|
+
params = [@model.active_space, @set.bind, relation_type]
|
24
|
+
params << expect_constant_set(rhs)
|
25
|
+
params << an_instance_of(Gecode::Raw::BoolVar)
|
26
|
+
Gecode::Raw.should_receive(:dom).once.with(*params.flatten)
|
27
|
+
end
|
25
28
|
end
|
26
29
|
end
|
27
30
|
|
@@ -91,14 +94,17 @@ describe Gecode::Constraints::Set::Domain, ' (equality)' do
|
|
91
94
|
@singleton = 0
|
92
95
|
|
93
96
|
@expect = lambda do |relation_type, rhs, reif_var|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
97
|
+
@model.allow_space_access do
|
98
|
+
if reif_var.nil?
|
99
|
+
Gecode::Raw.should_receive(:dom).once.with(
|
100
|
+
an_instance_of(Gecode::Raw::Space),
|
101
|
+
@set.bind, relation_type, *expect_constant_set(rhs))
|
102
|
+
else
|
103
|
+
params = [@model.active_space, @set.bind, relation_type]
|
104
|
+
params << expect_constant_set(rhs)
|
105
|
+
params << an_instance_of(Gecode::Raw::BoolVar)
|
106
|
+
Gecode::Raw.should_receive(:dom).once.with(*params.flatten)
|
107
|
+
end
|
102
108
|
end
|
103
109
|
end
|
104
110
|
|
@@ -152,8 +158,8 @@ describe Gecode::Constraints::Set::Domain, ' (equality)' do
|
|
152
158
|
@set.must == @singleton
|
153
159
|
@model.solve!
|
154
160
|
@set.should be_assigned
|
155
|
-
@set.should include(@singleton)
|
156
|
-
@set.
|
161
|
+
@set.value.should include(@singleton)
|
162
|
+
@set.value.size.should == 1
|
157
163
|
end
|
158
164
|
|
159
165
|
it 'should constrain the domain with inequality' do
|
@@ -10,13 +10,17 @@ describe Gecode::Constraints::Set::Relation do
|
|
10
10
|
@set2 = @model.set_var([1], 0..3)
|
11
11
|
|
12
12
|
@expect = lambda do |relation_type, rhs, reif_var, negated|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
@model.allow_space_access do
|
14
|
+
if reif_var.nil? and !negated
|
15
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
16
|
+
an_instance_of(Gecode::Raw::Space),
|
17
|
+
@set.bind, relation_type, @set2.bind)
|
18
|
+
else
|
19
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
20
|
+
an_instance_of(Gecode::Raw::Space),
|
21
|
+
@set.bind, relation_type, @set2.bind,
|
22
|
+
an_instance_of(Gecode::Raw::BoolVar))
|
23
|
+
end
|
20
24
|
end
|
21
25
|
end
|
22
26
|
|
@@ -57,13 +61,17 @@ describe Gecode::Constraints::Set::Relation, ' (equality)' do
|
|
57
61
|
@set2 = @model.set_var([1], 0..1)
|
58
62
|
|
59
63
|
@expect = lambda do |relation_type, rhs, reif_var|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
@model.allow_space_access do
|
65
|
+
if reif_var.nil?
|
66
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
67
|
+
an_instance_of(Gecode::Raw::Space),
|
68
|
+
@set.bind, relation_type, @set2.bind)
|
69
|
+
else
|
70
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
71
|
+
an_instance_of(Gecode::Raw::Space),
|
72
|
+
@set.bind, relation_type, @set2.bind,
|
73
|
+
an_instance_of(Gecode::Raw::BoolVar))
|
74
|
+
end
|
67
75
|
end
|
68
76
|
end
|
69
77
|
|
@@ -119,12 +127,19 @@ describe Gecode::Constraints::Set::Relation, ' (elements)' do
|
|
119
127
|
@int_constant = 2
|
120
128
|
@model.branch_on @model.wrap_enum([@set])
|
121
129
|
@expect = lambda do |relation_type, rhs|
|
122
|
-
|
123
|
-
rhs
|
130
|
+
@model.allow_space_access do
|
131
|
+
if rhs.kind_of? Fixnum
|
132
|
+
rhs = an_instance_of(Gecode::Raw::IntVar)
|
133
|
+
end
|
134
|
+
rhs = rhs.bind if rhs.respond_to? :bind
|
135
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
136
|
+
an_instance_of(Gecode::Raw::Space),
|
137
|
+
@set.bind, relation_type, rhs)
|
124
138
|
end
|
125
|
-
|
126
|
-
|
127
|
-
|
139
|
+
end
|
140
|
+
|
141
|
+
@invoke_options = lambda do |hash|
|
142
|
+
@set.elements.must_be.equal_to(@int_var, hash)
|
128
143
|
end
|
129
144
|
|
130
145
|
@invoke_options = lambda do |hash|
|
@@ -165,16 +180,16 @@ describe Gecode::Constraints::Set::Relation, ' (elements)' do
|
|
165
180
|
@int_var.must == 0
|
166
181
|
@model.solve!
|
167
182
|
@set.should be_assigned
|
168
|
-
@set.should include(0)
|
169
|
-
@set.should_not include(1,2)
|
183
|
+
@set.value.should include(0)
|
184
|
+
@set.value.should_not include(1,2)
|
170
185
|
end
|
171
186
|
|
172
187
|
it 'should constrain the elements of the set (constant parameter)' do
|
173
188
|
@set.elements.must <= 0
|
174
189
|
@model.solve!
|
175
190
|
@set.should be_assigned
|
176
|
-
@set.should include(0)
|
177
|
-
@set.should_not include(1,2)
|
191
|
+
@set.value.should include(0)
|
192
|
+
@set.value.should_not include(1,2)
|
178
193
|
end
|
179
194
|
|
180
195
|
it_should_behave_like 'non-reifiable set constraint'
|
data/specs/constraints/sort.rb
CHANGED
@@ -31,12 +31,12 @@ describe Gecode::Constraints::IntEnum::Sort, ' (without :as and :order)' do
|
|
31
31
|
@expect_options = lambda do |strength, reif_var|
|
32
32
|
if reif_var.nil?
|
33
33
|
Gecode::Raw.should_receive(:rel).exactly(@vars.size - 1).times.with(
|
34
|
-
|
34
|
+
an_instance_of(Gecode::Raw::Space),
|
35
35
|
an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_LQ,
|
36
36
|
an_instance_of(Gecode::Raw::IntVar), strength)
|
37
37
|
else
|
38
38
|
Gecode::Raw.should_receive(:rel).exactly(@vars.size - 1).times.with(
|
39
|
-
|
39
|
+
an_instance_of(Gecode::Raw::Space),
|
40
40
|
an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_LQ,
|
41
41
|
an_instance_of(Gecode::Raw::IntVar),
|
42
42
|
an_instance_of(Gecode::Raw::BoolVar), strength)
|
@@ -51,14 +51,14 @@ describe Gecode::Constraints::IntEnum::Sort, ' (without :as and :order)' do
|
|
51
51
|
|
52
52
|
it 'should constraint variables to be sorted' do
|
53
53
|
@vars.must_be.sorted
|
54
|
-
values = @model.solve!.vars.
|
54
|
+
values = @model.solve!.vars.values
|
55
55
|
values.should == values.sort
|
56
56
|
end
|
57
57
|
|
58
58
|
it 'should allow negation' do
|
59
59
|
@vars.must_not_be.sorted
|
60
60
|
@model.solve!
|
61
|
-
values = @vars.
|
61
|
+
values = @vars.values
|
62
62
|
values.should_not == values.sort
|
63
63
|
end
|
64
64
|
|
@@ -79,7 +79,8 @@ describe Gecode::Constraints::IntEnum::Sort, ' (with :as)' do
|
|
79
79
|
@model.solve!
|
80
80
|
end
|
81
81
|
@expect_options = lambda do |strength, reif_var|
|
82
|
-
Gecode::Raw.should_receive(:sortedness).once.with(
|
82
|
+
Gecode::Raw.should_receive(:sortedness).once.with(
|
83
|
+
an_instance_of(Gecode::Raw::Space),
|
83
84
|
an_instance_of(Gecode::Raw::IntVarArray),
|
84
85
|
an_instance_of(Gecode::Raw::IntVarArray), strength)
|
85
86
|
end
|
@@ -93,7 +94,7 @@ describe Gecode::Constraints::IntEnum::Sort, ' (with :as)' do
|
|
93
94
|
it 'should constraint variables to be sorted' do
|
94
95
|
@vars.must_be.sorted(:as => @sorted)
|
95
96
|
@model.solve!
|
96
|
-
values = @sorted.
|
97
|
+
values = @sorted.values
|
97
98
|
values.should == values.sort
|
98
99
|
end
|
99
100
|
|
@@ -124,7 +125,8 @@ describe Gecode::Constraints::IntEnum::Sort, ' (with :order)' do
|
|
124
125
|
@model.solve!
|
125
126
|
end
|
126
127
|
@expect_options = lambda do |strength, reif_var|
|
127
|
-
Gecode::Raw.should_receive(:sortedness).once.with(
|
128
|
+
Gecode::Raw.should_receive(:sortedness).once.with(
|
129
|
+
an_instance_of(Gecode::Raw::Space),
|
128
130
|
an_instance_of(Gecode::Raw::IntVarArray),
|
129
131
|
an_instance_of(Gecode::Raw::IntVarArray),
|
130
132
|
an_instance_of(Gecode::Raw::IntVarArray), strength)
|
@@ -145,10 +147,10 @@ describe Gecode::Constraints::IntEnum::Sort, ' (with :order)' do
|
|
145
147
|
it 'should constraint variables to be sorted with the specified indices' do
|
146
148
|
@vars.must_be.sorted(:as => @sorted, :order => @indices)
|
147
149
|
@model.solve!
|
148
|
-
sorted_values = @sorted.
|
150
|
+
sorted_values = @sorted.values
|
149
151
|
sorted_values.should == sorted_values.sort
|
150
|
-
expected_indices = @vars.map{ |v| sorted_values.index(v.
|
151
|
-
@indices.
|
152
|
+
expected_indices = @vars.map{ |v| sorted_values.index(v.value) }
|
153
|
+
@indices.values.should == expected_indices
|
152
154
|
end
|
153
155
|
|
154
156
|
it 'should not allow targets that are not int var enums' do
|
data/specs/enum_wrapper.rb
CHANGED
@@ -68,7 +68,9 @@ describe Gecode::IntEnumMethods do
|
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'should convert to an int var array' do
|
71
|
-
@
|
71
|
+
@model.allow_space_access do
|
72
|
+
@int_enum.to_int_var_array.should be_kind_of(Gecode::Raw::IntVarArray)
|
73
|
+
end
|
72
74
|
end
|
73
75
|
|
74
76
|
it 'should compute the smallest domain range' do
|
@@ -84,7 +86,9 @@ describe Gecode::BoolEnumMethods do
|
|
84
86
|
end
|
85
87
|
|
86
88
|
it 'should convert to a bool var array' do
|
87
|
-
@
|
89
|
+
@model.allow_space_access do
|
90
|
+
@bool_enum.to_bool_var_array.should be_kind_of(Gecode::Raw::BoolVarArray)
|
91
|
+
end
|
88
92
|
end
|
89
93
|
end
|
90
94
|
|
@@ -95,7 +99,9 @@ describe Gecode::SetEnumMethods do
|
|
95
99
|
end
|
96
100
|
|
97
101
|
it 'should convert to a set var array' do
|
98
|
-
@
|
102
|
+
@model.allow_space_access do
|
103
|
+
@set_enum.to_set_var_array.should be_kind_of(Gecode::Raw::SetVarArray)
|
104
|
+
end
|
99
105
|
end
|
100
106
|
end
|
101
107
|
|
data/specs/int_var.rb
CHANGED
@@ -15,13 +15,13 @@ describe 'non-empty int variable', :shared => true do
|
|
15
15
|
|
16
16
|
it 'should contain every element in its domain' do
|
17
17
|
@domain.each do |i|
|
18
|
-
@var.should
|
18
|
+
@var.should include(i)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'should not contain elements outside its domain' do
|
23
|
-
@var.should_not
|
24
|
-
@var.should_not
|
23
|
+
@var.should_not include(@domain.min - 1)
|
24
|
+
@var.should_not include(@domain.max + 1)
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'should have a width equal to the domain width' do
|
@@ -54,6 +54,10 @@ describe Gecode::FreeIntVar, ' (with range domain of size > 1)' do
|
|
54
54
|
it 'should have a range domain' do
|
55
55
|
@var.should be_range
|
56
56
|
end
|
57
|
+
|
58
|
+
it 'should raise error when trying to access assigned value' do
|
59
|
+
lambda{ @var.value }.should raise_error(RuntimeError)
|
60
|
+
end
|
57
61
|
end
|
58
62
|
|
59
63
|
describe Gecode::FreeIntVar, ' (defined with three-dot range)' do
|
@@ -85,7 +89,7 @@ describe Gecode::FreeIntVar, ' (with non-range domain of size > 1)' do
|
|
85
89
|
end
|
86
90
|
|
87
91
|
it 'should not contain the domain\'s holes' do
|
88
|
-
@var.should_not
|
92
|
+
@var.should_not include(0)
|
89
93
|
end
|
90
94
|
end
|
91
95
|
|
data/specs/logging.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Gecode::LoggingLayer do
|
4
|
+
before do
|
5
|
+
# Enable logging.
|
6
|
+
Gecode.instance_eval{ remove_const(:Raw) }
|
7
|
+
Gecode.const_set(:Raw, Gecode::LoggingLayer)
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
# Disable logging.
|
12
|
+
Gecode.instance_eval{ remove_const(:Raw) }
|
13
|
+
Gecode.const_set(:Raw, GecodeRaw)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "shouldn't interfere with calls through Gecode::Raw" do
|
17
|
+
lambda do
|
18
|
+
model = Gecode::Model.new
|
19
|
+
int_var = model.int_var(0..9)
|
20
|
+
int_var.must >= 5
|
21
|
+
model.solve!
|
22
|
+
end.should_not raise_error
|
23
|
+
end
|
24
|
+
end
|
data/specs/model.rb
CHANGED
@@ -116,13 +116,13 @@ describe Gecode::Model, ' (set creation)' do
|
|
116
116
|
|
117
117
|
it 'should allow the creation of set variables with specified lower cardinality bound' do
|
118
118
|
@model.set_var(@glb_range, @lub_range,
|
119
|
-
@lower_card).
|
119
|
+
@lower_card).cardinality.begin.should >= @lower_card
|
120
120
|
end
|
121
121
|
|
122
122
|
it 'should allow the creation of set variables with specified cardinality range' do
|
123
123
|
var = @model.set_var(@glb_range, @lub_range, @lower_card..@upper_card)
|
124
|
-
var.
|
125
|
-
var.
|
124
|
+
var.cardinality.end.should <= @upper_card
|
125
|
+
var.cardinality.begin.should >= @lower_card
|
126
126
|
end
|
127
127
|
|
128
128
|
it 'should allow the creation of arrays of set variables' do
|
@@ -130,8 +130,8 @@ describe Gecode::Model, ' (set creation)' do
|
|
130
130
|
arr.size.should == 3
|
131
131
|
arr.each do |var|
|
132
132
|
var.should have_bounds(@glb_enum, @lub_enum)
|
133
|
-
var.
|
134
|
-
var.
|
133
|
+
var.cardinality.end.should <= @upper_card
|
134
|
+
var.cardinality.begin.should >= @lower_card
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
@@ -142,8 +142,8 @@ describe Gecode::Model, ' (set creation)' do
|
|
142
142
|
matrix.column_size.should == 5
|
143
143
|
matrix.each do |var|
|
144
144
|
var.should have_bounds(@glb_enum, @lub_enum)
|
145
|
-
var.
|
146
|
-
var.
|
145
|
+
var.cardinality.end.should <= @upper_card
|
146
|
+
var.cardinality.begin.should >= @lower_card
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
@@ -161,4 +161,22 @@ describe Gecode::Model, ' (set creation)' do
|
|
161
161
|
lambda{ @model.set_var(@lub_enum, @glb_enum).should }.should raise_error(
|
162
162
|
ArgumentError)
|
163
163
|
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe Gecode::Model, ' (space access restriction)' do
|
167
|
+
before do
|
168
|
+
@model = Gecode::Model.new
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'should raise error if not allowed to access space' do
|
172
|
+
lambda{ @model.active_space }.should raise_error(RuntimeError)
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should not raise error because of space restriction if allowed to access space' do
|
176
|
+
lambda do
|
177
|
+
@model.allow_space_access do
|
178
|
+
@model.active_space
|
179
|
+
end
|
180
|
+
end.should_not raise_error(RuntimeError)
|
181
|
+
end
|
164
182
|
end
|
data/specs/search.rb
CHANGED
@@ -19,6 +19,20 @@ class SampleProblem < Gecode::Model
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
class SampleOptimizationProblem < Gecode::Model
|
23
|
+
attr :x
|
24
|
+
attr :y
|
25
|
+
attr :z
|
26
|
+
|
27
|
+
def initialize
|
28
|
+
@x,@y = int_var_array(2, 0..5)
|
29
|
+
@z = int_var(0..25)
|
30
|
+
(@x * @y).must == @z
|
31
|
+
|
32
|
+
branch_on wrap_enum([@x, @y]), :variable => :smallest_size, :value => :min
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
22
36
|
describe Gecode::Model, ' (with multiple solutions)' do
|
23
37
|
before do
|
24
38
|
@domain = 0..3
|
@@ -45,7 +59,7 @@ describe Gecode::Model, ' (with multiple solutions)' do
|
|
45
59
|
it 'should pass every solution to #each_solution' do
|
46
60
|
solutions = []
|
47
61
|
@model.each_solution do |s|
|
48
|
-
solutions << s.var.
|
62
|
+
solutions << s.var.value
|
49
63
|
end
|
50
64
|
Set.new(solutions).should == Set.new([2,3])
|
51
65
|
end
|
@@ -143,6 +157,10 @@ describe Gecode::Model, ' (without solution)' do
|
|
143
157
|
it 'should return nil when calling #solve!' do
|
144
158
|
@model.solve!.should be_nil
|
145
159
|
end
|
160
|
+
|
161
|
+
it 'should return nil when calling #optimize!' do
|
162
|
+
@model.optimize!{}.should be_nil
|
163
|
+
end
|
146
164
|
end
|
147
165
|
|
148
166
|
describe Gecode::Model, ' (without constraints)' do
|
@@ -154,4 +172,26 @@ describe Gecode::Model, ' (without constraints)' do
|
|
154
172
|
it 'should produce a solution' do
|
155
173
|
@model.solve!.should_not be_nil
|
156
174
|
end
|
175
|
+
end
|
176
|
+
|
177
|
+
describe Gecode::Model, '(optimization search)' do
|
178
|
+
before do
|
179
|
+
@model = SampleOptimizationProblem.new
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'should optimize the solution' do
|
183
|
+
solution = @model.optimize! do |model, best_so_far|
|
184
|
+
model.z.must > best_so_far.z.value
|
185
|
+
end
|
186
|
+
solution.should_not be_nil
|
187
|
+
solution.x.value.should == 5
|
188
|
+
solution.y.value.should == 5
|
189
|
+
solution.z.value.should == 25
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'should raise error if no constrain proc has been defined' do
|
193
|
+
lambda do
|
194
|
+
Gecode::Model.constrain(nil, nil)
|
195
|
+
end.should raise_error(NotImplementedError)
|
196
|
+
end
|
157
197
|
end
|