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.
Files changed (159) hide show
  1. data/CHANGES +81 -0
  2. data/COPYING +17 -0
  3. data/LGPL-LICENSE +458 -0
  4. data/README +45 -0
  5. data/Rakefile +13 -0
  6. data/example/example_helper.rb +1 -0
  7. data/example/magic_sequence.rb +43 -0
  8. data/example/queens.rb +43 -0
  9. data/example/raw_bindings.rb +42 -0
  10. data/example/send_more_money.rb +43 -0
  11. data/example/send_most_money.rb +58 -0
  12. data/example/square_tiling.rb +84 -0
  13. data/example/sudoku-set.rb +110 -0
  14. data/example/sudoku.rb +61 -0
  15. data/lib/gecode.dll +0 -0
  16. data/lib/gecoder.rb +5 -0
  17. data/lib/gecoder/bindings.rb +54 -0
  18. data/lib/gecoder/bindings/bindings.rb +2210 -0
  19. data/lib/gecoder/interface.rb +8 -0
  20. data/lib/gecoder/interface/binding_changes.rb +313 -0
  21. data/lib/gecoder/interface/branch.rb +152 -0
  22. data/lib/gecoder/interface/constraints.rb +397 -0
  23. data/lib/gecoder/interface/constraints/bool/boolean.rb +246 -0
  24. data/lib/gecoder/interface/constraints/bool/linear.rb +29 -0
  25. data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +84 -0
  26. data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +8 -0
  27. data/lib/gecoder/interface/constraints/bool_var_constraints.rb +75 -0
  28. data/lib/gecoder/interface/constraints/int/arithmetic.rb +71 -0
  29. data/lib/gecoder/interface/constraints/int/domain.rb +78 -0
  30. data/lib/gecoder/interface/constraints/int/linear.rb +295 -0
  31. data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +72 -0
  32. data/lib/gecoder/interface/constraints/int_enum/channel.rb +100 -0
  33. data/lib/gecoder/interface/constraints/int_enum/count.rb +92 -0
  34. data/lib/gecoder/interface/constraints/int_enum/distinct.rb +69 -0
  35. data/lib/gecoder/interface/constraints/int_enum/element.rb +82 -0
  36. data/lib/gecoder/interface/constraints/int_enum/equality.rb +38 -0
  37. data/lib/gecoder/interface/constraints/int_enum/sort.rb +126 -0
  38. data/lib/gecoder/interface/constraints/int_enum_constraints.rb +37 -0
  39. data/lib/gecoder/interface/constraints/int_var_constraints.rb +58 -0
  40. data/lib/gecoder/interface/constraints/reifiable_constraints.rb +78 -0
  41. data/lib/gecoder/interface/constraints/set/cardinality.rb +75 -0
  42. data/lib/gecoder/interface/constraints/set/connection.rb +193 -0
  43. data/lib/gecoder/interface/constraints/set/domain.rb +109 -0
  44. data/lib/gecoder/interface/constraints/set/operation.rb +132 -0
  45. data/lib/gecoder/interface/constraints/set/relation.rb +178 -0
  46. data/lib/gecoder/interface/constraints/set_enum/channel.rb +18 -0
  47. data/lib/gecoder/interface/constraints/set_enum/distinct.rb +80 -0
  48. data/lib/gecoder/interface/constraints/set_enum/operation.rb +60 -0
  49. data/lib/gecoder/interface/constraints/set_enum/selection.rb +217 -0
  50. data/lib/gecoder/interface/constraints/set_enum_constraints.rb +34 -0
  51. data/lib/gecoder/interface/constraints/set_var_constraints.rb +72 -0
  52. data/lib/gecoder/interface/enum_matrix.rb +64 -0
  53. data/lib/gecoder/interface/enum_wrapper.rb +153 -0
  54. data/lib/gecoder/interface/model.rb +251 -0
  55. data/lib/gecoder/interface/search.rb +123 -0
  56. data/lib/gecoder/interface/variables.rb +254 -0
  57. data/lib/gecoder/version.rb +4 -0
  58. data/specs/binding_changes.rb +76 -0
  59. data/specs/bool_var.rb +74 -0
  60. data/specs/branch.rb +170 -0
  61. data/specs/constraints/arithmetic.rb +266 -0
  62. data/specs/constraints/bool_enum.rb +140 -0
  63. data/specs/constraints/boolean.rb +232 -0
  64. data/specs/constraints/cardinality.rb +154 -0
  65. data/specs/constraints/channel.rb +126 -0
  66. data/specs/constraints/connection.rb +373 -0
  67. data/specs/constraints/constraint_helper.rb +180 -0
  68. data/specs/constraints/constraints.rb +74 -0
  69. data/specs/constraints/count.rb +139 -0
  70. data/specs/constraints/distinct.rb +218 -0
  71. data/specs/constraints/element.rb +106 -0
  72. data/specs/constraints/equality.rb +31 -0
  73. data/specs/constraints/int_domain.rb +69 -0
  74. data/specs/constraints/int_relation.rb +78 -0
  75. data/specs/constraints/linear.rb +332 -0
  76. data/specs/constraints/reification_sugar.rb +96 -0
  77. data/specs/constraints/selection.rb +292 -0
  78. data/specs/constraints/set_domain.rb +181 -0
  79. data/specs/constraints/set_operation.rb +285 -0
  80. data/specs/constraints/set_relation.rb +201 -0
  81. data/specs/constraints/sort.rb +175 -0
  82. data/specs/distribution.rb +14 -0
  83. data/specs/enum_matrix.rb +43 -0
  84. data/specs/enum_wrapper.rb +122 -0
  85. data/specs/int_var.rb +144 -0
  86. data/specs/logging.rb +24 -0
  87. data/specs/model.rb +190 -0
  88. data/specs/search.rb +246 -0
  89. data/specs/set_var.rb +68 -0
  90. data/specs/spec_helper.rb +93 -0
  91. data/tasks/all_tasks.rb +1 -0
  92. data/tasks/building.howto +65 -0
  93. data/tasks/distribution.rake +156 -0
  94. data/tasks/rcov.rake +17 -0
  95. data/tasks/specs.rake +15 -0
  96. data/tasks/svn.rake +11 -0
  97. data/tasks/website.rake +51 -0
  98. data/vendor/gecode/win32/lib/libgecodeint.dll +0 -0
  99. data/vendor/gecode/win32/lib/libgecodekernel.dll +0 -0
  100. data/vendor/gecode/win32/lib/libgecodeminimodel.dll +0 -0
  101. data/vendor/gecode/win32/lib/libgecodesearch.dll +0 -0
  102. data/vendor/gecode/win32/lib/libgecodeset.dll +0 -0
  103. data/vendor/rust/README +28 -0
  104. data/vendor/rust/bin/cxxgenerator.rb +93 -0
  105. data/vendor/rust/include/rust_checks.hh +115 -0
  106. data/vendor/rust/include/rust_conversions.hh +102 -0
  107. data/vendor/rust/rust.rb +67 -0
  108. data/vendor/rust/rust/attribute.rb +51 -0
  109. data/vendor/rust/rust/bindings.rb +172 -0
  110. data/vendor/rust/rust/class.rb +339 -0
  111. data/vendor/rust/rust/constants.rb +48 -0
  112. data/vendor/rust/rust/container.rb +110 -0
  113. data/vendor/rust/rust/cppifaceparser.rb +129 -0
  114. data/vendor/rust/rust/cwrapper.rb +72 -0
  115. data/vendor/rust/rust/cxxclass.rb +98 -0
  116. data/vendor/rust/rust/element.rb +81 -0
  117. data/vendor/rust/rust/enum.rb +63 -0
  118. data/vendor/rust/rust/function.rb +407 -0
  119. data/vendor/rust/rust/namespace.rb +61 -0
  120. data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +17 -0
  121. data/vendor/rust/rust/templates/AttributeInitBinding.rusttpl +9 -0
  122. data/vendor/rust/rust/templates/BindingsHeader.rusttpl +24 -0
  123. data/vendor/rust/rust/templates/BindingsUnit.rusttpl +46 -0
  124. data/vendor/rust/rust/templates/CWrapperClassDefinitions.rusttpl +64 -0
  125. data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +7 -0
  126. data/vendor/rust/rust/templates/ClassInitialize.rusttpl +6 -0
  127. data/vendor/rust/rust/templates/ConstructorStub.rusttpl +21 -0
  128. data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +91 -0
  129. data/vendor/rust/rust/templates/CxxMethodStub.rusttpl +12 -0
  130. data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +26 -0
  131. data/vendor/rust/rust/templates/EnumDeclarations.rusttpl +3 -0
  132. data/vendor/rust/rust/templates/EnumDefinitions.rusttpl +29 -0
  133. data/vendor/rust/rust/templates/FunctionDefinition.rusttpl +9 -0
  134. data/vendor/rust/rust/templates/FunctionInitAlias.rusttpl +5 -0
  135. data/vendor/rust/rust/templates/FunctionInitBinding.rusttpl +9 -0
  136. data/vendor/rust/rust/templates/MethodInitBinding.rusttpl +9 -0
  137. data/vendor/rust/rust/templates/ModuleDeclarations.rusttpl +3 -0
  138. data/vendor/rust/rust/templates/ModuleDefinitions.rusttpl +3 -0
  139. data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +7 -0
  140. data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +14 -0
  141. data/vendor/rust/rust/type.rb +98 -0
  142. data/vendor/rust/test/Makefile +4 -0
  143. data/vendor/rust/test/constants.rb +36 -0
  144. data/vendor/rust/test/cppclass.cc +45 -0
  145. data/vendor/rust/test/cppclass.hh +67 -0
  146. data/vendor/rust/test/cppclass.rb +59 -0
  147. data/vendor/rust/test/cwrapper.c +74 -0
  148. data/vendor/rust/test/cwrapper.h +41 -0
  149. data/vendor/rust/test/cwrapper.rb +56 -0
  150. data/vendor/rust/test/dummyclass.hh +31 -0
  151. data/vendor/rust/test/lib/extension-test.rb +98 -0
  152. data/vendor/rust/test/operators.cc +41 -0
  153. data/vendor/rust/test/operators.hh +39 -0
  154. data/vendor/rust/test/operators.rb +39 -0
  155. data/vendor/rust/test/test-constants.rb +43 -0
  156. data/vendor/rust/test/test-cppclass.rb +82 -0
  157. data/vendor/rust/test/test-cwrapper.rb +80 -0
  158. data/vendor/rust/test/test-operators.rb +42 -0
  159. metadata +293 -0
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 ADDED
@@ -0,0 +1,190 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Gecode::Model, ' (integer creation)' do
4
+ before do
5
+ @model = Gecode::Model.new
6
+ end
7
+
8
+ it 'should allow the creation of int variables with range' do
9
+ range = 0..3
10
+ @model.int_var(range).should have_domain(range)
11
+ end
12
+
13
+ it 'should allow the creation of int variables without specified domain' do
14
+ var = @model.int_var
15
+ var.should be_range
16
+ var.min.should == Gecode::Raw::Limits::Int::INT_MIN
17
+ var.max.should == Gecode::Raw::Limits::Int::INT_MAX
18
+ end
19
+
20
+ it 'should allow the creation of int variables with non-range domains' do
21
+ domain = [1, 3, 5]
22
+ @model.int_var(domain).should have_domain(domain)
23
+ end
24
+
25
+ it 'should allow the creation of int variables with single element domains' do
26
+ domain = 3
27
+ @model.int_var(domain).should have_domain([domain])
28
+ end
29
+
30
+ it 'should allow the creation of int-var arrays with range domains' do
31
+ range = 0..3
32
+ count = 5
33
+ vars = @model.int_var_array(count, range)
34
+ vars.size.should equal(count)
35
+ vars.each{ |var| var.should have_domain(range) }
36
+ end
37
+
38
+ it 'should allow the creation of int-var arrays with non-range domains' do
39
+ domain = [1,3,5]
40
+ count = 5
41
+ vars = @model.int_var_array(count, domain)
42
+ vars.size.should equal(count)
43
+ vars.each{ |var| var.should have_domain(domain) }
44
+ end
45
+
46
+ it 'should allow the creation of int-var matrices with range domains' do
47
+ range = 0..3
48
+ rows = 5
49
+ columns = 4
50
+ vars = @model.int_var_matrix(rows, columns, range)
51
+ vars.row_size.should equal(rows)
52
+ vars.column_size.should equal(columns)
53
+ vars.each{ |var| var.should have_domain(range) }
54
+ end
55
+
56
+ it 'should allow the creation of int-var matrices with non-range domains' do
57
+ domain = [1,3,5]
58
+ rows = 5
59
+ columns = 4
60
+ vars = @model.int_var_matrix(rows, columns, domain)
61
+ vars.row_size.should equal(rows)
62
+ vars.column_size.should equal(columns)
63
+ vars.each{ |var| var.should have_domain(domain) }
64
+ end
65
+ end
66
+
67
+ describe Gecode::Model, ' (bool creation)' do
68
+ before do
69
+ @model = Gecode::Model.new
70
+ end
71
+
72
+ it 'should allow the creation of boolean variables' do
73
+ @model.bool_var.should_not be_nil
74
+ end
75
+
76
+ it 'should allow the creation of arrays of boolean variables' do
77
+ @model.bool_var_array(3).size.should equal(3)
78
+ end
79
+
80
+ it 'should allow the creation of matrices of boolean variables' do
81
+ matrix = @model.bool_var_matrix(3, 4)
82
+ matrix.row_size.should equal(3)
83
+ matrix.column_size.should equal(4)
84
+ end
85
+ end
86
+
87
+ describe Gecode::Model, ' (set creation)' do
88
+ before do
89
+ @model = Gecode::Model.new
90
+ @glb_range = 0..3
91
+ @lub_range = 0..5
92
+ @glb_enum = [0, 3]
93
+ @lub_enum = [0, 1, 2, 3, 5]
94
+ @lower_card = 1
95
+ @upper_card = 3
96
+ end
97
+
98
+ it 'should allow the creation of set variables without specified bounds' do
99
+ var = @model.set_var
100
+ var.lower_bound.size.should == 0
101
+ var.upper_bound.min.should == Gecode::Raw::Limits::Set::INT_MIN
102
+ var.upper_bound.max.should == Gecode::Raw::Limits::Set::INT_MAX
103
+ end
104
+
105
+ it 'should allow the creation of set variables with glb range and lub range' do
106
+ @model.set_var(@glb_range, @lub_range).should have_bounds(@glb_range,
107
+ @lub_range)
108
+ end
109
+
110
+ it 'should allow the creation of set variables with glb enum and lub range' do
111
+ @model.set_var(@glb_enum, @lub_range).should have_bounds(@glb_enum,
112
+ @lub_range)
113
+ end
114
+
115
+ it 'should allow the creation of set variables with glb range and lub enum' do
116
+ @model.set_var(@glb_range, @lub_enum).should have_bounds(@glb_range,
117
+ @lub_enum)
118
+ end
119
+
120
+ it 'should allow the creation of set variables with glb enum and lub enum' do
121
+ @model.set_var(@glb_enum, @lub_enum).should have_bounds(@glb_enum,
122
+ @lub_enum)
123
+ end
124
+
125
+ it 'should allow the creation of set variables with specified lower cardinality bound' do
126
+ @model.set_var(@glb_range, @lub_range,
127
+ @lower_card).cardinality.begin.should >= @lower_card
128
+ end
129
+
130
+ it 'should allow the creation of set variables with specified cardinality range' do
131
+ var = @model.set_var(@glb_range, @lub_range, @lower_card..@upper_card)
132
+ var.cardinality.end.should <= @upper_card
133
+ var.cardinality.begin.should >= @lower_card
134
+ end
135
+
136
+ it 'should allow the creation of arrays of set variables' do
137
+ arr = @model.set_var_array(3, @glb_enum, @lub_enum, @lower_card..@upper_card)
138
+ arr.size.should == 3
139
+ arr.each do |var|
140
+ var.should have_bounds(@glb_enum, @lub_enum)
141
+ var.cardinality.end.should <= @upper_card
142
+ var.cardinality.begin.should >= @lower_card
143
+ end
144
+ end
145
+
146
+ it 'should allow the creation of matrices of set variables' do
147
+ matrix = @model.set_var_matrix(4, 5, @glb_enum, @lub_enum,
148
+ @lower_card..@upper_card)
149
+ matrix.row_size.should == 4
150
+ matrix.column_size.should == 5
151
+ matrix.each do |var|
152
+ var.should have_bounds(@glb_enum, @lub_enum)
153
+ var.cardinality.end.should <= @upper_card
154
+ var.cardinality.begin.should >= @lower_card
155
+ end
156
+ end
157
+
158
+ it 'should raise error if glb and lub are not valid when they are given as range' do
159
+ lambda{ @model.set_var(@lub_range, @glb_range).should }.should raise_error(
160
+ ArgumentError)
161
+ end
162
+
163
+ it 'should raise error if glb and lub are not valid when one is given as enum' do
164
+ lambda{ @model.set_var(@lub_range, @glb_enum).should }.should raise_error(
165
+ ArgumentError)
166
+ end
167
+
168
+ it 'should raise error if glb and lub are not valid when both are given as enums' do
169
+ lambda{ @model.set_var(@lub_enum, @glb_enum).should }.should raise_error(
170
+ ArgumentError)
171
+ end
172
+ end
173
+
174
+ describe Gecode::Model, ' (space access restriction)' do
175
+ before do
176
+ @model = Gecode::Model.new
177
+ end
178
+
179
+ it 'should raise error if not allowed to access space' do
180
+ lambda{ @model.active_space }.should raise_error(RuntimeError)
181
+ end
182
+
183
+ it 'should not raise error because of space restriction if allowed to access space' do
184
+ lambda do
185
+ @model.allow_space_access do
186
+ @model.active_space
187
+ end
188
+ end.should_not raise_error(RuntimeError)
189
+ end
190
+ end
data/specs/search.rb ADDED
@@ -0,0 +1,246 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+ require 'set'
3
+
4
+ class SampleProblem < Gecode::Model
5
+ attr :var
6
+ attr :array
7
+ attr :hash
8
+ attr :nested_enum
9
+
10
+ def initialize(domain)
11
+ vars = self.int_var_array(1,domain)
12
+ @var = vars.first
13
+ @var.must > 1
14
+ @array = [@var]
15
+ @hash = {:a => var}
16
+ @nested_enum = [1,2,[@var],[7, {:b => var}]]
17
+
18
+ branch_on vars, :variable => :smallest_size, :value => :min
19
+ end
20
+ end
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
+
36
+ class SampleOptimizationProblem2 < Gecode::Model
37
+ attr :money
38
+
39
+ def initialize
40
+ @money = int_var_array(3, 0..9)
41
+ @money.must_be.distinct
42
+ @money.to_number.must < 500 # Otherwise it takes some time.
43
+
44
+ branch_on @money, :variable => :smallest_size, :value => :min
45
+ end
46
+ end
47
+
48
+ class Array
49
+ # Computes a number of the specified base using the array's elements as
50
+ # digits.
51
+ def to_number(base = 10)
52
+ inject{ |result, variable| variable + result * base }
53
+ end
54
+ end
55
+
56
+ describe Gecode::Model, ' (with multiple solutions)' do
57
+ before do
58
+ @domain = 0..3
59
+ @solved_domain = [2]
60
+ @model = SampleProblem.new(@domain)
61
+ end
62
+
63
+ it 'should pass a solution to the block given in #solution' do
64
+ @model.solution do |s|
65
+ s.var.should have_domain(@solved_domain)
66
+ end
67
+ end
68
+
69
+ it 'should only evaluate the block for one solution in #solution' do
70
+ i = 0
71
+ @model.solution{ |s| i += 1 }
72
+ i.should equal(1)
73
+ end
74
+
75
+ it 'should return the result of the block when calling #solution' do
76
+ @model.solution{ |s| 'test' }.should == 'test'
77
+ end
78
+
79
+ it 'should pass every solution to #each_solution' do
80
+ solutions = []
81
+ @model.each_solution do |s|
82
+ solutions << s.var.value
83
+ end
84
+ Set.new(solutions).should == Set.new([2,3])
85
+ end
86
+ end
87
+
88
+ describe Gecode::Model, ' (after #solve!)' do
89
+ before do
90
+ @domain = 0..3
91
+ @solved_domain = [2]
92
+ @model = SampleProblem.new(@domain)
93
+ @model.solve!
94
+ end
95
+
96
+ it 'should have updated the variables domains' do
97
+ @model.var.should have_domain(@solved_domain)
98
+ end
99
+
100
+ it 'should have updated variables in arrays' do
101
+ @model.array.first.should have_domain(@solved_domain)
102
+ end
103
+
104
+ it 'should have updated variables in hashes' do
105
+ @model.hash.values.first.should have_domain(@solved_domain)
106
+ end
107
+
108
+ it 'should have updated variables in nested enums' do
109
+ enum = @model.solve!.nested_enum
110
+ enum[2].first.should have_domain(@solved_domain)
111
+ enum[3][1][:b].should have_domain(@solved_domain)
112
+
113
+ enum = @model.nested_enum
114
+ enum[2].first.should have_domain(@solved_domain)
115
+ enum[3][1][:b].should have_domain(@solved_domain)
116
+ end
117
+ end
118
+
119
+ describe 'reset model', :shared => true do
120
+ it 'should have reset variables' do
121
+ @model.var.should have_domain(@reset_domain)
122
+ end
123
+
124
+ it 'should have reset variables in nested enums' do
125
+ enum = @model.nested_enum
126
+ enum[2].first.should have_domain(@reset_domain)
127
+ enum[3][1][:b].should have_domain(@reset_domain)
128
+ end
129
+ end
130
+
131
+ describe Gecode::Model, ' (after #reset!)' do
132
+ before do
133
+ @domain = 0..3
134
+ @reset_domain = 2..3
135
+ @model = SampleProblem.new(@domain)
136
+ @model.solve!
137
+ @model.reset!
138
+ end
139
+
140
+ it_should_behave_like 'reset model'
141
+ end
142
+
143
+ describe Gecode::Model, ' (after #solution)' do
144
+ before do
145
+ @domain = 0..3
146
+ @reset_domain = 2..3
147
+ @model = SampleProblem.new(@domain)
148
+ @model.solution{ |s| }
149
+ end
150
+
151
+ it_should_behave_like 'reset model'
152
+ end
153
+
154
+ describe Gecode::Model, ' (after #each_solution)' do
155
+ before do
156
+ @domain = 0..3
157
+ @reset_domain = 2..3
158
+ @model = SampleProblem.new(@domain)
159
+ @model.each_solution{ |s| }
160
+ end
161
+
162
+ it_should_behave_like 'reset model'
163
+ end
164
+
165
+ describe Gecode::Model, ' (without solution)' do
166
+ before do
167
+ @domain = 0..3
168
+ @model = SampleProblem.new(@domain)
169
+ @model.var.must < 0
170
+ end
171
+
172
+ it 'should return nil when calling #solution' do
173
+ @model.var.must < 0
174
+ @model.solution{ |s| 'test' }.should be_nil
175
+ end
176
+
177
+ it 'should return nil when calling #solve!' do
178
+ @model.solve!.should be_nil
179
+ end
180
+
181
+ it 'should return nil when calling #optimize!' do
182
+ @model.optimize!{}.should be_nil
183
+ end
184
+ end
185
+
186
+ describe Gecode::Model, ' (without constraints)' do
187
+ before do
188
+ @model = Gecode::Model.new
189
+ @x = @model.int_var(0..1)
190
+ end
191
+
192
+ it 'should produce a solution' do
193
+ @model.solve!.should_not be_nil
194
+ end
195
+ end
196
+
197
+ describe Gecode::Model, '(optimization search)' do
198
+ it 'should optimize the solution' do
199
+ solution = SampleOptimizationProblem.new.optimize! do |model, best_so_far|
200
+ model.z.must > best_so_far.z.value
201
+ end
202
+ solution.should_not be_nil
203
+ solution.x.value.should == 5
204
+ solution.y.value.should == 5
205
+ solution.z.value.should == 25
206
+ end
207
+
208
+ it 'should not be bothered by garbage collecting' do
209
+ # This goes through 400+ spaces.
210
+ solution = SampleOptimizationProblem2.new.optimize! do |model, best_so_far|
211
+ model.money.to_number.must > best_so_far.money.values.to_number
212
+ end
213
+ solution.should_not be_nil
214
+ solution.money.values.to_number.should == 498
215
+ end
216
+
217
+ it 'should raise error if no constrain proc has been defined' do
218
+ lambda do
219
+ Gecode::Model.constrain(nil, nil)
220
+ end.should raise_error(NotImplementedError)
221
+ end
222
+
223
+ it 'should not have problems with variables being created in the optimization block' do
224
+ solution = SampleOptimizationProblem.new.optimize! do |model, best_so_far|
225
+ tmp = model.int_var(0..25)
226
+ tmp.must == model.z
227
+ tmp.must > best_so_far.z.value
228
+ end
229
+ solution.should_not be_nil
230
+ solution.x.value.should == 5
231
+ solution.y.value.should == 5
232
+ solution.z.value.should == 25
233
+ end
234
+
235
+ it 'should not have problems with variables being created in the optimization block (2)' do
236
+ solution = SampleOptimizationProblem.new.optimize! do |model, best_so_far|
237
+ tmp = model.int_var(0..25)
238
+ tmp.must == model.z
239
+ (tmp + tmp).must > best_so_far.z.value*2
240
+ end
241
+ solution.should_not be_nil
242
+ solution.x.value.should == 5
243
+ solution.y.value.should == 5
244
+ solution.z.value.should == 25
245
+ end
246
+ end