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
data/lib/gecoder/version.rb
CHANGED
data/specs/binding_changes.rb
CHANGED
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
2
2
|
|
3
3
|
describe 'Space', :shared => true do
|
4
4
|
it 'should give different indices when creating int variables' do
|
5
|
-
@space.new_int_vars(0, 17).should_not equal(@space.new_int_vars(0, 17))
|
5
|
+
@space.new_int_vars([0, 17]).should_not equal(@space.new_int_vars([0, 17]))
|
6
6
|
end
|
7
7
|
|
8
8
|
it 'should give different indices when creating bool variables' do
|
@@ -10,7 +10,7 @@ describe 'Space', :shared => true do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'should give different indices when creating multiple int variables' do
|
13
|
-
@space.new_int_vars(0, 17, 17).uniq.size.should equal(17)
|
13
|
+
@space.new_int_vars([0, 17], 17).uniq.size.should equal(17)
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'should give different indices when creating multiple bool variables' do
|
@@ -18,7 +18,7 @@ describe 'Space', :shared => true do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'should not return nil for created int variables' do
|
21
|
-
@space.new_int_vars(0, 17, 4).each do |i|
|
21
|
+
@space.new_int_vars([0, 17], 4).each do |i|
|
22
22
|
@space.int_var(i).should_not be_nil
|
23
23
|
end
|
24
24
|
end
|
@@ -36,6 +36,10 @@ describe 'Space', :shared => true do
|
|
36
36
|
it 'should return nil when requesting bool variables with negative indices' do
|
37
37
|
@space.bool_var(-1).should be_nil
|
38
38
|
end
|
39
|
+
|
40
|
+
it 'should raise an error if given a domain of incorrect type' do
|
41
|
+
lambda{ @space.new_int_vars(17) }.should raise_error(TypeError)
|
42
|
+
end
|
39
43
|
end
|
40
44
|
|
41
45
|
describe Gecode::Raw::Space, ' (new)' do
|
@@ -57,8 +61,8 @@ end
|
|
57
61
|
describe Gecode::Raw::Space, ' (with items)' do
|
58
62
|
before do
|
59
63
|
@space = Gecode::Raw::Space.new
|
60
|
-
@first = @space.new_int_vars(1, 4).first
|
61
|
-
@second = @space.new_int_vars(-5, 5).first
|
64
|
+
@first = @space.new_int_vars([1, 4]).first
|
65
|
+
@second = @space.new_int_vars([-5, 5]).first
|
62
66
|
end
|
63
67
|
|
64
68
|
it_should_behave_like 'Space'
|
data/specs/bool_var.rb
CHANGED
@@ -21,6 +21,10 @@ describe Gecode::FreeBoolVar, '(not assigned)' do
|
|
21
21
|
it "should say that it's not assigned when inspecting" do
|
22
22
|
@var.inspect.should include('unassigned')
|
23
23
|
end
|
24
|
+
|
25
|
+
it 'should raise error when trying to access assigned value' do
|
26
|
+
lambda{ @var.value }.should raise_error(RuntimeError)
|
27
|
+
end
|
24
28
|
end
|
25
29
|
|
26
30
|
describe Gecode::FreeBoolVar, '(assigned true)' do
|
@@ -37,12 +41,8 @@ describe Gecode::FreeBoolVar, '(assigned true)' do
|
|
37
41
|
@var.should be_assigned
|
38
42
|
end
|
39
43
|
|
40
|
-
it 'should
|
41
|
-
@var.
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should not respond true to false?' do
|
45
|
-
@var.false?.should_not be_true
|
44
|
+
it 'should have valye true' do
|
45
|
+
@var.value.should be_true
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should say that it's true when inspecting" do
|
@@ -64,12 +64,8 @@ describe Gecode::FreeBoolVar, '(assigned false)' do
|
|
64
64
|
@var.should be_assigned
|
65
65
|
end
|
66
66
|
|
67
|
-
it 'should
|
68
|
-
@var.
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'should respond true to false?' do
|
72
|
-
@var.false?.should be_true
|
67
|
+
it 'should have value false ' do
|
68
|
+
@var.value.should_not be_true
|
73
69
|
end
|
74
70
|
|
75
71
|
it "should say that it's false when inspecting" do
|
data/specs/branch.rb
CHANGED
@@ -3,39 +3,28 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
3
3
|
class BranchSampleProblem < Gecode::Model
|
4
4
|
attr :vars
|
5
5
|
attr :bools
|
6
|
+
attr :sets
|
6
7
|
|
7
8
|
def initialize
|
8
9
|
@vars = int_var_array(2, 0..3)
|
10
|
+
@sets = set_var_array(2, [], 0..4)
|
9
11
|
@bools = bool_var_array(2)
|
10
12
|
end
|
11
13
|
end
|
12
14
|
|
13
|
-
describe Gecode::Model, ' (branch)' do
|
15
|
+
describe Gecode::Model, ' (integer branch)' do
|
14
16
|
before do
|
15
17
|
@model = BranchSampleProblem.new
|
16
18
|
@vars = @model.vars
|
17
19
|
@bools = @model.bools
|
18
20
|
end
|
19
21
|
|
20
|
-
it 'should pass the variables given in int arrays' do
|
21
|
-
Gecode::Raw.should_receive(:branch).once.and_return{ |s, vars, x, y| vars }
|
22
|
-
int_var_array = @model.branch_on @vars
|
23
|
-
int_var_array.size.should equal(2)
|
24
|
-
2.times do |i|
|
25
|
-
int_var_array.at(i).should have_domain(0..3)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should pass the variables given in bool arrays' do
|
30
|
-
Gecode::Raw.should_receive(:branch).once.and_return{ |s, vars, x, y| vars }
|
31
|
-
bool_var_array = @model.branch_on @bools
|
32
|
-
bool_var_array.size.should equal(2)
|
33
|
-
end
|
34
|
-
|
35
22
|
it 'should default to :none and :min' do
|
36
|
-
Gecode::Raw.should_receive(:branch).once.with(
|
23
|
+
Gecode::Raw.should_receive(:branch).once.with(
|
24
|
+
an_instance_of(Gecode::Raw::Space),
|
37
25
|
anything, Gecode::Raw::BVAR_NONE, Gecode::Raw::BVAL_MIN)
|
38
26
|
@model.branch_on @vars
|
27
|
+
@model.solve!
|
39
28
|
end
|
40
29
|
|
41
30
|
it 'should ensure that branched int variables are assigned in a solution' do
|
@@ -64,9 +53,11 @@ describe Gecode::Model, ' (branch)' do
|
|
64
53
|
:largest_max_regret => Gecode::Raw::BVAR_REGRET_MAX_MAX
|
65
54
|
}.each_pair do |name, gecode_const|
|
66
55
|
it "should support #{name} as variable selection strategy" do
|
67
|
-
Gecode::Raw.should_receive(:branch).once.with(
|
56
|
+
Gecode::Raw.should_receive(:branch).once.with(
|
57
|
+
an_instance_of(Gecode::Raw::Space),
|
68
58
|
anything, gecode_const, an_instance_of(Numeric))
|
69
59
|
@model.branch_on @vars, :variable => name
|
60
|
+
@model.solve!
|
70
61
|
end
|
71
62
|
end
|
72
63
|
|
@@ -78,9 +69,11 @@ describe Gecode::Model, ' (branch)' do
|
|
78
69
|
:split_max => Gecode::Raw::BVAL_SPLIT_MAX
|
79
70
|
}.each_pair do |name, gecode_const|
|
80
71
|
it "should support #{name} as value selection strategy" do
|
81
|
-
Gecode::Raw.should_receive(:branch).once.with(
|
72
|
+
Gecode::Raw.should_receive(:branch).once.with(
|
73
|
+
an_instance_of(Gecode::Raw::Space),
|
82
74
|
anything, an_instance_of(Numeric), gecode_const)
|
83
75
|
@model.branch_on @vars, :value => name
|
76
|
+
@model.solve!
|
84
77
|
end
|
85
78
|
end
|
86
79
|
|
@@ -101,4 +94,77 @@ describe Gecode::Model, ' (branch)' do
|
|
101
94
|
@model.branch_on @vars, :foo => 5
|
102
95
|
end.should raise_error(ArgumentError)
|
103
96
|
end
|
97
|
+
|
98
|
+
it 'should raise errors for unrecognized enumerations' do
|
99
|
+
lambda do
|
100
|
+
@model.branch_on [1,2,3]
|
101
|
+
end.should raise_error(TypeError)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe Gecode::Model, ' (set branch)' do
|
106
|
+
before do
|
107
|
+
@model = BranchSampleProblem.new
|
108
|
+
@sets = @model.sets
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should default to :none and :min' do
|
112
|
+
Gecode::Raw.should_receive(:branch).once.with(
|
113
|
+
an_instance_of(Gecode::Raw::Space),
|
114
|
+
anything, Gecode::Raw::SETBVAR_NONE, Gecode::Raw::SETBVAL_MIN)
|
115
|
+
@model.branch_on @sets
|
116
|
+
@model.solve!
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should ensure that branched set variables are assigned in a solution' do
|
120
|
+
@model.branch_on @sets
|
121
|
+
@model.solve!.sets.each{ |var| var.should be_assigned }
|
122
|
+
end
|
123
|
+
|
124
|
+
supported_var_selectors = {
|
125
|
+
:none => Gecode::Raw::SETBVAR_NONE,
|
126
|
+
:smallest_cardinality => Gecode::Raw::SETBVAR_MIN_CARD,
|
127
|
+
:largest_cardinality => Gecode::Raw::SETBVAR_MAX_CARD,
|
128
|
+
:smallest_unknown => Gecode::Raw::SETBVAR_MIN_UNKNOWN_ELEM,
|
129
|
+
:largest_unknown => Gecode::Raw::SETBVAR_MAX_UNKNOWN_ELEM
|
130
|
+
}.each_pair do |name, gecode_const|
|
131
|
+
it "should support #{name} as variable selection strategy" do
|
132
|
+
Gecode::Raw.should_receive(:branch).once.with(
|
133
|
+
an_instance_of(Gecode::Raw::Space),
|
134
|
+
anything, gecode_const, an_instance_of(Numeric))
|
135
|
+
@model.branch_on @sets, :variable => name
|
136
|
+
@model.solve!
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
supported_val_selectors = {
|
141
|
+
:min => Gecode::Raw::SETBVAL_MIN,
|
142
|
+
:max => Gecode::Raw::SETBVAL_MAX
|
143
|
+
}.each_pair do |name, gecode_const|
|
144
|
+
it "should support #{name} as value selection strategy" do
|
145
|
+
Gecode::Raw.should_receive(:branch).once.with(
|
146
|
+
an_instance_of(Gecode::Raw::Space),
|
147
|
+
anything, an_instance_of(Numeric), gecode_const)
|
148
|
+
@model.branch_on @sets, :value => name
|
149
|
+
@model.solve!
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'should raise errors for unrecognized var selection strategies' do
|
154
|
+
lambda do
|
155
|
+
@model.branch_on @sets, :variable => :foo
|
156
|
+
end.should raise_error(ArgumentError)
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'should raise errors for unrecognized val selection strategies' do
|
160
|
+
lambda do
|
161
|
+
@model.branch_on @sets, :value => :foo
|
162
|
+
end.should raise_error(ArgumentError)
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'should raise errors for unrecognized options' do
|
166
|
+
lambda do
|
167
|
+
@model.branch_on @sets, :foo => 5
|
168
|
+
end.should raise_error(ArgumentError)
|
169
|
+
end
|
104
170
|
end
|
@@ -64,34 +64,41 @@ describe Gecode::Constraints::IntEnum::Arithmetic, ' (max)' do
|
|
64
64
|
|
65
65
|
# Creates an expectation corresponding to the specified input.
|
66
66
|
@expect = lambda do |relation, rhs, strength, reif_var, negated|
|
67
|
-
|
68
|
-
|
69
|
-
if
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
67
|
+
@model.allow_space_access do
|
68
|
+
rhs = rhs.bind if rhs.respond_to? :bind
|
69
|
+
if reif_var.nil?
|
70
|
+
if !negated and relation == Gecode::Raw::IRT_EQ and
|
71
|
+
rhs.kind_of? Gecode::Raw::IntVar
|
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
|
74
85
|
else
|
75
|
-
Gecode::Raw.should_receive(:max).once.with(
|
86
|
+
Gecode::Raw.should_receive(:max).once.with(
|
87
|
+
an_instance_of(Gecode::Raw::Space),
|
76
88
|
an_instance_of(Gecode::Raw::IntVarArray),
|
77
89
|
an_instance_of(Gecode::Raw::IntVar), strength)
|
78
|
-
Gecode::Raw.should_receive(:rel).once.with(
|
79
|
-
an_instance_of(Gecode::Raw::
|
90
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
91
|
+
an_instance_of(Gecode::Raw::Space),
|
92
|
+
an_instance_of(Gecode::Raw::IntVar), relation, rhs, reif_var.bind,
|
93
|
+
strength)
|
80
94
|
end
|
81
|
-
else
|
82
|
-
Gecode::Raw.should_receive(:max).once.with(@model.active_space,
|
83
|
-
an_instance_of(Gecode::Raw::IntVarArray),
|
84
|
-
an_instance_of(Gecode::Raw::IntVar), strength)
|
85
|
-
Gecode::Raw.should_receive(:rel).once.with(@model.active_space,
|
86
|
-
an_instance_of(Gecode::Raw::IntVar), relation, rhs, reif_var.bind,
|
87
|
-
strength)
|
88
95
|
end
|
89
96
|
end
|
90
97
|
end
|
91
98
|
|
92
99
|
it 'should constrain the maximum value' do
|
93
100
|
@numbers.max.must > 5
|
94
|
-
@model.solve!.numbers.
|
101
|
+
@model.solve!.numbers.values.max.should > 5
|
95
102
|
end
|
96
103
|
|
97
104
|
it_should_behave_like 'arithmetic constraint'
|
@@ -106,34 +113,41 @@ describe Gecode::Constraints::IntEnum::Arithmetic, ' (min)' do
|
|
106
113
|
|
107
114
|
# Creates an expectation corresponding to the specified input.
|
108
115
|
@expect = lambda do |relation, rhs, strength, reif_var, negated|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
+
@model.allow_space_access do
|
117
|
+
rhs = rhs.bind if rhs.respond_to? :bind
|
118
|
+
if reif_var.nil?
|
119
|
+
if !negated and relation == Gecode::Raw::IRT_EQ and
|
120
|
+
rhs.kind_of? Gecode::Raw::IntVar
|
121
|
+
Gecode::Raw.should_receive(:min).once.with(
|
122
|
+
an_instance_of(Gecode::Raw::Space),
|
123
|
+
an_instance_of(Gecode::Raw::IntVarArray), rhs, strength)
|
124
|
+
Gecode::Raw.should_receive(:rel).exactly(0).times
|
125
|
+
else
|
126
|
+
Gecode::Raw.should_receive(:min).once.with(
|
127
|
+
an_instance_of(Gecode::Raw::Space),
|
128
|
+
an_instance_of(Gecode::Raw::IntVarArray),
|
129
|
+
an_instance_of(Gecode::Raw::IntVar), strength)
|
130
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
131
|
+
an_instance_of(Gecode::Raw::Space),
|
132
|
+
an_instance_of(Gecode::Raw::IntVar), relation, rhs, strength)
|
133
|
+
end
|
116
134
|
else
|
117
|
-
Gecode::Raw.should_receive(:min).once.with(
|
135
|
+
Gecode::Raw.should_receive(:min).once.with(
|
136
|
+
an_instance_of(Gecode::Raw::Space),
|
118
137
|
an_instance_of(Gecode::Raw::IntVarArray),
|
119
138
|
an_instance_of(Gecode::Raw::IntVar), strength)
|
120
|
-
Gecode::Raw.should_receive(:rel).once.with(
|
121
|
-
an_instance_of(Gecode::Raw::
|
139
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
140
|
+
an_instance_of(Gecode::Raw::Space),
|
141
|
+
an_instance_of(Gecode::Raw::IntVar), relation, rhs, reif_var.bind,
|
142
|
+
strength)
|
122
143
|
end
|
123
|
-
else
|
124
|
-
Gecode::Raw.should_receive(:min).once.with(@model.active_space,
|
125
|
-
an_instance_of(Gecode::Raw::IntVarArray),
|
126
|
-
an_instance_of(Gecode::Raw::IntVar), strength)
|
127
|
-
Gecode::Raw.should_receive(:rel).once.with(@model.active_space,
|
128
|
-
an_instance_of(Gecode::Raw::IntVar), relation, rhs, reif_var.bind,
|
129
|
-
strength)
|
130
144
|
end
|
131
145
|
end
|
132
146
|
end
|
133
147
|
|
134
148
|
it 'should constrain the minimum value' do
|
135
149
|
@numbers.min.must > 5
|
136
|
-
@model.solve!.numbers.
|
150
|
+
@model.solve!.numbers.values.min.should > 5
|
137
151
|
end
|
138
152
|
|
139
153
|
it_should_behave_like 'arithmetic constraint'
|
@@ -148,25 +162,32 @@ describe Gecode::Constraints::Int::Arithmetic, ' (abs)' do
|
|
148
162
|
|
149
163
|
# Creates an expectation corresponding to the specified input.
|
150
164
|
@expect = lambda do |relation, rhs, strength, reif_var, negated|
|
151
|
-
|
152
|
-
|
153
|
-
if
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
165
|
+
@model.allow_space_access do
|
166
|
+
rhs = rhs.bind if rhs.respond_to? :bind
|
167
|
+
if reif_var.nil?
|
168
|
+
if !negated and relation == Gecode::Raw::IRT_EQ and
|
169
|
+
rhs.kind_of? Gecode::Raw::IntVar
|
170
|
+
Gecode::Raw.should_receive(:abs).once.with(
|
171
|
+
an_instance_of(Gecode::Raw::Space),
|
172
|
+
@var.bind, rhs, strength)
|
173
|
+
Gecode::Raw.should_receive(:rel).exactly(0).times
|
174
|
+
else
|
175
|
+
Gecode::Raw.should_receive(:abs).once.with(
|
176
|
+
an_instance_of(Gecode::Raw::Space),
|
177
|
+
@var.bind, an_instance_of(Gecode::Raw::IntVar), strength)
|
178
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
179
|
+
an_instance_of(Gecode::Raw::Space),
|
180
|
+
an_instance_of(Gecode::Raw::IntVar), relation, rhs, strength)
|
181
|
+
end
|
158
182
|
else
|
159
|
-
Gecode::Raw.should_receive(:abs).once.with(
|
183
|
+
Gecode::Raw.should_receive(:abs).once.with(
|
184
|
+
an_instance_of(Gecode::Raw::Space),
|
160
185
|
@var.bind, an_instance_of(Gecode::Raw::IntVar), strength)
|
161
|
-
Gecode::Raw.should_receive(:rel).once.with(
|
162
|
-
an_instance_of(Gecode::Raw::
|
186
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
187
|
+
an_instance_of(Gecode::Raw::Space),
|
188
|
+
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
189
|
+
an_instance_of(Gecode::Raw::BoolVar), strength)
|
163
190
|
end
|
164
|
-
else
|
165
|
-
Gecode::Raw.should_receive(:abs).once.with(@model.active_space,
|
166
|
-
@var.bind, an_instance_of(Gecode::Raw::IntVar), strength)
|
167
|
-
Gecode::Raw.should_receive(:rel).once.with(@model.active_space,
|
168
|
-
an_instance_of(Gecode::Raw::IntVar), relation, rhs,
|
169
|
-
an_instance_of(Gecode::Raw::BoolVar), strength)
|
170
191
|
end
|
171
192
|
end
|
172
193
|
end
|
@@ -174,7 +195,7 @@ describe Gecode::Constraints::Int::Arithmetic, ' (abs)' do
|
|
174
195
|
it 'should constrain the absolute value' do
|
175
196
|
@var.must < 0
|
176
197
|
@var.abs.must == 5
|
177
|
-
@model.solve!.var.
|
198
|
+
@model.solve!.var.value.should == -5
|
178
199
|
end
|
179
200
|
|
180
201
|
it_should_behave_like 'arithmetic constraint'
|
@@ -190,26 +211,33 @@ describe Gecode::Constraints::Int::Arithmetic, ' (multiplication)' do
|
|
190
211
|
|
191
212
|
# Creates an expectation corresponding to the specified input.
|
192
213
|
@expect = lambda do |relation, rhs, strength, reif_var, negated|
|
193
|
-
|
194
|
-
|
195
|
-
if
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
214
|
+
@model.allow_space_access do
|
215
|
+
rhs = rhs.bind if rhs.respond_to? :bind
|
216
|
+
if reif_var.nil?
|
217
|
+
if !negated and relation == Gecode::Raw::IRT_EQ and
|
218
|
+
rhs.kind_of? Gecode::Raw::IntVar
|
219
|
+
Gecode::Raw.should_receive(:mult).once.with(
|
220
|
+
an_instance_of(Gecode::Raw::Space),
|
221
|
+
@var.bind, @var2.bind, rhs, strength)
|
222
|
+
Gecode::Raw.should_receive(:rel).exactly(0).times
|
223
|
+
else
|
224
|
+
Gecode::Raw.should_receive(:mult).once.with(
|
225
|
+
an_instance_of(Gecode::Raw::Space),
|
226
|
+
@var.bind, @var2.bind, an_instance_of(Gecode::Raw::IntVar),
|
227
|
+
strength)
|
228
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
229
|
+
an_instance_of(Gecode::Raw::Space),
|
230
|
+
an_instance_of(Gecode::Raw::IntVar), relation, rhs, strength)
|
231
|
+
end
|
200
232
|
else
|
201
|
-
Gecode::Raw.should_receive(:mult).once.with(
|
202
|
-
|
233
|
+
Gecode::Raw.should_receive(:mult).once.with(
|
234
|
+
an_instance_of(Gecode::Raw::Space),
|
235
|
+
@var.bind, @var2.bind, an_instance_of(Gecode::Raw::IntVar), strength)
|
236
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
237
|
+
an_instance_of(Gecode::Raw::Space),
|
238
|
+
an_instance_of(Gecode::Raw::IntVar), relation, rhs, reif_var.bind,
|
203
239
|
strength)
|
204
|
-
Gecode::Raw.should_receive(:rel).once.with(@model.active_space,
|
205
|
-
an_instance_of(Gecode::Raw::IntVar), relation, rhs, strength)
|
206
240
|
end
|
207
|
-
else
|
208
|
-
Gecode::Raw.should_receive(:mult).once.with(@model.active_space,
|
209
|
-
@var.bind, @var2.bind, an_instance_of(Gecode::Raw::IntVar), strength)
|
210
|
-
Gecode::Raw.should_receive(:rel).once.with(@model.active_space,
|
211
|
-
an_instance_of(Gecode::Raw::IntVar), relation, rhs, reif_var.bind,
|
212
|
-
strength)
|
213
241
|
end
|
214
242
|
end
|
215
243
|
end
|
@@ -217,7 +245,7 @@ describe Gecode::Constraints::Int::Arithmetic, ' (multiplication)' do
|
|
217
245
|
it 'should constrain the value of the multiplication' do
|
218
246
|
(@var * @var2).must == 56
|
219
247
|
sol = @model.solve!
|
220
|
-
[sol.var.
|
248
|
+
[sol.var.value, sol.var2.value].sort.should == [7, 8]
|
221
249
|
end
|
222
250
|
|
223
251
|
it 'should not interfere with other defined multiplication methods' do
|