gecoder 0.8.3 → 0.9.0

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 (142) hide show
  1. data/CHANGES +15 -0
  2. data/README +6 -2
  3. data/example/equation_system.rb +15 -0
  4. data/example/magic_sequence.rb +7 -7
  5. data/example/money.rb +36 -0
  6. data/example/queens.rb +7 -8
  7. data/example/send_most_money.rb +1 -1
  8. data/example/square_tiling.rb +2 -2
  9. data/example/sudoku-set.rb +11 -12
  10. data/example/sudoku.rb +40 -45
  11. data/ext/extconf.rb +0 -0
  12. data/lib/gecoder/bindings.rb +42 -0
  13. data/lib/gecoder/bindings/bindings.rb +16 -0
  14. data/lib/gecoder/interface.rb +2 -1
  15. data/lib/gecoder/interface/branch.rb +16 -9
  16. data/lib/gecoder/interface/constraints.rb +410 -451
  17. data/lib/gecoder/interface/constraints/bool/boolean.rb +205 -213
  18. data/lib/gecoder/interface/constraints/bool/channel.rb +4 -5
  19. data/lib/gecoder/interface/constraints/bool/linear.rb +192 -21
  20. data/lib/gecoder/interface/constraints/bool_enum/channel.rb +43 -39
  21. data/lib/gecoder/interface/constraints/bool_enum/extensional.rb +43 -49
  22. data/lib/gecoder/interface/constraints/bool_enum/relation.rb +38 -71
  23. data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +73 -22
  24. data/lib/gecoder/interface/constraints/bool_var_constraints.rb +140 -61
  25. data/lib/gecoder/interface/constraints/extensional_regexp.rb +4 -4
  26. data/lib/gecoder/interface/constraints/fixnum_enum/element.rb +63 -0
  27. data/lib/gecoder/interface/constraints/fixnum_enum/operation.rb +65 -0
  28. data/lib/gecoder/interface/constraints/fixnum_enum_constraints.rb +42 -0
  29. data/lib/gecoder/interface/constraints/int/arithmetic.rb +131 -130
  30. data/lib/gecoder/interface/constraints/int/channel.rb +21 -31
  31. data/lib/gecoder/interface/constraints/int/domain.rb +45 -42
  32. data/lib/gecoder/interface/constraints/int/linear.rb +85 -239
  33. data/lib/gecoder/interface/constraints/int/relation.rb +141 -0
  34. data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +55 -64
  35. data/lib/gecoder/interface/constraints/int_enum/channel.rb +35 -37
  36. data/lib/gecoder/interface/constraints/int_enum/count.rb +53 -78
  37. data/lib/gecoder/interface/constraints/int_enum/distinct.rb +36 -46
  38. data/lib/gecoder/interface/constraints/int_enum/element.rb +39 -57
  39. data/lib/gecoder/interface/constraints/int_enum/equality.rb +15 -19
  40. data/lib/gecoder/interface/constraints/int_enum/extensional.rb +65 -72
  41. data/lib/gecoder/interface/constraints/int_enum/sort.rb +42 -45
  42. data/lib/gecoder/interface/constraints/int_enum_constraints.rb +79 -22
  43. data/lib/gecoder/interface/constraints/int_var_constraints.rb +215 -44
  44. data/lib/gecoder/interface/constraints/reifiable_constraints.rb +14 -14
  45. data/lib/gecoder/interface/constraints/selected_set/select.rb +120 -0
  46. data/lib/gecoder/interface/constraints/selected_set_constraints.rb +75 -0
  47. data/lib/gecoder/interface/constraints/set/cardinality.rb +43 -53
  48. data/lib/gecoder/interface/constraints/set/channel.rb +26 -29
  49. data/lib/gecoder/interface/constraints/set/connection.rb +89 -152
  50. data/lib/gecoder/interface/constraints/set/domain.rb +112 -65
  51. data/lib/gecoder/interface/constraints/set/include.rb +36 -0
  52. data/lib/gecoder/interface/constraints/set/operation.rb +96 -110
  53. data/lib/gecoder/interface/constraints/set/relation.rb +114 -137
  54. data/lib/gecoder/interface/constraints/set_elements/relation.rb +116 -0
  55. data/lib/gecoder/interface/constraints/set_elements_constraints.rb +97 -0
  56. data/lib/gecoder/interface/constraints/set_enum/channel.rb +23 -27
  57. data/lib/gecoder/interface/constraints/set_enum/distinct.rb +18 -19
  58. data/lib/gecoder/interface/constraints/set_enum/operation.rb +62 -53
  59. data/lib/gecoder/interface/constraints/set_enum/select.rb +79 -0
  60. data/lib/gecoder/interface/constraints/set_enum_constraints.rb +73 -23
  61. data/lib/gecoder/interface/constraints/set_var_constraints.rb +222 -57
  62. data/lib/gecoder/interface/enum_matrix.rb +4 -4
  63. data/lib/gecoder/interface/enum_wrapper.rb +71 -22
  64. data/lib/gecoder/interface/model.rb +167 -12
  65. data/lib/gecoder/interface/model_sugar.rb +84 -0
  66. data/lib/gecoder/interface/search.rb +30 -18
  67. data/lib/gecoder/interface/variables.rb +103 -33
  68. data/lib/gecoder/version.rb +2 -2
  69. data/specs/bool_var.rb +19 -12
  70. data/specs/constraints/{boolean.rb → bool/boolean.rb} +103 -28
  71. data/specs/constraints/bool/boolean_properties.rb +51 -0
  72. data/specs/constraints/bool/linear.rb +213 -0
  73. data/specs/constraints/bool_enum/bool_enum_relation.rb +117 -0
  74. data/specs/constraints/bool_enum/channel.rb +102 -0
  75. data/specs/constraints/{extensional.rb → bool_enum/extensional.rb} +32 -101
  76. data/specs/constraints/constraint_helper.rb +149 -179
  77. data/specs/constraints/constraint_receivers.rb +103 -0
  78. data/specs/constraints/constraints.rb +6 -63
  79. data/specs/constraints/fixnum_enum/element.rb +58 -0
  80. data/specs/constraints/fixnum_enum/operation.rb +67 -0
  81. data/specs/constraints/int/arithmetic.rb +149 -0
  82. data/specs/constraints/int/channel.rb +101 -0
  83. data/specs/constraints/int/domain.rb +106 -0
  84. data/specs/constraints/int/linear.rb +183 -0
  85. data/specs/constraints/int/linear_properties.rb +97 -0
  86. data/specs/constraints/int/relation.rb +84 -0
  87. data/specs/constraints/int_enum/arithmetic.rb +72 -0
  88. data/specs/constraints/int_enum/channel.rb +57 -0
  89. data/specs/constraints/int_enum/count.rb +72 -0
  90. data/specs/constraints/int_enum/distinct.rb +80 -0
  91. data/specs/constraints/int_enum/element.rb +61 -0
  92. data/specs/constraints/int_enum/equality.rb +29 -0
  93. data/specs/constraints/int_enum/extensional.rb +224 -0
  94. data/specs/constraints/int_enum/sort.rb +167 -0
  95. data/specs/constraints/operands.rb +264 -0
  96. data/specs/constraints/property_helper.rb +443 -0
  97. data/specs/constraints/reification_sugar.rb +4 -5
  98. data/specs/constraints/selected_set/select.rb +56 -0
  99. data/specs/constraints/selected_set/select_properties.rb +157 -0
  100. data/specs/constraints/set/cardinality.rb +58 -0
  101. data/specs/constraints/set/cardinality_properties.rb +46 -0
  102. data/specs/constraints/set/channel.rb +77 -0
  103. data/specs/constraints/set/connection.rb +176 -0
  104. data/specs/constraints/set/domain.rb +197 -0
  105. data/specs/constraints/set/include.rb +36 -0
  106. data/specs/constraints/set/operation.rb +132 -0
  107. data/specs/constraints/set/relation.rb +117 -0
  108. data/specs/constraints/set_elements/relation.rb +84 -0
  109. data/specs/constraints/set_enum/channel.rb +80 -0
  110. data/specs/constraints/set_enum/distinct.rb +59 -0
  111. data/specs/constraints/set_enum/operation.rb +111 -0
  112. data/specs/constraints/set_enum/select.rb +73 -0
  113. data/specs/enum_wrapper.rb +53 -3
  114. data/specs/int_var.rb +44 -25
  115. data/specs/model.rb +58 -1
  116. data/specs/model_sugar.rb +30 -0
  117. data/specs/search.rb +24 -5
  118. data/specs/selected_set.rb +39 -0
  119. data/specs/set_elements.rb +34 -0
  120. data/specs/set_var.rb +22 -8
  121. data/specs/spec_helper.rb +206 -6
  122. data/tasks/distribution.rake +22 -7
  123. data/tasks/svn.rake +3 -1
  124. metadata +218 -134
  125. data/lib/gecoder/interface/constraints/set_enum/selection.rb +0 -217
  126. data/specs/constraints/arithmetic.rb +0 -351
  127. data/specs/constraints/bool_enum_relation.rb +0 -160
  128. data/specs/constraints/cardinality.rb +0 -157
  129. data/specs/constraints/channel.rb +0 -454
  130. data/specs/constraints/connection.rb +0 -369
  131. data/specs/constraints/count.rb +0 -146
  132. data/specs/constraints/distinct.rb +0 -164
  133. data/specs/constraints/element.rb +0 -108
  134. data/specs/constraints/equality.rb +0 -31
  135. data/specs/constraints/int_domain.rb +0 -70
  136. data/specs/constraints/int_relation.rb +0 -82
  137. data/specs/constraints/linear.rb +0 -340
  138. data/specs/constraints/selection.rb +0 -292
  139. data/specs/constraints/set_domain.rb +0 -185
  140. data/specs/constraints/set_operation.rb +0 -285
  141. data/specs/constraints/set_relation.rb +0 -197
  142. data/specs/constraints/sort.rb +0 -179
