gecoder-with-gecode 0.7.1-mswin32
Sign up to get free protection for your applications and to get access to all the features.
- 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,60 @@
|
|
1
|
+
module Gecode::SetEnumMethods
|
2
|
+
Gecode::Constraints::Util::SET_OPERATION_TYPES.each_pair do |name, type|
|
3
|
+
next if type == Gecode::Raw::SOT_MINUS # Does not support this constraint?
|
4
|
+
|
5
|
+
module_eval <<-"end_code"
|
6
|
+
# Starts a constraint on the #{name} of the sets.
|
7
|
+
def #{name}
|
8
|
+
params = {:lhs => self, :operation => #{type}}
|
9
|
+
Gecode::Constraints::SetEnum::Operation::ExpressionStub.new(
|
10
|
+
@model, params)
|
11
|
+
end
|
12
|
+
end_code
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# A module that gathers the classes and modules used by operation constaints.
|
17
|
+
module Gecode::Constraints::SetEnum::Operation #:nodoc:
|
18
|
+
# Describes a CompositeStub for the enumeration operation constraint, which
|
19
|
+
# constrains the result of applying an operation between all set variables in
|
20
|
+
# a set enumeration.
|
21
|
+
#
|
22
|
+
# The supported operations are:
|
23
|
+
# * union
|
24
|
+
# * disjoint_union
|
25
|
+
# * intersection
|
26
|
+
# * minus
|
27
|
+
#
|
28
|
+
# == Example
|
29
|
+
#
|
30
|
+
# # The union of all set variables in +sets+ must be subset of 1..17.
|
31
|
+
# sets.union.must_be.subset_of 1..17
|
32
|
+
#
|
33
|
+
# # The intersection of all set variables must equal [1,3,5].
|
34
|
+
# sets.intersection.must == [1,3,5]
|
35
|
+
#
|
36
|
+
# # The union of all set variable must be a subset of the set variable
|
37
|
+
# # +universe+.
|
38
|
+
# sets.union.must_be.subset_of universe
|
39
|
+
#
|
40
|
+
# # The same as above, but reified with the boolean variable
|
41
|
+
# # +is_within_universe+.
|
42
|
+
# sets.union.must_be.subset_of(universe, :reify => is_within_universe)
|
43
|
+
class ExpressionStub < Gecode::Constraints::Set::CompositeStub
|
44
|
+
def constrain_equal(variable, params, constrain)
|
45
|
+
enum, operation = @params.values_at(:lhs, :operation)
|
46
|
+
|
47
|
+
if constrain
|
48
|
+
if operation == Gecode::Raw::SOT_INTER or
|
49
|
+
operation == Gecode::Raw::SOT_MINUS
|
50
|
+
variable.must_be.subset_of enum.first.upper_bound
|
51
|
+
else
|
52
|
+
variable.must_be.subset_of enum.upper_bound_range
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
Gecode::Raw::rel(@model.active_space, operation, enum.to_set_var_array,
|
57
|
+
variable.bind)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,217 @@
|
|
1
|
+
module Gecode::SetEnumMethods
|
2
|
+
# This adds the adder for the methods in the modules including it. The
|
3
|
+
# reason for doing it so indirect is that the first #[] won't be defined
|
4
|
+
# before the module that this is mixed into is mixed into an enum.
|
5
|
+
def self.included(mod) #:nodoc:
|
6
|
+
mod.module_eval do
|
7
|
+
# Now we enter the module that the module possibly defining #[]
|
8
|
+
# is mixed into.
|
9
|
+
if instance_methods.include?('[]') and
|
10
|
+
not instance_methods.include?('pre_selection_access')
|
11
|
+
alias_method :pre_selection_access, :[]
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](*vars)
|
15
|
+
# Hook in an element constraint if a variable is used for array
|
16
|
+
# access.
|
17
|
+
if vars.first.kind_of? Gecode::FreeIntVar
|
18
|
+
params = {:lhs => self, :index => vars.first}
|
19
|
+
Gecode::Constraints::SetEnum::Selection::SelectExpressionStub.new(
|
20
|
+
@model, params)
|
21
|
+
elsif vars.first.kind_of? Gecode::FreeSetVar
|
22
|
+
params = {:lhs => self, :indices => vars.first}
|
23
|
+
Gecode::Constraints::SetEnum::Selection::SetAccessStub.new(
|
24
|
+
@model, params)
|
25
|
+
else
|
26
|
+
pre_selection_access(*vars) if respond_to? :pre_selection_access
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# A module that gathers the classes and modules used by selection constraints.
|
34
|
+
module Gecode::Constraints::SetEnum::Selection #:nodoc:
|
35
|
+
# Describes an expression stub started with a set var enum followed with an
|
36
|
+
# array access using a set variable.
|
37
|
+
class SetAccessStub < Gecode::Constraints::ExpressionStub #:nodoc:
|
38
|
+
include Gecode::Constraints::LeftHandSideMethods
|
39
|
+
|
40
|
+
# Starts a union selection constraint on the selected sets.
|
41
|
+
def union
|
42
|
+
UnionExpressionStub.new(@model, @params)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Starts a intersection selection constraint on the selected sets. The
|
46
|
+
# option :with may optionally be specified, in which case the value should
|
47
|
+
# be an enumeration of the elements in the universe.
|
48
|
+
def intersection(options = {})
|
49
|
+
unless options.empty?
|
50
|
+
unless options.size == 1 and options.has_key?(:with)
|
51
|
+
raise ArgumentError, "Expected option key :with, got #{options.keys}."
|
52
|
+
else
|
53
|
+
universe = options[:with]
|
54
|
+
unless universe.kind_of?(Enumerable) and
|
55
|
+
universe.all?{ |element| element.kind_of? Fixnum }
|
56
|
+
raise TypeError, "Expected the universe to be specified as " +
|
57
|
+
"an enumeration of fixnum, got #{universe.class}."
|
58
|
+
end
|
59
|
+
@params.update(:universe => universe)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
IntersectionExpressionStub.new(@model, @params)
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
# Produces an expression with position for the lhs module.
|
69
|
+
def expression(params)
|
70
|
+
SetAccessExpression.new(@model, @params.update(params))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Describes an expression that starts with an set variable enum followed with
|
75
|
+
# an array access using a set variable followed by some form of must.
|
76
|
+
class SetAccessExpression < Gecode::Constraints::Set::Expression #:nodoc:
|
77
|
+
# Constrains the selected sets to be disjoint.
|
78
|
+
def disjoint
|
79
|
+
if @params[:negate]
|
80
|
+
raise Gecode::MissingConstraintError, 'A negated set selection ' +
|
81
|
+
'disjoint is not implemented.'
|
82
|
+
end
|
83
|
+
|
84
|
+
@model.add_constraint DisjointConstraint.new(@model, @params)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Describes a CompositeStub for the set select constraint, which constrains
|
89
|
+
# the set in a position specified by an integer variable in an enumeration of
|
90
|
+
# set variable.
|
91
|
+
#
|
92
|
+
# == Examples
|
93
|
+
#
|
94
|
+
# # The set at the position described by the integer variable
|
95
|
+
# # +singleton_zero_position+ in the enumeration +sets+ of set variables
|
96
|
+
# # must equal [0].
|
97
|
+
# sets[singleton_zero_position].must == 0
|
98
|
+
#
|
99
|
+
# # The set at the position described by the integer variable +position+ in
|
100
|
+
# # the enumeration +sets+ of set variables must be a subset of +set+.
|
101
|
+
# sets[position].must_be.subset_of set
|
102
|
+
#
|
103
|
+
# # The same as above, but reified with the boolean variable +bool+.
|
104
|
+
# sets[position].must_be.subset_of(set, :reify => bool)
|
105
|
+
class SelectExpressionStub < Gecode::Constraints::Set::CompositeStub
|
106
|
+
def constrain_equal(variable, params, constrain)
|
107
|
+
enum, index = @params.values_at(:lhs, :index)
|
108
|
+
if constrain
|
109
|
+
variable.must_be.subset_of enum.upper_bound_range
|
110
|
+
end
|
111
|
+
|
112
|
+
Gecode::Raw::selectSet(@model.active_space, enum.to_set_var_array,
|
113
|
+
index.bind, variable.bind)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Describes a CompositeStub for the set union selection constraint,
|
118
|
+
# which constrains the union of sets located at the positions
|
119
|
+
# specified by a set variable in an enumeration of set variables.
|
120
|
+
#
|
121
|
+
# == Examples
|
122
|
+
#
|
123
|
+
# # The sets in the enumeration set variable +sets+ located at the positions
|
124
|
+
# # described by the set variable +selected_sets+ must have a union that's
|
125
|
+
# # a superset of [0,4,17].
|
126
|
+
# sets[selected_sets].union.must_be.superset_of [0,4,17]
|
127
|
+
#
|
128
|
+
# # The sets in the enumeration set variable +sets+ located at the positions
|
129
|
+
# # described by the set variable +selected_sets+ must have a union that's
|
130
|
+
# # disjoint with the set variable +set+.
|
131
|
+
# sets[selected_sets].union.must_be.disjoint_with set
|
132
|
+
#
|
133
|
+
# # The same as above but reified with the boolean variable
|
134
|
+
# # +union_is_disjoint+.
|
135
|
+
# sets[selected_sets].union.must_be.disjoint_with(set,
|
136
|
+
# :reify => union_is_disjoin)
|
137
|
+
class UnionExpressionStub < Gecode::Constraints::Set::CompositeStub
|
138
|
+
def constrain_equal(variable, params, constrain)
|
139
|
+
enum, indices = @params.values_at(:lhs, :indices)
|
140
|
+
if constrain
|
141
|
+
variable.must_be.subset_of enum.upper_bound_range
|
142
|
+
end
|
143
|
+
|
144
|
+
Gecode::Raw::selectUnion(@model.active_space, enum.to_set_var_array,
|
145
|
+
indices.bind, variable.bind)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# Describes a CompositeStub for the set intersection selection constraint,
|
150
|
+
# which constrains the intersection of sets located at the positions
|
151
|
+
# specified by a set variable in an enumeration of set variables.
|
152
|
+
#
|
153
|
+
# Optionally a universe may also be specified.
|
154
|
+
#
|
155
|
+
# == Examples
|
156
|
+
#
|
157
|
+
# # The sets in the enumeration set variable +sets+ located at the positions
|
158
|
+
# # described by the set variable +selected_sets+ must have an intersection
|
159
|
+
# # that's a superset of [0,4,17].
|
160
|
+
# sets[selected_sets].intersection.must_be.superset_of [0,4,17]
|
161
|
+
#
|
162
|
+
# # The sets in the enumeration set variable +sets+ located at the positions
|
163
|
+
# # described by the set variable +selected_sets+ must have an intersection
|
164
|
+
# # that's disjoint with the set variable +set+.
|
165
|
+
# sets[selected_sets].intersection.must_be.disjoint_with set
|
166
|
+
#
|
167
|
+
# # The sets in the enumeration set variable +sets+ located at the positions
|
168
|
+
# # described by the set variable +selected_sets+ must have an intersection
|
169
|
+
# # that's disjoint with the set variable +set+ inside the universe 0..17.
|
170
|
+
# sets[selected_sets].intersection(:with => 0..17).must_be.disjoint_with set
|
171
|
+
#
|
172
|
+
# # The sets in the enumeration set variable +sets+ located at the positions
|
173
|
+
# # described by the set variable +selected_sets+ must have an intersection
|
174
|
+
# # that's disjoint with the set variable +set+ inside the universe
|
175
|
+
# # described by the set variable +universe+.
|
176
|
+
# sets[selected_sets].intersection(:with => universe).must_be.disjoint_with set
|
177
|
+
#
|
178
|
+
#
|
179
|
+
# # The same as above but reified with the boolean variable
|
180
|
+
# # +intersection_is_disjoint+.
|
181
|
+
# sets[selected_sets].intersection(:with => universe).must_be.disjoint_with(
|
182
|
+
# set, :reifty => intersection_is_disjoin)
|
183
|
+
class IntersectionExpressionStub < Gecode::Constraints::Set::CompositeStub
|
184
|
+
def constrain_equal(variable, params, constrain)
|
185
|
+
enum, indices, universe = @params.values_at(:lhs, :indices, :universe)
|
186
|
+
# We can't do any useful constraining here since the empty intersection
|
187
|
+
# is the universe.
|
188
|
+
|
189
|
+
if universe.nil?
|
190
|
+
Gecode::Raw::selectInter(@model.active_space, enum.to_set_var_array,
|
191
|
+
indices.bind, variable.bind)
|
192
|
+
else
|
193
|
+
Gecode::Raw::selectInterIn(@model.active_space, enum.to_set_var_array,
|
194
|
+
indices.bind, variable.bind,
|
195
|
+
Gecode::Constraints::Util.constant_set_to_int_set(universe))
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# Describes a disjoint constraint, which constrains all set variable is an
|
201
|
+
# enumeration, at the position specified by a set variable, to be disjoint.
|
202
|
+
#
|
203
|
+
# Does not support negation nor reification.
|
204
|
+
#
|
205
|
+
# == Examples
|
206
|
+
#
|
207
|
+
# # The set variable located in the enumeration +sets+ at positions
|
208
|
+
# # described by +disjoint_set_positions+ must be disjoint.
|
209
|
+
# sets[disjoint_set_positions].must_be.disjoint
|
210
|
+
class DisjointConstraint < Gecode::Constraints::Constraint
|
211
|
+
def post
|
212
|
+
enum, indices = @params.values_at(:lhs, :indices)
|
213
|
+
Gecode::Raw.selectDisjoint(@model.active_space, enum.to_set_var_array,
|
214
|
+
indices.bind)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Gecode
|
2
|
+
module SetEnumMethods
|
3
|
+
include Gecode::Constraints::LeftHandSideMethods
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
# Produces an expression for the lhs module.
|
8
|
+
def expression(params)
|
9
|
+
params.update(:lhs => self)
|
10
|
+
Constraints::SetEnum::Expression.new(@model, params)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# A module containing constraints that have enumerations of set variables as
|
15
|
+
# left hand side.
|
16
|
+
module Constraints::SetEnum
|
17
|
+
# Expressions with set enums as left hand sides.
|
18
|
+
class Expression < Gecode::Constraints::Expression
|
19
|
+
# Raises TypeError unless the left hand side is a set enum.
|
20
|
+
def initialize(model, params)
|
21
|
+
super
|
22
|
+
|
23
|
+
unless params[:lhs].respond_to? :to_set_var_array
|
24
|
+
raise TypeError, 'Must have set enum as left hand side.'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
require 'gecoder/interface/constraints/set_enum/channel'
|
32
|
+
require 'gecoder/interface/constraints/set_enum/distinct'
|
33
|
+
require 'gecoder/interface/constraints/set_enum/selection'
|
34
|
+
require 'gecoder/interface/constraints/set_enum/operation'
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Gecode
|
2
|
+
class FreeSetVar
|
3
|
+
include Gecode::Constraints::LeftHandSideMethods
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
# Produces an expression for the lhs module.
|
8
|
+
def expression(params)
|
9
|
+
params.update(:lhs => self)
|
10
|
+
Constraints::Set::Expression.new(@model, params)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# A module containing constraints that have set variables as left hand side
|
15
|
+
# (but not enumerations).
|
16
|
+
module Constraints::Set
|
17
|
+
# An expression with a set as left hand side.
|
18
|
+
class Expression < Gecode::Constraints::Expression #:nodoc:
|
19
|
+
end
|
20
|
+
|
21
|
+
# Utility methods for sets.
|
22
|
+
module Util #:nodoc:
|
23
|
+
module_function
|
24
|
+
def decode_options(options)
|
25
|
+
if options.has_key? :strength
|
26
|
+
raise ArgumentError, 'Set constraints do not support the strength ' +
|
27
|
+
'option.'
|
28
|
+
end
|
29
|
+
Gecode::Constraints::Util.decode_options(options)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# A composite expression which is an set expression with a left hand side
|
34
|
+
# resulting from a previous constraint.
|
35
|
+
class CompositeExpression < Gecode::Constraints::CompositeExpression #:nodoc:
|
36
|
+
# The block given should take three parameters. The first is the variable
|
37
|
+
# that should be the left hand side, if it's nil then a new one should be
|
38
|
+
# created. The second is the has of parameters. The block should return
|
39
|
+
# the variable used as left hand side.
|
40
|
+
def initialize(model, params, &block)
|
41
|
+
super(Expression, Gecode::FreeSetVar, lambda{ model.set_var }, model,
|
42
|
+
params, &block)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Describes a stub that produces a set variable, which can then be used with
|
47
|
+
# the normal set variable constraints. An example of a set composite
|
48
|
+
# constraints would be set selection constraint.
|
49
|
+
#
|
50
|
+
# sets[int_var].must_be.subset_of(another_set)
|
51
|
+
#
|
52
|
+
# <tt>sets[int_var]</tt> produces a set variable which the constraint
|
53
|
+
# <tt>.must_be.subset_of(another_set)</tt> is then applied to.In the above
|
54
|
+
# case two constraints (and one temporary variable) are required, but in the
|
55
|
+
# case of equality only one constraint is required.
|
56
|
+
#
|
57
|
+
# Whether a constraint involving a reification stub supports negation and
|
58
|
+
# reification depends on the constraint on the right hand side (none
|
59
|
+
# support the strength option as no set constraints do).
|
60
|
+
class CompositeStub < Gecode::Constraints::CompositeStub
|
61
|
+
def initialize(model, params)
|
62
|
+
super(CompositeExpression, model, params)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
require 'gecoder/interface/constraints/set/domain'
|
69
|
+
require 'gecoder/interface/constraints/set/relation'
|
70
|
+
require 'gecoder/interface/constraints/set/cardinality'
|
71
|
+
require 'gecoder/interface/constraints/set/connection'
|
72
|
+
require 'gecoder/interface/constraints/set/operation'
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'matrix'
|
2
|
+
|
3
|
+
module Gecode::Util
|
4
|
+
# Methods that make a matrix an enumerable.
|
5
|
+
module MatrixEnumMethods
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
# Iterates over every element in the matrix.
|
9
|
+
def each(&block)
|
10
|
+
row_size.times do |i|
|
11
|
+
column_size.times do |j|
|
12
|
+
yield self[i,j]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Extends Matrix so that it's an enumerable.
|
19
|
+
class EnumMatrix < Matrix
|
20
|
+
include MatrixEnumMethods
|
21
|
+
|
22
|
+
def row(i)
|
23
|
+
wrap_if_wrapped make_vector_enumerable(super)
|
24
|
+
end
|
25
|
+
|
26
|
+
def column(i)
|
27
|
+
wrap_if_wrapped make_vector_enumerable(super)
|
28
|
+
end
|
29
|
+
|
30
|
+
def minor(*args)
|
31
|
+
matrix = super
|
32
|
+
class <<matrix
|
33
|
+
include MatrixEnumMethods
|
34
|
+
end
|
35
|
+
return wrap_if_wrapped(matrix)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# Makes the specified vector enumerable.
|
41
|
+
def make_vector_enumerable(vector)
|
42
|
+
class <<vector
|
43
|
+
include Enumerable
|
44
|
+
|
45
|
+
# Iterates over every element in the matrix.
|
46
|
+
def each(&block)
|
47
|
+
size.times do |i|
|
48
|
+
yield self[i]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
return vector
|
53
|
+
end
|
54
|
+
|
55
|
+
# Wraps the specified enumerable if the matrix itself is already wrapped.
|
56
|
+
def wrap_if_wrapped(enum)
|
57
|
+
if respond_to? :model
|
58
|
+
model.wrap_enum(enum)
|
59
|
+
else
|
60
|
+
enum
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|