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,109 @@
1
+ module Gecode::Constraints::Set
2
+ class Expression
3
+ Gecode::Constraints::Util::SET_RELATION_TYPES.each_pair do |name, type|
4
+ module_eval <<-"end_code"
5
+ # Creates a domain constraint using the specified constant set.
6
+ def #{name}(constant_set, options = {})
7
+ add_domain_constraint(:#{name}, constant_set, options)
8
+ end
9
+ end_code
10
+ end
11
+ alias_set_methods
12
+
13
+ private
14
+
15
+ # Adds a domain constraint for the specified relation name, constant set
16
+ # and options.
17
+ def add_domain_constraint(relation_name, constant_set, options)
18
+ unless Gecode::Constraints::Util.constant_set? constant_set
19
+ raise TypeError, "Expected constant set, got #{constant_set.class}."
20
+ end
21
+ @params[:rhs] = constant_set
22
+ @params[:relation] = relation_name
23
+ @params.update Gecode::Constraints::Set::Util.decode_options(options)
24
+ if relation_name == :==
25
+ @model.add_constraint Domain::EqualityDomainConstraint.new(@model,
26
+ @params)
27
+ else
28
+ @model.add_constraint Domain::DomainConstraint.new(@model, @params)
29
+ end
30
+ end
31
+ end
32
+
33
+ # A module that gathers the classes and modules used in domain constraints.
34
+ module Domain #:nodoc:
35
+ # Describes a domain constraint which constrains a set to be equal to a
36
+ # constant set.
37
+ #
38
+ # == Examples
39
+ #
40
+ # # +set+ must equal [1,2,5]
41
+ # set.must == [1,2,5]
42
+ #
43
+ # # +set+ must not equal 1..67
44
+ # set.must_not == 1..67
45
+ #
46
+ # # +set+ must equal the singleton set 0. The constraint is reified with
47
+ # # the boolean varaible +is_singleton_zero+.
48
+ # set.must.equal(0, :reify => is_singleton_zero)
49
+ class EqualityDomainConstraint < Gecode::Constraints::ReifiableConstraint
50
+ def post
51
+ var, domain, reif_var, negate = @params.values_at(:lhs, :rhs, :reif,
52
+ :negate)
53
+ if negate
54
+ rel_type = Gecode::Constraints::Util::NEGATED_SET_RELATION_TYPES[:==]
55
+ else
56
+ rel_type = Gecode::Constraints::Util::SET_RELATION_TYPES[:==]
57
+ end
58
+
59
+ (params = []) << var.bind
60
+ params << rel_type
61
+ params << Gecode::Constraints::Util.constant_set_to_params(domain)
62
+ params << reif_var.bind if reif_var.respond_to? :bind
63
+ Gecode::Raw::dom(@model.active_space, *params.flatten)
64
+ end
65
+ end
66
+
67
+ # Describes a domain constraint which constrains a set to have a specific
68
+ # relation to a constant set. A constant set may be specified in three ways
69
+ #
70
+ # [Fixnum] Represents a singleton set.
71
+ # [Range] Represents a set containing all elements in the
72
+ # range. This represents the set more efficiently
73
+ # than when another enumeration with the same
74
+ # elements are used.
75
+ # [Enumeration of Fixnum] Represents a set containing the enumeration’s
76
+ # elements.
77
+ #
78
+ # The relations allowed are the same as in
79
+ # <tt>Set::Relation::RelationConstraint</tt>.
80
+ #
81
+ # == Examples
82
+ #
83
+ # # +set+ must be subset of [1,2,5]
84
+ # set.must_be.subset_of [1,2,5]
85
+ #
86
+ # # +set+ must be disjoint with 1..67
87
+ # set.must_be.disjoint_with 1..67
88
+ #
89
+ # # +set+ must not be a superset of [0].
90
+ # set.must_not_be.superset_of 0
91
+ #
92
+ # # +set+ must be subset of [1,3,5,7]. The constraint is reified with
93
+ # # the boolean varaible +only_constains_odd_values+.
94
+ # set.must_be.subset_of([1.3.5.7], :reify => only_contains_odd_values)
95
+ class DomainConstraint < Gecode::Constraints::ReifiableConstraint
96
+ def post
97
+ var, domain, reif_var, relation = @params.values_at(:lhs, :rhs, :reif,
98
+ :relation)
99
+
100
+ (params = []) << var.bind
101
+ params << Gecode::Constraints::Util::SET_RELATION_TYPES[relation]
102
+ params << Gecode::Constraints::Util.constant_set_to_params(domain)
103
+ params << reif_var.bind if reif_var.respond_to? :bind
104
+ Gecode::Raw::dom(@model.active_space, *params.flatten)
105
+ end
106
+ negate_using_reification
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,132 @@
1
+ module Gecode
2
+ class FreeSetVar
3
+ Gecode::Constraints::Util::SET_OPERATION_TYPES.each_pair do |name, type|
4
+ module_eval <<-"end_code"
5
+ # Starts a constraint on this set #{name} the specified set.
6
+ def #{name}(operand)
7
+ unless operand.kind_of?(Gecode::FreeSetVar) or
8
+ Gecode::Constraints::Util::constant_set?(operand)
9
+ raise TypeError, 'Expected set variable or constant set as ' +
10
+ "operand, got \#{operand.class}."
11
+ end
12
+
13
+ params = {:lhs => self, :op2 => operand, :operation => #{type}}
14
+ Gecode::Constraints::SimpleExpressionStub.new(@model, params) do |m, ps|
15
+ Gecode::Constraints::Set::Operation::Expression.new(m, ps)
16
+ end
17
+ end
18
+ end_code
19
+ end
20
+ end
21
+
22
+ module FixnumEnumMethods
23
+ Gecode::Constraints::Util::SET_OPERATION_TYPES.each_pair do |name, type|
24
+ module_eval <<-"end_code"
25
+ # Starts a constraint on this set union the specified set.
26
+ def #{name}(operand)
27
+ unless operand.kind_of?(Gecode::FreeSetVar) or
28
+ Gecode::Constraints::Util::constant_set?(operand)
29
+ raise TypeError, 'Expected set variable or constant set as ' +
30
+ "operand, got \#{operand.class}."
31
+ end
32
+
33
+ params = {:lhs => self, :op2 => operand, :operation => #{type}}
34
+ Gecode::Constraints::SimpleExpressionStub.new(@model, params) do |m, ps|
35
+ Gecode::Constraints::Set::Operation::Expression.new(m, ps)
36
+ end
37
+ end
38
+ end_code
39
+ end
40
+ end
41
+ end
42
+
43
+ module Gecode::Constraints::Set
44
+ # A module that gathers the classes and modules used in operation constraints.
45
+ module Operation #:nodoc:
46
+ # An expression with a set operand and two operands followed by must.
47
+ class Expression < Gecode::Constraints::Expression #:nodoc:
48
+ Gecode::Constraints::Util::SET_RELATION_TYPES.each_pair do |name, type|
49
+ module_eval <<-"end_code"
50
+ # Creates an operation constraint using the specified expression.
51
+ def #{name}(expression)
52
+ if @params[:negate]
53
+ # We do not allow negation.
54
+ raise Gecode::MissingConstraintError, 'A negated set operation ' +
55
+ 'constraint is not implemented.'
56
+ end
57
+ unless expression.kind_of?(Gecode::FreeSetVar) or
58
+ Gecode::Constraints::Util::constant_set?(expression)
59
+ raise TypeError, 'Expected set variable or constant set, got ' +
60
+ "\#{expression.class}."
61
+ end
62
+
63
+ @params[:rhs] = expression
64
+ @params[:relation] = #{type}
65
+ unless @params.values_at(:lhs, :op2, :rhs).any?{ |element|
66
+ element.kind_of? Gecode::FreeSetVar}
67
+ # At least one variable must be involved in the constraint.
68
+ raise ArgumentError, 'At least one variable must be involved ' +
69
+ 'in the constraint, but all given were constants.'
70
+ end
71
+
72
+ @model.add_constraint OperationConstraint.new(@model, @params)
73
+ end
74
+ end_code
75
+ end
76
+ alias_set_methods
77
+ end
78
+
79
+ # Describes an operation constraint, which constrains the result of an
80
+ # operation with two sets as operands. Either constant sets or set
81
+ # variables may be used for the result and operands, with the exception of
82
+ # that all three may not be constant sets.
83
+ #
84
+ # The typical form is
85
+ # set_operand_1.<operation>(set_operand_2).must.<relation>(result_set)
86
+ #
87
+ # The following operations are supported:
88
+ #
89
+ # * union
90
+ # * disjoint_union
91
+ # * intersection
92
+ # * minus
93
+ #
94
+ # The allowed relations are the same as for
95
+ # <tt>Set::Relation::RelationConstraint</tt>.
96
+ #
97
+ # Neither reification nor negation is supported.
98
+ #
99
+ # == Examples
100
+ #
101
+ # # +set_1+ union +set_2+ must equal +set_3+.
102
+ # set_1.union(set_2).must == set_3
103
+ #
104
+ # # +set_1+ intersection [3,5,6] must equal +set_3+.
105
+ # set_1.intersection([3,5,6]).must == set_3
106
+ #
107
+ # # [0,1,2] minus +set_2+ must be superset of +set_3+.
108
+ # wrap_enum([0,1,2]).minus(set_2).must_be.superset_of(set_3)
109
+ #
110
+ # # +set_1+ disjoint union with [0] must be subset of 0..17.
111
+ # set_1.disjoint_union(0).must_be.subset_of 0..17
112
+ class OperationConstraint < Gecode::Constraints::Constraint
113
+ def post
114
+ op1, op2, operation, relation, rhs, negate = @params.values_at(:lhs,
115
+ :op2, :operation, :relation, :rhs, :negate)
116
+
117
+ op1, op2, rhs = [op1, op2, rhs].map do |expression|
118
+ # The expressions can either be set variables or constant sets,
119
+ # convert them appropriately.
120
+ if expression.respond_to? :bind
121
+ expression.bind
122
+ else
123
+ Gecode::Constraints::Util::constant_set_to_int_set(expression)
124
+ end
125
+ end
126
+
127
+ Gecode::Raw::rel(@model.active_space, op1, operation, op2, relation,
128
+ rhs)
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,178 @@
1
+ module Gecode
2
+ class FreeSetVar
3
+ # Starts a constraint on all the elements of the set.
4
+ def elements
5
+ params = {:lhs => self}
6
+ Gecode::Constraints::SimpleExpressionStub.new(@model, params) do |m, ps|
7
+ Gecode::Constraints::Set::Relation::ElementExpression.new(m, ps)
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ module Gecode::Constraints::Set
14
+ class Expression
15
+ Gecode::Constraints::Util::SET_RELATION_TYPES.each_pair do |name, type|
16
+ module_eval <<-"end_code"
17
+ # Wrap previous relation methods providing support for relation
18
+ # constraints.
19
+ alias_method 'pre_relation_#{type}_method'.to_sym, :#{name}
20
+
21
+ # Creates a relation constraint using the specified expression.
22
+ def #{name}(expression, options = {})
23
+ if expression.kind_of? Gecode::FreeSetVar
24
+ add_relation_constraint(:#{name}, expression, options)
25
+ else
26
+ # Send it on.
27
+ pre_relation_#{type}_method(expression, options)
28
+ end
29
+ end
30
+ end_code
31
+ end
32
+ alias_set_methods
33
+
34
+ private
35
+
36
+ # Adds a relation constraint for the specified relation name, set variable
37
+ # and options.
38
+ def add_relation_constraint(relation_name, set, options)
39
+ @params[:rhs] = set
40
+ @params[:relation] = relation_name
41
+ @params.update Gecode::Constraints::Set::Util.decode_options(options)
42
+ if relation_name == :==
43
+ @model.add_constraint Relation::EqualityRelationConstraint.new(@model,
44
+ @params)
45
+ else
46
+ @model.add_constraint Relation::RelationConstraint.new(@model, @params)
47
+ end
48
+ end
49
+ end
50
+
51
+ # A module that gathers the classes and modules used in relation constraints.
52
+ module Relation #:nodoc:
53
+ # Describes a relation constraint which constrains a set variable to be
54
+ # equal to another set variable. Equality may either be expressed as
55
+ # +==+, +equal+ or +equal_to+.
56
+ #
57
+ # == Examples
58
+ #
59
+ # # +set_1+ must be equal to +set_2+
60
+ # set_1.must == set_2
61
+ #
62
+ # # +set_1+ must not be equal to +set_2+
63
+ # set_1.must_not == set_2
64
+ #
65
+ # # The same as above but reified with the boolean variable
66
+ # # +are_not_equal+.
67
+ # set_1.must_not.equal(set_2, :reify => are_not_equal)
68
+ class EqualityRelationConstraint < Gecode::Constraints::ReifiableConstraint
69
+ def post
70
+ var, rhs, reif_var, negate = @params.values_at(:lhs, :rhs, :reif,
71
+ :negate)
72
+ if negate
73
+ rel_type = Gecode::Constraints::Util::NEGATED_SET_RELATION_TYPES[:==]
74
+ else
75
+ rel_type = Gecode::Constraints::Util::SET_RELATION_TYPES[:==]
76
+ end
77
+
78
+ (params = []) << var.bind
79
+ params << rel_type
80
+ params << rhs.bind
81
+ params << reif_var.bind if reif_var.respond_to? :bind
82
+ Gecode::Raw::rel(@model.active_space, *params)
83
+ end
84
+ end
85
+
86
+ # Describes a relation constraint which constrains a set variable to have
87
+ # a specified relation to another set variable. The allowed relations and
88
+ # their aliases are
89
+ #
90
+ # * subset, subset_of
91
+ # * superset, superset_of
92
+ # * disjoint, disjoint_with
93
+ # * complement, complement_of
94
+ #
95
+ # == Examples
96
+ #
97
+ # # +set_1+ must be subset of +set_2+
98
+ # set_1.must_be.subset_of set_2
99
+ #
100
+ # # +set_1+ must not be superset of +set_2+
101
+ # set_1.must_not_be.superset_of set_2
102
+ #
103
+ # # +set_1+ must be disjoint with +set_2+
104
+ # set_1.must_be.disjoint set_2
105
+ #
106
+ # # The same as above but reified with the boolean variable
107
+ # # +are_disjoint+.
108
+ # set_1.must_be.disjoint(set_2, :reify => are_disjoint)
109
+ class RelationConstraint < Gecode::Constraints::ReifiableConstraint
110
+ def post
111
+ var, rhs, reif_var, relation = @params.values_at(:lhs, :rhs, :reif,
112
+ :relation)
113
+
114
+ (params = []) << var.bind
115
+ params << Gecode::Constraints::Util::SET_RELATION_TYPES[relation]
116
+ params << rhs.bind
117
+ params << reif_var.bind if reif_var.respond_to? :bind
118
+ Gecode::Raw::rel(@model.active_space, *params)
119
+ end
120
+ negate_using_reification
121
+ end
122
+
123
+ # Describes an element relation constraint which constrains all elements in
124
+ # a set variable to satisfy an integer relation constraint. The relations
125
+ # supported are the same as in
126
+ # <tt>Int::Linear::SimpleRelationConstraint</tt>.
127
+ #
128
+ # Reification is not supported.
129
+ #
130
+ # == Examples
131
+ #
132
+ # # All elements in +set+ must be larger than 5.
133
+ # set.elements.must > 5
134
+ #
135
+ # # No element in +set+ may equal 0.
136
+ # set.elements.must_not == 0
137
+ #
138
+ # # No element in +set+ may contain the value of the integer variable
139
+ # # +forbidden_number+.
140
+ # set.elements.must_not == forbidden_number
141
+ class ElementRelationConstraint < Gecode::Constraints::Constraint
142
+ def post
143
+ var, rhs, relation = @params.values_at(:lhs, :rhs, :relation)
144
+
145
+ if @params[:negate]
146
+ type = Gecode::Constraints::Util::NEGATED_RELATION_TYPES[relation]
147
+ else
148
+ type = Gecode::Constraints::Util::RELATION_TYPES[relation]
149
+ end
150
+
151
+ if rhs.kind_of? Fixnum
152
+ # Use a proxy int variable to cover.
153
+ rhs = @model.int_var(rhs)
154
+ end
155
+ Gecode::Raw::rel(@model.active_space, var.bind, type, rhs.bind)
156
+ end
157
+ end
158
+
159
+ # Describes an expression which starts with set.elements.must* .
160
+ class ElementExpression < Gecode::Constraints::Expression #:nodoc:
161
+ Gecode::Constraints::Util::RELATION_TYPES.each_key do |name|
162
+ module_eval <<-"end_code"
163
+ # Creates an elements constraint using the specified expression, which
164
+ # may be either a constant integer of variable.
165
+ def #{name}(expression)
166
+ unless expression.kind_of?(Fixnum) or
167
+ expression.kind_of?(Gecode::FreeIntVar)
168
+ raise TypeError, "Invalid expression type \#{expression.class}."
169
+ end
170
+ @params.update(:rhs => expression, :relation => :#{name})
171
+ @model.add_constraint ElementRelationConstraint.new(@model, @params)
172
+ end
173
+ end_code
174
+ end
175
+ alias_comparison_methods
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,18 @@
1
+ module Gecode::Constraints::SetEnum
2
+ class Expression
3
+ # Posts a channel constraint on the variables in the enum with the specified
4
+ # int enum.
5
+ def channel(enum)
6
+ unless enum.respond_to? :to_int_var_array
7
+ raise TypeError, "Expected integer variable enum, for #{enum.class}."
8
+ end
9
+
10
+ # Just provide commutativity to the corresponding int enum constraint.
11
+ if @params[:negate]
12
+ enum.must_not.channel(@params[:lhs])
13
+ else
14
+ enum.must.channel(@params[:lhs])
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,80 @@
1
+ module Gecode::Constraints::SetEnum
2
+ class Expression
3
+ # Adds a distinct constraint on the sets in the enum. The "option" :size
4
+ # must be specified, the sets will be constrained to that size.
5
+ def distinct(options = {})
6
+ unless options.has_key? :size
7
+ raise ArgumentError, 'Option :size has to be specified.'
8
+ end
9
+ unless options.size == 1
10
+ raise ArgumentError, 'Only the option :size is accepted, got ' +
11
+ "#{options.keys.join(', ')}."
12
+ end
13
+ if @params[:negate]
14
+ raise Gecode::MissingConstraintError, 'A negated distinct is not ' +
15
+ 'implemented.'
16
+ end
17
+
18
+ @model.add_constraint Distinct::DistinctConstraint.new(
19
+ @model, @params.update(options))
20
+ end
21
+
22
+ # Adds a constraint on the sets that specifies that they must have at most
23
+ # one element in common. The "option" :size must be specified, the sets
24
+ # will be constrained to that size.
25
+ def at_most_share_one_element(options = {})
26
+ unless options.has_key? :size
27
+ raise ArgumentError, 'Option :size has to be specified.'
28
+ end
29
+ unless options.size == 1
30
+ raise ArgumentError, 'Only the option :size is accepted, got ' +
31
+ "#{options.keys.join(', ')}."
32
+ end
33
+ if @params[:negate]
34
+ raise Gecode::MissingConstraintError, 'A negated atmost one ' +
35
+ 'constrain is not implemented.'
36
+ end
37
+
38
+ @model.add_constraint Distinct::AtMostOneConstraint.new(
39
+ @model, @params.update(options))
40
+ end
41
+ end
42
+
43
+ # A module that gathers the classes and modules used in distinct constraints.
44
+ module Distinct #:nodoc:
45
+ # Describes a set distinct constraint, which constrains all set variables
46
+ # in the enumeration to be distinct and of a specified size. Providing a
47
+ # size is not optional.
48
+ #
49
+ # Neither negation nor reification is supported.
50
+ #
51
+ # == Examples
52
+ #
53
+ # # All set variables in +sets+ must have cardinality 4 and be different.
54
+ # sets.must_be.distinct(:size => 4)
55
+ class DistinctConstraint < Gecode::Constraints::Constraint
56
+ def post
57
+ sets, size = @params.values_at(:lhs, :size)
58
+ Gecode::Raw::distinct(@model.active_space, sets.to_set_var_array, size)
59
+ end
60
+ end
61
+
62
+ # Describes an at most one constraint, which constrains all pairs of set
63
+ # variables in the enumeration to at most have one element in common and be
64
+ # of a specified size. Providing a size is not optional.
65
+ #
66
+ # Neither negation nor reification is supported.
67
+ #
68
+ # == Examples
69
+ #
70
+ # # All set variables in +sets+ must have cardinality 17 and no pair may
71
+ # # have more than one element in common.
72
+ # sets.must.at_most_share_one_element(:size => 17)
73
+ class AtMostOneConstraint < Gecode::Constraints::Constraint
74
+ def post
75
+ sets, size = @params.values_at(:lhs, :size)
76
+ Gecode::Raw::atmostOne(@model.active_space, sets.to_set_var_array, size)
77
+ end
78
+ end
79
+ end
80
+ end