gecoder-with-gecode 0.7.1-mswin32

Sign up to get free protection for your applications and to get access to all the features.
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