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