@@ -1,8 +1,7 @@
1
- module Gecode::Constraints::Bool
2
- class Expression
3
- # Constrains the boolean variable to be equal to the specified integer
4
- # variable.
5
- provide_commutivity(:==){ |rhs, _| rhs.kind_of?(Gecode::FreeIntVar) }
1
+ module Gecode::Bool
2
+ class BoolConstraintReceiver
3
+ # Provides commutivity with IntVarReceiver#==
4
+ provide_commutativity(:==){ |rhs, _| rhs.respond_to? :to_int_var }
6
5
  alias_comparison_methods
7
6
  end
8
7
  end
@@ -1,29 +1,200 @@
1
- module Gecode
2
- class FreeBoolVar
3
- # Creates a linear expression where the bool variables are summed.
4
- def +(var)
5
- Gecode::Constraints::Int::Linear::ExpressionNode.new(self,
6
- @model) + var
1
+ module Gecode::Bool
2
+ module BoolLinearOperations #:nodoc:
3
+ # Produces an IntOperand representing the value of this boolean
4
+ # operand (0 or 1) plus +op2+.
5
+ #
6
+ # ==== Examples
7
+ #
8
+ # # +bool1+ plus +bool2+
9
+ # bool1 + bool2
10
+ def +(op2)
11
+ bool_linear_expression_operation(:+, op2)
7
12
  end
