gecoder 1.0.0 → 1.1.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 -10
- data/THANKS +10 -9
- data/example/minesweeper.rb +136 -0
- data/example/nonogram.rb +155 -0
- data/example/survo.rb +131 -0
- data/ext/gecoder.cpp +10 -14
- data/ext/gecoder.h +3 -6
- data/lib/gecoder/bindings/bindings.rb +11 -6
- data/lib/gecoder/interface/constraints.rb +10 -2
- data/lib/gecoder/interface/constraints/extensional_regexp.rb +8 -4
- data/lib/gecoder/interface/constraints/set/connection.rb +3 -2
- data/lib/gecoder/interface/constraints/set_enum/channel.rb +1 -1
- data/lib/gecoder/interface/search.rb +38 -7
- data/lib/gecoder/version.rb +1 -1
- data/specs/search.rb +43 -0
- data/tasks/distribution.rake +25 -20
- data/tasks/rcov.rake +2 -0
- data/tasks/specs.rake +2 -0
- data/tasks/website.rake +3 -3
- data/vendor/rust/include/rust_conversions.hh +22 -3
- data/vendor/rust/rust/class.rb +48 -24
- data/vendor/rust/rust/function.rb +1 -1
- data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +2 -2
- metadata +249 -248
data/ext/gecoder.cpp
CHANGED
@@ -125,7 +125,7 @@ namespace Gecode {
|
|
125
125
|
* MDFS is the same as DFS but with the size of a space inferred from the
|
126
126
|
* other arguments, since it can't be done from the Ruby side.
|
127
127
|
*/
|
128
|
-
MDFS::MDFS(MSpace* space,
|
128
|
+
MDFS::MDFS(MSpace* space, const Search::Options &o) : Gecode::DFS<MSpace>(space, o) {
|
129
129
|
}
|
130
130
|
|
131
131
|
MDFS::~MDFS() {
|
@@ -143,39 +143,35 @@ namespace Gecode {
|
|
143
143
|
|
144
144
|
namespace Search {
|
145
145
|
/*
|
146
|
-
* MStop combines the time
|
147
|
-
*
|
146
|
+
* MStop combines the time, memory and fail stop into one concrete
|
147
|
+
* class. This is done because the bindings generator can't deal
|
148
|
+
* with virtual classes.
|
148
149
|
*/
|
149
150
|
|
150
151
|
struct MStop::Private {
|
151
152
|
Gecode::Search::TimeStop* ts;
|
152
153
|
Gecode::Search::FailStop* fs;
|
154
|
+
Gecode::Search::MemoryStop* ms;
|
153
155
|
};
|
154
156
|
|
155
157
|
MStop::MStop() : d(new Private) {
|
156
158
|
d->ts = 0;
|
157
159
|
d->fs = 0;
|
160
|
+
d->ms = 0;
|
158
161
|
}
|
159
162
|
|
160
|
-
MStop::MStop(int fails, int time) : d(new Private) {
|
163
|
+
MStop::MStop(int fails, int time, size_t mem) : d(new Private) {
|
161
164
|
d->ts = new Search::TimeStop(time);
|
162
165
|
d->fs = new Search::FailStop(fails);
|
166
|
+
d->ms = new Search::MemoryStop(mem);
|
163
167
|
}
|
164
168
|
|
165
169
|
MStop::~MStop() {
|
166
170
|
}
|
167
171
|
|
168
172
|
bool MStop::stop(const Gecode::Search::Statistics &s) {
|
169
|
-
if (!d->fs && !d->ts) return false;
|
170
|
-
return d->fs->stop(s) || d->ts->stop(s);
|
171
|
-
}
|
172
|
-
|
173
|
-
Gecode::Search::Stop* MStop::create(int fails, int time) {
|
174
|
-
if (fails < 0 && time < 0) return 0;
|
175
|
-
if (fails < 0) return new Search::TimeStop(time);
|
176
|
-
if (time < 0) return new Search::FailStop(fails);
|
177
|
-
|
178
|
-
return new MStop(fails, time);
|
173
|
+
if (!d->fs && !d->ts && !d->ms) return false;
|
174
|
+
return d->fs->stop(s) || d->ts->stop(s) || d->ms->stop(s);
|
179
175
|
}
|
180
176
|
}
|
181
177
|
}
|
data/ext/gecoder.h
CHANGED
@@ -58,9 +58,9 @@ namespace Gecode {
|
|
58
58
|
Gecode::SetVarArray set_variables;
|
59
59
|
};
|
60
60
|
|
61
|
-
class MDFS : public Gecode::
|
61
|
+
class MDFS : public Gecode::DFS<MSpace> {
|
62
62
|
public:
|
63
|
-
MDFS(MSpace *space,
|
63
|
+
MDFS(MSpace *space, const Search::Options &o);
|
64
64
|
~MDFS();
|
65
65
|
};
|
66
66
|
|
@@ -72,15 +72,12 @@ namespace Gecode {
|
|
72
72
|
|
73
73
|
namespace Search {
|
74
74
|
class MStop : public Gecode::Search::Stop {
|
75
|
-
private:
|
76
|
-
MStop(int fails, int time);
|
77
|
-
|
78
75
|
public:
|
79
76
|
MStop();
|
77
|
+
MStop(int fails, int time, size_t mem);
|
80
78
|
~MStop();
|
81
79
|
|
82
80
|
bool stop (const Gecode::Search::Statistics &s);
|
83
|
-
static Gecode::Search::Stop* create(int fails, int time);
|
84
81
|
|
85
82
|
private:
|
86
83
|
struct Private;
|
@@ -38,10 +38,10 @@ Gecode::IntArgs ruby2Gecode_IntArgs(VALUE arr, int argn = -1);
|
|
38
38
|
Gecode::IntArgs ruby2Gecode_IntArgs(VALUE arr, int argn)
|
39
39
|
{
|
40
40
|
RArray *array = RARRAY(arr);
|
41
|
-
Gecode::IntArgs intargs(array
|
42
|
-
for(int i = 0; i < array
|
41
|
+
Gecode::IntArgs intargs(RARRAY_LEN(array));
|
42
|
+
for(int i = 0; i < RARRAY_LEN(array); i++)
|
43
43
|
{
|
44
|
-
intargs[i] = NUM2INT(array
|
44
|
+
intargs[i] = NUM2INT(RARRAY_PTR(array)[i]);
|
45
45
|
}
|
46
46
|
|
47
47
|
return intargs;
|
@@ -628,12 +628,11 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
628
628
|
klass.bindname = "DFS"
|
629
629
|
klass.add_constructor do |method|
|
630
630
|
method.add_parameter "Gecode::MSpace *", "s"
|
631
|
-
method.add_parameter "
|
632
|
-
method.add_parameter "int", "a_d"
|
633
|
-
method.add_parameter "Gecode::Search::MStop *", "st"
|
631
|
+
method.add_parameter "Gecode::Search::Options", "o"
|
634
632
|
end
|
635
633
|
|
636
634
|
klass.add_method "next", "Gecode::MSpace *"
|
635
|
+
klass.add_method "stopped", "bool"
|
637
636
|
klass.add_method "statistics", "Gecode::Search::Statistics"
|
638
637
|
end
|
639
638
|
|
@@ -645,6 +644,7 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
645
644
|
end
|
646
645
|
|
647
646
|
klass.add_method "next", "Gecode::MSpace *"
|
647
|
+
klass.add_method "stopped", "bool"
|
648
648
|
klass.add_method "statistics", "Gecode::Search::Statistics"
|
649
649
|
end
|
650
650
|
|
@@ -705,6 +705,11 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b|
|
|
705
705
|
searchns.add_cxx_class "MStop" do |klass|
|
706
706
|
klass.bindname = "Stop"
|
707
707
|
klass.add_constructor
|
708
|
+
klass.add_constructor do |method|
|
709
|
+
method.add_parameter "int", "fails"
|
710
|
+
method.add_parameter "int", "time"
|
711
|
+
method.add_parameter "int", "mem"
|
712
|
+
end
|
708
713
|
end
|
709
714
|
|
710
715
|
searchns.add_cxx_class "Statistics" do |klass|
|
@@ -120,6 +120,10 @@ module Gecode
|
|
120
120
|
# See e.g. Gecode::Int::IntConstraintReceiver for
|
121
121
|
# concrete examples of options being specified.
|
122
122
|
class ConstraintReceiver
|
123
|
+
# A list that keeps track of all constraint methods used in the
|
124
|
+
# program, essentially providing unique ids for each.
|
125
|
+
@@constraint_names_list ||= []
|
126
|
+
|
123
127
|
# Constructs a new expression with the specified parameters. The
|
124
128
|
# parameters should at least contain the keys :lhs, and :negate.
|
125
129
|
#
|
@@ -150,8 +154,12 @@ module Gecode
|
|
150
154
|
# The original constraint method is assumed to take two arguments:
|
151
155
|
# a right hand side and a hash of options.
|
152
156
|
def self.provide_commutativity(constraint_name, &block)
|
153
|
-
|
154
|
-
|
157
|
+
unless @@constraint_names_list.include? constraint_name
|
158
|
+
@@constraint_names_list << constraint_name
|
159
|
+
end
|
160
|
+
unique_id = @@constraint_names_list.index(constraint_name)
|
161
|
+
|
162
|
+
pre_alias_method_name = "pre_commutivity_#{unique_id}"
|
155
163
|
if method_defined? constraint_name
|
156
164
|
alias_method pre_alias_method_name, constraint_name
|
157
165
|
end
|
@@ -86,10 +86,14 @@ module Gecode
|
|
86
86
|
# FalseClass or Enumerable.
|
87
87
|
def self.internal_parse_regexp(arg)
|
88
88
|
case arg
|
89
|
-
when Gecode::Raw::REG
|
90
|
-
|
91
|
-
when
|
92
|
-
|
89
|
+
when Gecode::Raw::REG
|
90
|
+
arg
|
91
|
+
when Fixnum
|
92
|
+
Gecode::Raw::REG.new(arg)
|
93
|
+
when TrueClass
|
94
|
+
Gecode::Raw::REG.new(1)
|
95
|
+
when FalseClass
|
96
|
+
Gecode::Raw::REG.new(0)
|
93
97
|
when Enumerable
|
94
98
|
# Recursively convert the elements of the arg.
|
95
99
|
arg.inject(Gecode::Raw::REG.new) do |regexp, element|
|
@@ -48,8 +48,9 @@ module Gecode::Set
|
|
48
48
|
end
|
49
49
|
|
50
50
|
case options.keys.first
|
51
|
-
when :substitutions
|
52
|
-
|
51
|
+
when :substitutions
|
52
|
+
subs = options[:substitutions]
|
53
|
+
when :weights
|
53
54
|
weights = options[:weights]
|
54
55
|
subs = Hash.new do |hash, key|
|
55
56
|
if weights[key].nil?
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Gecode::SetEnum
|
2
2
|
class SetEnumConstraintReceiver
|
3
3
|
# Constrains this set enum to channel +int_enum_operand+. The i:th set
|
4
|
-
# in the enumeration of set operands is constrained to
|
4
|
+
# in the enumeration of set operands is constrained to include the value
|
5
5
|
# of the j:th integer operand.
|
6
6
|
#
|
7
7
|
# Neither reification nor negation is supported.
|
@@ -6,15 +6,32 @@ module Gecode
|
|
6
6
|
super('No solution could be found.')
|
7
7
|
end
|
8
8
|
end
|
9
|
+
|
10
|
+
# An exception raised when a search has been aborted due to e.g.
|
11
|
+
# hitting the time limit specified when initiating the search.
|
12
|
+
class SearchAbortedError < RuntimeError
|
13
|
+
def initialize #:nodoc:
|
14
|
+
super('The search was aborted before a solution could be found.')
|
15
|
+
end
|
16
|
+
end
|
9
17
|
|
10
18
|
module Mixin
|
11
19
|
# Finds the first solution to the modelled problem and updates the variables
|
12
20
|
# to that solution. The found solution is also returned. Raises
|
13
21
|
# Gecode::NoSolutionError if no solution can be found.
|
14
|
-
|
15
|
-
|
22
|
+
#
|
23
|
+
# The following options can be specified in a hash with symbols as
|
24
|
+
# keys when calling the method:
|
25
|
+
#
|
26
|
+
# [:time_limit] The number of milliseconds that the solver should be
|
27
|
+
# allowed to use when searching for a solution. If it can
|
28
|
+
# not find a solution fast enough, then
|
29
|
+
# Gecode::SearchAbortedError is raised.
|
30
|
+
def solve!(options = {})
|
31
|
+
dfs = dfs_engine(options)
|
16
32
|
space = dfs.next
|
17
33
|
@gecoder_mixin_statistics = dfs.statistics
|
34
|
+
raise Gecode::SearchAbortedError if dfs.stopped
|
18
35
|
raise Gecode::NoSolutionError if space.nil?
|
19
36
|
self.active_space = space
|
20
37
|
return self
|
@@ -184,15 +201,29 @@ module Gecode
|
|
184
201
|
|
185
202
|
# Creates a depth first search engine for search, executing any
|
186
203
|
# unexecuted constraints first.
|
187
|
-
def dfs_engine
|
204
|
+
def dfs_engine(options = {})
|
188
205
|
# Execute constraints.
|
189
206
|
perform_queued_gecode_interactions
|
190
207
|
|
208
|
+
# Begin constructing the option struct.
|
209
|
+
opt_struct = Gecode::Raw::Search::Options.new
|
210
|
+
opt_struct.c_d = Gecode::Raw::Search::Config::MINIMAL_DISTANCE
|
211
|
+
opt_struct.a_d = Gecode::Raw::Search::Config::ADAPTIVE_DISTANCE
|
212
|
+
|
213
|
+
# Decode the options.
|
214
|
+
if options.has_key? :time_limit
|
215
|
+
opt_struct.stop = Gecode::Raw::Search::Stop.new(-1, options.delete(:time_limit), -1)
|
216
|
+
else
|
217
|
+
opt_struct.stop = nil
|
218
|
+
end
|
219
|
+
|
220
|
+
unless options.empty?
|
221
|
+
raise ArgumentError, 'Unrecognized search option: ' +
|
222
|
+
options.keys.first.to_s
|
223
|
+
end
|
224
|
+
|
191
225
|
# Construct the engine.
|
192
|
-
Gecode::Raw::DFS.new(selected_space,
|
193
|
-
Gecode::Raw::Search::Config::MINIMAL_DISTANCE,
|
194
|
-
Gecode::Raw::Search::Config::ADAPTIVE_DISTANCE,
|
195
|
-
nil)
|
226
|
+
Gecode::Raw::DFS.new(selected_space, opt_struct)
|
196
227
|
end
|
197
228
|
end
|
198
229
|
end
|
data/lib/gecoder/version.rb
CHANGED
data/specs/search.rb
CHANGED
@@ -21,6 +21,23 @@ class SampleProblem
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
class DifficultSampleProblem
|
25
|
+
include Gecode::Mixin
|
26
|
+
|
27
|
+
def initialize
|
28
|
+
# The magic sequence problem with a large n.
|
29
|
+
n = 500
|
30
|
+
sequence_is_an int_var_array(n, 0...n)
|
31
|
+
n.times{ |i| sequence.count(i).must == sequence[i] }
|
32
|
+
sequence.inject{ |x,y| x + y }.must == n
|
33
|
+
sequence.zip((-1...n).to_a).map do |element, c|
|
34
|
+
element*c
|
35
|
+
end.inject{ |x,y| x + y }.must == 0
|
36
|
+
|
37
|
+
branch_on sequence, :variable => :smallest_degree, :value => :split_max
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
24
41
|
class SampleOptimizationProblem
|
25
42
|
include Gecode::Mixin
|
26
43
|
|
@@ -387,3 +404,29 @@ describe Gecode::Mixin, '(single variable maximization)' do
|
|
387
404
|
it_should_behave_like 'single variable optimization'
|
388
405
|
end
|
389
406
|
|
407
|
+
describe Gecode::Mixin, ' (with time limitations)' do
|
408
|
+
it 'should not time out problems that finish within the time limitation' do
|
409
|
+
@domain = 0..3
|
410
|
+
@solved_domain = [2]
|
411
|
+
@model = SampleProblem.new(@domain)
|
412
|
+
lambda do
|
413
|
+
@model.solve!(:time_limit => 50)
|
414
|
+
end.should_not raise_error(Gecode::SearchAbortedError)
|
415
|
+
end
|
416
|
+
|
417
|
+
it 'should time out problems that do not finish within the time limitation' do
|
418
|
+
@model = DifficultSampleProblem.new
|
419
|
+
lambda do
|
420
|
+
t = Time.now
|
421
|
+
@model.solve!(:time_limit => 50)
|
422
|
+
puts Time.now - t
|
423
|
+
end.should raise_error(Gecode::SearchAbortedError)
|
424
|
+
end
|
425
|
+
|
426
|
+
it 'should raise error if an unrecognised option is passed' do
|
427
|
+
@model = DifficultSampleProblem.new
|
428
|
+
lambda do
|
429
|
+
@model.solve!(:time_limit => 50, :foo => 1)
|
430
|
+
end.should raise_error(ArgumentError)
|
431
|
+
end
|
432
|
+
end
|
data/tasks/distribution.rake
CHANGED
@@ -18,18 +18,20 @@ rd = Rake::RDocTask.new do |rdoc|
|
|
18
18
|
rdoc.rdoc_dir = 'doc/output/rdoc'
|
19
19
|
rdoc.title = 'Gecode/R'
|
20
20
|
rdoc.template = 'doc/rdoc/jamis.rb'
|
21
|
-
rdoc.options << '--line-numbers' << '--inline-source' <<
|
21
|
+
rdoc.options << '--line-numbers' << '--inline-source' <<
|
22
22
|
'--accessor' << 'delegate' << '--main' << 'README'
|
23
23
|
rdoc.rdoc_files.include('README', 'CHANGES', 'THANKS', 'LGPL-LICENSE', 'lib/**/*.rb')
|
24
24
|
end
|
25
25
|
|
26
|
+
# Removing this, which apparently doesn't work due to an update to RDoc.
|
27
|
+
=begin
|
26
28
|
TMP_DIR = 'doc/tmp/rdoc_dev'
|
27
29
|
desc 'Generate RDoc, ignoring nodoc'
|
28
30
|
Rake::RDocTask.new(:rdoc_dev => :prepare_rdoc_dev) do |rdoc|
|
29
31
|
rdoc.rdoc_dir = 'doc/output/rdoc_dev'
|
30
|
-
rdoc.options << '--title' << 'Gecode/R Developers RDoc' << '--line-numbers' <<
|
32
|
+
rdoc.options << '--title' << 'Gecode/R Developers RDoc' << '--line-numbers' <<
|
31
33
|
'--inline-source' << '--accessor' << 'delegate'
|
32
|
-
|
34
|
+
|
33
35
|
rdoc.rdoc_files.include("#{TMP_DIR}/**/*.rb")
|
34
36
|
end
|
35
37
|
|
@@ -46,6 +48,7 @@ task :prepare_rdoc_dev do
|
|
46
48
|
destination.close
|
47
49
|
end
|
48
50
|
end
|
51
|
+
=end
|
49
52
|
|
50
53
|
desc 'Extracts the source of Gecode before it is packaged into a gem'
|
51
54
|
task :extract_gecode do
|
@@ -53,25 +56,25 @@ task :extract_gecode do
|
|
53
56
|
cd(EXT_DIR) do
|
54
57
|
cp "../#{GECODE_DIR}/#{GECODE_ARCHIVE_NAME}", GECODE_ARCHIVE_NAME
|
55
58
|
system("tar -xvf #{GECODE_ARCHIVE_NAME}")
|
56
|
-
rm GECODE_ARCHIVE_NAME
|
59
|
+
rm GECODE_ARCHIVE_NAME
|
57
60
|
end
|
58
61
|
end
|
59
62
|
# To ensure that the Gecode files exist for the gem spec.
|
60
|
-
Rake::Task['extract_gecode'].invoke
|
63
|
+
Rake::Task['extract_gecode'].invoke
|
61
64
|
|
62
65
|
spec = Gem::Specification.new do |s|
|
63
66
|
s.name = PKG_NAME
|
64
67
|
s.version = GecodeR::VERSION
|
65
68
|
s.summary = 'Ruby interface to Gecode, an environment for constraint programming.'
|
66
69
|
s.description = <<-end_description
|
67
|
-
Gecode/R is a Ruby interface to the Gecode constraint programming library.
|
68
|
-
Gecode/R is intended for people with no previous experience of constraint
|
70
|
+
Gecode/R is a Ruby interface to the Gecode constraint programming library.
|
71
|
+
Gecode/R is intended for people with no previous experience of constraint
|
69
72
|
programming, aiming to be easy to pick up and use.
|
70
73
|
end_description
|
71
74
|
|
72
75
|
s.files = FileList[
|
73
76
|
'[A-Z]*',
|
74
|
-
'lib/**/*.rb',
|
77
|
+
'lib/**/*.rb',
|
75
78
|
'example/**/*.rb',
|
76
79
|
'src/**/*',
|
77
80
|
'vendor/rust/**/*',
|
@@ -98,12 +101,12 @@ spec = Gem::Specification.new do |s|
|
|
98
101
|
=begin
|
99
102
|
# Development dependencies.
|
100
103
|
# Not listed: rubygems >= 1.2
|
101
|
-
[['rake'],
|
102
|
-
['webgen', '= 0.4.7'],
|
103
|
-
['coderay'],
|
104
|
-
['rspec', '>= 1.0'],
|
105
|
-
['rcov'],
|
106
|
-
['meta_project'],
|
104
|
+
[['rake'],
|
105
|
+
['webgen', '= 0.4.7'],
|
106
|
+
['coderay'],
|
107
|
+
['rspec', '>= 1.0'],
|
108
|
+
['rcov'],
|
109
|
+
['meta_project'],
|
107
110
|
['rubyforge']].each do |dependency|
|
108
111
|
s.add_development_dependency(*dependency)
|
109
112
|
end
|
@@ -117,17 +120,17 @@ spec_windows_binary_with_gecode.extensions = []
|
|
117
120
|
spec_windows_binary_with_gecode.requirements = []
|
118
121
|
# Add the precompiled Gecode DLLs and precompiled bindings.
|
119
122
|
spec_windows_binary_with_gecode.files = spec.files.dup -
|
120
|
-
FileList['ext/**/*'].to_a +
|
123
|
+
FileList['ext/**/*'].to_a +
|
121
124
|
FileList['vendor/gecode/win32/lib/*'].to_a << 'lib/gecode.dll'
|
122
125
|
spec_windows_binary_with_gecode.platform = 'x86-mswin32-60' #Gem::Platform::WIN32
|
123
126
|
|
124
127
|
# Create a clone of the gem spec that includes Gecode.
|
125
128
|
spec_with_gecode = spec.dup
|
126
129
|
spec_with_gecode.name = PKG_NAME_WITH_GECODE
|
127
|
-
spec_with_gecode.extensions =
|
130
|
+
spec_with_gecode.extensions =
|
128
131
|
spec_with_gecode.extensions.dup.unshift 'ext/gecode-2.2.0/configure'
|
129
132
|
spec_with_gecode.requirements = []
|
130
|
-
spec_with_gecode.files = spec.files.dup + FileList['ext/gecode-*/**/*'].to_a
|
133
|
+
spec_with_gecode.files = spec.files.dup + FileList['ext/gecode-*/**/*'].to_a
|
131
134
|
|
132
135
|
desc 'Generate Gecode/R Gem'
|
133
136
|
Rake::GemPackageTask.new(spec) do |pkg|
|
@@ -141,9 +144,11 @@ Rake::GemPackageTask.new(spec_with_gecode) do |pkg|
|
|
141
144
|
pkg.need_tar = true
|
142
145
|
end
|
143
146
|
|
147
|
+
=begin
|
144
148
|
desc 'Generate Gecode/R + Gecode Gem (windows binary)'
|
145
149
|
Rake::GemPackageTask.new(spec_windows_binary_with_gecode) do |pkg|
|
146
150
|
end
|
151
|
+
=end
|
147
152
|
|
148
153
|
desc 'Precompiles the Gecode/R bindings for Windows platforms'
|
149
154
|
file 'lib/gecode.dll' do
|
@@ -168,7 +173,7 @@ task :clobber do
|
|
168
173
|
end
|
169
174
|
|
170
175
|
desc 'Publish packages on RubyForge'
|
171
|
-
task :publish_packages => [:publish_gecoder_packages,
|
176
|
+
task :publish_packages => [:publish_gecoder_packages,
|
172
177
|
:publish_gecoder_with_gecode_packages]
|
173
178
|
|
174
179
|
# Files included in the vanilla Gecode/R release.
|
@@ -195,13 +200,13 @@ gecode_release_files = [
|
|
195
200
|
"pkg/#{PKG_FILE_NAME_WITH_GECODE}.gem",
|
196
201
|
#"pkg/#{PKG_FILE_NAME_WITH_GECODE}.tgz",
|
197
202
|
#"pkg/#{PKG_FILE_NAME_WITH_GECODE}.zip",
|
198
|
-
"pkg/#{PKG_FILE_NAME_WITH_GECODE}-x86-mswin32-60.gem"
|
203
|
+
#"pkg/#{PKG_FILE_NAME_WITH_GECODE}-x86-mswin32-60.gem"
|
199
204
|
]
|
200
205
|
gecode_release_files.each do |pkg|
|
201
206
|
file pkg => :extract_gecode
|
202
207
|
end
|
203
208
|
desc 'Publish Gecode/R with Gecode packages on RubyForge'
|
204
|
-
task :publish_gecoder_with_gecode_packages =>
|
209
|
+
task :publish_gecoder_with_gecode_packages =>
|
205
210
|
[:verify_user] + gecode_release_files do
|
206
211
|
require 'meta_project'
|
207
212
|
require 'rake/contrib/xforge'
|