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.
Files changed (159) hide show
  1. data/CHANGES +81 -0
  2. data/COPYING +17 -0
  3. data/LGPL-LICENSE +458 -0
  4. data/README +45 -0
  5. data/Rakefile +13 -0
  6. data/example/example_helper.rb +1 -0
  7. data/example/magic_sequence.rb +43 -0
  8. data/example/queens.rb +43 -0
  9. data/example/raw_bindings.rb +42 -0
  10. data/example/send_more_money.rb +43 -0
  11. data/example/send_most_money.rb +58 -0
  12. data/example/square_tiling.rb +84 -0
  13. data/example/sudoku-set.rb +110 -0
  14. data/example/sudoku.rb +61 -0
  15. data/lib/gecode.dll +0 -0
  16. data/lib/gecoder.rb +5 -0
  17. data/lib/gecoder/bindings.rb +54 -0
  18. data/lib/gecoder/bindings/bindings.rb +2210 -0
  19. data/lib/gecoder/interface.rb +8 -0
  20. data/lib/gecoder/interface/binding_changes.rb +313 -0
  21. data/lib/gecoder/interface/branch.rb +152 -0
  22. data/lib/gecoder/interface/constraints.rb +397 -0
  23. data/lib/gecoder/interface/constraints/bool/boolean.rb +246 -0
  24. data/lib/gecoder/interface/constraints/bool/linear.rb +29 -0
  25. data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +84 -0
  26. data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +8 -0
  27. data/lib/gecoder/interface/constraints/bool_var_constraints.rb +75 -0
  28. data/lib/gecoder/interface/constraints/int/arithmetic.rb +71 -0
  29. data/lib/gecoder/interface/constraints/int/domain.rb +78 -0
  30. data/lib/gecoder/interface/constraints/int/linear.rb +295 -0
  31. data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +72 -0
  32. data/lib/gecoder/interface/constraints/int_enum/channel.rb +100 -0
  33. data/lib/gecoder/interface/constraints/int_enum/count.rb +92 -0
  34. data/lib/gecoder/interface/constraints/int_enum/distinct.rb +69 -0
  35. data/lib/gecoder/interface/constraints/int_enum/element.rb +82 -0
  36. data/lib/gecoder/interface/constraints/int_enum/equality.rb +38 -0
  37. data/lib/gecoder/interface/constraints/int_enum/sort.rb +126 -0
  38. data/lib/gecoder/interface/constraints/int_enum_constraints.rb +37 -0
  39. data/lib/gecoder/interface/constraints/int_var_constraints.rb +58 -0
  40. data/lib/gecoder/interface/constraints/reifiable_constraints.rb +78 -0
  41. data/lib/gecoder/interface/constraints/set/cardinality.rb +75 -0
  42. data/lib/gecoder/interface/constraints/set/connection.rb +193 -0
  43. data/lib/gecoder/interface/constraints/set/domain.rb +109 -0
  44. data/lib/gecoder/interface/constraints/set/operation.rb +132 -0
  45. data/lib/gecoder/interface/constraints/set/relation.rb +178 -0
  46. data/lib/gecoder/interface/constraints/set_enum/channel.rb +18 -0
  47. data/lib/gecoder/interface/constraints/set_enum/distinct.rb +80 -0
  48. data/lib/gecoder/interface/constraints/set_enum/operation.rb +60 -0
  49. data/lib/gecoder/interface/constraints/set_enum/selection.rb +217 -0
  50. data/lib/gecoder/interface/constraints/set_enum_constraints.rb +34 -0
  51. data/lib/gecoder/interface/constraints/set_var_constraints.rb +72 -0
  52. data/lib/gecoder/interface/enum_matrix.rb +64 -0
  53. data/lib/gecoder/interface/enum_wrapper.rb +153 -0
  54. data/lib/gecoder/interface/model.rb +251 -0
  55. data/lib/gecoder/interface/search.rb +123 -0
  56. data/lib/gecoder/interface/variables.rb +254 -0
  57. data/lib/gecoder/version.rb +4 -0
  58. data/specs/binding_changes.rb +76 -0
  59. data/specs/bool_var.rb +74 -0
  60. data/specs/branch.rb +170 -0
  61. data/specs/constraints/arithmetic.rb +266 -0
  62. data/specs/constraints/bool_enum.rb +140 -0
  63. data/specs/constraints/boolean.rb +232 -0
  64. data/specs/constraints/cardinality.rb +154 -0
  65. data/specs/constraints/channel.rb +126 -0
  66. data/specs/constraints/connection.rb +373 -0
  67. data/specs/constraints/constraint_helper.rb +180 -0
  68. data/specs/constraints/constraints.rb +74 -0
  69. data/specs/constraints/count.rb +139 -0
  70. data/specs/constraints/distinct.rb +218 -0
  71. data/specs/constraints/element.rb +106 -0
  72. data/specs/constraints/equality.rb +31 -0
  73. data/specs/constraints/int_domain.rb +69 -0
  74. data/specs/constraints/int_relation.rb +78 -0
  75. data/specs/constraints/linear.rb +332 -0
  76. data/specs/constraints/reification_sugar.rb +96 -0
  77. data/specs/constraints/selection.rb +292 -0
  78. data/specs/constraints/set_domain.rb +181 -0
  79. data/specs/constraints/set_operation.rb +285 -0
  80. data/specs/constraints/set_relation.rb +201 -0
  81. data/specs/constraints/sort.rb +175 -0
  82. data/specs/distribution.rb +14 -0
  83. data/specs/enum_matrix.rb +43 -0
  84. data/specs/enum_wrapper.rb +122 -0
  85. data/specs/int_var.rb +144 -0
  86. data/specs/logging.rb +24 -0
  87. data/specs/model.rb +190 -0
  88. data/specs/search.rb +246 -0
  89. data/specs/set_var.rb +68 -0
  90. data/specs/spec_helper.rb +93 -0
  91. data/tasks/all_tasks.rb +1 -0
  92. data/tasks/building.howto +65 -0
  93. data/tasks/distribution.rake +156 -0
  94. data/tasks/rcov.rake +17 -0
  95. data/tasks/specs.rake +15 -0
  96. data/tasks/svn.rake +11 -0
  97. data/tasks/website.rake +51 -0
  98. data/vendor/gecode/win32/lib/libgecodeint.dll +0 -0
  99. data/vendor/gecode/win32/lib/libgecodekernel.dll +0 -0
  100. data/vendor/gecode/win32/lib/libgecodeminimodel.dll +0 -0
  101. data/vendor/gecode/win32/lib/libgecodesearch.dll +0 -0
  102. data/vendor/gecode/win32/lib/libgecodeset.dll +0 -0
  103. data/vendor/rust/README +28 -0
  104. data/vendor/rust/bin/cxxgenerator.rb +93 -0
  105. data/vendor/rust/include/rust_checks.hh +115 -0
  106. data/vendor/rust/include/rust_conversions.hh +102 -0
  107. data/vendor/rust/rust.rb +67 -0
  108. data/vendor/rust/rust/attribute.rb +51 -0
  109. data/vendor/rust/rust/bindings.rb +172 -0
  110. data/vendor/rust/rust/class.rb +339 -0
  111. data/vendor/rust/rust/constants.rb +48 -0
  112. data/vendor/rust/rust/container.rb +110 -0
  113. data/vendor/rust/rust/cppifaceparser.rb +129 -0
  114. data/vendor/rust/rust/cwrapper.rb +72 -0
  115. data/vendor/rust/rust/cxxclass.rb +98 -0
  116. data/vendor/rust/rust/element.rb +81 -0
  117. data/vendor/rust/rust/enum.rb +63 -0
  118. data/vendor/rust/rust/function.rb +407 -0
  119. data/vendor/rust/rust/namespace.rb +61 -0
  120. data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +17 -0
  121. data/vendor/rust/rust/templates/AttributeInitBinding.rusttpl +9 -0
  122. data/vendor/rust/rust/templates/BindingsHeader.rusttpl +24 -0
  123. data/vendor/rust/rust/templates/BindingsUnit.rusttpl +46 -0
  124. data/vendor/rust/rust/templates/CWrapperClassDefinitions.rusttpl +64 -0
  125. data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +7 -0
  126. data/vendor/rust/rust/templates/ClassInitialize.rusttpl +6 -0
  127. data/vendor/rust/rust/templates/ConstructorStub.rusttpl +21 -0
  128. data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +91 -0
  129. data/vendor/rust/rust/templates/CxxMethodStub.rusttpl +12 -0
  130. data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +26 -0
  131. data/vendor/rust/rust/templates/EnumDeclarations.rusttpl +3 -0
  132. data/vendor/rust/rust/templates/EnumDefinitions.rusttpl +29 -0
  133. data/vendor/rust/rust/templates/FunctionDefinition.rusttpl +9 -0
  134. data/vendor/rust/rust/templates/FunctionInitAlias.rusttpl +5 -0
  135. data/vendor/rust/rust/templates/FunctionInitBinding.rusttpl +9 -0
  136. data/vendor/rust/rust/templates/MethodInitBinding.rusttpl +9 -0
  137. data/vendor/rust/rust/templates/ModuleDeclarations.rusttpl +3 -0
  138. data/vendor/rust/rust/templates/ModuleDefinitions.rusttpl +3 -0
  139. data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +7 -0
  140. data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +14 -0
  141. data/vendor/rust/rust/type.rb +98 -0
  142. data/vendor/rust/test/Makefile +4 -0
  143. data/vendor/rust/test/constants.rb +36 -0
  144. data/vendor/rust/test/cppclass.cc +45 -0
  145. data/vendor/rust/test/cppclass.hh +67 -0
  146. data/vendor/rust/test/cppclass.rb +59 -0
  147. data/vendor/rust/test/cwrapper.c +74 -0
  148. data/vendor/rust/test/cwrapper.h +41 -0
  149. data/vendor/rust/test/cwrapper.rb +56 -0
  150. data/vendor/rust/test/dummyclass.hh +31 -0
  151. data/vendor/rust/test/lib/extension-test.rb +98 -0
  152. data/vendor/rust/test/operators.cc +41 -0
  153. data/vendor/rust/test/operators.hh +39 -0
  154. data/vendor/rust/test/operators.rb +39 -0
  155. data/vendor/rust/test/test-constants.rb +43 -0
  156. data/vendor/rust/test/test-cppclass.rb +82 -0
  157. data/vendor/rust/test/test-cwrapper.rb +80 -0
  158. data/vendor/rust/test/test-operators.rb +42 -0
  159. metadata +293 -0
@@ -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