8
13
 
9
- alias_method :pre_linear_mult, :* if instance_methods.include? '*'
10
-
11
- # Creates a linear expression where the bool variable is multiplied with
12
- # a constant integer.
13
- def *(int)
14
- if int.kind_of? Fixnum
15
- Gecode::Constraints::Int::Linear::ExpressionNode.new(self,
16
- @model) * int
14
+ # Produces an IntOperand representing the value of this boolean
15
+ # operand (0 or 1) times a constant.
16
+ #
17
+ # ==== Examples
18
+ #
19
+ # # +bool+ times 17
20
+ # bool * 17
21
+ def *(fixnum)
22
+ if fixnum.kind_of? Fixnum
23
+ bool_linear_expression_operation(:*, fixnum)
17
24
  else
18
- pre_linear_mult(int) if respond_to? :pre_linear_mult
25
+ raise TypeError, "Expected fixnum, got #{fixnum.class}."
19
26
  end
20
27
  end
21
28
 
22
- # Creates a linear expression where the specified variable is subtracted
23
- # from this one.
24
- def -(var)
25
- Gecode::Constraints::Int::Linear::ExpressionNode.new(self,
26
- @model) - var
29
+ # Produces an IntOperand representing the value of this boolean
30
+ # operand (0 or 1) minus +op2+.
31
+ #
32
+ # ==== Examples
33
+ #
34
+ # # +bool1+ minus +bool2+
35
+ # bool1 - bool2
36
+ def -(op2)
37
+ bool_linear_expression_operation(:-, op2)
38
+ end
39
+
40
+ private
41
+
42
+ # Performs the bool linear expression operation +operator+ on self
43
+ # and +operand2+.
44
+ def bool_linear_expression_operation(operator, operand2)
45
+ linear_module = Linear
46
+ unless operand2.respond_to? :to_minimodel_lin_exp
47
+ operand2 = linear_module::ExpressionNode.new operand2
48
+ end
49
+ operand1 = self
50
+ unless operand1.respond_to? :to_minimodel_lin_exp
51
+ operand1 = linear_module::ExpressionNode.new(self, @model)
52
+ end
53
+ linear_module::ExpressionTree.new(operand1, operand2, operator)
54
+ end
55
+ end
56
+
57
+ module BoolOperand
58
+ # We include the operations and then redefine them so that they show
59
+ # up in the documentation.
60
+ include BoolLinearOperations
61
+
62
+ # Produces an IntOperand representing the value of this boolean
63
+ # operand (0 or 1) plus +op2+.
64
+ #
65
+ # ==== Examples
66
+ #
67
+ # # +bool1+ plus +bool2+
68
+ # bool1 + bool2
69
+ def +(op2)
70
+ bool_linear_expression_operation(:+, op2)
71
+ end
72
+
73
+ # Produces an IntOperand representing the value of this boolean
74
+ # operand (0 or 1) times a constant.
75
+ #
76
+ # ==== Examples
77
+ #
78
+ # # +bool+ times 17
79
+ # bool * 17
80
+ def *(fixnum)
81
+ if fixnum.kind_of? Fixnum
82
+ bool_linear_expression_operation(:*, fixnum)
83
+ else
84
+ raise TypeError, "Expected fixnum, got #{fixnum.class}."
85
+ end
86
+ end
87
+
88
+ # Produces an IntOperand representing the value of this boolean
89
+ # operand (0 or 1) minus +op2+.
90
+ #
91
+ # ==== Examples
92
+ #
93
+ # # +bool1+ minus +bool2+
94
+ # bool1 - bool2
95
+ def -(op2)
96
+ bool_linear_expression_operation(:-, op2)
97
+ end
98
+ end
99
+
100
+ # A module that gathers the classes and modules used in linear constraints.
101
+ module Linear #:nodoc:
102
+ class LinearRelationConstraint < Gecode::ReifiableConstraint #:nodoc:
103
+ def post
104
+ lhs, rhs, relation_type, reif_var =
105
+ @params.values_at(:lhs, :rhs, :relation_type, :reif)
106
+ reif_var = reif_var.to_bool_var.bind if reif_var.respond_to? :to_bool_var
107
+ final_exp = (lhs.to_minimodel_lin_exp - rhs.to_minimodel_lin_exp)
108
+ if reif_var.nil?
109
+ final_exp.post(@model.active_space, relation_type,
110
+ *propagation_options)
111
+ else
112
+ final_exp.post(@model.active_space, relation_type, reif_var,
113
+ *propagation_options)
114
+ end
115
+ end
116
+ end
117
+
118
+ # Describes a binary tree of expression nodes which together form a linear
119
+ # expression.
120
+ class ExpressionTree < Gecode::Int::ShortCircuitRelationsOperand #:nodoc:
121
+ include Gecode::Bool::BoolLinearOperations
122
+ attr :model
123
+
124
+ # Constructs a new expression with the specified operands.
125
+ def initialize(left_node, right_node, operation)
126
+ super(left_node.model || right_node.model)
127
+ @left = left_node
128
+ @right = right_node
129
+ @operation = operation
130
+ @model = @left.model || @right.model
131
+ end
132
+
133
+ # Converts the linear expression to an instance of
134
+ # Gecode::Raw::MiniModel::LinExpr
135
+ def to_minimodel_lin_exp
136
+ @left.to_minimodel_lin_exp.send(@operation, @right.to_minimodel_lin_exp)
137
+ end
138
+
139
+ alias_method :pre_bool_construct_receiver, :construct_receiver
140
+ def construct_receiver(params)
141
+ receiver = pre_bool_construct_receiver(params)
142
+ lhs = self
143
+ receiver.instance_eval{ @lhs = lhs }
144
+ class <<receiver
145
+ alias_method :pre_bool_equality, :==
146
+ def ==(op, options = {})
147
+ if op.respond_to? :to_bool_var
148
+ (@lhs - op).must.equal(0, options)
149
+ else
150
+ pre_bool_equality(op, options)
151
+ end
152
+ end
153
+ alias_comparison_methods
154
+ end
155
+ return receiver
156
+ end
157
+
158
+ def relation_constraint(relation, bool_operand_or_fix, params)
159
+ unless params[:negate]
160
+ relation_type =
161
+ Gecode::Util::RELATION_TYPES[relation]
162
+ else
163
+ relation_type =
164
+ Gecode::Util::NEGATED_RELATION_TYPES[relation]
165
+ end
166
+
167
+ unless bool_operand_or_fix.respond_to? :to_minimodel_lin_exp
168
+ bool_operand_or_fix = Linear::ExpressionNode.new(bool_operand_or_fix);
169
+ end
170
+
171
+ params.update(:rhs => bool_operand_or_fix, :relation_type => relation_type)
172
+ LinearRelationConstraint.new(model, params)
173
+ end
174
+ end
175
+
176
+ # Describes a single node in a linear expression.
177
+ class ExpressionNode #:nodoc:
178
+ attr :model
179
+
180
+ def initialize(value, model = nil)
181
+ unless value.respond_to?(:to_bool_var) or value.kind_of?(Fixnum)
182
+ raise TypeError, 'Expected bool operand or ' +
183
+ "fixnum, got #{value.class}."
184
+ end
185
+ @value = value
186
+ @model = model
187
+ end
188
+
189
+ # Converts the linear expression to an instance of
190
+ # Gecode::Raw::MiniModel::LinExpr
191
+ def to_minimodel_lin_exp
192
+ expression = @value
193
+ if expression.respond_to? :to_bool_var
194
+ expression = expression.to_bool_var.bind * 1
195
+ end
196
+ expression
197
+ end
27
198
  end
