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.
- 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
|