gecoder-with-gecode 0.7.1-mswin32

Sign up to get free protection for your applications and to get access to all the features.
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