28
199
  end
29
- end
200
+ end
@@ -1,14 +1,35 @@
1
- module Gecode::Constraints::BoolEnum
2
- class Expression
3
- # Adds a channel constraint on the variables in the enum with the specified
4
- # integer variable. Beyond the common options the channel constraint can
1
+ module Gecode::BoolEnum
2
+ class BoolEnumConstraintReceiver
3
+ # Constrains this enumeration to "channel" +integer_operand+. This
4
+ # constrains the integer operand to take value i exactly when the
5
+ # operand at index i in the boolean enumeration is true and the others
6
+ # are false.
7
+ #
8
+ # Beyond the common options the channel constraint can
5
9
  # also take the following option:
6
10
  #
7
- # [:offset] Specifies an offset for the integer variable. If the offset is
8
- # set to k then the integer variable takes value i+k exactly
9
- # when the variable at index i in the boolean enumeration is true
10
- # and the rest are false.
11
- def channel(int_var, options = {})
11
+ # [:offset] Specifies an offset for the integer operand. If the offset is
12
+ # set to k then the integer operand takes value i+k exactly
13
+ # when the operand at index i in the boolean enumeration is
14
+ # true and the rest are false.
15
+ #
16
+ # Neither reification nor negation is supported. The int operand
17
+ # and the enumeration can be interchanged.
18
+ #
19
+ # ==== Examples
20
+ #
21
+ # # Constrains the enumeration called +option_is_selected+ to be false
22
+ # # in the first four positions and have exactly one true operand in
23
+ # # the other.
24
+ # option_is_selected.must.channel selected_option_index
25
+ # selected_option_index.must_be > 3
26
+ #
27
+ # # Constrains the enumeration called +option_is_selected+ to be false
28
+ # # in the first five positions and have exactly one true operand in
29
+ # # the other.
30
+ # selected_option_index.must.channel(option_is_selected, :offset => 1)
31
+ # selected_option_index.must_be > 3
32
+ def channel(integer_operand, options = {})
12
33
  if @params[:negate]
