gecoder 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +9 -1
- data/Rakefile +3 -0
- data/example/send_most_money.rb +58 -0
- data/ext/missing.cpp +26 -1
- data/ext/missing.h +2 -0
- data/ext/vararray.cpp +31 -11
- data/ext/vararray.h +6 -0
- data/lib/gecoder/bindings.rb +5 -5
- data/lib/gecoder/bindings/bindings.rb +52 -0
- data/lib/gecoder/interface/binding_changes.rb +16 -11
- data/lib/gecoder/interface/constraints.rb +28 -15
- data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +8 -17
- data/lib/gecoder/interface/constraints/bool_var_constraints.rb +8 -3
- data/lib/gecoder/interface/constraints/int/arithmetic.rb +10 -15
- data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +10 -16
- data/lib/gecoder/interface/constraints/int_enum/element.rb +6 -11
- data/lib/gecoder/interface/constraints/int_var_constraints.rb +2 -1
- data/lib/gecoder/interface/constraints/set/cardinality.rb +4 -7
- data/lib/gecoder/interface/constraints/set/connection.rb +13 -22
- data/lib/gecoder/interface/model.rb +52 -41
- data/lib/gecoder/interface/search.rb +29 -24
- data/lib/gecoder/interface/variables.rb +27 -15
- data/lib/gecoder/version.rb +1 -1
- data/specs/constraints/arithmetic.rb +27 -17
- data/specs/constraints/bool_enum.rb +4 -2
- data/specs/constraints/boolean.rb +5 -2
- data/specs/constraints/cardinality.rb +28 -8
- data/specs/constraints/connection.rb +58 -37
- data/specs/constraints/constraints.rb +2 -2
- data/specs/constraints/count.rb +3 -3
- data/specs/constraints/element.rb +5 -5
- data/specs/constraints/int_domain.rb +4 -2
- data/specs/constraints/set_domain.rb +8 -4
- data/specs/constraints/set_relation.rb +10 -5
- data/specs/int_var.rb +3 -3
- data/specs/model.rb +10 -9
- data/specs/search.rb +54 -5
- data/specs/spec_helper.rb +2 -0
- data/tasks/distribution.rake +8 -1
- data/tasks/specs.rake +0 -1
- data/vendor/rust/rust/class.rb +6 -1
- data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +3 -3
- data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +15 -1
- data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +2 -0
- metadata +51 -21
data/CHANGES
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== Version 0.6.1
|
2
|
+
This release fixes various bugs introduced in 0.6.0 and changes the way that
|
3
|
+
int variable domains are specified (breaking backward-compatibility).
|
4
|
+
|
5
|
+
* The domain for int variables can no longer be specified as several individual elements, it has to be specified as either a single element, a range or another enumeration.
|
6
|
+
* Fixed a bug with set cardinality, min and max constraints using composite sugar.
|
7
|
+
* Variables can now be created inside the optimization block.
|
8
|
+
|
1
9
|
== Version 0.6.0
|
2
10
|
This release adds most of the remaining set constraints. It also makes
|
3
11
|
backward-compatibility breaking changes to the way that properties of variables
|
@@ -9,7 +17,7 @@ are accessed.
|
|
9
17
|
* Added include (match) constraint for sets.
|
10
18
|
* Added distinct constraints (distinct and at most one) for sets.
|
11
19
|
* Added branch and bound search (optimization search). It's quite shaky at the moment though.
|
12
|
-
* Assigned values of variables are now always accessed using #value
|
20
|
+
* Assigned values of variables are now always accessed using #value instead of the various previous methods. The methods for extracting information from set variables have been changed and renamed.
|
13
21
|
* Enumerations containing variables now provide a convenience method #values which returns an array of the enum's values.
|
14
22
|
|
15
23
|
== Version 0.5.0
|
data/Rakefile
CHANGED
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/example_helper'
|
2
|
+
|
3
|
+
# Solves the cryptarithmetic send+most=money problem while maximizing the value
|
4
|
+
# of "money".
|
5
|
+
class SendMoreMoney < Gecode::Model
|
6
|
+
attr :money
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
# Set up the variables, 9 letters with domain 0..9.
|
10
|
+
s,e,n,d,m,o,s,t,y = @letters = int_var_array(9, 0..9)
|
11
|
+
@money = wrap_enum([m,o,n,e,y])
|
12
|
+
|
13
|
+
# Set up the constraints.
|
14
|
+
# The equation must hold.
|
15
|
+
(equation_row(s, e, n, d) + equation_row(m, o, s, t)).must ==
|
16
|
+
equation_row(m,o,n,e,y)
|
17
|
+
|
18
|
+
# The initial letters may not be 0.
|
19
|
+
s.must_not == 0
|
20
|
+
m.must_not == 0
|
21
|
+
|
22
|
+
# All letters must be assigned different digits.
|
23
|
+
@letters.must_be.distinct
|
24
|
+
|
25
|
+
# Set the branching.
|
26
|
+
branch_on @letters, :variable => :smallest_size, :value => :min
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
%w{s e n d m o s t y}.zip(@letters).map do |text, letter|
|
31
|
+
"#{text}: #{letter.value}"
|
32
|
+
end.join(', ')
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
# A helper to make the linear equation a bit tidier. Takes a number of
|
38
|
+
# variables and computes the linear combination as if the variable
|
39
|
+
# were digits in a base 10 number. E.g. x,y,z becomes
|
40
|
+
# 100*x + 10*y + z .
|
41
|
+
def equation_row(*variables)
|
42
|
+
variables.to_number
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class Array
|
47
|
+
# Computes a number of the specified base using the array's elements as
|
48
|
+
# digits.
|
49
|
+
def to_number(base = 10)
|
50
|
+
inject{ |result, variable| variable + result * base }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
solution = SendMoreMoney.new.optimize! do |model, best_so_far|
|
55
|
+
model.money.to_number.must > best_so_far.money.values.to_number
|
56
|
+
end
|
57
|
+
puts solution.to_s
|
58
|
+
puts "money: #{solution.money.values.to_number}"
|
data/ext/missing.cpp
CHANGED
@@ -194,12 +194,37 @@ void MSpace::own(Gecode::MSetVarArray *sva, const char *name)
|
|
194
194
|
d->setArrays[name] = sva;
|
195
195
|
}
|
196
196
|
|
197
|
+
void MSpace::gc_mark()
|
198
|
+
{
|
199
|
+
{
|
200
|
+
IntVarArrays::iterator it, eend = d->intArrays.end();
|
201
|
+
for(it = d->intArrays.begin(); it != eend; it++)
|
202
|
+
{
|
203
|
+
rb_gc_mark(Rust_gecode::cxx2ruby((*it).second));
|
204
|
+
}
|
205
|
+
}
|
206
|
+
{
|
207
|
+
BoolVarArrays::iterator it, eend = d->boolArrays.end();
|
208
|
+
for(it = d->boolArrays.begin(); it != eend; it++)
|
209
|
+
{
|
210
|
+
rb_gc_mark(Rust_gecode::cxx2ruby((*it).second));
|
211
|
+
}
|
212
|
+
}
|
213
|
+
{
|
214
|
+
SetVarArrays::iterator it, eend = d->setArrays.end();
|
215
|
+
for(it = d->setArrays.begin(); it != eend; it++)
|
216
|
+
{
|
217
|
+
rb_gc_mark(Rust_gecode::cxx2ruby((*it).second));
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}
|
221
|
+
|
197
222
|
// For BAB.
|
198
223
|
void MSpace::constrain(MSpace* s)
|
199
224
|
{
|
200
225
|
// Call Ruby's constrain.
|
201
226
|
rb_funcall(Rust_gecode::cxx2ruby(this), rb_intern("constrain"), 1,
|
202
|
-
Rust_gecode::cxx2ruby(s));
|
227
|
+
Rust_gecode::cxx2ruby(s, false));
|
203
228
|
}
|
204
229
|
|
205
230
|
Gecode::MIntVarArray *MSpace::intVarArray(const char *name) const
|
data/ext/missing.h
CHANGED
@@ -61,6 +61,8 @@ class MSpace : public Space
|
|
61
61
|
void own(Gecode::MBoolVarArray *bva, const char *name);
|
62
62
|
void own(Gecode::MSetVarArray *sva, const char *name);
|
63
63
|
|
64
|
+
void gc_mark();
|
65
|
+
|
64
66
|
void constrain(MSpace* s);
|
65
67
|
|
66
68
|
Gecode::MIntVarArray *intVarArray(const char *name ) const;
|
data/ext/vararray.cpp
CHANGED
@@ -18,6 +18,7 @@
|
|
18
18
|
**/
|
19
19
|
|
20
20
|
#include "vararray.h"
|
21
|
+
#include "gecode.hh"
|
21
22
|
|
22
23
|
namespace Gecode {
|
23
24
|
|
@@ -74,7 +75,6 @@ MIntVarArray::MIntVarArray() : d(new Private)
|
|
74
75
|
MIntVarArray::MIntVarArray(const Gecode::IntVarArray &arr) : d(new Private)
|
75
76
|
{
|
76
77
|
setArray(arr);
|
77
|
-
setCount(0);
|
78
78
|
}
|
79
79
|
|
80
80
|
MIntVarArray::MIntVarArray (Space *home, int n) : d(new Private)
|
@@ -107,7 +107,7 @@ void MIntVarArray::setArray(const Gecode::IntVarArray &arr)
|
|
107
107
|
void MIntVarArray::enlargeArray(Gecode::Space *parent, int n)
|
108
108
|
{
|
109
109
|
Gecode::IntVarArray na(parent, size()+n, 0, 0);
|
110
|
-
for(int i =
|
110
|
+
for(int i = size(); i--; )
|
111
111
|
na[i] = d->array[i];
|
112
112
|
|
113
113
|
d->array = na;
|
@@ -130,6 +130,13 @@ IntVar &MIntVarArray::operator [](int index)
|
|
130
130
|
return d->array[index];
|
131
131
|
}
|
132
132
|
|
133
|
+
void MIntVarArray::gc_mark()
|
134
|
+
{
|
135
|
+
for(int i = size(); i--; ) {
|
136
|
+
rb_gc_mark(Rust_gecode::cxx2ruby(&(d->array[i])));
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
133
140
|
void MIntVarArray::debug() const
|
134
141
|
{
|
135
142
|
for(int i = 0; i < d->array.size(); i++)
|
@@ -150,14 +157,14 @@ struct MBoolVarArray::Private
|
|
150
157
|
|
151
158
|
MBoolVarArray::MBoolVarArray() : d(new Private)
|
152
159
|
{
|
160
|
+
setArray(Gecode::BoolVarArray());
|
153
161
|
}
|
154
162
|
|
155
163
|
MBoolVarArray::MBoolVarArray(const Gecode::BoolVarArray &arr) : d(new Private)
|
156
164
|
{
|
157
|
-
|
158
|
-
setSize(arr.size());
|
159
|
-
setCount(0);
|
165
|
+
setArray(arr);
|
160
166
|
}
|
167
|
+
|
161
168
|
MBoolVarArray::MBoolVarArray (Space *home, int n) : d(new Private)
|
162
169
|
{
|
163
170
|
setArray(Gecode::BoolVarArray(home, n));
|
@@ -177,7 +184,7 @@ void MBoolVarArray::setArray(const Gecode::BoolVarArray &arr)
|
|
177
184
|
void MBoolVarArray::enlargeArray(Gecode::Space *parent, int n)
|
178
185
|
{
|
179
186
|
Gecode::BoolVarArray na(parent, size()+n, 0, 0);
|
180
|
-
for(int i =
|
187
|
+
for(int i = size(); i--; )
|
181
188
|
na[i] = d->array[i];
|
182
189
|
|
183
190
|
d->array = na;
|
@@ -200,6 +207,13 @@ Gecode::BoolVar &MBoolVarArray::operator[](int index)
|
|
200
207
|
return d->array[index];
|
201
208
|
}
|
202
209
|
|
210
|
+
void MBoolVarArray::gc_mark()
|
211
|
+
{
|
212
|
+
for(int i = size(); i--; ) {
|
213
|
+
rb_gc_mark(Rust_gecode::cxx2ruby(&(d->array[i])));
|
214
|
+
}
|
215
|
+
}
|
216
|
+
|
203
217
|
void MBoolVarArray::debug() const
|
204
218
|
{
|
205
219
|
for(int i = 0; i < d->array.size(); i++)
|
@@ -219,13 +233,12 @@ struct MSetVarArray::Private
|
|
219
233
|
|
220
234
|
MSetVarArray::MSetVarArray() : d(new Private)
|
221
235
|
{
|
236
|
+
setArray(Gecode::SetVarArray());
|
222
237
|
}
|
223
238
|
|
224
239
|
MSetVarArray::MSetVarArray(const Gecode::SetVarArray &arr) : d(new Private)
|
225
240
|
{
|
226
|
-
|
227
|
-
setSize(arr.size());
|
228
|
-
setCount(0);
|
241
|
+
setArray(arr);
|
229
242
|
}
|
230
243
|
|
231
244
|
MSetVarArray::MSetVarArray(Space *home, int n) : d(new Private)
|
@@ -266,8 +279,8 @@ void MSetVarArray::setArray(const Gecode::SetVarArray &arr)
|
|
266
279
|
|
267
280
|
void MSetVarArray::enlargeArray(Gecode::Space *parent, int n)
|
268
281
|
{
|
269
|
-
Gecode::SetVarArray na(parent, size()
|
270
|
-
for (int i =
|
282
|
+
Gecode::SetVarArray na(parent, size()+n);
|
283
|
+
for (int i = size(); i--; )
|
271
284
|
na[i] = d->array[i];
|
272
285
|
|
273
286
|
d->array = na;
|
@@ -290,6 +303,13 @@ Gecode::SetVar &MSetVarArray::operator[](int index)
|
|
290
303
|
return d->array[index];
|
291
304
|
}
|
292
305
|
|
306
|
+
void MSetVarArray::gc_mark()
|
307
|
+
{
|
308
|
+
for(int i = size(); i--; ) {
|
309
|
+
rb_gc_mark(Rust_gecode::cxx2ruby(&(d->array[i])));
|
310
|
+
}
|
311
|
+
}
|
312
|
+
|
293
313
|
void MSetVarArray::debug() const
|
294
314
|
{
|
295
315
|
for(int i = 0; i < d->array.size(); i++)
|
data/ext/vararray.h
CHANGED
@@ -65,6 +65,8 @@ class MIntVarArray : public MVarArray
|
|
65
65
|
|
66
66
|
void debug() const;
|
67
67
|
|
68
|
+
void gc_mark();
|
69
|
+
|
68
70
|
IntVar &operator [](int index);
|
69
71
|
|
70
72
|
private:
|
@@ -93,6 +95,8 @@ class MBoolVarArray : public MVarArray
|
|
93
95
|
|
94
96
|
void debug() const;
|
95
97
|
|
98
|
+
void gc_mark();
|
99
|
+
|
96
100
|
private:
|
97
101
|
struct Private;
|
98
102
|
Private *const d;
|
@@ -131,6 +135,8 @@ class MSetVarArray : public MVarArray
|
|
131
135
|
|
132
136
|
void debug() const;
|
133
137
|
|
138
|
+
void gc_mark();
|
139
|
+
|
134
140
|
private:
|
135
141
|
struct Private;
|
136
142
|
Private *const d;
|
data/lib/gecoder/bindings.rb
CHANGED
@@ -3,11 +3,6 @@ module Gecode
|
|
3
3
|
# The Gecode::Raw module is what the interface should use to access methods
|
4
4
|
# in Gecode. The actual bindings are located in ::GecodeRaw.
|
5
5
|
|
6
|
-
# We just make Gecode::Raw an alias of the real module.
|
7
|
-
Raw = ::GecodeRaw
|
8
|
-
# Log all calls via Gecode::Raw.
|
9
|
-
#Raw = ::LoggingLayer
|
10
|
-
|
11
6
|
# Describes a layer that delegates to GecodeRaw only after having logged the
|
12
7
|
# call.
|
13
8
|
module LoggingLayer
|
@@ -31,4 +26,9 @@ module Gecode
|
|
31
26
|
@logger
|
32
27
|
end
|
33
28
|
end
|
29
|
+
|
30
|
+
# We just make Gecode::Raw an alias of the real module.
|
31
|
+
Raw = ::GecodeRaw
|
32
|
+
# Log all calls via Gecode::Raw.
|
33
|
+
#Raw = LoggingLayer
|
34
34
|
end
|
@@ -48,6 +48,28 @@ Gecode::IntArgs ruby2Gecode_IntArgs(VALUE arr, int argn)
|
|
48
48
|
}
|
49
49
|
@
|
50
50
|
|
51
|
+
custom_mark_definitions =<<-"end_custom_definition"
|
52
|
+
static void Gecode_MSpace_custom_mark(void *p) {
|
53
|
+
Gecode_MSpace_mark(p);
|
54
|
+
((Gecode::MSpace*)p)->gc_mark();
|
55
|
+
}
|
56
|
+
|
57
|
+
static void Gecode_MIntVarArray_custom_mark(void *p) {
|
58
|
+
Gecode_MIntVarArray_mark(p);
|
59
|
+
((Gecode::MIntVarArray*)p)->gc_mark();
|
60
|
+
}
|
61
|
+
|
62
|
+
static void Gecode_MBoolVarArray_custom_mark(void *p) {
|
63
|
+
Gecode_MBoolVarArray_mark(p);
|
64
|
+
((Gecode::MBoolVarArray*)p)->gc_mark();
|
65
|
+
}
|
66
|
+
|
67
|
+
static void Gecode_MSetVarArray_custom_mark(void *p) {
|
68
|
+
Gecode_MSetVarArray_mark(p);
|
69
|
+
((Gecode::MSetVarArray*)p)->gc_mark();
|
70
|
+
}
|
71
|
+
end_custom_definition
|
72
|
+
|
51
73
|
|
52
74
|
Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
53
75
|
b.include_header 'gecode/kernel.hh', Rust::Bindings::HeaderGlobal
|
@@ -57,6 +79,7 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
57
79
|
b.include_header 'missing.h', Rust::Bindings::HeaderLocal
|
58
80
|
|
59
81
|
b.add_custom_definition ruby2intargs
|
82
|
+
b.add_custom_definition custom_mark_definitions
|
60
83
|
|
61
84
|
# Is it possible to use namespaces with multiple levels in Rust? I.e. use
|
62
85
|
# Gecode::Raw instead of GecodeRaw here (and avoid the hidious renaming)
|
@@ -146,6 +169,8 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
146
169
|
|
147
170
|
ns.add_cxx_class "MIntVarArray" do |klass|
|
148
171
|
klass.bindname = "IntVarArray"
|
172
|
+
klass.function_mark = 'Gecode_MIntVarArray_custom_mark'
|
173
|
+
|
149
174
|
klass.add_constructor
|
150
175
|
klass.add_constructor do |func|
|
151
176
|
func.add_parameter "Gecode::MSpace *", "home"
|
@@ -178,6 +203,11 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
178
203
|
method.add_parameter "Gecode::IntVar", "val"
|
179
204
|
end
|
180
205
|
|
206
|
+
klass.add_method "enlargeArray" do |method|
|
207
|
+
method.add_parameter "Gecode::MSpace *", "home"
|
208
|
+
method.add_parameter "int", "n"
|
209
|
+
end
|
210
|
+
|
181
211
|
klass.add_method "size", "int"
|
182
212
|
|
183
213
|
klass.add_method "debug"
|
@@ -187,6 +217,8 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
187
217
|
|
188
218
|
ns.add_cxx_class "MBoolVarArray" do |klass|
|
189
219
|
klass.bindname = "BoolVarArray"
|
220
|
+
klass.function_mark = 'Gecode_MBoolVarArray_custom_mark'
|
221
|
+
|
190
222
|
klass.add_constructor
|
191
223
|
klass.add_constructor do |func|
|
192
224
|
func.add_parameter "Gecode::MSpace *", "home"
|
@@ -206,6 +238,11 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
206
238
|
method.add_parameter "Gecode::BoolVar", "val"
|
207
239
|
end
|
208
240
|
|
241
|
+
klass.add_method "enlargeArray" do |method|
|
242
|
+
method.add_parameter "Gecode::MSpace *", "home"
|
243
|
+
method.add_parameter "int", "n"
|
244
|
+
end
|
245
|
+
|
209
246
|
klass.add_method "size", "int"
|
210
247
|
|
211
248
|
klass.add_method "debug"
|
@@ -214,6 +251,8 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
214
251
|
|
215
252
|
ns.add_cxx_class "MSetVarArray" do |klass|
|
216
253
|
klass.bindname = "SetVarArray"
|
254
|
+
klass.function_mark = 'Gecode_MSetVarArray_custom_mark'
|
255
|
+
|
217
256
|
klass.add_constructor
|
218
257
|
|
219
258
|
klass.add_constructor do |method|
|
@@ -274,6 +313,11 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
274
313
|
method.add_parameter "Gecode::SetVar", "val"
|
275
314
|
end
|
276
315
|
|
316
|
+
klass.add_method "enlargeArray" do |method|
|
317
|
+
method.add_parameter "Gecode::MSpace *", "home"
|
318
|
+
method.add_parameter "int", "n"
|
319
|
+
end
|
320
|
+
|
277
321
|
klass.add_method "size", "int"
|
278
322
|
|
279
323
|
klass.add_method "debug"
|
@@ -288,6 +332,7 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
288
332
|
|
289
333
|
ns.add_cxx_class "MSpace" do |klass|
|
290
334
|
klass.bindname = "Space"
|
335
|
+
klass.function_mark = 'Gecode_MSpace_custom_mark'
|
291
336
|
|
292
337
|
klass.add_constructor
|
293
338
|
|
@@ -1429,6 +1474,13 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
1429
1474
|
# func.add_parameter "Gecode::IntConLevel", "icl", true
|
1430
1475
|
# end
|
1431
1476
|
|
1477
|
+
ns.add_function "bab", "Gecode::MSpace*" do |func|
|
1478
|
+
func.add_parameter "Gecode::MSpace*", "home"
|
1479
|
+
func.add_parameter "int", "c_d"
|
1480
|
+
func.add_parameter "int", "a_d"
|
1481
|
+
func.add_parameter "Gecode::Search::MStop *", "st"
|
1482
|
+
end
|
1483
|
+
|
1432
1484
|
ns.add_function "rel" do |func|
|
1433
1485
|
func.add_parameter "Gecode::MSpace*", "home"
|
1434
1486
|
func.add_parameter "Gecode::IntVar", "x0"
|
@@ -52,31 +52,40 @@ module GecodeRaw
|
|
52
52
|
Gecode::Model.constrain(self, best_so_far_space)
|
53
53
|
end
|
54
54
|
|
55
|
+
# Refreshes the underlying stores used by the space.
|
56
|
+
def refresh
|
57
|
+
@int_var_store = nil
|
58
|
+
@bool_var_store = nil
|
59
|
+
@set_var_store = nil
|
60
|
+
end
|
61
|
+
|
55
62
|
private
|
56
63
|
|
57
64
|
# Retrieves the store used for integer variables. Creates one if none
|
58
65
|
# exists.
|
59
66
|
def int_var_store
|
60
|
-
|
67
|
+
# TODO: caching interferes with the variable creation during BAB-search,
|
68
|
+
# find out why.
|
69
|
+
#if @int_var_store.nil?
|
61
70
|
@int_var_store = Gecode::Util::IntVarStore.new(self)
|
62
|
-
end
|
71
|
+
#end
|
63
72
|
return @int_var_store
|
64
73
|
end
|
65
74
|
|
66
75
|
# Retrieves the store used for boolean variables. Creates one if none
|
67
76
|
# exists.
|
68
77
|
def bool_var_store
|
69
|
-
if @bool_var_store.nil?
|
78
|
+
#if @bool_var_store.nil?
|
70
79
|
@bool_var_store = Gecode::Util::BoolVarStore.new(self)
|
71
|
-
end
|
80
|
+
#end
|
72
81
|
return @bool_var_store
|
73
82
|
end
|
74
83
|
|
75
84
|
# Retrieves the store used for set variables. Creates one if none exists.
|
76
85
|
def set_var_store
|
77
|
-
if @set_var_store.nil?
|
86
|
+
#if @set_var_store.nil?
|
78
87
|
@set_var_store = Gecode::Util::SetVarStore.new(self)
|
79
|
-
end
|
88
|
+
#end
|
80
89
|
return @set_var_store
|
81
90
|
end
|
82
91
|
end
|
@@ -100,11 +109,7 @@ module Gecode
|
|
100
109
|
|
101
110
|
# Grows the store to the new size.
|
102
111
|
def grow(new_size)
|
103
|
-
|
104
|
-
@var_array.size.times do |i|
|
105
|
-
new_array[i] = @var_array[i]
|
106
|
-
end
|
107
|
-
@var_array = new_array
|
112
|
+
@var_array.enlargeArray(@space, new_size - @size)
|
108
113
|
@size = new_size
|
109
114
|
end
|
110
115
|
end
|