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,175 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require File.dirname(__FILE__) + '/constraint_helper'
|
3
|
+
|
4
|
+
class SortSampleProblem < Gecode::Model
|
5
|
+
attr :vars
|
6
|
+
attr :sorted
|
7
|
+
attr :indices
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@vars = int_var_array(4, 10..19)
|
11
|
+
@sorted = int_var_array(4, 10..19)
|
12
|
+
@indices = int_var_array(4, 0..9)
|
13
|
+
|
14
|
+
# To make it more interesting
|
15
|
+
@vars.must_be.distinct
|
16
|
+
|
17
|
+
branch_on @vars
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe Gecode::Constraints::IntEnum::Sort, ' (without :as and :order)' do
|
22
|
+
before do
|
23
|
+
@model = SortSampleProblem.new
|
24
|
+
@vars = @model.vars
|
25
|
+
@sorted = @model.sorted
|
26
|
+
|
27
|
+
@invoke_options = lambda do |hash|
|
28
|
+
@vars.must_be.sorted(hash)
|
29
|
+
@model.solve!
|
30
|
+
end
|
31
|
+
@expect_options = lambda do |strength, reif_var|
|
32
|
+
if reif_var.nil?
|
33
|
+
Gecode::Raw.should_receive(:rel).exactly(@vars.size - 1).times.with(
|
34
|
+
an_instance_of(Gecode::Raw::Space),
|
35
|
+
an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_LQ,
|
36
|
+
an_instance_of(Gecode::Raw::IntVar), strength)
|
37
|
+
else
|
38
|
+
Gecode::Raw.should_receive(:rel).exactly(@vars.size - 1).times.with(
|
39
|
+
an_instance_of(Gecode::Raw::Space),
|
40
|
+
an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_LQ,
|
41
|
+
an_instance_of(Gecode::Raw::IntVar),
|
42
|
+
an_instance_of(Gecode::Raw::BoolVar), strength)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should translate into n relation constraints' do
|
48
|
+
@expect_options.call(Gecode::Raw::ICL_DEF, nil)
|
49
|
+
@invoke_options.call({})
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should constraint variables to be sorted' do
|
53
|
+
@vars.must_be.sorted
|
54
|
+
values = @model.solve!.vars.values
|
55
|
+
values.should == values.sort
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should allow negation' do
|
59
|
+
@vars.must_not_be.sorted
|
60
|
+
@model.solve!
|
61
|
+
values = @vars.values
|
62
|
+
values.should_not == values.sort
|
63
|
+
end
|
64
|
+
|
65
|
+
it_should_behave_like 'constraint with options'
|
66
|
+
end
|
67
|
+
|
68
|
+
describe Gecode::Constraints::IntEnum::Sort, ' (with :as)' do
|
69
|
+
before do
|
70
|
+
@model = SortSampleProblem.new
|
71
|
+
@vars = @model.vars
|
72
|
+
@sorted = @model.sorted
|
73
|
+
|
74
|
+
# Make it a bit more interesting.
|
75
|
+
@vars[0].must > @vars[3] + 1
|
76
|
+
|
77
|
+
@invoke_options = lambda do |hash|
|
78
|
+
@vars.must_be.sorted hash.update(:as => @sorted)
|
79
|
+
@model.solve!
|
80
|
+
end
|
81
|
+
@expect_options = lambda do |strength, reif_var|
|
82
|
+
Gecode::Raw.should_receive(:sortedness).once.with(
|
83
|
+
an_instance_of(Gecode::Raw::Space),
|
84
|
+
an_instance_of(Gecode::Raw::IntVarArray),
|
85
|
+
an_instance_of(Gecode::Raw::IntVarArray), strength)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should translate into a sortedness constraints' do
|
90
|
+
@expect_options.call(Gecode::Raw::ICL_DEF, nil)
|
91
|
+
@invoke_options.call({})
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should constraint variables to be sorted' do
|
95
|
+
@vars.must_be.sorted(:as => @sorted)
|
96
|
+
@model.solve!
|
97
|
+
values = @sorted.values
|
98
|
+
values.should == values.sort
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should not allow targets that are not int var enums' do
|
102
|
+
lambda{ @vars.must_be.sorted(:as => 'hello') }.should raise_error(TypeError)
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should not allow negation' do
|
106
|
+
lambda{ @vars.must_not_be.sorted(:as => @sorted) }.should raise_error(
|
107
|
+
Gecode::MissingConstraintError)
|
108
|
+
end
|
109
|
+
|
110
|
+
it_should_behave_like 'constraint with strength option'
|
111
|
+
end
|
112
|
+
|
113
|
+
describe Gecode::Constraints::IntEnum::Sort, ' (with :order)' do
|
114
|
+
before do
|
115
|
+
@model = SortSampleProblem.new
|
116
|
+
@vars = @model.vars
|
117
|
+
@sorted = @model.sorted
|
118
|
+
@indices = @model.indices
|
119
|
+
|
120
|
+
# Make it a bit more interesting.
|
121
|
+
@vars[0].must > @vars[3] + 1
|
122
|
+
|
123
|
+
@invoke_options = lambda do |hash|
|
124
|
+
@vars.must_be.sorted hash.update(:order => @indices, :as => @sorted)
|
125
|
+
@model.solve!
|
126
|
+
end
|
127
|
+
@expect_options = lambda do |strength, reif_var|
|
128
|
+
Gecode::Raw.should_receive(:sortedness).once.with(
|
129
|
+
an_instance_of(Gecode::Raw::Space),
|
130
|
+
an_instance_of(Gecode::Raw::IntVarArray),
|
131
|
+
an_instance_of(Gecode::Raw::IntVarArray),
|
132
|
+
an_instance_of(Gecode::Raw::IntVarArray), strength)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should translate into a sortedness constraints' do
|
137
|
+
@expect_options.call(Gecode::Raw::ICL_DEF, nil)
|
138
|
+
@invoke_options.call({})
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'should translate into a sortedness constraints, even without a target' do
|
142
|
+
@expect_options.call(Gecode::Raw::ICL_DEF, nil)
|
143
|
+
@vars.must_be.sorted(:order => @indices)
|
144
|
+
@model.solve!
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'should constraint variables to be sorted with the specified indices' do
|
148
|
+
@vars.must_be.sorted(:as => @sorted, :order => @indices)
|
149
|
+
@model.solve!
|
150
|
+
sorted_values = @sorted.values
|
151
|
+
sorted_values.should == sorted_values.sort
|
152
|
+
expected_indices = @vars.map{ |v| sorted_values.index(v.value) }
|
153
|
+
@indices.values.should == expected_indices
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'should not allow targets that are not int var enums' do
|
157
|
+
lambda do
|
158
|
+
@vars.must_be.sorted(:as => 'hello', :order => @indices)
|
159
|
+
end.should raise_error(TypeError)
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'should not allow order that are not int var enums' do
|
163
|
+
lambda do
|
164
|
+
@vars.must_be.sorted(:as => @sorted, :order => 'hello')
|
165
|
+
end.should raise_error(TypeError)
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'should not allow negation' do
|
169
|
+
lambda do
|
170
|
+
@vars.must_not_be.sorted(:as => @sorted, :order => @indices)
|
171
|
+
end.should raise_error(Gecode::MissingConstraintError)
|
172
|
+
end
|
173
|
+
|
174
|
+
it_should_behave_like 'constraint with strength option'
|
175
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe 'Interface installed on win32 systems' do
|
4
|
+
it 'should be able to load the libraries' do
|
5
|
+
# Admittably this is not an especially good test for the library loading
|
6
|
+
# under Windows. It only makes sure that there are no execution errors. This
|
7
|
+
# has to be tested in a proper Windows environment to tell whether library
|
8
|
+
# loading actually works.
|
9
|
+
RUBY_PLATFORM = 'i386-mswin32'
|
10
|
+
lambda do
|
11
|
+
Gecode.load_bindings_lib
|
12
|
+
end.should_not raise_error
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Gecode::Util::EnumMatrix do
|
4
|
+
before do
|
5
|
+
@matrix = Gecode::Util::EnumMatrix[[0, 1], [1, 0]]
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should be enumerable' do
|
9
|
+
@matrix.should be_kind_of(Enumerable)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should produce rows that are enumerable' do
|
13
|
+
@matrix.row(0).should be_kind_of(Enumerable)
|
14
|
+
@matrix.row(0).inject([]){ |arr, e| arr << e }.should == [0, 1]
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should produce columns that are enumerable' do
|
18
|
+
@matrix.column(0).should be_kind_of(Enumerable)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should produce submatrices that are enumerable' do
|
22
|
+
@matrix.minor(0,1,0,1).should be_kind_of(Enumerable)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe Gecode::Util::EnumMatrix, ' (when wrapped)' do
|
27
|
+
before do
|
28
|
+
@model = Gecode::Model.new
|
29
|
+
@matrix = @model.wrap_enum(Gecode::Util::EnumMatrix[[0, 1], [1, 0]])
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should produce rows that are wrapped' do
|
33
|
+
@matrix.row(0).should respond_to(:model)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should produce columns that are enumerable' do
|
37
|
+
@matrix.column(0).should respond_to(:model)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should produce submatrices that are enumerable' do
|
41
|
+
@matrix.minor(0,1,0,1).should respond_to(:model)
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Gecode::Model, ' (enum wrapping)' do
|
4
|
+
before do
|
5
|
+
@model = Gecode::Model.new
|
6
|
+
@bool = @model.bool_var
|
7
|
+
@int = @model.int_var(1..2)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should only allow enumerables to be wrapped' do
|
11
|
+
lambda do
|
12
|
+
@model.wrap_enum(17)
|
13
|
+
end.should raise_error(TypeError)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should allow enumerables of bool variables to be wrapped' do
|
17
|
+
lambda do
|
18
|
+
enum = [@bool]
|
19
|
+
@model.wrap_enum(enum)
|
20
|
+
end.should_not raise_error
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should allow enumerables of int variables to be wrapped' do
|
24
|
+
lambda do
|
25
|
+
enum = [@int]
|
26
|
+
@model.wrap_enum(enum)
|
27
|
+
end.should_not raise_error
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should allow enumerables of fixnums to be wrapped' do
|
31
|
+
lambda do
|
32
|
+
enum = [17]
|
33
|
+
@model.wrap_enum(enum)
|
34
|
+
end.should_not raise_error
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should not allow empty enumerables to be wrapped' do
|
38
|
+
lambda do
|
39
|
+
@model.wrap_enum([])
|
40
|
+
end.should raise_error(ArgumentError)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should not allow enumerables without variables or fixnums to be wrapped' do
|
44
|
+
lambda do
|
45
|
+
@model.wrap_enum(['foo'])
|
46
|
+
end.should raise_error(TypeError)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should not allow enumerables with only some variables to be wrapped' do
|
50
|
+
lambda do
|
51
|
+
enum = [@bool, 'foo']
|
52
|
+
@model.wrap_enum(enum)
|
53
|
+
end.should raise_error(TypeError)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should not allow enumerables with mixed types of variables to be wrapped' do
|
57
|
+
lambda do
|
58
|
+
enum = [@bool, @int]
|
59
|
+
@model.wrap_enum(enum)
|
60
|
+
end.should raise_error(TypeError)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe Gecode::IntEnumMethods do
|
65
|
+
before do
|
66
|
+
@model = Gecode::Model.new
|
67
|
+
@int_enum = @model.int_var_array(3, 0..1)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should convert to an int var array' do
|
71
|
+
@model.allow_space_access do
|
72
|
+
@int_enum.to_int_var_array.should be_kind_of(Gecode::Raw::IntVarArray)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should compute the smallest domain range' do
|
77
|
+
@int_enum.domain_range.should == (0..1)
|
78
|
+
(@int_enum << @model.int_var(-4..4)).domain_range.should == (-4..4)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe Gecode::BoolEnumMethods do
|
83
|
+
before do
|
84
|
+
@model = Gecode::Model.new
|
85
|
+
@bool_enum = @model.bool_var_array(3)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should convert to a bool var array' do
|
89
|
+
@model.allow_space_access do
|
90
|
+
@bool_enum.to_bool_var_array.should be_kind_of(Gecode::Raw::BoolVarArray)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe Gecode::SetEnumMethods do
|
96
|
+
before do
|
97
|
+
@model = Gecode::Model.new
|
98
|
+
@set_enum = @model.set_var_array(3, [0], 0..1)
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should convert to a set var array' do
|
102
|
+
@model.allow_space_access do
|
103
|
+
@set_enum.to_set_var_array.should be_kind_of(Gecode::Raw::SetVarArray)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should compute the smallest upper bound union range' do
|
108
|
+
@set_enum.upper_bound_range.should == (0..1)
|
109
|
+
(@set_enum << @model.set_var([], -4..4)).upper_bound_range.should == (-4..4)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe Gecode::FixnumEnumMethods do
|
114
|
+
before do
|
115
|
+
@model = Gecode::Model.new
|
116
|
+
@enum = @model.instance_eval{ wrap_enum([7, 14, 17, 4711]) }
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should compute the smallest domain range' do
|
120
|
+
@enum.domain_range.should == (7..4711)
|
121
|
+
end
|
122
|
+
end
|
data/specs/int_var.rb
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe 'non-empty int variable', :shared => true do
|
4
|
+
it 'should have min equal to the lower domain bound' do
|
5
|
+
@var.min.should equal(@domain.min)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should have max equal to the upper domain bound' do
|
9
|
+
@var.max.should equal(@domain.max)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should have size equal to the domain size' do
|
13
|
+
@var.size.should equal(@domain.size)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should contain every element in its domain' do
|
17
|
+
@domain.each do |i|
|
18
|
+
@var.should include(i)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should not contain elements outside its domain' do
|
23
|
+
@var.should_not include(@domain.min - 1)
|
24
|
+
@var.should_not include(@domain.max + 1)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should have a width equal to the domain width' do
|
28
|
+
@var.width.should equal(@domain.max - @domain.min + 1)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should give a NoMethodError when calling a method that doesn\'t exist' do
|
32
|
+
lambda{ @var.this_method_does_not_exists }.should raise_error(NoMethodError)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should have a zero degree' do
|
36
|
+
@var.degree.should be_zero
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe Gecode::FreeIntVar, ' (with range domain of size > 1)' do
|
41
|
+
before do
|
42
|
+
@range = -4..3
|
43
|
+
@domain = @range.to_a
|
44
|
+
model = Gecode::Model.new
|
45
|
+
@var = model.int_var(@range)
|
46
|
+
end
|
47
|
+
|
48
|
+
it_should_behave_like 'non-empty int variable'
|
49
|
+
|
50
|
+
it 'should not be assigned' do
|
51
|
+
@var.should_not be_assigned
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should have a range domain' do
|
55
|
+
@var.should be_range
|
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
|
61
|
+
end
|
62
|
+
|
63
|
+
describe Gecode::FreeIntVar, ' (defined with three-dot range)' do
|
64
|
+
before do
|
65
|
+
@range = -4...3
|
66
|
+
@domain = @range.to_a
|
67
|
+
model = Gecode::Model.new
|
68
|
+
@var = model.int_var(@range)
|
69
|
+
end
|
70
|
+
|
71
|
+
it_should_behave_like 'non-empty int variable'
|
72
|
+
end
|
73
|
+
|
74
|
+
describe Gecode::FreeIntVar, ' (with non-range domain of size > 1)' do
|
75
|
+
before do
|
76
|
+
@domain = [-3, -2, -1, 1]
|
77
|
+
model = Gecode::Model.new
|
78
|
+
@var = model.int_var(@domain)
|
79
|
+
end
|
80
|
+
|
81
|
+
it_should_behave_like 'non-empty int variable'
|
82
|
+
|
83
|
+
it 'should not be assigned' do
|
84
|
+
@var.should_not be_assigned
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should not be a range domain' do
|
88
|
+
@var.should_not be_range
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should not contain the domain\'s holes' do
|
92
|
+
@var.should_not include(0)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe Gecode::FreeIntVar, ' (with a domain of size 1)' do
|
97
|
+
before do
|
98
|
+
@domain = [1]
|
99
|
+
model = Gecode::Model.new
|
100
|
+
@var = model.int_var(*@domain)
|
101
|
+
end
|
102
|
+
|
103
|
+
it_should_behave_like 'non-empty int variable'
|
104
|
+
|
105
|
+
it 'should be assigned' do
|
106
|
+
@var.should be_assigned
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'should be a range domain' do
|
110
|
+
@var.should be_range
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe Gecode::FreeIntVar, ' (assigned)' do
|
115
|
+
before do
|
116
|
+
@domain = 1
|
117
|
+
model = Gecode::Model.new
|
118
|
+
@var = model.int_var(*@domain)
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should be assigned' do
|
122
|
+
@var.should be_assigned
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should give the assigned number when inspecting' do
|
126
|
+
@var.inspect.should include(" #{@domain[0]}>")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe Gecode::FreeIntVar, ' (not assigned)' do
|
131
|
+
before do
|
132
|
+
@domain = 1..2
|
133
|
+
model = Gecode::Model.new
|
134
|
+
@var = model.int_var(@domain)
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'should not be assigned' do
|
138
|
+
@var.should_not be_assigned
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'should give the domain range when inspecting' do
|
142
|
+
@var.inspect.should include(" #{@domain.first}..#{@domain.last}>")
|
143
|
+
end
|
144
|
+
end
|