13
34
  raise Gecode::MissingConstraintError, 'A negated channel constraint ' +
14
35
  'is not implemented.'
@@ -17,47 +38,30 @@ module Gecode::Constraints::BoolEnum
17
38
  raise ArgumentError, 'The channel constraint does not support the ' +
18
39
  'reification option.'
19
40
  end
20
- unless int_var.kind_of? Gecode::FreeIntVar
21
- raise TypeError, "Expected an integer variable, got #{int_var.class}."
41
+ unless integer_operand.respond_to? :to_int_var
42
+ raise TypeError, 'Expected an integer operand, got ' +
43
+ "#{integer_operand.class}."
22
44
  end
23
45
 
24
- @params.update(:rhs => int_var, :offset => options.delete(:offset) || 0)
25
- @params.update(Gecode::Constraints::Util.decode_options(options))
46
+ @params.update(:rhs => integer_operand,
47
+ :offset => options.delete(:offset) || 0)
48
+ @params.update(Gecode::Util.decode_options(options))
26
49
  @model.add_constraint Channel::ChannelConstraint.new(@model, @params)
27
50
  end
28
51
 
29
- # Adds a channel constraint on the variables in the enum with the specified
30
- # set variable.
31
- provide_commutivity(:channel){ |rhs, _| rhs.kind_of? Gecode::FreeSetVar }
52
+ # Provides commutativity with SetConstraintReceiver#channel
53
+ provide_commutativity(:channel){ |rhs, _| rhs.respond_to? :to_set_var }
32
54
  end
33
55
 
34
56
  # A module that gathers the classes and modules used in channel constraints
35
- # involving one boolean enum and one integer variable.
57
+ # involving one boolean enum and one integer operand.
36
58
  module Channel #:nodoc:
37
- # Describes a channel constraint that "channels" an enumeration of
38
- # boolean variables with an integer variable. This constrains the integer
39
- # variable to take value i exactly when the variable at index i in the
40
- # boolean enumeration is true and the others are false.
41
- #
42
- # Neither reification nor negation is supported. The int variable
43
- # and the enumeration can be interchanged.
44
- #
45
- # == Examples
46
- #
47
- # # Constrains the enumeration called +option_is_selected+ to be false in the
48
- # # first four positions and have exactly one true variable in the other.
49
- # option_is_selected.must.channel selected_option_index
50
- # selected_option_index.must_be > 3
51
- #
52
- # # Constrains the enumeration called +option_is_selected+ to be false in the
53
- # # first five positions and have exactly one true variable in the other.
54
- # selected_option_index.must.channel(option_is_selected, :offset => 1)
55
- # selected_option_index.must_be > 3
56
- class ChannelConstraint < Gecode::Constraints::Constraint
59
+ class ChannelConstraint < Gecode::Constraint #:nodoc:
57
60
  def post
58
61
  lhs, rhs, offset = @params.values_at(:lhs, :rhs, :offset)
59
- Gecode::Raw::channel(@model.active_space, lhs.to_bool_var_array,
60
- rhs.bind, offset, *propagation_options)
62
+ Gecode::Raw::channel(@model.active_space,
63
+ lhs.to_bool_enum.bind_array, rhs.to_int_var.bind,
64
+ offset, *propagation_options)
61
65
  end
62
66
  end
63
67
  end
@@ -1,6 +1,18 @@
1
- module Gecode::Constraints::BoolEnum
2
- class Expression
3
- # Posts an equality constraint on the variables in the enum.
1
+ module Gecode::BoolEnum
2
+ class BoolEnumConstraintReceiver
3
+ # Constrains all the operands in this enumeration to be equal to
4
+ # one of the specified tuples. Neither negation nor reification is
5
+ # supported.
6
+ #
7
+ # ==== Examples
8
+ #
9
+ # # Constrains the three boolean operands in +bools+ to either
10
+ # # be true, false, true, or false, false, true.
11
+ # bools.must_be.in [[true, false, true], [false, false, true]]
12
+ #
13
+ # # The same as above, but preferring speed over low memory usage.
14
+ # bools.must_be.in([[true, false, true], [false, false, true]],
15
+ # :kind => :speed)
4
16
  def in(tuples, options = {})
5
17
  if @params[:negate]
6
18
  raise Gecode::MissingConstraintError, 'A negated tuple constraint is ' +
@@ -11,7 +23,7 @@ module Gecode::Constraints::BoolEnum
11
23
  'constraint.'
12
24
  end
13
25
 
14
- util = Gecode::Constraints::Util
26
+ util = Gecode::Util
15
27
 
16
28
  # Check that the tuples are correct.
17
29
  expected_size = @params[:lhs].size
@@ -23,14 +35,28 @@ module Gecode::Constraints::BoolEnum
23
35
 
24
36
  @params[:tuples] = tuples
25
37
  @model.add_constraint Extensional::TupleConstraint.new(@model,
26
- @params.update(Gecode::Constraints::Util.decode_options(options)))
38
+ @params.update(Gecode::Util.decode_options(options)))
27
39
  end
28
40
 
29
- # Adds a constraint that forces the enumeration to match the
30
- # specified regular expression over the boolean domain. The regular
31
- # expression is expressed using arrays and boolean values (or
32
- # integers). See BoolEnum::Extensional::RegexpConstraint for more information
33
- # and examples of such regexps.
41
+ # Constrains the sequence of operands in this enumeration to match
42
+ # a specified regexp in the boolean domain. Neither negation nor
43
+ # reification is supported.
44
+ #
45
+ # The regular expressions are specified as described in
46
+ # IntEnumConstraintReceiver#match but true and false can be
47
+ # used instead of integers.
48
+ #
49
+ # ==== Examples
50
+ #
51
+ # # Constrains the two boolean operands in +bools+ to be false
52
+ # # and true respectively.
53
+ # bools.must.match [false, true]
54
+ #
55
+ # # Constrains the boolean operands in +bools+ to be false,
56
+ # # except for three consecutive operands which should be true
57
+ # # followed by false followed by true.
58
+ # bools.must.match [repeat(false), true, false, true, repeat(false)]]
59
+ #
34
60
  def match(regexp, options = {})
35
61
  if @params[:negate]
36
62
  raise Gecode::MissingConstraintError, 'A negated regexp constraint ' +
@@ -42,8 +68,8 @@ module Gecode::Constraints::BoolEnum
42
68
  end
43
69
 
44
70
  @params[:regexp] =
45
- Gecode::Constraints::Util::Extensional.parse_regexp regexp
46
- @params.update Gecode::Constraints::Util.decode_options(options)
71
+ Gecode::Util::Extensional.parse_regexp regexp
72
+ @params.update Gecode::Util.decode_options(options)
47
73
  @model.add_constraint Extensional::RegexpConstraint.new(@model, @params)
48
74
  end
49
75
  end
@@ -51,23 +77,10 @@ module Gecode::Constraints::BoolEnum
51
77
  # A module that gathers the classes and modules used in extensional
52
78
  # constraints.
53
79
  module Extensional #:nodoc:
54
- # Describes a tuple constraint, which constrains the variables in an
55
- # boolean enumeration to be equal to one of the specified tuples. Neither
56
- # negation nor reification is supported.
57
- #
58
- # == Example
59
- #
60
- # # Constrains the three boolean variables in +bools+ to either
61
- # # be true, false, true, or false, false, true.
62
- # bools.must_be.in [[true, false, true], [false, false, true]]
63
- #
64
- # # The same as above, but preferring speed over low memory usage.
65
- # bools.must_be.in([[true, false, true], [false, false, true]],
66
- # :kind => :speed)
67
- class TupleConstraint < Gecode::Constraints::Constraint
80
+ class TupleConstraint < Gecode::Constraint #:nodoc:
68
81
  def post
69
82
  # Bind lhs.
70
- lhs = @params[:lhs].to_bool_var_array
83
+ lhs = @params[:lhs].to_bool_enum.bind_array
71
84
 
72
85
  # Create the tuple set.
73
86
  tuple_set = Gecode::Raw::TupleSet.new
@@ -82,30 +95,11 @@ module Gecode::Constraints::BoolEnum
82
95
  end
83
96
  end
84
97
 
85
- # Describes a regexp constraint, which constrains the enumeration of
86
- # boolean variables to match a specified regexp in the boolean
87
- # domain. Neither negation nor reification is supported.
88
- #
89
- # The regular expressions are specified as described in
90
- # IntEnum::Extensional::RegexpConstraint but true and false can be
91
- # used instead of integers.
92
- #
93
- # == Example
94
- #
95
- # # Constrains the two boolean variables in +bools+ to be false
96
- # # and true respectively.
97
- # bools.must.match [false, true]
98
- #
99
- # # Constrains the boolean variables in +bools+ to be false,
100
- # # except for three consecutive variables which should be true
101
- # # followed by false followed by true.
102
- # bools.must.match [repeat(false), true, false, true, repeat(false)]]
103
- #
104
- class RegexpConstraint < Gecode::Constraints::Constraint
98
+ class RegexpConstraint < Gecode::Constraint #:nodoc:
105
99
  def post
106
100
  lhs, regexp = @params.values_at(:lhs, :regexp)
107
- Gecode::Raw::extensional(@model.active_space, lhs.to_bool_var_array,
108
- regexp, *propagation_options)
101
+ Gecode::Raw::extensional(@model.active_space,
102
+ lhs.to_bool_enum.bind_array, regexp, *propagation_options)
109
103
  end
110
104
  end
111
105
  end